# 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 给出访问地址。
