# LinuxCNC RTCP G-code 特点分析 ## 1. 实现方式 这套 LinuxCNC 源码没有把 RTCP 作为独立的 `G43.4/G43.5` 代码实现。源码中的 RTCP 是运动学层能力: - `src/emc/kinematics/trtfuncs.c` 实现 XYZAC 和 XYZBC 的正逆运动学。 - `src/emc/kinematics/xyzac-trt-kins.c` 和 `xyzbc-trt-kins.c` 将对应运动学注册为 LinuxCNC kinematics。 - `src/emc/kinematics/5axiskins.c` 实现 XYZBCW Bridge Mill 的 pivot-length、刀长和 W 轴变换。 - `src/emc/kinematics/genhexkins.c` 的注释明确说明,`tool-offset` 连接到 `motion.tooloffset.Z` 时实现 RTCP。 因此,G 代码主要承担四件事: 1. 选择 TCP 或 identity 运动学。 2. 设置刀长补偿和工件坐标系。 3. 给出刀尖/工件坐标和刀具姿态。 4. 用同步的直线、圆弧和旋转轴运动验证逆运动学结果。 ## 2. M428/M429/M430 的作用 在 TRT、TDR、Bridge Mill 和 Hexapod 的 switchkins 配置中,常见映射如下: | 命令 | 作用 | |---|---| | `M428` | 选择非平凡 TCP/RTCP kinematics,通常通过 `M68 E3 Q1` 设置 `motion.switchkins-type=1`,然后用 `M66 E0 L0` 同步 | | `M429` | 选择 identity/trivkins,通常设置 `motion.switchkins-type=0` | | `M430` | 选择 userk,通常设置 `motion.switchkins-type=2`;它是扩展运动学入口,不等于 RTCP 本身 | 这几个 M 代码是 remap 出来的用户命令,不是 LinuxCNC 固定的通用 M 代码。使用前必须匹配 INI 中的 `REMAP`、`SUBROUTINE_PATH` 和 HAL 信号。例如 TRT 配置需要把 `motion.analog-out-03` 接到 `motion.switchkins-type`。 `428remap.ngc` 和 `429remap.ngc` 都会检查 `motion.switchkins-type` 是否存在,并在 task 模式下检查切换结果;缺少 `HAL_PIN_VARS` 或 HAL 网络时会输出 debug 信息并停止。这说明运动学切换被设计成有确认步骤的同步操作。 ## 3. TRT 的 XYZAC 与 XYZBC ### XYZAC `xyzac-trt` 表示: - 直线轴:X、Y、Z - 倾转轴:A - 旋转轴:C - 典型结构:A 倾转台上安装 C 旋转台 `trtfuncs.c` 的正逆变换会使用: - C 轴旋转中心:`x-rot-point`、`y-rot-point`、`z-rot-point` - A 轴相对于 C 轴的偏置:`y-offset`、`z-offset` - 当前刀长:`tool-offset` ### XYZBC `xyzbc-trt` 表示: - 直线轴:X、Y、Z - 倾转轴:B - 旋转轴:C - 典型结构:B 倾转台上安装 C 旋转台 它使用 `x-offset`、`z-offset` 描述 B/C 旋转组件之间的几何偏置,并同样使用旋转中心参数和当前刀长。 两种运动学的共同点是:G 代码给出的 XYZ 和旋转姿态被当作笛卡尔 pose,逆运动学再计算实际关节位置。RTCP 的核心效果是改变 A/B/C 姿态时,刀尖 TCP 的空间位置仍按程序要求保持。 ## 4. 刀长和 TCP 偏置 典型写法包括: ```gcode T1 M6 G43 H1 Z5.0 ... G49 ``` 或: ```gcode G43.1 Z#1 ... G49 ``` 含义分别是: - `G43 Hn`:使用刀具表中第 n 号刀的长度。 - `G43.1`:从当前 G 代码块的轴字设置动态刀长。 - `G49`:取消刀长补偿。 在 TRT 配置中,`motion.tooloffset.z` 通过 HAL 连接到 `xyzac-trt-kins.tool-offset` 或 `xyzbc-trt-kins.tool-offset`。这使得普通 G43/G43.1 的结果进入运动学变换,而不是只修改显示坐标。 `cone.ngc` 特别体现了动态刀长的使用:它先令 B/C 回到零位,再用 `G43.1 Z#1` 设置刀长,随后执行五轴旋转轨迹。这样可以避免切换刀长时旋转姿态带来的大幅关节变化。 ## 5. 工件坐标系与旋转中心 RTCP 程序常见以下组合: ```gcode G53 G0 X0 Y0 Z... G10 L20 P0 X0 Y0 Z... A0 C0 G54 ``` - `G53` 用于在机器坐标下安全定位。 - `G10 L20 P0` 根据当前姿态建立或重设工件坐标系。 - `G54` 激活工件坐标系。 `centering.ngc`、`helix_ac.ngc`、`helix_bc.ngc` 和 `xyzab-tdr-demo.ngc` 还读取 HAL 变量,例如旋转中心和机械偏置。这类程序不是只验证 G 代码语法,而是验证“配置中的旋转中心、偏置和程序坐标”是否保持一致。 ## 6. 轨迹类型 ### CAM 点列轨迹 `boat-xyzac.ngc`、`boat-xyzbc.ngc` 和 `impeller-7bl-xyzac.ngc` 是典型后处理器输出: - 大量连续的 `G1` 线段。 - 同一段轨迹同时改变 X/Y/Z 与 A/C 或 B/C。 - `boat-xyzbc.ngc` 和 impeller 程序使用 `G93` 逆时间进给,并在安全移动时切回 `G94`。 - 通过高密度姿态点逼近船体、叶轮等复杂曲面。 - 文件规模较大,适合验证连续五轴轨迹和逆运动学稳定性,不适合作为最小功能测试。 ### 运动学切换测试 `xyzac_switchkins_test_1.ngc`、`xyzac_switchkins_test_2.ngc`、`xyzac_switchkins_test_3.ngc` 的重点是对照: - `M429` 下的 identity 坐标。 - `M428` 下的 TCP 坐标。 - C 轴旋转后,同一个 X/Y/Z 指令对应的实际关节变化。 - `(debug,...)` 输出的预期坐标。 - M1 可选停,用于人工检查切换前后的结果。 其中 `test_3` 直接写出切换前后的预期位置,例如 C=90 后进入 TCP 模式时,X/Y 位置会因旋转变换而改变。 ### 螺旋和四象限测试 `helix_ac.ngc` 和 `helix_bc.ngc` 的主要模式是: ```gcode M429 G10 L20 ... M428 G0 A... C... G2 I... Z... P... M429 ``` 它们在 TCP 模式下执行带旋转姿态的螺旋,再回到 identity 模式进行安全返回。`xyzac_switchkins_sub.ngc` 和 `xyzbc_switchkins_sub.ngc` 将该动作扩展到四个象限,并用参数传入安全高度、半径、圈数、进给率、姿态角和象限间距。 ### 旋转中心保持测试 `centering.ngc` 先输出 HAL 中的旋转中心,然后进入 TCP 模式,在 C 轴每个角度执行一个小方形轨迹。它用于观察工件坐标中心是否在 C 轴旋转过程中保持固定。 ### 参数化 Bridge Mill 测试 `5axisgui.ngc` 使用 O 代码循环和三角函数: - B 轴分层改变倾角。 - C 轴分段改变方位角。 - 根据角度计算球面上的 X/Y/Z 位置。 - 用 W 轴执行钻削和退刀。 - 使用 `G43` 将当前刀长送入 5axiskins 的 pivot length。 它更偏向运动学和可视化演示,代码结构比 CAM 输出更适合阅读和移植。 ## 7. 这些程序的共同特点 1. RTCP 由 kinematics 完成,程序行本身通常仍是普通 `G0/G1/G2/G3` 加旋转轴字。 2. TCP 模式和 identity 模式经常交替出现,前者用于加工或姿态变换,后者用于机器坐标定位、建立偏置和安全返回。 3. 刀长不是单独的显示量,而是通过 `motion.tooloffset.z` 进入逆运动学。 4. 旋转中心、旋转组件偏置和工件坐标系是正确运行的必要条件;参数错误会直接表现为 TCP 漂移。 5. 连续五轴 CAM 程序经常使用 `G93`,因为 XYZ 直线运动和旋转轴运动必须在同一段时间内完成。 6. 许多程序明确使用 `G53`、高 Z 安全位置、`G49` 和姿态归零,说明五轴 RTCP 程序对切换点和刀长变化较敏感。 7. 大型船体和叶轮程序主要验证连续轨迹;小型 switchkins、helix、centering 程序主要验证几何和状态切换。 ## 8. 筛选边界 以下内容没有放入本集合: - 只出现普通 `G43/G49`、没有五轴非平凡运动学关联的通用铣削、车削和探测程序。 - SCARA、Puma、Melfa 等使用 `M428/M429` 进行运动学切换,但源码没有将其定义为 RTCP 的示例。 - millturn 的 `M428/M429`,其作用是铣削/车削运动学切换,不是 TCP/RTCP。 - 只有 `XYZAC` 或 `XYZBC` 文字、但配置使用 `trivkins` identity 的普通五轴坐标示例。 - `G43.1` 工具测量程序本身,除非同时包含五轴姿态和 RTCP 运动学上下文。 筛选依据来自源码中的配置和运动学实现,尤其是: - `configs/sim/axis/vismach/5axis/table-rotary-tilting/README` - `configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.txt` - `configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.txt` - `configs/sim/axis/vismach/5axis/table-dual-rotary/README` - `docs/src/motion/5-axis-kinematics.adoc` - `src/emc/kinematics/trtfuncs.c` - `src/emc/kinematics/5axiskins.c` - `src/emc/kinematics/genhexkins.c`