feat: add spindle direction selection contract

This commit is contained in:
Nick Hermes
2026-06-02 15:40:16 +00:00
parent 02d9323c43
commit beeb521ca7
21 changed files with 689 additions and 133 deletions

View File

@@ -25,7 +25,8 @@
"phase_deg": 37.2
},
"dither_profile": "none",
"notes": "Direct translation no segmentation needed for 1200s duration."
"notes": "Direct translation \u2014 no segmentation needed for 1200s duration.",
"commanded_spindle_direction": "cw"
}
],
"translation_losses": []

View File

@@ -36,7 +36,8 @@
"amplitude_n": 5.0,
"phase_deg": 37.2
},
"notes": "Phase derived from Zernike fit of pre-polish interferogram."
"notes": "Phase derived from Zernike fit of pre-polish interferogram.",
"spindle_direction": "cw"
}
],
"predicted_outcome": {
@@ -53,7 +54,10 @@
}
},
"uncertainty": {
"removal_rms_nm_range": [14.0, 24.0],
"removal_rms_nm_range": [
14.0,
24.0
],
"notes": "Uncertainty dominated by Preston coefficient calibration spread."
},
"attachments": [

View File

@@ -5,31 +5,85 @@
"machine_name": "Fullum Swing-Arm Polisher",
"controller_version": "polisher-control/0.1.0",
"last_verified": "2026-06-01T00:00:00Z",
"supported_motion_families": ["swing-arm-rosette"],
"force_range_n": [5, 200],
"table_rpm_range": [0.5, 10.0],
"spindle_rpm_range": [10, 120],
"cam_amplitude_range_deg": [1.0, 31.3],
"cam_offset_range_deg": [-30.0, 30.0],
"supported_motion_families": [
"swing-arm-rosette"
],
"force_range_n": [
5,
200
],
"table_rpm_range": [
0.5,
10.0
],
"spindle_rpm_range": [
10,
120
],
"cam_amplitude_range_deg": [
1.0,
31.3
],
"cam_offset_range_deg": [
-30.0,
30.0
],
"force_modulation": {
"supported": true,
"max_harmonics": 3,
"max_amplitude_n": 24.0,
"notes": "m=2 astigmatism and m=3 trefoil are proven channels. m=1 coma is unreliable (score 0.09)."
},
"supported_dither_profiles": ["none", "default"],
"supported_dither_profiles": [
"none",
"default"
],
"segment_duration_limits": {
"min_s": 30,
"max_s": 7200
},
"pause_resume_support": true,
"telemetry_channels": [
{ "name": "table_rpm", "unit": "RPM", "sample_rate_hz": 100 },
{ "name": "spindle_rpm", "unit": "RPM", "sample_rate_hz": 100 },
{ "name": "force_n", "unit": "N", "sample_rate_hz": 100 },
{ "name": "arm_angle_deg", "unit": "degrees", "sample_rate_hz": 100 },
{ "name": "table_angle_deg", "unit": "degrees", "sample_rate_hz": 100 },
{ "name": "timestamp_ms", "unit": "ms", "sample_rate_hz": 100 }
{
"name": "table_rpm",
"unit": "RPM",
"sample_rate_hz": 100
},
{
"name": "spindle_rpm",
"unit": "RPM",
"sample_rate_hz": 100
},
{
"name": "force_n",
"unit": "N",
"sample_rate_hz": 100
},
{
"name": "arm_angle_deg",
"unit": "degrees",
"sample_rate_hz": 100
},
{
"name": "table_angle_deg",
"unit": "degrees",
"sample_rate_hz": 100
},
{
"name": "timestamp_ms",
"unit": "ms",
"sample_rate_hz": 100
},
{
"name": "spindle_direction_setpoint",
"unit": "enum(cw|ccw)",
"sample_rate_hz": 10
},
{
"name": "spindle_direction_actual",
"unit": "enum(cw|ccw)",
"sample_rate_hz": 10
}
],
"safety_limits": {
"max_force_n": 200,
@@ -38,14 +92,18 @@
"notes": "Force hard-limited by load cell interlock. RPM limits are VFD/servo configured."
},
"known_constraints": [
"Cam amplitude is not servo-programmable must be set mechanically before run.",
"Cam amplitude is not servo-programmable \u2014 must be set mechanically before run.",
"Force modulation bandwidth limited to ~5 Hz by actuator response.",
"Table encoder is absolute but may have 1-2 count jitter.",
"Serial interface to Teensy limits command update rate to ~50 Hz effective."
],
"unknowns": [
"Exact force modulation phase accuracy at m=3 harmonic not yet validated on hardware.",
"Exact force modulation phase accuracy at m=3 harmonic \u2014 not yet validated on hardware.",
"Thermal drift effect on force sensor over runs longer than 1 hour.",
"Arm pivot play magnitude under varying force loads."
],
"supported_spindle_directions": [
"cw",
"ccw"
]
}

View File

@@ -20,7 +20,8 @@
"table_rpm": 4.0,
"spindle_rpm": 40.0,
"cam_amplitude_deg": 31.3,
"cam_offset_deg": 0.0
"cam_offset_deg": 0.0,
"spindle_direction": "cw"
},
"actual": {
"force_n_mean": 44.7,
@@ -37,7 +38,8 @@
"commanded_summary": {
"force_n": 45.0,
"table_rpm": 4.0,
"spindle_rpm": 40.0
"spindle_rpm": 40.0,
"spindle_direction": "cw"
},
"actual_summary": {
"force_n_mean": 44.7,