# RTCP 五轴 Web 仿真技术路线 生成时间:2026-06-20 CST ## 1. 技术选型 推荐技术栈: ```text UI: 原生 HTML + CSS + TypeScript/JavaScript ES modules Build: Vite 或 esbuild,仅作为 TypeScript/ES module 打包工具,不引入 React/Vue 等 UI 框架 3D: Three.js WASM: Emscripten Core CNC reference: vendored LinuxCNC source GUI reference: LinuxCNC Python GUI sources, PyVCP XML, HAL postgui wiring Storage: OPFS Tests: Node smoke + Playwright/Chromium browser smoke Docs/gates: Markdown + machine-readable JSON/TSV artifacts ``` 前端界面不使用 React、Vue、Angular、Svelte 等 UI 框架。原因是本项目核心复杂度在 LinuxCNC/WASM、五轴运动学、RTCP 数据流、Three.js 机床模型和验证链路,不在通用 UI 框架。直接使用 HTML/CSS + TypeScript/JavaScript ES modules 更贴近当前 `wasm-port/runtime/ui/simulation` 的实现方式,也更容易保持 WASM、OPFS、virtual HAL 和 Three.js 的边界清晰。 不使用框架不等于写成单个巨大脚本。必须按模块拆分 `ui/`、`runtime/`、`visualization/`、`profiles/`、`panel-schema/`、`workers/`、`state/`。LinuxCNC 的 Python GUI 只作为参考输入:AXIS 的操作界面、vismach 的机床模型层级、PyVCP XML 面板、gmoccapy/QtVCP 的操作面板都需要转换成 Web 组件和 Three.js 场景。 ## 2. 目录建议 后续实现可在本目录扩展为: ```text web-rtcp-5axis-sim-plan/ README.md docs/ implementation-plan.md technical-roadmap.md linuxcnc-python-gui-reference.md linuxcnc-gui-reference-gallery.md linuxcnc-reference-map.md rtcp-data-contract.md validation-plan.md app/ index.html package.json src/ main.ts ui/ ui-reference/ runtime/ visualization/ profiles/ workers/ panel-schema/ state/ core/ linuxcnc_kinematics_wasm/ include/ src/ build.sh tests/ node/ browser/ ``` 第一轮实现可以只创建 `app/`,后续再把 C/WASM ABI 放入 `core/`。 ## 3. gmoccapy 5 轴风格 Web 实现方案 结论:`gmoccapy_5_axis.png` 的界面风格可以实现为 Web 前端,而且适合作为本项目第一版数控系统仿真界面的首选风格。 参考图: ![gmoccapy 5 Axis](../assets/reference/linuxcnc-gui/gmoccapy_5_axis.png) 原始来源: ```text linuxcnc/docs/src/gui/images/gmoccapy_5_axis.png ``` ### 3.1 可实现性判断 gmoccapy 5 轴界面由清晰的操作区域组成,适合直接拆成 Web 组件: - 左侧大面积刀路/机床预览:可用 Three.js 实现。 - 右上大号绿色 DRO:可用 HTML/CSS 数字面板实现。 - 中右 G-code 当前行列表:可用虚拟滚动或普通 scroll list 实现。 - 右侧竖向模式按钮:可用原生 button + icon 实现。 - 下方信息面板:可用 tabs 和 table 实现。 - 中下 override、spindle、coolant 面板:可用 slider、stepper、toggle 实现。 - 底部运行控制:可用 icon button 实现。 这些控件不需要 React/Vue;原生 HTML/CSS + TypeScript/JavaScript ES modules 足够实现。核心状态由一个小型 runtime store 驱动,所有 CNC 语义仍来自 LinuxCNC/WASM/kinematics 边界。 ### 3.2 页面布局 建议第一版按 gmoccapy 截图拆为固定操作台布局: ```text ┌──────────────────────────────────────────────────────────────────────┐ │ 顶部标题栏:machine/profile/session/run state │ ├───────────────────────────────┬──────────────────────────────┬───────┤ │ │ DRO + active G-code │ 右侧 │ │ Three.js 五轴机床/刀路预览 │ X/Y/Z/A/B/C + G-code list │ 模式栏 │ │ │ │ │ ├───────────────────────────────┼──────────────────────────────┴───────┤ │ Tool info / G-code properties │ Velocity / Override / Spindle/Coolant │ ├───────────────────────────────┴──────────────────────────────────────┤ │ 底部:open / reload / run / stop / pause / step / home / fullscreen │ └──────────────────────────────────────────────────────────────────────┘ ``` 适配 Web 五轴 RTCP 后,右上 DRO 应扩展为: ```text X Y Z A B C Abs / Rel / DTG TCP X/Y/Z Tool axis vector RTCP: on/off Kins: identity / TCP / userk ``` ### 3.3 Web 组件映射 建议模块: ```text ui/gmoccapy-shell.ts ui/gmoccapy-dro-panel.ts ui/gmoccapy-preview-toolbar.ts ui/gmoccapy-gcode-panel.ts ui/gmoccapy-status-sidebar.ts ui/gmoccapy-override-panel.ts ui/gmoccapy-spindle-coolant-panel.ts ui/gmoccapy-bottom-controls.ts ui/gmoccapy-info-tabs.ts ``` 组件职责: - `gmoccapy-shell`:整体布局和区域挂载。 - `dro-panel`:大号绿色坐标显示,显示 axis/joint/TCP/DTG。 - `preview-toolbar`:视角、缩放、清除预览、适配窗口。 - `gcode-panel`:程序行、当前行、运行进度。 - `status-sidebar`:E-stop、machine on、manual/mdi/auto、settings、tool 等模式按钮。 - `override-panel`:current velocity、rapid override、feed override。 - `spindle-coolant-panel`:spindle rpm、spindle override、coolant state。 - `bottom-controls`:open、reload、run、stop、pause、step、home、fullscreen。 - `info-tabs`:tool info、G-code properties、RTCP diagnostics、session readiness。 ### 3.4 状态模型 gmoccapy 风格页面需要一个小型 store,不需要前端框架: ```text GmoccapySimulationState machineProfile sessionReadiness runState activeProgram activeLine dro jointPose tcpPose rtcpState kinsType feedOverride rapidOverride spindleOverride coolantState previewState diagnostics ``` 状态更新路线: ```text LinuxCNC/WASM canonical events -> frame builder -> GmoccapySimulationState -> DOM renderers + Three.js scene ``` ### 3.5 样式原则 保持 gmoccapy 的工业操作台气质: - 黑色 3D 预览背景。 - 大号绿色 DRO 数字。 - 灰色面板和分区边框。 - 橙色 override 进度条。 - 大尺寸图标按钮。 - 底部运行控制固定高度。 - 右侧模式栏固定宽度。 Web 版需要改进的点: - 适配 1366x768、1920x1080 和平板尺寸。 - 字体和按钮要避免溢出。 - 3D 预览和 G-code 面板可以响应式分配宽度。 - RTCP/TCP 专用状态必须比原图更明确。 ### 3.6 与 LinuxCNC 源码边界 可 Web 化: - 页面布局。 - 操作按钮。 - DRO 显示。 - override/coolant/spindle 仿真状态。 - G-code 当前行高亮。 - Three.js 五轴预览。 - RTCP/TCP 状态展示。 必须仍由 LinuxCNC/WASM 或 source-derived runtime 提供: - G-code 解释。 - canonical event。 - modal state。 - tool/parameter 语义。 - 五轴 kinematics。 - RTCP/TCP frame。 - M428/M429/M430 remap 状态。 不直接实现: - gmoccapy native GTK/Glade runtime。 - LinuxCNC native task/motion IPC。 - 真实 HAL component process。 - Python remap runtime。 - 真实机床 IO。 ### 3.7 第一版验收标准 第一版 gmoccapy 风格 Web 前端完成时,应满足: - 页面整体布局与 `gmoccapy_5_axis.png` 对齐:预览、DRO、G-code、右侧模式栏、底部控制、override/spindle/coolant 区都存在。 - 使用原生 HTML/CSS + TypeScript/JavaScript ES modules,无 React/Vue 等框架。 - Three.js 预览非空,能显示五轴机床、刀具和路径。 - DRO 显示 X/Y/Z/A/B/C 和 TCP 坐标。 - G-code 面板能高亮当前行。 - Run/Stop/Pause/Step 控件能驱动仿真 playback。 - RTCP/TCP 和 kinstype 状态在界面中可见。 - Browser smoke 做截图和 canvas 非空验证。 ## 4. 核心模块拆分 ### 4.1 `profiles` 管理 LinuxCNC 五轴机型 profile: - `xyzac-trt` - `xyzbc-trt` - `bridge-xyzbcw` - `tdr-xyzab` 每个 profile 记录: - LinuxCNC config source path; - coordinates/joints; - kinematics source files; - HAL pins; - M428/M429/M430 remap; - sample programs; - limits 和默认参数。 - Python GUI 参考文件; - PyVCP/HAL panel 控件; - vismach model node 映射。 ### 4.2 `runtime` 管理运行状态: - machine session; - G-code staging; - interpreter run; - kinematics frame calculation; - RTCP mode state; - diagnostics。 建议 API: ```text loadMachineProfile(profileId) stageProgram(programText) runProgram() buildFiveAxisFrames(canonicalEvents, machineProfile) setRtcpEnabled(enabled) setKinsType(type) updateMachineParameter(name, value) exportSessionSnapshot() restoreSessionSnapshot(snapshot) ``` ### 4.3 `linuxcnc_kinematics_wasm` 提供窄 C ABI: ```text linuxcnc_xyzac_trt_forward(input, output) linuxcnc_xyzac_trt_inverse(input, output) linuxcnc_xyzbc_trt_forward(input, output) linuxcnc_xyzbc_trt_inverse(input, output) linuxcnc_bridge_5axis_forward(input, output) linuxcnc_bridge_5axis_inverse(input, output) linuxcnc_set_hal_float(pin, value) linuxcnc_set_hal_bit(pin, value) linuxcnc_get_last_error() ``` 输入输出应使用稳定结构,不让 UI 直接理解 LinuxCNC 内部全局状态。 ### 4.4 `visualization` Three.js 负责: - 机床底座、工作台、转台、摆头、主轴、刀具; - 坐标轴和工作空间; - TCP path; - joint path; - active segment; - tool axis vector; - RTCP on/off overlay。 机床模型初期可以用几何体组合,不要先追求 CAD 级模型。重点是五轴姿态和 TCP 点正确、可验证。 vismach 转换规则: - `Collection` -> Three.js `Group`; - `Translate` / `Rotate` -> 静态 transform node; - `HalTranslate` / `HalRotate` -> 绑定 virtual HAL pin 的动态 transform node; - STL/workpiece asset -> glTF/STL loader 或简化几何体; - vismach plot clear -> Web runtime 的 path clear action; - HAL component pin -> profile 中声明的 observable runtime value。 ### 4.5 `ui` 界面组件: - machine profile selector; - RTCP/kins panel; - G-code editor; - run controls; - DRO; - joint position panel; - HAL/diagnostics; - Three.js viewport; - session save/restore。 - gmoccapy-style shell; - gmoccapy-style DRO / override / spindle / coolant / status sidebar。 UI 参考转换: - AXIS:菜单、工具栏、Manual/MDI、预览、DRO、G-code、状态栏。 - PyVCP:`SWITCHKINS`、joint 数值、offset/rot-point 控件、`vismach-clear`。 - gmoccapy:首选界面风格;大按钮操作、jog increment、override、右侧模式栏、底部运行控制、黑底预览和绿色 DRO。 - QtVCP/QtDragon:现代触控面板、状态区、工具/探测/大屏布局。 ### 4.6 `panel-schema` 把 PyVCP XML 和 postgui HAL 的参考关系整理为 Web 面板 schema。 建议 schema: ```text PanelControl id type: label | multilabel | button | number | slider | toggle halpin signal sourceFile command displayFormat readonly ``` 第一阶段不需要完整 XML parser,可以先把 `xyzac-trt.xml`、`xyzbc-trt.xml`、`5axis.xml`、`xyzab-tdr.xml` 手工整理成 JSON/TS profile。后续再决定是否写 PyVCP XML importer。 ## 5. LinuxCNC 源码接入路线 ### Step 1:建立引用清单 形成 `linuxcnc-reference-map.md`,记录每个能力引用哪些 LinuxCNC 文件。 第一批: ```text trtfuncs.c xyzac-trt-kins.c xyzbc-trt-kins.c 5axiskins.c switchkins.c / switchkins.h kins_util.c kinematics.h emcpose.h / emcpose.c ``` Python GUI / panel 第一批: ```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/bridgemill/5axisgui.hal configs/sim/axis/vismach/5axis/bridgemill/5axis_postgui.hal 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-rotary-tilting/switchkins_postgui.hal configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.xml configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr-postgui.hal configs/sim/gmoccapy/gmoccapy_XYZAC.ini configs/sim/qtvcp_screens/qtdragon/README ``` ### Step 2:建立 C ABI shim 不要把 LinuxCNC HAL module lifecycle 原样暴露给浏览器。应构造最小 shim: - 初始化 profile; - 分配 HAL 参数存储; - 设置 HAL pin 值; - 调用 forward/inverse; - 输出 frame。 ### Step 3:编译 WASM 使用 Emscripten 编译 kinematics core。初期可与当前 `wasm-port` 构建脚本分离,等稳定后再合并。 ### Step 4:Node 验证 至少验证: - `xyzac` forward/inverse; - `xyzbc` forward/inverse; - tool offset 变化影响 TCP; - rot point 变化影响结果; - kinstype 0/1 切换状态; - source file hash 与 vendor 一致。 ### Step 5:Browser 验证 至少验证: - WASM 在浏览器加载; - Three.js canvas 非空; - 五轴姿态非默认; - RTCP 开关改变显示状态; - 加载 sample program 后 path 点数非零。 - `SWITCHKINS` 面板能显示 `IDENTITY` / `TCP` / `USERK` 状态。 - joint value 面板与 five-axis frame 中的 joint pose 对齐。 - `vismach-clear` 类操作能清空预览路径,不改变 LinuxCNC semantic state。 ### Step 6:Python GUI 参考验收 该步骤不是运行 Python GUI,而是证明 Web 界面已经吸收其关键设计: - AXIS 区域齐全:toolbar、Manual/MDI、preview、DRO、G-code、statusbar。 - PyVCP 控件齐全:switchkins multilabel、type buttons、joint values、clear path。 - vismach 模型层级齐全:动态平移、动态旋转、工具、工作台、旋转点。 - gmoccapy/QtVCP 操作形态齐全:大按钮、override、jog increment、operator status。 ## 6. RTCP 数据流 推荐数据流: ```text LinuxCNC G-code text -> interpreter WASM -> canonical events / modal output -> five-axis frame builder -> LinuxCNC kinematics WASM forward/inverse -> FiveAxisMotionFrame[] -> Three.js visualization + DRO + status panels ``` `FiveAxisMotionFrame` 是 UI 的唯一运动数据输入。这样可以避免 UI 从多个地方拼状态导致错位。 ## 7. 测试路线 ### Node smoke - profile inventory; - source reference map; - kinematics ABI; - frame builder; - OPFS/session pure helpers; - no JS CNC semantics guard。 ### Browser smoke - 页面加载; - profile 切换; - sample program run; - RTCP status; - canvas pixel 非空; - tool marker 移动; - active G-code line; - session save/restore。 ### Visual regression 先做轻量检查: - canvas 非空; - tool marker 坐标在视口内; - path bounding box 合理; - A/B/C 非零时刀轴方向变化。 ## 8. 里程碑 建议按以下顺序推进: 1. `M0-docs`:当前方案和技术路线。 2. `M1-web-shell`:独立 Web app、Three.js 空机床、普通 G-code 执行接通。 3. `M2-python-gui-reference-panels`:AXIS/PyVCP/vismach/gmoccapy/QtVCP 参考界面转换为 Web panel/schema。 4. `M3-profile-loader`:`xyzac-trt` / `xyzbc-trt` profile、INI/HAL/remap asset 可见。 5. `M4-kinematics-wasm`:LinuxCNC 五轴运动学 C/WASM ABI。 6. `M5-rtcp-preview`:RTCP/TCP path、joint/work/TCP 同步显示。 7. `M6-kinematics-frame-proof`:Web RTCP frame/boundary adapter 接入 `xyzac-trt` kinematics WASM Node proof。 8. `M7-browser-kinematics-runtime`:浏览器 asset copy/worker 加载 kinematics WASM。 9. `M8-session`:OPFS 保存/恢复五轴仿真会话。 10. `M9-release-gate`:Node/browser/docs/release gate。 11. `M10-profile-switching`:`xyzac-trt` / `xyzbc-trt` profile 切换并重载对应 kinematics WASM。 ## 9. 验收标准 最小可验收版本: - 浏览器中可以选择 `xyzac-trt`; - 可以加载并运行一个 5 轴 sample 或 representative program; - 可以看到 XYZAC 或 XYZBC 轴值; - 可以切换或识别 RTCP/TCP 状态; - Three.js 中显示机床、刀具姿态和 TCP 轨迹; - UI 中有参考 PyVCP 的 `SWITCHKINS` 面板和 joint 数值区; - Three.js 机床模型能体现 vismach Python 示例的动态层级; - 结果来自 LinuxCNC interpreter + LinuxCNC kinematics WASM 边界; - browser smoke 通过; - 文档明确哪些功能 blocked。 ## 10. 下一步动作 当前已完成到 `M11-profile-session-business-closure`。建议下一轮优先做: - 把 interpreter WASM 调用迁移到 Worker,保持 UI 主线程只做渲染和状态编排; - 接入 OPFS machine-session 的 INI/HAL/tool table staging,让 interpreter execution 使用真实会话文件; - 继续推进 remap/planner 边界,不把普通 canonical execution 冒充完整 LinuxCNC task/motion runtime; - 保持 source/browser/dist 三层 smoke:interpreter canonical frame、kinematics worker frame、DRO/preview 同步。 - 启动本地 dev server 给出访问地址。