继续完成 web-rtcp-5axis-sim-plan

结论:完成 LinuxCNC kinematics WASM ABI 覆盖,并将 web-rtcp-5axis-sim-plan 的 RTCP frame/boundary adapter 接到 xyzac-trt kinematics SDK;Node、build、browser smoke 验证通过。
This commit is contained in:
2026-06-21 16:44:29 +08:00
parent a6eda3fbff
commit 626bcfe8e3
101 changed files with 101586 additions and 770 deletions

233
textbak/text40.txt Normal file
View File

@@ -0,0 +1,233 @@
text40.txt
一、接续说明
执行时间2026-06-21 CST
本文件接续 `textbak/text39.txt`。`text39.txt` 的结论停留在:
```text
LinuxCNC TRT kinematics WASM ABI 已完成第一批;
LinuxCNC 全量 kinematics WASM ABI 仍未完成。
```
在其后续工作中kinematics WASM ABI 已继续推进并完成全量可加载
LinuxCNC kinematics module 覆盖。因此本文件用于纠正旧结论,记录当前
最终状态和仍然不应误判为缺口的边界。
二、准确结论
当前结论:
```text
LinuxCNC 可加载 kinematics module 的独立 WASM ABI 已完成。
LinuxCNC 已 vendored 的所有实际 kinematics forward/inverse 算法均已通过独立 ABI 导出并验证。
JavaScript/SDK 没有实现 kinematics 数学,只负责加载 WASM、分配内存、传 seed buffer、调用 C ABI。
```
需要特别说明:
```text
1. `ugenserkins.c` 不是 loadable kinematics module而是 upstream 自标注 declining usage 的 userspace test program其调用的 genserKinematicsForward/Inverse 已由 `genser` WASM module 覆盖。
2. `lineardeltakins.cc` 和 `rotarydeltakins.cc` 是 Boost.Python wrapper调用同一 common header 中的 kinematics_forward/kinematics_inverse实际 LinuxCNC module 算法已由 `lineardelta` / `rotarydelta` WASM module 覆盖。
3. `cubic.c` 是 kinematics support/interpolation utility不是独立 kinematicsForward/kinematicsInverse module。
4. `userkfuncs.c` 是 switchkins 的 user/identity fallback function set不是单独 loadrt module它已随 switchkins modules 编译进对应 WASM module。
```
三、已导出的独立 kinematics WASM modules
当前 SDK 支持并验证的 moduleId
```text
trivkins
5axiskins
xyzac-trt
xyzbc-trt
corexy
rotate
rose
max
lineardelta
rotarydelta
scorbot
tripod
scara
puma
genser
genhex
pentakins
```
当前生成的 WASM 产物共 17 个:
```text
wasm-port/build/wasm/kinematics/linuxcnc_trivkins_kinematics.wasm
wasm-port/build/wasm/kinematics/linuxcnc_5axiskins_kinematics.wasm
wasm-port/build/wasm/kinematics/linuxcnc_xyzac_trt_kinematics.wasm
wasm-port/build/wasm/kinematics/linuxcnc_xyzbc_trt_kinematics.wasm
wasm-port/build/wasm/kinematics/linuxcnc_corexy_kinematics.wasm
wasm-port/build/wasm/kinematics/linuxcnc_rotate_kinematics.wasm
wasm-port/build/wasm/kinematics/linuxcnc_rose_kinematics.wasm
wasm-port/build/wasm/kinematics/linuxcnc_max_kinematics.wasm
wasm-port/build/wasm/kinematics/linuxcnc_lineardelta_kinematics.wasm
wasm-port/build/wasm/kinematics/linuxcnc_rotarydelta_kinematics.wasm
wasm-port/build/wasm/kinematics/linuxcnc_scorbot_kinematics.wasm
wasm-port/build/wasm/kinematics/linuxcnc_tripod_kinematics.wasm
wasm-port/build/wasm/kinematics/linuxcnc_scara_kinematics.wasm
wasm-port/build/wasm/kinematics/linuxcnc_puma_kinematics.wasm
wasm-port/build/wasm/kinematics/linuxcnc_genser_kinematics.wasm
wasm-port/build/wasm/kinematics/linuxcnc_genhex_kinematics.wasm
wasm-port/build/wasm/kinematics/linuxcnc_pentakins_kinematics.wasm
```
四、ABI 入口
统一 C ABI wrapper
```text
wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_kinematics_wasm.c
```
导出函数:
```text
lckins_init
lckins_exit
lckins_type
lckins_switchable
lckins_switch
lckins_forward
lckins_inverse
lckins_run_probe
lckins_free_string
```
关键 ABI 语义:
```text
1. `lckins_forward()` 使用 `pose_out` 作为 in/out pose buffer。
这保留了 LinuxCNC genhex/pentakins 等迭代 forward kinematics 对初始 pose estimate 的要求。
2. `lckins_inverse()` 使用 `joints_out` 作为 in/out joint buffer。
这保留了 LinuxCNC genser 等迭代 inverse kinematics 对初始 joint estimate 的要求。
3. `fflags` / `iflags` 通过指针传入传出,保留 tripod/switchkins 等 flag 语义边界。
```
五、SDK 接入
SDK wrapper
```text
wasm-port/runtime/sdk/src/linuxcnc-kinematics.js
```
统一导出:
```text
wasm-port/runtime/sdk/src/index.js
```
SDK API
```text
createLinuxCncKinematicsSdk()
supportedLinuxCncKinematicsModules()
linuxCncKinematicsWasmFile(moduleId)
```
运行时方法:
```text
type()
switchable()
switchKinematics(switchkinsType)
forward(joints, { seedPose })
inverse(pose, jointCount, { seedJoints })
runProbe()
```
六、构建脚本
独立构建入口:
```text
wasm-port/tools/build_kinematics_wasm.sh
```
构建策略:
```text
1. 每个 kinematics family 单独生成一个 Emscripten module避免 LinuxCNC kinematicsForward/kinematicsInverse 同名符号冲突。
2. source 复用 vendored LinuxCNC `src/emc/kinematics`。
3. posemath-heavy modules 额外链接 vendored `src/libnml/posemath`。
4. genser 直接以 C 编译 vendored `gomath.c`,避免 C++ wrapper name mangling 造成 go_* 链接失败。
5. switchkins modules 复用 `kins_util.c`、`switchkins.c`、`userkfuncs.c`。
```
七、验证
Node/WASM 验证入口:
```text
wasm-port/tests/wasm/node/verify_kinematics_wasm.sh
wasm-port/tests/wasm/node/verify_kinematics_wasm.mjs
```
已通过命令:
```bash
source /home/cnc/emsdk/emsdk_env.sh >/dev/null && bash wasm-port/tools/build_kinematics_wasm.sh && bash wasm-port/tests/wasm/node/verify_kinematics_wasm.sh
```
通过输出:
```text
kinematics_wasm_node_smoke=ok
```
验证覆盖:
```text
1. 17 个 moduleId 列表与预期完全一致;
2. 每个 WASM module 可通过 SDK 加载;
3. 每个 module 导出 lckins_forward / lckins_inverse / lckins_run_probe
4. kinematicsType / kinematicsSwitchable 与 LinuxCNC module 预期一致;
5. trivkins / corexy / rotate / rose / max 等直接 joint roundtrip
6. lineardelta / rotarydelta / tripod / pentakins 等 pose -> inverse -> forward roundtrip
7. scorbot / puma 使用 LinuxCNC native probe pattern 做 pose roundtrip
8. scara / 5axiskins / xyzac-trt / xyzbc-trt / genser 覆盖 switchkins primary 和 identity path
9. genhex 覆盖 inverse + iterative-forward warmup path并验证 alternate switch path 可切换;
10. genser seedJoints、genhex/pentakins seedPose 语义被显式验证。
```
八、当前文件状态提醒
当前相关文件中有一部分仍是未跟踪文件,需要后续提交时纳入:
```text
wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_kinematics_wasm.c
wasm-port/runtime/sdk/src/linuxcnc-kinematics.js
wasm-port/tests/wasm/node/verify_kinematics_wasm.mjs
wasm-port/tools/build_kinematics_wasm.sh
```
相关已修改文件:
```text
wasm-port/runtime/core/shims/hal.h
wasm-port/runtime/sdk/src/index.js
wasm-port/runtime/sdk/README.md
wasm-port/docs/porting-steps-standalone.md
wasm-port/docs/compatibility-validation.md
```
九、后续建议
就“LinuxCNC 的所有逆解相关算法,导出独立 kinematics ABI”这一项而言
```text
无需继续扩展 kinematics module 列表。
下一步不应再手写或补造 JS kinematics 数学。
后续重点应转向把 Web/M4/M5 simulation UI 从 fixture/frame 逻辑接入 createLinuxCncKinematicsSdk() 输出,或继续推进 remap/planner/browser 集成验证。
```