提交 xyzbc-trt 界面与验证更新

This commit is contained in:
mes123456
2026-07-02 20:25:37 -04:00
parent 68ecd05353
commit 370c344b96
868 changed files with 275426 additions and 39640 deletions

View File

@@ -1,12 +1,12 @@
{
"apiName": "xyzbc-trt-native-web-evidence-comparison",
"status": "pass",
"comparedAt": "2026-07-02T14:28:50.647Z",
"comparedAt": "2026-07-02T23:30:52.947Z",
"nativePath": "/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/native-xyzbc-trt-evidence.json",
"webPath": "/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/web-xyzbc-trt-evidence.json",
"summary": {
"checkCount": 29,
"passCount": 29,
"checkCount": 31,
"passCount": 31,
"failCount": 0,
"blockers": [],
"nativeStatus": "ok",
@@ -808,6 +808,536 @@
"section": "run-jog-home-controls"
}
],
"axisButtonParity": {
"sourceFile": "/home/mes123456/cnc_wams/linuxcnc/src/emc/usr_intf/axis/scripts/axis.py",
"pyvcpSourceFiles": [
"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.xml",
"configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal"
],
"requiredActions": [
"estop",
"power",
"open",
"reload",
"run-ready",
"run",
"pause",
"resume",
"step",
"stop",
"home-all",
"jog-minus",
"jog-plus",
"touch-off",
"tool-touch-off",
"spindle-forward",
"spindle-stop",
"spindle-reverse",
"feed-override-down",
"feed-override-up",
"rapid-override-down",
"rapid-override-up",
"spindle-override-down",
"spindle-override-up",
"ignore-limits",
"block-delete",
"optional-stop",
"toggle-flood",
"toggle-mist",
"mdi-form",
"mdi-history",
"kins-identity",
"kins-tcp",
"kins-userk",
"clear-preview",
"view-x",
"view-y",
"view-z",
"view-p"
],
"coveredActions": [
"open",
"reload",
"stage",
"save-session",
"restore-session",
"estop",
"power",
"home-all",
"run-ready",
"run",
"pause",
"resume",
"step",
"stop",
"view-z",
"view-y",
"view-x",
"view-p",
"clear-preview",
"audit",
"tab-manual",
"tab-mdi",
"select-joint",
"jog-increment",
"jog-minus",
"jog-plus",
"touch-off",
"tool-touch-off",
"spindle-reverse",
"spindle-stop",
"spindle-forward",
"feed-override-down",
"feed-override-up",
"rapid-override-down",
"rapid-override-up",
"spindle-override-down",
"spindle-override-up",
"ignore-limits",
"block-delete",
"optional-stop",
"toggle-flood",
"toggle-mist",
"mdi-form",
"mdi-history",
"kins-identity",
"kins-tcp",
"kins-userk"
],
"missingActions": [],
"buttonCount": 61,
"sourceReferencedCount": 61,
"ready": true
},
"buttons": [
{
"id": "menu-open",
"action": "open",
"sourceSymbol": "commands.open_file",
"sourceLines": "axis.py:2243-2262",
"expected": "file picker opens without changing runtime state"
},
{
"id": "menu-reload",
"action": "reload",
"sourceSymbol": "commands.reload_file",
"sourceLines": "axis.py:2296-2297",
"expected": "program reload resets active playback state"
},
{
"id": "menu-stage",
"action": "stage",
"sourceSymbol": "web OPFS staging for DISPLAY PROGRAM_PREFIX",
"sourceLines": "xyzbc-trt.ini:[DISPLAY] PROGRAM_PREFIX",
"expected": "LinuxCNC profile files are staged"
},
{
"id": "menu-save-session",
"action": "save-session",
"sourceSymbol": "web session persistence",
"sourceLines": "five-axis-session.js",
"expected": "session snapshot is requested"
},
{
"id": "menu-restore-session",
"action": "restore-session",
"sourceSymbol": "web session persistence",
"sourceLines": "five-axis-session.js",
"expected": "session restore is requested"
},
{
"id": "menu-estop",
"action": "estop",
"sourceSymbol": "commands.estop_clicked",
"sourceLines": "axis.py:2223-2229",
"expected": "toggle ESTOP/ESTOP_RESET"
},
{
"id": "menu-power",
"action": "power",
"sourceSymbol": "commands.onoff_clicked",
"sourceLines": "axis.py:2231-2241",
"expected": "toggle machine ON/OFF after estop reset"
},
{
"id": "menu-home-all",
"action": "home-all",
"sourceSymbol": "commands.home_all_joints",
"sourceLines": "axis.py:2586-2596",
"expected": "home all joints in manual mode"
},
{
"id": "menu-run-ready",
"action": "run-ready",
"sourceSymbol": "AXIS run preconditions",
"sourceLines": "axis.py:2308-2320",
"expected": "power on, home, auto mode and TCP kins ready"
},
{
"id": "menu-run",
"action": "run",
"sourceSymbol": "commands.task_run",
"sourceLines": "axis.py:2308-2320",
"expected": "AUTO_RUN from current start line"
},
{
"id": "menu-pause",
"action": "pause",
"sourceSymbol": "commands.task_pause",
"sourceLines": "axis.py:2329-2333",
"expected": "AUTO_PAUSE when running"
},
{
"id": "menu-resume",
"action": "resume",
"sourceSymbol": "commands.task_resume",
"sourceLines": "axis.py:2344-2351",
"expected": "AUTO_RESUME when paused"
},
{
"id": "menu-step",
"action": "step",
"sourceSymbol": "commands.task_step",
"sourceLines": "axis.py:2321-2327",
"expected": "AUTO_STEP one cycle/segment"
},
{
"id": "menu-stop",
"action": "stop",
"sourceSymbol": "commands.task_stop",
"sourceLines": "axis.py:2365-2372",
"expected": "abort current task"
},
{
"id": "menu-view-z",
"action": "view-z",
"sourceSymbol": "commands.set_view_z",
"sourceLines": "axis.py:2208-2215",
"expected": "select top Z camera"
},
{
"id": "menu-view-y",
"action": "view-y",
"sourceSymbol": "commands.set_view_y",
"sourceLines": "axis.py:2192-2200",
"expected": "select front Y camera"
},
{
"id": "menu-view-x",
"action": "view-x",
"sourceSymbol": "commands.set_view_x",
"sourceLines": "axis.py:2182-2190",
"expected": "select side X camera"
},
{
"id": "menu-view-p",
"action": "view-p",
"sourceSymbol": "commands.set_view_p",
"sourceLines": "axis.py:2220-2221",
"expected": "select perspective/fit camera"
},
{
"id": "menu-clear-preview",
"action": "clear-preview",
"sourceSymbol": "commands.clear_live_plot",
"sourceLines": "axis.py:2557-2558",
"expected": "clear live plot buffer"
},
{
"id": "menu-audit",
"action": "audit",
"sourceSymbol": "web parity audit",
"sourceLines": "collect-web-xyzbc-trt-evidence.mjs",
"expected": "request native/Web parity audit"
},
{
"id": "toolbar-estop",
"action": "estop",
"sourceSymbol": "commands.estop_clicked",
"sourceLines": "axis.py:2223-2229",
"expected": "toggle ESTOP/ESTOP_RESET"
},
{
"id": "toolbar-power",
"action": "power",
"sourceSymbol": "commands.onoff_clicked",
"sourceLines": "axis.py:2231-2241",
"expected": "toggle machine power"
},
{
"id": "toolbar-load",
"action": "open",
"sourceSymbol": "commands.open_file",
"sourceLines": "axis.py:2243-2262",
"expected": "open local G-code"
},
{
"id": "toolbar-reload",
"action": "reload",
"sourceSymbol": "commands.reload_file",
"sourceLines": "axis.py:2296-2297",
"expected": "reload active program"
},
{
"id": "toolbar-run",
"action": "run",
"sourceSymbol": "commands.task_run",
"sourceLines": "axis.py:2308-2320",
"expected": "start AUTO run"
},
{
"id": "toolbar-pause-resume",
"action": "pause",
"sourceSymbol": "commands.task_pauseresume",
"sourceLines": "axis.py:2353-2363",
"expected": "pause or resume based on paused state"
},
{
"id": "toolbar-step",
"action": "step",
"sourceSymbol": "commands.task_step",
"sourceLines": "axis.py:2321-2327",
"expected": "single step"
},
{
"id": "toolbar-stop",
"action": "stop",
"sourceSymbol": "commands.task_stop",
"sourceLines": "axis.py:2365-2372",
"expected": "abort current task"
},
{
"id": "toolbar-view-z",
"action": "view-z",
"sourceSymbol": "commands.set_view_z",
"sourceLines": "axis.py:2208-2215",
"expected": "Z view"
},
{
"id": "toolbar-view-y",
"action": "view-y",
"sourceSymbol": "commands.set_view_y",
"sourceLines": "axis.py:2192-2200",
"expected": "Y view"
},
{
"id": "toolbar-view-x",
"action": "view-x",
"sourceSymbol": "commands.set_view_x",
"sourceLines": "axis.py:2182-2190",
"expected": "X view"
},
{
"id": "toolbar-view-p",
"action": "view-p",
"sourceSymbol": "commands.set_view_p",
"sourceLines": "axis.py:2220-2221",
"expected": "perspective view"
},
{
"id": "toolbar-clear-preview",
"action": "clear-preview",
"sourceSymbol": "commands.clear_live_plot",
"sourceLines": "axis.py:2557-2558",
"expected": "clear path count"
},
{
"id": "manual-tab",
"action": "tab-manual",
"sourceSymbol": "commands.ensure_manual",
"sourceLines": "axis.py:2520-2531",
"expected": "manual mode tab selected"
},
{
"id": "mdi-tab",
"action": "tab-mdi",
"sourceSymbol": "commands.ensure_mdi",
"sourceLines": "axis.py:2533-2540",
"expected": "MDI mode tab selected"
},
{
"id": "manual-select-joint",
"action": "select-joint",
"sourceSymbol": "axis radiobuttons ja_rbutton",
"sourceLines": "axis.py:1369-1380",
"expected": "active joint/axis selected"
},
{
"id": "manual-jog-increment",
"action": "jog-increment",
"sourceSymbol": "set_hal_jogincrement",
"sourceLines": "axis.py:1507-1515",
"expected": "jog increment updates HAL-equivalent state"
},
{
"id": "manual-jog-minus",
"action": "jog-minus",
"sourceSymbol": "commands.jog_minus",
"sourceLines": "axis.py:2573-2577",
"expected": "negative jog of active axis/joint"
},
{
"id": "manual-jog-plus",
"action": "jog-plus",
"sourceSymbol": "commands.jog_plus",
"sourceLines": "axis.py:2567-2571",
"expected": "positive jog of active axis/joint"
},
{
"id": "manual-touch-off",
"action": "touch-off",
"sourceSymbol": "commands.touch_off_system",
"sourceLines": "axis.py:2631-2650",
"expected": "G10 touch off MDI equivalent"
},
{
"id": "manual-tool-touch-off",
"action": "tool-touch-off",
"sourceSymbol": "commands.touch_off_tool",
"sourceLines": "axis.py:2651-2685",
"expected": "tool length offset equivalent"
},
{
"id": "manual-spindle-reverse",
"action": "spindle-reverse",
"sourceSymbol": "spindle CCW control",
"sourceLines": "axis.py:1389-1398",
"expected": "spindle reverse"
},
{
"id": "manual-spindle-stop",
"action": "spindle-stop",
"sourceSymbol": "spindle stop control",
"sourceLines": "axis.py:1389-1398",
"expected": "spindle stop"
},
{
"id": "manual-spindle-forward",
"action": "spindle-forward",
"sourceSymbol": "spindle CW control",
"sourceLines": "axis.py:1389-1398",
"expected": "spindle forward"
},
{
"id": "override-feed-down",
"action": "feed-override-down",
"sourceSymbol": "commands.set_feedrate",
"sourceLines": "axis.py:2131-2137",
"expected": "feed override down"
},
{
"id": "override-feed-up",
"action": "feed-override-up",
"sourceSymbol": "commands.set_feedrate",
"sourceLines": "axis.py:2131-2137",
"expected": "feed override up"
},
{
"id": "override-rapid-down",
"action": "rapid-override-down",
"sourceSymbol": "commands.set_rapidrate",
"sourceLines": "axis.py:2139-2145",
"expected": "rapid override down"
},
{
"id": "override-rapid-up",
"action": "rapid-override-up",
"sourceSymbol": "commands.set_rapidrate",
"sourceLines": "axis.py:2139-2145",
"expected": "rapid override up"
},
{
"id": "override-spindle-down",
"action": "spindle-override-down",
"sourceSymbol": "commands.set_spindlerate",
"sourceLines": "axis.py:2122-2129",
"expected": "spindle override down"
},
{
"id": "override-spindle-up",
"action": "spindle-override-up",
"sourceSymbol": "commands.set_spindlerate",
"sourceLines": "axis.py:2122-2129",
"expected": "spindle override up"
},
{
"id": "manual-ignore-limits",
"action": "ignore-limits",
"sourceSymbol": "commands.toggle_override_limits",
"sourceLines": "axis.py:3161",
"expected": "limit override checkbox state"
},
{
"id": "manual-block-delete",
"action": "block-delete",
"sourceSymbol": "commands.toggle_block_delete",
"sourceLines": "axis.py:2051-2059",
"expected": "block delete state"
},
{
"id": "manual-optional-stop",
"action": "optional-stop",
"sourceSymbol": "commands.toggle_optional_stop",
"sourceLines": "axis.py:2047-2049",
"expected": "optional stop state"
},
{
"id": "manual-flood",
"action": "toggle-flood",
"sourceSymbol": "commands.flood_toggle",
"sourceLines": "axis.py:3176",
"expected": "flood coolant toggle"
},
{
"id": "manual-mist",
"action": "toggle-mist",
"sourceSymbol": "commands.mist_toggle",
"sourceLines": "axis.py:3175",
"expected": "mist coolant toggle"
},
{
"id": "mdi-submit",
"action": "mdi-form",
"sourceSymbol": "commands.send_mdi",
"sourceLines": "axis.py:2413-2417",
"expected": "submit MDI command"
},
{
"id": "mdi-history",
"action": "mdi-history",
"sourceSymbol": "commands.mdi_history_butt_1",
"sourceLines": "axis.py:2499-2516",
"expected": "run/restore MDI history command"
},
{
"id": "pyvcp-identity",
"action": "kins-identity",
"sourceSymbol": "pyvcp.type0-button -> halui.mdi-command-00",
"sourceLines": "switchkins_postgui.hal",
"expected": "M429 sets identity kins"
},
{
"id": "pyvcp-tcp",
"action": "kins-tcp",
"sourceSymbol": "pyvcp.type1-button -> halui.mdi-command-01",
"sourceLines": "switchkins_postgui.hal",
"expected": "M428 sets tcp-xyzbc kins"
},
{
"id": "pyvcp-userk",
"action": "kins-userk",
"sourceSymbol": "pyvcp.type2-button -> halui.mdi-command-02",
"sourceLines": "switchkins_postgui.hal",
"expected": "M430 sets userk kins"
},
{
"id": "pyvcp-clear",
"action": "clear-preview",
"sourceSymbol": "pyvcp.vismach-clear -> vismach.plotclear",
"sourceLines": "switchkins_postgui.hal",
"expected": "clear Vismach plot"
}
],
"capabilities": [
{
"id": "program",
@@ -932,7 +1462,7 @@
"ready": true,
"evidence": {
"samplePeriodMs": 20,
"sampleCount": 3074
"sampleCount": 3226
}
},
{
@@ -950,7 +1480,108 @@
"canRunAuto": false,
"canExecuteMdi": false,
"canJog": false,
"canHome": false
"canHome": false,
"axisButtonParity": {
"sourceFile": "/home/mes123456/cnc_wams/linuxcnc/src/emc/usr_intf/axis/scripts/axis.py",
"pyvcpSourceFiles": [
"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.xml",
"configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal"
],
"requiredActions": [
"estop",
"power",
"open",
"reload",
"run-ready",
"run",
"pause",
"resume",
"step",
"stop",
"home-all",
"jog-minus",
"jog-plus",
"touch-off",
"tool-touch-off",
"spindle-forward",
"spindle-stop",
"spindle-reverse",
"feed-override-down",
"feed-override-up",
"rapid-override-down",
"rapid-override-up",
"spindle-override-down",
"spindle-override-up",
"ignore-limits",
"block-delete",
"optional-stop",
"toggle-flood",
"toggle-mist",
"mdi-form",
"mdi-history",
"kins-identity",
"kins-tcp",
"kins-userk",
"clear-preview",
"view-x",
"view-y",
"view-z",
"view-p"
],
"coveredActions": [
"open",
"reload",
"stage",
"save-session",
"restore-session",
"estop",
"power",
"home-all",
"run-ready",
"run",
"pause",
"resume",
"step",
"stop",
"view-z",
"view-y",
"view-x",
"view-p",
"clear-preview",
"audit",
"tab-manual",
"tab-mdi",
"select-joint",
"jog-increment",
"jog-minus",
"jog-plus",
"touch-off",
"tool-touch-off",
"spindle-reverse",
"spindle-stop",
"spindle-forward",
"feed-override-down",
"feed-override-up",
"rapid-override-down",
"rapid-override-up",
"spindle-override-down",
"spindle-override-up",
"ignore-limits",
"block-delete",
"optional-stop",
"toggle-flood",
"toggle-mist",
"mdi-form",
"mdi-history",
"kins-identity",
"kins-tcp",
"kins-userk"
],
"missingActions": [],
"buttonCount": 61,
"sourceReferencedCount": 61,
"ready": true
}
}
}
],
@@ -959,6 +1590,114 @@
}
}
},
{
"category": "ui",
"requirement": "web AXIS/PyVCP buttons are source-referenced and covered by a button-level parity matrix",
"status": "pass",
"evidence": {
"axisButtonParity": {
"sourceFile": "/home/mes123456/cnc_wams/linuxcnc/src/emc/usr_intf/axis/scripts/axis.py",
"pyvcpSourceFiles": [
"configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.xml",
"configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal"
],
"requiredActions": [
"estop",
"power",
"open",
"reload",
"run-ready",
"run",
"pause",
"resume",
"step",
"stop",
"home-all",
"jog-minus",
"jog-plus",
"touch-off",
"tool-touch-off",
"spindle-forward",
"spindle-stop",
"spindle-reverse",
"feed-override-down",
"feed-override-up",
"rapid-override-down",
"rapid-override-up",
"spindle-override-down",
"spindle-override-up",
"ignore-limits",
"block-delete",
"optional-stop",
"toggle-flood",
"toggle-mist",
"mdi-form",
"mdi-history",
"kins-identity",
"kins-tcp",
"kins-userk",
"clear-preview",
"view-x",
"view-y",
"view-z",
"view-p"
],
"coveredActions": [
"open",
"reload",
"stage",
"save-session",
"restore-session",
"estop",
"power",
"home-all",
"run-ready",
"run",
"pause",
"resume",
"step",
"stop",
"view-z",
"view-y",
"view-x",
"view-p",
"clear-preview",
"audit",
"tab-manual",
"tab-mdi",
"select-joint",
"jog-increment",
"jog-minus",
"jog-plus",
"touch-off",
"tool-touch-off",
"spindle-reverse",
"spindle-stop",
"spindle-forward",
"feed-override-down",
"feed-override-up",
"rapid-override-down",
"rapid-override-up",
"spindle-override-down",
"spindle-override-up",
"ignore-limits",
"block-delete",
"optional-stop",
"toggle-flood",
"toggle-mist",
"mdi-form",
"mdi-history",
"kins-identity",
"kins-tcp",
"kins-userk"
],
"missingActions": [],
"buttonCount": 61,
"sourceReferencedCount": 61,
"ready": true
}
}
},
{
"category": "ui",
"requirement": "web UI state flow, buttons, HAL pins, and paths are rechecked against native xyzbc-trt runtime",
@@ -971,7 +1710,7 @@
"states": [
{
"name": "before",
"taskState": 1,
"taskState": 4,
"taskMode": 1,
"interpState": 1,
"execState": 2,
@@ -982,7 +1721,7 @@
false,
false
],
"file": "./demos/xyzbc_switchkins.ngc"
"file": "/home/mes123456/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc"
},
{
"name": "after",
@@ -1074,10 +1813,28 @@
"status": "pass",
"evidence": {
"nativeSampleCount": 3226,
"webSampleCount": 3074,
"webSampleCount": 3226,
"unavailable": []
}
},
{
"category": "path-preview",
"requirement": "native and web preview tool paths are geometrically aligned",
"status": "pass",
"evidence": {
"thresholds": {
"maxTcpErrorMm": 0.001,
"maxJointError": 0.001,
"maxToolAxisAngleDeg": 0.001,
"sampleCountDelta": 0
},
"maxTcpErrorMm": 3.552713678800501e-15,
"rmsTcpErrorMm": 3.620348931466302e-16,
"maxJointError": 3.552713678800501e-15,
"maxToolAxisAngleDeg": 0,
"sampleCountDelta": 0
}
},
{
"category": "path-execution",
"requirement": "native and web execution path sample period is 20ms",
@@ -1112,7 +1869,7 @@
"requirement": "web preview and execution paths are comparable",
"status": "pass",
"evidence": {
"webPreviewSampleCount": 3074,
"webPreviewSampleCount": 3226,
"webExecutionSampleCount": 569,
"unavailable": []
}
@@ -1123,25 +1880,39 @@
"previewVsPreview": {
"status": "pass",
"comparable": true,
"geometricAligned": true,
"thresholds": {
"maxTcpErrorMm": 0.001,
"maxJointError": 0.001,
"maxToolAxisAngleDeg": 0.001,
"sampleCountDelta": 0
},
"periodsMatch": true,
"nativeSamplePeriodMs": 20,
"webSamplePeriodMs": 20,
"leftSampleCount": 3226,
"rightSampleCount": 3074,
"rightSampleCount": 3226,
"nativeSampleCount": 3226,
"webSampleCount": 3074,
"webSampleCount": 3226,
"unavailable": [],
"maxTcpErrorMm": 67.98043602330502,
"rmsTcpErrorMm": 32.95865162170114,
"maxJointError": 82.06891657213505,
"rmsJointError": 37.490160637344005,
"maxToolAxisAngleDeg": 19.999999999999993,
"sampleCountDelta": 152,
"maxTcpErrorMm": 3.552713678800501e-15,
"rmsTcpErrorMm": 3.620348931466302e-16,
"maxJointError": 3.552713678800501e-15,
"rmsJointError": 3.620348931466302e-16,
"maxToolAxisAngleDeg": 0,
"sampleCountDelta": 0,
"missingSamples": []
},
"executionVsExecution": {
"status": "pass",
"status": "fail",
"comparable": true,
"geometricAligned": false,
"thresholds": {
"maxTcpErrorMm": 0.001,
"maxJointError": 0.001,
"maxToolAxisAngleDeg": 0.001,
"sampleCountDelta": 0
},
"periodsMatch": true,
"nativeSamplePeriodMs": 20,
"webSamplePeriodMs": 20,
@@ -1161,6 +1932,8 @@
"previewVsExecutionNative": {
"status": "pass",
"comparable": true,
"geometricAligned": true,
"thresholds": null,
"periodsMatch": true,
"nativePreviewSamplePeriodMs": 20,
"nativeExecutionSamplePeriodMs": 20,
@@ -1178,18 +1951,20 @@
"previewVsExecutionWeb": {
"status": "pass",
"comparable": true,
"geometricAligned": true,
"thresholds": null,
"periodsMatch": true,
"webPreviewSamplePeriodMs": 20,
"webExecutionSamplePeriodMs": 20,
"leftSampleCount": 3074,
"leftSampleCount": 3226,
"rightSampleCount": 569,
"unavailable": [],
"maxTcpErrorMm": 31.575968660550437,
"rmsTcpErrorMm": 14.55884964854259,
"maxJointError": 58.498220458848685,
"rmsJointError": 20.762740311288844,
"maxTcpErrorMm": 38.30103950316296,
"rmsTcpErrorMm": 27.021770315964023,
"maxJointError": 61.12490900383208,
"rmsJointError": 30.022839681881376,
"maxToolAxisAngleDeg": 19.999999999999993,
"sampleCountDelta": 2505,
"sampleCountDelta": 2657,
"missingSamples": []
}
},