Files
cnc_wams/web-rtcp-5axis-sim-plan/docs/implementation-plan.md

398 lines
16 KiB
Markdown
Raw Permalink 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.
# 基于 Web 的 RTCP 五轴联动数控系统仿真实现方案
生成时间2026-06-20 CST
## 1. 项目定位
本项目建设一个独立的 Web 数控系统仿真界面,重点支持五轴联动与 RTCP/TCP 模式展示。系统以 LinuxCNC 源码、`configs/sim` 案例和 LinuxCNC Python 图形界面程序为参考基础,复用当前项目已经完成的 WASM、OPFS、virtual HAL、AXIS 风格 UI、G-code 执行仿真和 5 轴 source coverage 成果。
边界必须清晰:
- 这是 Web 数控系统仿真,不是硬实时机床控制器。
- 浏览器不直接驱动真实伺服、IO 或 Linux kernel realtime ABI。
- G-code 解释、canonical event、五轴运动学、remap 语义、tool/parameter 行为应尽量保持 LinuxCNC-owned。
- JavaScript 只做 UI、会话、文件 staging、WASM 调用、状态编排和可视化映射。
- 前端界面采用原生 HTML/CSS + TypeScript/JavaScript ES modules不使用 React/Vue 等 UI 框架。
- LinuxCNC Python GUI 是界面和仿真结构参考,不是浏览器 runtime 依赖Web 侧不直接运行 Tk/OpenGLTk、PyQt、GTK/Glade 或 native HAL GUI 进程。
## 2. 当前项目完成情况基线
当前 `wasm-port` 已经具备以下可继承能力:
- 浏览器真实仿真页面:`wasm-port/runtime/ui/simulation/index.html` 已实现 AXIS 风格界面、程序选择、编辑器、DRO、状态栏、Three.js 预览、播放控制和 browser smoke。
- LinuxCNC 解释器 WASM已有 `createLinuxCncInterpSdk()` 路径,可运行内置和用户输入的 G-code并输出 LinuxCNC canonical 事件。
- OPFS/session已有 INI、参数文件、刀具表、G-code 程序、会话快照的浏览器侧持久化和加载工作流。
- virtual HAL已有仿真级 HAL pin/signal/param、halcmd 风格命令、motion feedback stepping 和浏览器状态展示。
- 5 轴源码覆盖:已 vendored LinuxCNC `5axiskins.c``trtfuncs.c``xyzac-trt-kins.c``xyzbc-trt-kins.c``switchkins.*``userkfuncs.c` 等,且 source reuse 文档明确这些文件的验证边界。
- 5 轴案例覆盖:已纳入 LinuxCNC `configs/sim/axis/vismach/5axis/bridgemill``table-dual-rotary``table-rotary-tilting` 的 INI/HAL/NGC/remap assets。
- 当前 sim config inventory 基线:`executed=82``passed=82``skipped=77``unexpected_fail=0`77 个 skipped row 已有实现覆盖账本,但不是全部 promotion。
- 本地 LinuxCNC 源码中可参考 Python 图形界面:`src/emc/usr_intf/axis/scripts/axis.py``lib/python/vismach.py``configs/sim/axis/vismach/5axis/*``configs/sim/gmoccapy/*``configs/sim/qtvcp_screens/*`
未完成或不能直接宣称完成的点:
- RTCP/TCP 五轴联动还没有作为独立 Web 产品能力完整闭环。
- 当前浏览器页面主要是通用 AXIS 风格仿真,还不是专门的五轴/RTCP 操作界面。
- TRT/bridge 五轴运动学虽然有 source coverage 和 probe 基础,但需要形成面向 UI 的统一五轴 pose/joint/TCP 数据模型。
- 任意 Python remap、任意 external user-M host process、host tool DB process 等 hard block 仍不能伪装成浏览器 PASS`tool.tbl` 和白名单 user-M 只允许在 `web_simulation_only` 边界内仿真。
- Python GUI 的 native 控件、HAL component 进程、Tk/PyQt/GTK 主循环和 OpenGLTk 不能直接作为 Web 运行时使用,需要转换成 Web 组件、Three.js 场景和 virtual HAL 数据绑定。
## 3. LinuxCNC 参考案例选择
第一阶段建议聚焦 LinuxCNC 已有 5 轴 sample不泛化到任意机型。
优先参考案例:
```text
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
configs/sim/axis/vismach/5axis/bridgemill/5axis.ini
configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini
```
优先参考源码:
```text
src/emc/kinematics/trtfuncs.c
src/emc/kinematics/xyzac-trt-kins.c
src/emc/kinematics/xyzbc-trt-kins.c
src/emc/kinematics/5axiskins.c
src/emc/kinematics/switchkins.c
src/emc/kinematics/switchkins.h
src/emc/kinematics/userkfuncs.c
src/emc/kinematics/kins_util.c
```
关键 LinuxCNC 机制:
- `M428`:切换到 TCP/RTCP 相关五轴运动学模式,示例中设置 `motion.switchkins-type=1`
- `M429`:恢复 identity/trivkins 模式,示例中设置 `motion.switchkins-type=0`
- `M430`:切换到 user kinematics作为后续扩展不作为第一阶段必做。
- `HAL_PIN_VARS=1`remap 子程序通过 `_hal[motion.switchkins-type]` 读取 HAL 状态。
- `M68`/`M66`:设置 analog output 并同步 HAL 状态。
- TRT 参数:`x-rot-point``y-rot-point``z-rot-point``x/y/z-offset``tool-offset``conventional-directions`
## 4. Python 图形界面参考范围
LinuxCNC 的五轴仿真界面大量使用 Python 图形界面程序和 XML/HAL 配置组合。Web 项目应参考这些界面形态,但不把 Python GUI 作为浏览器依赖。
优先参考对象:
```text
src/emc/usr_intf/axis/scripts/axis.py
lib/python/vismach.py
configs/sim/axis/vismach/5axis/bridgemill/5axis.xml
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.xml
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.xml
configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.xml
configs/sim/axis/vismach/5axis/*/*postgui.hal
configs/sim/gmoccapy/gmoccapy_XYZAC.ini
configs/sim/qtvcp_screens/qtdragon/*
```
可借鉴的界面能力:
- AXIS 的菜单、工具栏、Manual/MDI、预览、DRO、G-code 高亮、状态栏。
- vismach 的层级机床模型:`Translate``Rotate``HalTranslate``HalRotate`,通过 HAL pin 驱动几何体姿态。
- PyVCP XML 的 `SWITCHKINS` 多状态标签、`TCP:XYZAC`/`IDENTITY`/`USERK` 按钮、joint 数值显示和 `vismach-clear` 操作。
- gmoccapy 的操作员面板、jog increment、override、嵌入式右侧面板和多轴配置。
- QtVCP/QtDragon 的现代面板布局、探测/刀具/状态区和大屏操作方式。
- LinuxCNC 文档中已有实际界面截图,可先用 `docs/linuxcnc-gui-reference-gallery.md` 中的图册做界面选型。
Web 转换规则:
```text
Python Tk/OpenGLTk/PyQt/GTK 控件 -> Web components
vismach OpenGL scene graph -> Three.js scene graph
HAL pin widget binding -> virtual HAL subscription/render binding
PyVCP XML controls -> declarative Web panel schema
AXIS/gmoccapy workflow -> browser operator workflow
native GUI process -> no direct browser dependency
```
前端实现规则:
```text
HTML/CSS: 页面结构、布局、主题、响应式约束
TypeScript/JavaScript ES modules: UI 控件、状态订阅、WASM/OPFS 调用、事件编排
Three.js: 五轴机床和刀路 3D 预览
Web Worker: LinuxCNC interpreter/kinematics WASM 计算隔离
Vite/esbuild: 只做开发服务器、TypeScript 编译和模块打包
```
禁止引入 React/Vue 等框架作为默认 UI 架构,避免把 CNC runtime 状态包进框架生命周期,增加调试和验证复杂度。
## 5. 总体架构
建议独立项目采用四层架构。
### 5.1 Web UI 层
职责:
- 五轴数控系统主界面;
- 程序编辑/加载/保存;
- 机床配置选择;
- RTCP 开关状态、kins 类型、刀具长度、旋转中心、A/B/C 角度展示;
- DRO、关节坐标、工件坐标、TCP 坐标、距离到达、运行状态;
- 三维机床模型、刀具姿态、刀尖中心点轨迹、已执行轨迹与完整轨迹;
- 报警、边界、未支持功能提示。
界面首选按 `gmoccapy_5_axis.png` 的工业操作台风格实现,并同时吸收 vismach/PyVCP/QtVCP 的界面结构。新项目界面要更偏向“五轴联动仿真工作台”:
```text
顶部gmoccapy 风格标题栏,显示 machine/profile/session/run state
左侧:黑底 Three.js 五轴机床和 TCP 刀路预览
右上:大号绿色 DRO显示 X/Y/Z/A/B/C、TCP、RTCP、DTG
中右G-code 当前行列表和运行进度
右侧:竖向模式按钮栏,参考 gmoccapy 大按钮
中下tool info / G-code properties / RTCP diagnostics tabs
下方velocity、rapid/feed override、coolant、spindle 面板
底部open、reload、run、stop、pause、step、home、fullscreen
```
额外要求:
- 左侧或右侧保留 PyVCP 风格的 `SWITCHKINS` 面板,清楚显示 `IDENTITY``TCP:XYZAC``TCP:XYZBC``USERK`
- DRO 同时显示 axis pose、joint pose、TCP pose不把关节坐标和工件坐标混在一起。
- Three.js 机床模型按 vismach 层级构建,所有旋转/平移节点都能追溯到 HAL pin 或 kinematics frame。
- 操作按钮参考 AXIS/gmoccapy 的 F1/F2/home/jog/run/step/stop/reset 逻辑,但只触发仿真 runtime。
### 5.2 Web Runtime/Session 层
职责:
- OPFS 会话管理;
- INI、HAL、tool table、parameter、G-code 文件 staging
- 运行模式管理standalone、machine-session、5axis-rtcp-session
- program run summary
- status/event history
- diagnostics artifact。
已有 `runtime/opfs` 能作为参考,但新目录后续应建立独立命名空间,避免直接把原页面做成越来越大的单文件。
### 5.3 LinuxCNC WASM/Source Boundary 层
职责:
- 调用 LinuxCNC 解释器 WASM
- 调用 LinuxCNC 五轴运动学 C/WASM ABI
- 提供 `forwardKinematics()``inverseKinematics()``switchKinsType()` 这类窄接口;
- 捕获 canonical events、modal state、named parameters、tool offsets
- 输出 source-derived motion frames。
关键要求:
```text
RTCP/五轴姿态计算必须优先由 vendored LinuxCNC kinematics 源码编译到 WASM 暴露;
JavaScript 不直接复写 trtfuncs.c / 5axiskins.c 的公式作为最终语义源。
```
### 5.4 Visualization/Playback 层
职责:
- 将 LinuxCNC 输出的 motion frame 映射为 Three.js 对象;
- 插值播放已验证 motion events
- 显示 TCP 点、刀轴向量、刀具长度补偿、旋转中心、工作台/主轴姿态;
- 区分 programmed path、joint path、TCP executed path
- 显示 RTCP on/off 对比。
- 用 Three.js 重建 vismach 的机床树,不直接移植 Python OpenGLTk 绘制代码。
- 支持显示 PyVCP/vismach 示例中的旋转中心、偏置点、真实旋转点、刀具长度和关节反馈。
注意:插值只用于显示,不能成为新的运动规划器。
## 6. RTCP 功能实现定义
本项目中的 RTCP 功能定义为仿真级 RTCP/TCP 能力:
- 读取或配置五轴机床类型XYZAC、XYZBC、XYZBCW、XYZAB 等;
- 能识别 `M428/M429` 或 UI 切换产生的 kinstype 状态;
- 在 RTCP 模式下,以刀尖中心点为显示核心,展示旋转轴变化时 TCP 位置保持或按程序轨迹运动;
- 同时展示关节坐标和笛卡尔/TCP 坐标;
- 支持刀具长度、旋转中心、偏置参数改变后重新计算预览;
- 以 LinuxCNC forward/inverse kinematics 结果作为验算基础;
- 浏览器 smoke 能证明同一段 5 轴程序在 RTCP 模式下产生非空 A/B/C 姿态和 TCP 轨迹。
第一阶段不承诺:
- 真实伺服周期硬实时;
- 完整 LinuxCNC task/motion 进程;
- 任意 Python remap runtime
- 任意 external user-M host process
- 任意未在白名单内的 user-M 行为;
- 完整工业级碰撞检测;
- CAM 后处理器。
## 7. 数据模型
建议定义统一 frame
```text
FiveAxisMotionFrame
sequence
sourceLine
time
kinsType
rtcpEnabled
workPose: X/Y/Z/A/B/C/U/V/W
jointPose: joint[0..N]
tcpPose: x/y/z + toolAxisVector
toolOffset
pivot/rotPoint
feed
spindle
canonicalEventRef
diagnostics
```
建议定义 machine profile
```text
FiveAxisMachineProfile
id
title
family: xyzac-trt | xyzbc-trt | bridge-xyzbcw | tdr-xyzab
iniPath
coordinates
joints
kinematicsSource
halPins
remapCodes
limits
toolTable
samplePrograms
pythonGuiReferences
pyvcpControls
vismachModelNodes
```
## 8. 阶段计划
### Phase 0方案和边界文档
当前交付。
输出:
- 独立目录;
- 实现方案;
- 技术路线;
- 明确当前完成情况和未完成边界。
### Phase 1独立 Web 仿真骨架
目标:
- 新建独立 Web app
- 复用或引入现有 SDK/WASM 产物;
- 页面能加载、选择五轴机床、显示 G-code、运行普通 LinuxCNC-backed 程序;
- Three.js 显示一个基础五轴机床模型和非空刀路。
- UI 布局参考 AXIS/gmoccapy包含菜单、工具栏、Manual/MDI、预览、DRO、G-code、状态栏。
验收:
- 本地 dev server 可启动;
- browser smoke 截图非空;
- 运行现有线性/圆弧/G81 程序不回退。
### Phase 2五轴 profile 和 5 轴 demo 接入
目标:
- 接入 `xyzac-trt``xyzbc-trt` 两个 profile
- staging 对应 INI/HAL/tool table/remap_subs/demo
- UI 能显示 kinematics 参数、HAL pins、M428/M429 状态;
- 执行 LinuxCNC 5 轴 sample 或经过裁剪的 representative demo。
- 解析 PyVCP XML/HAL 参考,生成 `SWITCHKINS`、joint value、offset/rot-point 等 Web 面板。
验收:
- 能展示 A/C 或 B/C 角度;
- 能显示 kinstype 0/1 切换;
- browser smoke 验证 `motion.switchkins-type` 状态。
### Phase 3LinuxCNC 五轴运动学 WASM ABI
目标:
-`trtfuncs.c``xyzac-trt-kins.c``xyzbc-trt-kins.c``5axiskins.c` 的 forward/inverse 调用通过窄 C ABI 暴露给 Web runtime
- 建立 HAL pin shim为旋转中心、偏置、刀具长度提供输入
- 输出 joint/work/TCP frame。
验收:
- Node smokeforward -> inverse roundtrip
- browser smoke同一 frame 显示 joint pose、work pose、TCP pose
- source sync guard 仍通过。
### Phase 4RTCP/TCP 预览与播放
目标:
- RTCP mode on/off 可视化;
- 显示 programmed path、TCP path、joint path
- 刀轴方向随 A/B/C 变化;
- 刀尖中心点轨迹与 LinuxCNC kinematics frame 对齐。
- Three.js 机床层级与 vismach Python 示例的几何层级一致:工作台、转台、摆头、主轴、刀具和工件分别建模。
验收:
- RTCP 开启时,旋转轴变化不导致 UI 随机漂移;
-`M428/M429` 状态有明确显示;
- 截图 smoke 校验 canvas 非空、刀具姿态非默认、路径点数非零。
### Phase 5操作级数控系统仿真
目标:
- Manual/MDI、单段、连续、暂停、复位
- 程序行高亮、motion segment 高亮;
- 坐标系、刀具长度、旋转中心参数编辑和重新仿真;
- OPFS 保存/恢复完整 5 轴会话。
验收:
- 保存 -> 恢复 -> 重新运行结果一致;
- UI 提供 operator-facing 状态,不只是 diagnostics dashboard。
### Phase 6扩展验证和发布
目标:
- 建立 release gate
- 建立 regression fixtures
- 添加更多 LinuxCNC 5 轴案例;
- 文档化不支持范围。
验收:
- `git diff --check`
- source/vendor sync
- Node/browser smoke
- screenshot/canvas-pixel check
- release readiness artifact。
## 9. 风险与处理
主要风险:
- 把 RTCP 公式写在 JS 中,破坏 LinuxCNC semantic boundary。
- 5 轴 demo 依赖 remap/HAL 同步,直接跑全量程序可能遇到 runtime boundary。
- Vismach Python GUI 不能直接迁移到浏览器。
- 把 Python GUI 参考误解成要在浏览器中运行 Python/Tk/PyQt会导致架构失控。
- WebGL 3D 和 G-code 执行状态容易脱节。
- 过早承诺完整工业 RTCP 会扩大范围。
处理策略:
- 第一阶段只做 source-derived kinematics ABI不做 JS-owned CNC semantics。
- demo 程序分 representative subset 和 full upstream demo 两级。
- Vismach 只作为机床结构参考,浏览器用 Three.js 重建可视化,不移植 Python GUI。
- PyVCP/gmoccapy/QtVCP 只作为 panel schema 和 operator workflow 参考,控件用 Web 原生实现。
- 所有 UI frame 都要带 canonical/ref 或 kinematics/ref 追踪字段。
- hard block 保持显式 blocked不因为 UI 能显示就 promotion。
## 10. 结论
当前项目已经具备 Web 数控系统仿真的基础设施,但 RTCP 五轴联动还需要单独产品化。下一步应在独立目录中先搭建五轴 Web 仿真骨架,界面形态参考 LinuxCNC 的 AXIS、vismach、PyVCP、gmoccapy 和 QtVCP Python 图形界面,再把 LinuxCNC TRT/bridge 五轴运动学通过 WASM ABI 接入,最后形成 RTCP/TCP 轨迹、关节姿态、刀尖中心点和机床模型同步显示的浏览器仿真界面。