按关节槽位驱动 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>
This commit is contained in:
2026-10-30 06:09:12 +08:00
parent af65b69b2c
commit db29ae625f
157 changed files with 11936 additions and 885 deletions

View File

@@ -0,0 +1,526 @@
{
"schema": "linuxcnc.five-axis-physical-structures/1",
"units": {
"length": "mm",
"angle": "deg",
"gltf_length": "m",
"gltf_angle": "rad"
},
"sourcePolicy": "real-reference values are not calibration values; design-reference models require explicit design_reference status",
"cases": [
{
"id": "xyzac-trt",
"family": "table-rotary-tilting",
"reference": "HERMLE C 42 U 类摆动转台",
"status": "design-plus-real-reference",
"parts": [
"base",
"x",
"y",
"z",
"tool",
"a-tilt-frame",
"c-table",
"workholding",
"guard"
],
"jointTree": "base→x→y→z→tool; base→a→c→work",
"parameters": [
"rotaryPoint",
"tiltToRotaryOffset",
"toolOffset",
"physicalZero"
],
"source": "https://www.hermle.de/en/machining-centres-automation/models/machining-centre-c-42-gen2/",
"assetPlan": {
"zeroPoseRequired": true,
"separateJointNodes": true,
"includeOriginHelpers": true,
"metadata": [
"source",
"license",
"kinematics",
"coordinates",
"zero_pose",
"joint_limits",
"calibration_status"
]
}
},
{
"id": "xyzbc-trt",
"family": "table-rotary-tilting",
"reference": "Haas UMC-500/750 B/C 摆台",
"status": "real-reference",
"parts": [
"base",
"x",
"y",
"z",
"tool",
"b-trunnion",
"c-table",
"workholding",
"guard"
],
"jointTree": "base→x→y→z→tool; base→b→c→work",
"parameters": [
"MRZP",
"bCIntersection",
"toolOffset",
"physicalZero"
],
"source": "https://www.haascnc.com/service/online-manuals/umc-series/umc---geometry.html",
"assetPlan": {
"zeroPoseRequired": true,
"separateJointNodes": true,
"includeOriginHelpers": true,
"metadata": [
"source",
"license",
"kinematics",
"coordinates",
"zero_pose",
"joint_limits",
"calibration_status"
]
}
},
{
"id": "xyzab-tdr",
"family": "table-dual-rotary",
"reference": "LinuxCNC xyzab_tdr 双转台;双转台五轴通用设计",
"status": "linuxcnc-reference-plus-design",
"parts": [
"base",
"x",
"y",
"z",
"tool",
"a-outer-table",
"b-inner-table",
"workholding"
],
"jointTree": "base→x→y→z→tool; base→a→b→work",
"parameters": [
"xRotPoint",
"yRotPoint",
"zRotPoint",
"xOffset",
"zOffset",
"toolOffset",
"physicalZero"
],
"source": "https://linuxcnc.org/docs/html/man/man9/xyzab_tdr_kins.9.html",
"assetPlan": {
"zeroPoseRequired": true,
"separateJointNodes": true,
"includeOriginHelpers": true,
"metadata": [
"source",
"license",
"kinematics",
"coordinates",
"zero_pose",
"joint_limits",
"calibration_status"
]
}
},
{
"id": "bridge-mill-5axiskins",
"family": "bridge-mill",
"reference": "FIDIA BRIDGE / AWEA Mega 5P 固定龙门双摆头",
"status": "real-reference-plus-design",
"parts": [
"foundation",
"left-column",
"right-column",
"bridge",
"x-table",
"y-carriage",
"z-ram",
"b-head",
"c-head",
"y-left-drive",
"y-right-drive"
],
"jointTree": "base→x→y→z→b→c→tool; y-left/y-right duplicate gantry joints; w is a tool-direction coordinate",
"parameters": [
"jointCoordinateMap",
"duplicateAxisMap",
"toolDirectionAxis",
"toolOffset",
"physicalZero"
],
"source": "https://www.fidia.it/en/products/bridge/",
"assetPlan": {
"zeroPoseRequired": true,
"separateJointNodes": true,
"includeOriginHelpers": true,
"metadata": [
"source",
"license",
"kinematics",
"coordinates",
"zero_pose",
"joint_limits",
"calibration_status"
]
}
},
{
"id": "max5-maxkins",
"family": "table-and-head-rotary",
"reference": "LinuxCNC MAX5 桌面五轴:B 倾转头+C 水平转台",
"status": "linuxcnc-reference-plus-design",
"parts": [
"base",
"x",
"y",
"z",
"b-head",
"tool",
"c-horizontal-table",
"workholding"
],
"jointTree": "base→x→y→z→b→tool; base→c→work",
"parameters": [
"pivotLength",
"rotaryCenters",
"uvwTransform",
"toolOffset",
"physicalZero"
],
"source": "https://linuxcnc.org/docs/master/html/man/man9/kins.9.html",
"assetPlan": {
"zeroPoseRequired": true,
"separateJointNodes": true,
"includeOriginHelpers": true,
"metadata": [
"source",
"license",
"kinematics",
"coordinates",
"zero_pose",
"joint_limits",
"calibration_status"
]
}
},
{
"id": "hexapod-genhexkins",
"family": "parallel-platform",
"reference": "Giddings & Lewis Variax 六支链平台",
"status": "real-reference-plus-design",
"parts": [
"base-platform",
"strut-1",
"strut-2",
"strut-3",
"strut-4",
"strut-5",
"strut-6",
"moving-platform",
"spindle",
"tool"
],
"jointTree": "base→six independent struts→moving-platform→tool",
"parameters": [
"baseJointPoints",
"platformJointPoints",
"spindleOffset",
"screwLead",
"iterationLimits",
"physicalZero"
],
"source": "https://collection.sciencemuseumgroup.org.uk/objects/co8003352/pair-of-hexapod-legs-used-with-the-variax-machine-tool-made-by-giddings-lewis-of-wisconsin-in-1993",
"assetPlan": {
"zeroPoseRequired": true,
"separateJointNodes": true,
"includeOriginHelpers": true,
"metadata": [
"source",
"license",
"kinematics",
"coordinates",
"zero_pose",
"joint_limits",
"calibration_status"
]
}
},
{
"id": "pentapod-pentakins",
"family": "parallel-platform",
"reference": "METROM Pentapod P-Series",
"status": "real-reference-plus-design",
"parts": [
"base-frame",
"strut-1",
"strut-2",
"strut-3",
"strut-4",
"strut-5",
"moving-platform",
"spindle",
"tool"
],
"jointTree": "base→five independent struts→platform→tool",
"parameters": [
"baseJointPoints",
"effectorGeometry",
"toolOffset",
"convergenceCriterion",
"physicalZero"
],
"source": "https://metrom.com/5-axis-machining-center/",
"assetPlan": {
"zeroPoseRequired": true,
"separateJointNodes": true,
"includeOriginHelpers": true,
"metadata": [
"source",
"license",
"kinematics",
"coordinates",
"zero_pose",
"joint_limits",
"calibration_status"
]
}
},
{
"id": "puma-pumakins",
"family": "serial-robot",
"reference": "Unimation PUMA 560 类六轴机器人",
"status": "real-reference",
"parts": [
"base",
"j1-turntable",
"j2-shoulder",
"j3-elbow",
"j4-wrist-roll",
"j5-wrist-pitch",
"j6-wrist-yaw",
"flange",
"tool"
],
"jointTree": "base→j1→j2→j3→j4→j5→j6→tool",
"parameters": [
"A2",
"A3",
"D3",
"D4",
"D6",
"jointLimits",
"toolOffset",
"physicalZero"
],
"source": "https://www.linuxcnc.org/docs/html/motion/switchkins.html",
"assetPlan": {
"zeroPoseRequired": true,
"separateJointNodes": true,
"includeOriginHelpers": true,
"metadata": [
"source",
"license",
"kinematics",
"coordinates",
"zero_pose",
"joint_limits",
"calibration_status"
]
}
},
{
"id": "puma-genserkins",
"family": "serial-robot",
"reference": "PUMA 560 Modified-DH 六轴机器人",
"status": "real-reference-plus-design",
"parts": [
"base",
"j1",
"j2",
"j3",
"j4",
"j5",
"j6",
"flange",
"tool"
],
"jointTree": "base→j1→j2→j3→j4→j5→j6→tool",
"parameters": [
"DHParameters",
"jointLimits",
"toolOffset",
"physicalZero"
],
"source": "https://www.linuxcnc.org/docs/master/html/fr/man/man9/kins.9.html",
"assetPlan": {
"zeroPoseRequired": true,
"separateJointNodes": true,
"includeOriginHelpers": true,
"metadata": [
"source",
"license",
"kinematics",
"coordinates",
"zero_pose",
"joint_limits",
"calibration_status"
]
}
},
{
"id": "trivkins-xyzab",
"family": "identity-baseline",
"reference": "通用立式五轴双转台验证机",
"status": "design-reference",
"parts": [
"base",
"x",
"y",
"z",
"tool",
"a-frame",
"b-table",
"workholding"
],
"jointTree": "base→x→y→z→tool; base→a→b→work",
"parameters": [
"coordinateOrder",
"duplicateAxisMap",
"physicalZero"
],
"source": null,
"assetPlan": {
"zeroPoseRequired": true,
"separateJointNodes": true,
"includeOriginHelpers": true,
"metadata": [
"source",
"license",
"kinematics",
"coordinates",
"zero_pose",
"joint_limits",
"calibration_status"
]
}
},
{
"id": "trivkins-xyzcw",
"family": "identity-baseline",
"reference": "通用桥式 C/W 刀向补偿验证机",
"status": "design-reference",
"parts": [
"base",
"x",
"y",
"z",
"tool",
"c-table",
"w-tool-sleeve",
"workholding"
],
"jointTree": "base→x→y→z→tool; base→c→work; tool→w→tip",
"parameters": [
"coordinateOrder",
"toolDirectionAxis",
"physicalZero"
],
"source": null,
"assetPlan": {
"zeroPoseRequired": true,
"separateJointNodes": true,
"includeOriginHelpers": true,
"metadata": [
"source",
"license",
"kinematics",
"coordinates",
"zero_pose",
"joint_limits",
"calibration_status"
]
}
},
{
"id": "trivkins-xyzya",
"family": "identity-gantry-rotary",
"reference": "双 Y 龙门+A 转台验证机",
"status": "design-reference",
"parts": [
"base",
"x",
"y-left",
"y-right",
"z",
"tool",
"a-table",
"workholding"
],
"jointTree": "five joints: x,y-left,z,y-right,a; y-left/y-right drive one gantry axis",
"parameters": [
"coordinateOrder",
"duplicateAxisMap",
"gantrySynchronization",
"physicalZero"
],
"source": null,
"assetPlan": {
"zeroPoseRequired": true,
"separateJointNodes": true,
"includeOriginHelpers": true,
"metadata": [
"source",
"license",
"kinematics",
"coordinates",
"zero_pose",
"joint_limits",
"calibration_status"
]
}
},
{
"id": "scorbot-kins",
"family": "serial-robot",
"reference": "SCORBOT-ER 4U/ER 4PC 五关节机器人",
"status": "real-reference-plus-design",
"parts": [
"base",
"j1-base-turn",
"j2-shoulder",
"j3-elbow",
"j4-pitch",
"j5-wrist-roll",
"flange",
"tool"
],
"jointTree": "base→j1→j2→j3→j4→j5→tool",
"parameters": [
"robotLinkParameters",
"jointLimits",
"toolOffset",
"physicalZero"
],
"source": "https://www.theoldrobots.com/book45/USBC-document.pdf",
"assetPlan": {
"zeroPoseRequired": true,
"separateJointNodes": true,
"includeOriginHelpers": true,
"metadata": [
"source",
"license",
"kinematics",
"coordinates",
"zero_pose",
"joint_limits",
"calibration_status"
]
}
}
]
}