Files
linuxcncWebWASM/web/workspace/five-axis-machine-catalog.json
wangdequan db29ae625f 按关节槽位驱动 13 个五轴案例的三维模型
关节契约扩为槽位制:以 LinuxCNC 联合号标识关节,轴字母降为槽位属性,
重复轴(bridge-mill 的两个 Y)、并联杆长(hexapod/pentapod)和被动槽位
(max5 第 6 关节)都能表达。v1 规则保持不变并合成 jointOrder,已保存
GLB 与既有测试不受影响。

13 个结构 GLB 由 scripts/generate_physical_case_glbs.mjs 统一重建,
可动关节均为按槽位命名的 Group 并写 userData.linuxcncJoint,共 71 个
关节,槽位数与运行目录的 joint_count 逐条一致。

新增 machine-visual-bindings.json 与纯函数模块,以 machine id 为键:
坐标字母不能作键,因为三个案例共用 XYZAB、三个共用 XYZABC。主界面切换
案例时自动装载对应模型,失败时保留内置模型并显式提示。

消除前端五关节截断:visual 适配器的 joints 改为数组并新增
jointsAuthoritative;allHomed 按 joint_count 判断;面板按 worker 断言的
machine id 查找机型。

管理器解锁:坐标与案例下拉以"存在完整视觉绑定"为启用条件,13 案例全部
可选;machine-urdf.ts 新增 generic-wasm/1 profile,AC/BC 严格校验路径
不变;新增 machine-kinematics-specs.json 保存逐关节限位,INI 未声明的
限位保持 null 而不编造。

修复三个真实缺陷:构建漏发 woodpecker/gmoccapy/qtdragon 配置目录(
DEFECT-02 根因);案例切换沿用"装载需要已上电"的门控,导致关机状态下
第二次切换被静默拒绝;重复轴机型上 React 列表键冲突。

验收:13 案例逐个切换装载成功、槽位键与绑定定义逐一一致、浏览器错误 0;
typecheck 与生产构建通过;视觉绑定、GLB 命名、关节契约、投影、store、
双画布、运动学规格漂移、11 案例 Worker 闭环、管理器浏览器回归全部通过。
证据在 coverage/glb-machine-manager/physical-drive/。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-30 06:09:12 +08:00

363 lines
14 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"schema": "linuxcnc.five-axis-machine-catalog/1",
"sourceRoot": "linuxcnc",
"officialSources": [
{
"title": "LinuxCNC 5-Axis Kinematics",
"url": "https://linuxcnc.org/docs/html/motion/5-axis-kinematics.html"
},
{
"title": "LinuxCNC kins(9)",
"url": "https://linuxcnc.org/docs/html/man/man9/kins.9.html"
},
{
"title": "LinuxCNC switchable kinematics",
"url": "https://linuxcnc.org/docs/html/motion/switchkins.html"
}
],
"cases": [
{
"id": "xyzac-trt",
"label": "XYZAC · 转台倾转(A/C)",
"family": "table-rotary-tilting",
"machineClass": "five-axis-mill",
"coordinates": "XYZAC",
"joints": 5,
"kinematics": "xyzac-trt-kins",
"rtcp": "native",
"webWasm": "supported",
"description": "A 轴绕 X 倾转,C 轴绕 Z 回转,工件安装在复合转台上。",
"localCases": [
"linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini",
"linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc",
"linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc",
"linuxcnc/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/xyzac-trt.ini",
"linuxcnc/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/boat-xyzac.ngc",
"linuxcnc/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/impeller-7bl-xyzac.ngc",
"linuxcnc/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/test-xyzac.ngc"
],
"kinematicsSource": "linuxcnc/src/emc/kinematics/xyzac-trt-kins.c",
"designParameters": [
"rotaryPoint",
"tiltToRotaryOffset",
"toolOffset",
"physicalZero"
],
"physicalStructureRef": "five-axis-physical-structures.json#xyzac-trt"
},
{
"id": "xyzbc-trt",
"label": "XYZBC · 转台倾转(B/C)",
"family": "table-rotary-tilting",
"machineClass": "five-axis-mill",
"coordinates": "XYZBC",
"joints": 5,
"kinematics": "xyzbc-trt-kins",
"rtcp": "native",
"webWasm": "supported",
"description": "B 轴绕 Y 倾转,C 轴绕 Z 回转,适合 BC 类转台或相应摆头结构。",
"localCases": [
"linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini",
"linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc",
"linuxcnc/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/test-xyzbc.ngc",
"linuxcnc/configs/sim/gmoccapy/non_trivial_kinematics/table-rotary-tilting/examples/boat-xyzbc.ngc"
],
"kinematicsSource": "linuxcnc/src/emc/kinematics/xyzbc-trt-kins.c",
"designParameters": [
"rotaryPoint",
"tiltToRotaryOffset",
"toolOffset",
"physicalZero"
],
"physicalStructureRef": "five-axis-physical-structures.json#xyzbc-trt"
},
{
"id": "xyzab-tdr",
"label": "XYZAB · 双转台(A/B)",
"family": "table-dual-rotary",
"machineClass": "five-axis-mill",
"coordinates": "XYZAB",
"joints": 5,
"kinematics": "xyzab_tdr_kins",
"rtcp": "native-linuxcnc",
"webWasm": "adapter-required",
"description": "A/B 两个转轴组成双转台,源码案例包含旋转点、X/Z 偏置和 TCP 演示。",
"localCases": [
"linuxcnc/configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini",
"linuxcnc/configs/sim/axis/vismach/5axis/table-dual-rotary/demos/xyzab-tdr-demo.ngc",
"linuxcnc/configs/sim/gmoccapy/gmoccapy_XYZAB.ini",
"linuxcnc/configs/sim/qtdragon/qtdragon_xyz45/qtdragon_xyzab.ini"
],
"kinematicsSource": "linuxcnc/src/hal/components/xyzab_tdr_kins.comp",
"designParameters": [
"xRotPoint",
"yRotPoint",
"zRotPoint",
"xOffset",
"zOffset",
"toolOffset",
"physicalZero"
],
"physicalStructureRef": "five-axis-physical-structures.json#xyzab-tdr"
},
{
"id": "bridge-mill-5axiskins",
"label": "Bridge Mill · 5axiskins(XYZBCW/Y)",
"family": "bridge-mill",
"machineClass": "five-axis-mill-with-extra-coordinate",
"coordinates": "XYZBCWY",
"joints": 7,
"kinematics": "5axiskins",
"rtcp": "native-linuxcnc",
"webWasm": "adapter-required",
"description": "桥式五轴机床,B/C 为姿态轴,W 为刀具方向运动;示例还演示 Y 轴双关节。",
"localCases": [
"linuxcnc/configs/sim/axis/vismach/5axis/bridgemill/5axis.ini",
"linuxcnc/configs/sim/axis/vismach/5axis/bridgemill/5axisgui.ngc",
"linuxcnc/configs/sim/gmoccapy/gmoccapy_XYZCW.ini"
],
"kinematicsSource": "linuxcnc/src/emc/kinematics/5axiskins.c",
"designParameters": [
"jointCoordinateMap",
"duplicateAxisMap",
"toolDirectionAxis",
"toolOffset",
"physicalZero"
],
"physicalStructureRef": "five-axis-physical-structures.json#bridge-mill-5axiskins"
},
{
"id": "max5-maxkins",
"label": "MAX5 · maxkins(XYZBC)",
"family": "table-and-head-rotary",
"machineClass": "five-axis-mill",
"coordinates": "XYZBC",
"joints": 6,
"kinematics": "maxkins",
"rtcp": "native-linuxcnc",
"webWasm": "adapter-required",
"description": "LinuxCNC 的 MAX5 非恒等五轴案例;同时提供 trivkins 对照配置,适合验证坐标映射。",
"localCases": [
"linuxcnc/configs/sim/axis/vismach/5axis/max5/max5kins.ini",
"linuxcnc/configs/sim/axis/vismach/5axis/max5/max5triv.ini",
"linuxcnc/configs/sim/axis/vismach/5axis/max5/README",
"linuxcnc/configs/sim/gmoccapy/gmoccapy_XYZAB.ini"
],
"kinematicsSource": "linuxcnc/src/emc/kinematics/maxkins.c",
"designParameters": [
"rotaryAxisOrder",
"rotaryCenters",
"uvwTransform",
"toolOffset",
"physicalZero"
],
"physicalStructureRef": "five-axis-physical-structures.json#max5-maxkins"
},
{
"id": "hexapod-genhexkins",
"label": "Hexapod · genhexkins(Stewart 平台)",
"family": "parallel-platform",
"machineClass": "six-dof-rtcp-capable",
"coordinates": "XYZABC",
"joints": 6,
"kinematics": "genhexkins",
"rtcp": "native-linuxcnc",
"webWasm": "adapter-required",
"description": "六支链并联平台,具有 XYZABC 六自由度;它是五轴 CAM/RTCP 可覆盖的六自由度机型。",
"localCases": [
"linuxcnc/configs/sim/axis/vismach/hexapod-sim/hexapod.ini",
"linuxcnc/configs/sim/axis/vismach/hexapod-sim/kinematics.hal",
"linuxcnc/configs/sim/axis/vismach/hexapod-sim/README",
"linuxcnc/src/emc/kinematics/genhexkins.c"
],
"kinematicsSource": "linuxcnc/src/emc/kinematics/genhexkins.c",
"designParameters": [
"baseJointPoints",
"platformJointPoints",
"spindleOffset",
"screwLead",
"iterationLimits",
"physicalZero"
],
"physicalStructureRef": "five-axis-physical-structures.json#hexapod-genhexkins"
},
{
"id": "pentapod-pentakins",
"label": "Pentapod · pentakins(五支链平台)",
"family": "parallel-platform",
"machineClass": "five-axis-parallel",
"coordinates": "XYZAB",
"joints": 5,
"kinematics": "pentakins",
"rtcp": "native-linuxcnc",
"webWasm": "adapter-required",
"description": "五支链并联平台,LinuxCNC 源码提供 base/effector 几何参数和迭代求解案例。",
"localCases": [
"linuxcnc/configs/sim/axis/pentapod/pentapod.ini",
"linuxcnc/configs/sim/axis/pentapod/kinematics.hal",
"linuxcnc/configs/sim/axis/pentapod/README",
"linuxcnc/src/emc/kinematics/pentakins.c"
],
"kinematicsSource": "linuxcnc/src/emc/kinematics/pentakins.c",
"designParameters": [
"baseJointPoints",
"effectorGeometry",
"toolOffset",
"convergenceCriterion",
"physicalZero"
],
"physicalStructureRef": "five-axis-physical-structures.json#pentapod-pentakins"
},
{
"id": "puma-pumakins",
"label": "PUMA · pumakins(串联机器人)",
"family": "serial-robot",
"machineClass": "six-axis-robot",
"coordinates": "XYZABC",
"joints": 6,
"kinematics": "pumakins",
"rtcp": "robot-tool-center-point",
"webWasm": "adapter-required",
"description": "PUMA 型六关节串联机器人;可承载五轴刀具姿态任务,但不是五关节铣床拓扑。",
"localCases": [
"linuxcnc/configs/sim/axis/vismach/puma/puma.ini",
"linuxcnc/configs/sim/axis/vismach/puma/puma_cube.ini",
"linuxcnc/configs/sim/axis/vismach/puma/puma_cube.ngc",
"linuxcnc/src/emc/kinematics/pumakins.c"
],
"kinematicsSource": "linuxcnc/src/emc/kinematics/pumakins.c",
"designParameters": [
"A2",
"A3",
"D3",
"D4",
"toolOffset",
"physicalZero"
],
"physicalStructureRef": "five-axis-physical-structures.json#puma-pumakins"
},
{
"id": "puma-genserkins",
"label": "PUMA 560 · genserkins(DH 串联)",
"family": "serial-robot",
"machineClass": "six-axis-robot",
"coordinates": "XYZABC",
"joints": 6,
"kinematics": "genserkins",
"rtcp": "robot-tool-center-point",
"webWasm": "adapter-required",
"description": "PUMA 560 的通用串联运动学案例,用 DH 参数描述各关节。",
"localCases": [
"linuxcnc/configs/sim/axis/vismach/puma/puma560.ini",
"linuxcnc/configs/sim/axis/vismach/puma/puma560_uvw.ini",
"linuxcnc/configs/sim/axis/vismach/puma/puma560_dh.hal",
"linuxcnc/src/emc/kinematics/genserkins.c"
],
"kinematicsSource": "linuxcnc/src/emc/kinematics/genserkins.c",
"designParameters": [
"DHParameters",
"jointLimits",
"toolOffset",
"physicalZero"
],
"physicalStructureRef": "five-axis-physical-structures.json#puma-genserkins"
},
{
"id": "trivkins-xyzab",
"label": "XYZAB · trivkins(直角坐标映射基线)",
"family": "identity-baseline",
"machineClass": "five-axis-linear-or-rotary",
"coordinates": "XYZAB",
"joints": 5,
"kinematics": "trivkins",
"rtcp": "none",
"webWasm": "identity-only",
"description": "五轴一一对应的基线案例,用于校验 GLB 关节树和坐标映射;本身不提供非线性 RTCP。",
"localCases": [
"linuxcnc/configs/sim/qtdragon/qtdragon_xyz45/qtdragon_xyzab.ini",
"linuxcnc/configs/sim/woodpecker/woodpecker_xyzab.ini",
"linuxcnc/configs/sim/axis/vismach/5axis/max5/max5triv.ini",
"linuxcnc/src/emc/kinematics/trivkins.c"
],
"kinematicsSource": "linuxcnc/src/emc/kinematics/trivkins.c",
"designParameters": [
"coordinateOrder",
"duplicateAxisMap",
"physicalZero"
],
"physicalStructureRef": "five-axis-physical-structures.json#trivkins-xyzab"
},
{
"id": "trivkins-xyzcw",
"label": "XYZCW · trivkins(C/W 直角坐标基线)",
"family": "identity-baseline",
"machineClass": "five-axis-linear-or-rotary",
"coordinates": "XYZCW",
"joints": 5,
"kinematics": "trivkins",
"rtcp": "none",
"webWasm": "identity-only",
"description": "以 C 回转和 W 刀具方向坐标组成的五坐标基线,用于验证非标准字母顺序和显示映射。",
"localCases": [
"linuxcnc/configs/sim/gmoccapy/gmoccapy_XYZCW.ini",
"linuxcnc/src/emc/kinematics/trivkins.c"
],
"kinematicsSource": "linuxcnc/src/emc/kinematics/trivkins.c",
"designParameters": [
"coordinateOrder",
"toolDirectionAxis",
"physicalZero"
],
"physicalStructureRef": "five-axis-physical-structures.json#trivkins-xyzcw"
},
{
"id": "trivkins-xyzya",
"label": "XYZYA · trivkins(双 Y/旋转 A 基线)",
"family": "identity-gantry-rotary",
"machineClass": "five-axis-linear-or-rotary",
"coordinates": "XYZYA",
"joints": 5,
"kinematics": "trivkins",
"rtcp": "none",
"webWasm": "identity-only",
"description": "XYZYA 五坐标示例,包含 Y 轴与旋转 A 轴的自定义轴序,用于验证重复/非标准轴映射。",
"localCases": [
"linuxcnc/configs/sim/qtdragon/qtdragon_multi_joint/qtdragon_xyzya.ini",
"linuxcnc/configs/sim/woodpecker/woodpecker_xyzya.ini",
"linuxcnc/src/emc/kinematics/trivkins.c"
],
"kinematicsSource": "linuxcnc/src/emc/kinematics/trivkins.c",
"designParameters": [
"coordinateOrder",
"duplicateAxisMap",
"physicalZero"
],
"physicalStructureRef": "five-axis-physical-structures.json#trivkins-xyzya"
},
{
"id": "scorbot-kins",
"label": "SCORBOT · scorbot-kins(五关节串联)",
"family": "serial-robot",
"machineClass": "five-joint-robot",
"coordinates": "XYZAB",
"joints": 5,
"kinematics": "scorbot-kins",
"rtcp": "robot-tool-center-point",
"webWasm": "adapter-required",
"description": "LinuxCNC 源码附带的五关节 SCORBOT 配置候选,属于机器人运动学,不应按五轴铣床 TRT 处理。",
"localCases": [
"linuxcnc/configs/sim/axis/vismach/scorbot/scorbot.ini",
"linuxcnc/src/emc/kinematics/scorbot-kins.c"
],
"kinematicsSource": "linuxcnc/src/emc/kinematics/scorbot-kins.c",
"designParameters": [
"robotLinkParameters",
"jointLimits",
"toolOffset",
"physicalZero"
],
"physicalStructureRef": "five-axis-physical-structures.json#scorbot-kins"
}
]
}