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 集成验证。
```
