Add AC/BC RTCP programs and 3D machine manager

This commit is contained in:
2026-09-20 12:31:12 +08:00
parent 1c1e5f9672
commit 8aab531b02
363 changed files with 53213 additions and 58 deletions

View File

@@ -0,0 +1,45 @@
# 项目功能内容
## 目标
在 Web LinuxCNC 控制面板的机床预览区增加“三维机床管理”按钮。对话框内完成机床部件装配和坐标标定,最终生成可由现有 XYZAC/XYZBC TRT 运行链使用的机床模型。
## 功能范围
1. 对话框包含独立的 Three.js 三维预览,实时显示正在配置的机床。
2. 支持逐个导入自包含 `.glb` 机床部件,不允许依赖外部纹理或网格文件。
3. 每个部件可绑定 `底座、X、Y、Z、刀具、A/B、C、工件` 角色,并编辑父级关系。可运行结构必须满足:
- 刀具链:底座 → X → Y → Z → 刀具。
- 转台链:底座 → A/B → C → 工件。
4. 每个部件可定义局部坐标原点。模型网格相对该原点偏移,运动关节围绕该原点运动。
5. 每个部件可独立显示或隐藏原点坐标轴辅助线。
6. 每个部件可用数值和 Three.js 操纵器平移、旋转;变换只修改装配配置,不修改原 GLB 字节。
7. 可定义 C 轴原点位置和 A/B 到 C 的运动学偏置。应用时写入底座场景节点及整机场景的 `userData.linuxcncMachineGeometry`,同时生成 URDF:
- `C 原点 P = (x-rot-point, y-rot-point, z-rot-point)`。
- `A/B 偏置 D = (x-offset, y-offset, z-offset)`。
- 倾转关节原点 `T=P+D`,C 关节原点 `U=-D`,工件固定原点 `-P`。
8. 可定义 X/Y/Z/A或B/C 的物理零点。模型运动量为 LinuxCNC 实际关节值减去配置的物理零点。
9. 应用后,控制面板程序执行、Jog、RTCP 切换和刀长变化继续以 Worker/WASM 快照为唯一运动输入;模型不得在 React 中重新计算刀尖逆解。
## 数据和单位
- UI 中平移、局部原点、C 原点和偏置使用毫米;旋转和物理旋转轴零点使用度。
- GLB 遵循 glTF 米制、Y-up;生成的 URDF 使用米和弧度、Z-up。
- 部件源文件、哈希和原始场景保持不变;运行装配使用深复制后的几何与材质。显式“导出组合 GLB”会生成新文件,并将标定数据同时写入整机场景和底座节点 `userData`。
- 底座 `userData` 至少保存 schema、机型、C 原点、A/B 偏置、物理零点和部件装配摘要。
## 安全边界
- 当前只生成项目已有求解器支持的 XYZAC 或 XYZBC 双分支 TRT 结构。
- 层级编辑器允许建立关系,但“应用到控制器”前必须严格验证两条受支持机械链、角色唯一性和无环结构。
- 未完成八个角色时允许预览和保存草稿,不允许应用到控制器。
- 模型外观变换不能代替 INI/运动学参数;C 原点和 A/B 偏置必须通过现有配置重载进入 WASM。
- 不做碰撞、质量、刚体动力学或任意 URDF 求解。
## 验收结果
- AC 与 BC 均能由八个独立部件建立结构并应用。
- 对话框预览、原点辅助、平移/旋转和层级变化实时可见。
- 底座 `userData` 含完整几何及物理零点字段。
- 运行控制面板后,X/Y/Z/A或B/C Jog 和五轴程序驱动对应部件;工件路径继续附着 C 轴,刀具长度来自 WASM。
- 非法层级、重复角色、缺失部件、错误机型和外部资源 GLB 明确拒绝,已生效模型不改变。

View File

@@ -0,0 +1,13 @@
# 项目程序开发详细步骤
1. `MGR-01`:建立本专项 01–06 与 README,冻结数据字段、坐标单位、机械链和验收边界。
2. `MGR-02`:实现部件 GLB 加载、哈希、外部资源拒绝、装配草稿类型和生命周期清理。
3. `MGR-03`:实现角色/父级编辑、唯一性和无环校验,生成 XYZAC/XYZBC 严格 URDF 与运行场景。
4. `MGR-04`:实现对话框 Three.js 预览、部件选择、显示/隐藏和原点坐标轴辅助。
5. `MGR-05`:实现部件局部原点、数值平移/旋转和 Three.js TransformControls 操纵器。
6. `MGR-06`:实现 C 原点、A/B 偏置、物理零点,写入底座及整机 `userData`,并映射到 URDF/INI。
7. `MGR-07`:接入控制面板“应用机床”,复用现有 `LOAD_WORKSPACE`、`PROGRAM_LOAD`、回零失效和 GLB 资源清理事务。
8. `MGR-08`:验证 WASM 关节值到部件链的映射、刀具/工件/路径坐标一致性及 AC/BC 五轴程序。
9. `MGR-09`:浏览器交互、错误边界、类型检查、生产构建、截图和报告收口。
每轮只推进任务矩阵中依赖已满足的任务。代码完成后必须同步更新 03、04、05;若改变数据契约或坐标定义,先更新 06。

View File

@@ -0,0 +1,22 @@
# 推进台账
## R02 / 2026-09-20 / 部件装配、标定、应用与验收完成
- 新增 `machine-manager.ts`:通用自包含 GLB 部件加载、SHA-256、深复制、八角色和两条机械链校验、AC/BC URDF 生成、组合场景、底座/整机 userData、组合哈希。
- 新增 `MachineManagerPanel.tsx`:机床预览区“三维机床管理”按钮、可拖动大对话框、独立 Three.js 预览、批量部件导入、角色/父级、显隐、原点辅助、数值平移/旋转、TransformControls、C 原点、A/B 偏置和物理零点编辑。
- 新增“导出组合 GLB”;导出的新文件包含 `linuxcnc.machine/1` URDF,以及整机场景和底座节点上的 `linuxcnc.machine-manager/1` 标定 userData。
- 接入 App 原有 `LOAD_WORKSPACE` + `PROGRAM_LOAD` 事务。配置和程序应用成功后替换机床;失败候选被释放。关机且空闲门控、程序重解析和回零要求保持。
- `buildImportedMachine` 按 `WASM joint - physicalZero` 驱动 X/Y/Z/A或B/C,刀长、路径和 RTCP 仍来自 Worker/WASM;有效 INI 参数同步回运行克隆的底座 userData。
- 浏览器 E01/E02 覆盖 8 个独立 GLB、原点/变换、导出、AC 应用、同一部件切 BC、BC 五轴程序、物理零点、非法层级和生产包。无浏览器错误。
- 旧五轴整机回归重新通过:AC/BC 各 41 个五轴同时变化 tick、42 个样本,坐标误差低于 `2.5e-16` 视图单位。
- `gltf-validator` 当前未安装,因此没有重跑旧 Khronos 校验器;旧四个示例 GLB 未修改,历史 `coverage/glb-machine/gltf-validation.report.json` 仍为 verified。本专项生成并下载的组合 GLB 已由浏览器 GLTFExporter 完成往返导出。
- MGR-01 至 MGR-09 全部完成。下一步按用户体验反馈扩展草稿持久化、部件库或任意新运动学 profile;不自动扩大到碰撞/动力学。
## R01 / 2026-09-20 / 专项建立与实现启动
- 用户要求在机床预览区新增“三维机床管理”对话框,覆盖部件级 GLB 导入、层级、原点、姿态、RTCP 几何参数、物理零点和控制坐标对应。
- 核对现有 `docs/glb-machine`、`MachineImportPanel`、严格 URDF 解析、`buildImportedMachine` 和 WASM 关节投影。现有能力只支持已经包含完整层级与 URDF 的整机 GLB,本轮扩展为部件装配编辑器。
- 建立本目录 01–06 和 README;新增 MGR-01 至 MGR-09 任务链。
- 决定复用 `linuxcnc.machine/1` 结构:管理器生成合法场景和 URDF,现有 INI/Worker/WASM 继续作为运动和 RTCP 权威。
- 当前任务:已完成。
- 下一步:按新需求继续;本专项不重复执行。

View File

@@ -0,0 +1,13 @@
# 任务矩阵
|任务|状态|依赖|交付与验收标准|
|---|---|---|---|
|MGR-01 文档与契约|verified|-|01–06 与 README 存在;字段、单位、机械链、权威边界明确|
|MGR-02 部件 GLB 加载|verified|MGR-01|多文件导入、SHA-256、外部资源拒绝、资源释放测试通过|
|MGR-03 层级与 URDF|verified|MGR-02|八角色、父级编辑、无环/唯一性、AC/BC URDF 生成与严格解析通过|
|MGR-04 管理器预览|verified|MGR-03|对话框 Three.js 预览、选择、显隐和相机控制可用|
|MGR-05 原点与部件变换|verified|MGR-04|原点辅助显示;数值和操纵器平移/旋转同步|
|MGR-06 RTCP 几何与物理零点|verified|MGR-03|C 原点、A/B 偏置、物理零点写入底座 userData,并正确生成 URDF|
|MGR-07 控制面板接入|verified|MGR-03,MGR-06|“三维机床管理”入口;应用复用 LOAD_WORKSPACE/PROGRAM_LOAD,失败不改旧模型|
|MGR-08 坐标一致性|verified|MGR-07|AC/BC 的 X/Y/Z/A或B/C、刀长、工件和路径由 WASM 状态正确驱动|
|MGR-09 浏览器验收收口|verified|MGR-04,MGR-05,MGR-08|交互/错误/构建/浏览器截图报告通过,03–05 完整更新|

View File

@@ -0,0 +1,39 @@
# 验收证据
## E01 / R01 / 文档与基线
- 状态:verified。
- 文档目录:`docs/glb-machine-manager/`。
- 基线能力:现有整机 GLB 导入、严格 URDF、几何参数重载和 WASM 关节投影保留。
- 实现和运行证据见 E02–E04。
## E02 / R02 / 开发源浏览器闭环
- 命令:`PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_machine_manager_browser.mjs`
- report_id:`GLB-MGR-E01`
- 报告:`coverage/glb-machine-manager/browser.report.json`
- SHA-256:`d3d15da19d3e8a8c958935a0e9c3840b70fb646d5bc8ffb72805dc744df078a3`
- 状态:verified;浏览器错误 0。
- 覆盖:8 部件导入和预览、原点显隐、数值/TransformControls 变换、组合 GLB 导出、AC/BC 应用、底座 userData、物理零点、非法层级拒绝、BC 五轴程序。
- 截图:
- `coverage/glb-machine-manager/manager-ac-config.png`,SHA-256 `5ca01d26cb83da726319be107aa90069ce96c3197f4297a26e1f836d171a1501`
- `coverage/glb-machine-manager/managed-bc-running.png`,SHA-256 `6e14ff6bc4e493f57e55bb601ded84319ce86f064f7a811595c1e4498b1827a0`
## E03 / R02 / 生产构建浏览器闭环
- 构建:`npm --prefix web/react run build`,通过;只有既有大 chunk 提示。
- 命令:`MACHINE_MANAGER_SOURCE_MODULES=0 ... node scripts/test_machine_manager_browser.mjs`
- report_id:`GLB-MGR-E02`
- 报告:`coverage/glb-machine-manager/browser-production.report.json`
- SHA-256:`5ba840aa92c37a06e2f19bce7c57234871b085e27951fb44623af74253215388`
- 状态:verified;生产资产执行 AC/BC UI 应用和 BC WASM 程序运动,浏览器错误 0。
## E04 / R02 / 回归与静态契约
- `node scripts/test_axis_control_inventory.mjs`:verified,99 个文档化控件。
- `node web/react/src/test_dual_canvas_contract.mjs`:verified。
- `node web/react/src/test_xyzac_threejs.mjs`:verified。
- `npm --prefix web/react run typecheck`:通过。
- `node scripts/test_glb_machine_motion.mjs`:verified;报告 `coverage/glb-machine-manager/regression-motion/motion.report.json`,SHA-256 `91c3fa8ed8037aac8e71b8c76d54c38db9dc011ae25f63553966860b624aa626`。AC/BC 各 41 个同时五轴变化 tick、42 个样本,最大误差分别约 `2.26e-16`、`2.48e-16`。
- `git diff --check`:通过。
- `scripts/validate_glb_machines.mjs` 未重跑:本地缺少 `gltf-validator` 包;旧示例 GLB 未修改,历史 Khronos 校验报告仍为 verified。该依赖边界不影响新管理器的浏览器导入、导出和运行证据。

View File

@@ -0,0 +1,29 @@
# 决策记录
## D01 / 继续使用 LinuxCNC WASM 作为运动权威
部件编辑器只生成模型结构和标定参数。程序执行、Jog、刀长、运动学类型和关节位置仍来自 Worker/WASM 快照。Three.js 不实现第二套 RTCP 或逆运动学。
## D02 / 运行结构保持 `linuxcnc.machine/1`
现有严格 URDF 校验、配置写入和运行投影已经验收。部件管理器输出同一结构,可复用所有运行能力并避免引入并行格式。编辑草稿使用独立 schema,只有验证成功后才转换成运行结构。
## D03 / 编辑层级自由,应用层级受求解器限制
UI 允许用户选择父级以建立层级和发现错误;应用时只接受底座→X→Y→Z→刀具及底座→A/B→C→工件。当前 WASM 只支持这两类 TRT,不能把任意树伪装成可执行机床。
## D04 / 原 GLB 不原地改写
导入部件的源字节和场景保持不变。局部原点和平移/旋转存在装配配置中,应用时创建深复制运行场景。标定数据写入运行装配中底座节点及整机场景的 userData;“导出组合 GLB”将该装配序列化为新的自包含 GLB,原部件文件不被覆盖。
## D05 / C 原点与 A/B 偏置的唯一映射
沿用 `trtfuncs.c` 和既有参数契约:C 原点 P 对应 rot-point,A/B 偏置 D 对应 offset;URDF 使用 T=P+D、U=-D、work=-P。该公式是控制模型坐标对应的唯一来源。
## D06 / 物理零点是模型校准,不改控制器关节值
物理零点保存为每轴的模型零姿态标定值。渲染位移/转角使用 `WASM joint - physicalZero`,但不修改 Worker、INI 的回零位置或程序坐标。改变真实回零参数仍应通过机床配置完成。
## D07 / 组合 GLB 只通过显式导出生成
普通编辑和“应用到 Web LinuxCNC”不触碰用户原文件。只有用户点击“导出组合 GLB”时才用 GLTFExporter 生成新文件。导出包含部件层级、URDF、底座标定 userData 和整机场景标定 userData。

View File

@@ -0,0 +1,25 @@
# Web LinuxCNC 三维机床管理器
本目录是“三维机床管理器”专项的唯一接续入口。工作顺序固定为:
1. 阅读 [04-任务矩阵](04-任务矩阵.md),选择首个未完成且依赖满足的任务。
2. 阅读 [03-推进台账](03-推进台账.md) 最新一轮和 [06-决策记录](06-决策记录.md)。
3. 按 [02-项目程序开发详细步骤](02-项目程序开发详细步骤.md) 实施。
4. 验收后把命令、报告、截图写入 [05-验收证据](05-验收证据.md),同步任务状态和推进台账。
专项目标是在 Web LinuxCNC 机床预览区提供“三维机床管理”对话框,支持 GLB 部件导入、AC/BC 两条机械链装配、部件原点和姿态编辑、原点辅助显示、RTCP 几何参数及物理零点定义,并保证模型运动与 LinuxCNC WASM 的实际关节坐标一致。
现有整机 GLB + 内嵌 URDF 导入能力继续保留。新管理器生成与现有 `linuxcnc.machine/1` 相同的严格结构,再通过已有配置、Worker、WASM 和 Three.js 投影链运行。
当前状态:MGR-01 至 MGR-09 全部 verified。最新台账 R02,浏览器证据 `GLB-MGR-E01/E02`,截图和报告位于 `coverage/glb-machine-manager/`。
文档:
- [01-项目功能内容](01-项目功能内容.md)
- [02-项目程序开发详细步骤](02-项目程序开发详细步骤.md)
- [03-推进台账](03-推进台账.md)
- [04-任务矩阵](04-任务矩阵.md)
- [05-验收证据](05-验收证据.md)
- [06-决策记录](06-决策记录.md)
相关旧专项:[GLB / URDF 五轴机床子项目](../glb-machine/README.md)。旧专项已完成整机导入、AC/BC 识别、几何参数同步和实际关节驱动,本专项不重复这些底层能力。

View File

@@ -0,0 +1,103 @@
# 子项目功能内容
## 需求与边界
用户指定两条机械链:底座 → X → Y → Z → 主轴箱;底座 → A → C。BC 将 A 替换为 B。线性轴移动刀具侧,转台固定在底座的另一分支。提供原创 AC 和 BC 标准型、AC 和 BC 桁架型四个完整 GLB,均包含几何、材质、节点和 URDF,不依赖外部模型文件。
预览区提供 GLB 导入、AC/BC 示例加载及下载,显示识别的机型、层级、摇篮中心和 RTCP 参数。关机且空闲时应用;验证完成才重载配置;保留程序并重新解析、失效原回零/不兼容恢复记录。普通 GLB 缺少结构描述时不能猜测机床参数。
## URDF 数据契约 v1
GLB 默认场景 `extras.linuxcncMachine = { schema: "linuxcnc.machine/1", urdf: "<robot ...>...</robot>" }`,Three.js 加载后位于 `scene.userData.linuxcncMachine`。XML 使用标准 URDF link/joint/origin/axis/limit,增加命名空间 `xmlns:cnc="urn:linuxcnc:web:machine:1"` 的 `cnc:machine` 和 `cnc:axis`,标准 URDF 与应用绑定分开。
- SI:origin.xyz 米,rpy/关节角弧度;机床坐标右手 Z 向上。GLB 最外层 `urdf_frame` 绕 X -π/2,将 Z-up 转到 glTF Y-up;不得将毫米直接作为 glTF 米。
- 每个 link 对应唯一 GLB 节点同名,节点局部静止位姿必须与父 joint.origin 相同,视觉网格放在 link 的子节点,不能把轴心烘焙进顶点后伪造节点层级。
- `cnc:machine` 显式绑定 base/tool/work 三个 link;每个运动 joint 的 `cnc:axis coordinate="X|Y|Z|A|B|C"` 绑定 LinuxCNC 坐标。不相信机型字符串:根据拓扑、joint.type 和 axis 推断 AC/BC。
- v1 接受正交 XYZ 刀具链、正向 X(A) 或 Y(B) 倾转轴以及其子 Z(C) 轴;局部 rpy=0。任意斜轴、头头/头台结构、mimic 或额外运动轴明确拒绝,后续扩展需新增求解器。
- 限位、速度和 effort 必须有限且合法;URDF limit 用作导入运动范围校验,运行加速度、回零、伺服周期仍由对应 INI 提供,结构模型不能推断这些参数。
- 摇篮 joint.origin 为 T,C joint.origin 为 U;零位 C 原点 P=T+U。映射 `rot_point=P*1000`,`offset=-U*1000`。AC 要求 U.x=0;BC 要求 U.y=0。work 固定 joint.origin=-P,保证零角下程序坐标原点与机床原点相同。
- 主轴箱零基准位于线性链原点;刀长来自 LinuxCNC 工具状态,不从外观网格猜测。遵循 trtfuncs.c 的 master-tool 约定处理工具长度与程序路径参考。
## 验收
两文件可独立导入;AC/BC 自动识别;结构与 GLB 节点一致;非零中心/偏置进入 WASM;多姿态与非零刀长时刀尖和工件程序点吻合;错误文件不更改已生效配置;浏览器导入、切换、门控、渲染及相关回归通过。
## 字段示例与制模约定
```json
{
"extras": {
"linuxcncMachine": {
"schema": "linuxcnc.machine/1",
"urdf": "<?xml version=\"1.0\"?><robot ...>...</robot>"
}
}
}
```
```xml
<robot name="demo_ac_xyz_head" xmlns:cnc="urn:linuxcnc:web:machine:1">
<cnc:machine profile="trt-xyz-head/1"
base="base" tool="spindle_head" work="work_frame"/>
<!-- 标准 link 定义省略;完整可用 XML 见交付的 .urdf -->
<joint name="tilt_joint" type="revolute">
<parent link="base"/><child link="tilt_table"/>
<origin xyz="0.024 0.006 -0.037" rpy="0 0 0"/>
<axis xyz="1 0 0"/><cnc:axis coordinate="A"/>
<limit lower="-1.7453292519943295" upper="0.8726646259971648"
velocity="0.5235987755982988" effort="1000"/>
</joint>
<joint name="c_joint" type="revolute">
<parent link="tilt_table"/><child link="c_table"/>
<origin xyz="0 -0.018 0.045" rpy="0 0 0"/>
<axis xyz="0 0 1"/><cnc:axis coordinate="C"/>
<limit lower="-628.3185307179587" upper="628.3185307179587"
velocity="0.5235987755982988" effort="1000"/>
</joint>
</robot>
```
|数据|AC 示例(mm)|BC 示例(mm)|提取方法|
|---|---|---|---|
|倾转轴中心 T|24, 6, -37|4, 14, -28|A/B joint.origin|
|C 相对倾转轴 U|0, -18, 45|-22, 0, 40|C joint.origin|
|原生 rot-point P|24, -12, 8|-18, 14, 12|T + U|
|原生 offset D|0, 18, -45|22, 0, -40|-U|
```mermaid
flowchart TD
root[urdf_frame: Z-up → glTF Y-up] --> base[base 底座]
base --> x[x_slide / X]
x --> y[y_slide / Y]
y --> z[z_slide / Z]
z --> tool[spindle_head 主轴箱/刀具基准]
base --> tilt[tilt_table / A 或 B]
tilt --> c[c_table / C]
c --> work[work_frame 程序参考]
```
八个 link 名可以自定义,但必须唯一并通过 URDF 引用;link 节点直接父子关系保持上述两条链,网格作为 link 的子节点。不依赖网格的名称或数量。关节静止变换可以写 glTF TRS 或等价 matrix,禁止额外缩放/旋转而不反映到结构数据。外观尺寸、颜色不进入 RTCP 参数。
完整示例:[AC URDF](../../web/react/public/machines/demo-ac-xyz-head.urdf)、[BC URDF](../../web/react/public/machines/demo-bc-xyz-head.urdf)。GLB 是唯一必需输入;旁边的 XML 和 manifest 只用于阅读与核验。
## 当前实现边界
导入资产保存在当前页面内存;刷新后须重新导入。不会向原 INI 或宿主磁盘自动写入,仍可通过现有“保存 INI”导出。修改/重新读取同机型 INI 时保留导入 GLB,同步更新有效 URDF 的轴心、偏置和工件参考系;手工切换机型才回到内置模型。跨 AC/BC 保留原程序,若原程序无法在新机型解析,明确提示“机床已应用,但程序解析失败”。
GLB 不提供完整工业机床控制配置、不做碰撞检测、质量/动力学仿真或任意 URDF 求解。示例 effort 为 URDF 结构字段,本仿真不据此宣称力矩控制。URDF 角度行程以匹配已有 LinuxCNC 示例配置为目的,不代表实际摇篮无碰撞范围。
2026-09-18 界面更新:导入/示例/结构信息和几何参数均在按钮打开的可拖动对话框中,预览顶部只保留“导入机床模型”“机床参数”两个入口,详见 D09 / GLB-UI01 / E07。
## 参数化桁架型(2026-09-18 新增)
|示例|URDF profile|刀具侧|工作台侧|结构节点|
|---|---|---|---|---|
|AC / BC 示例|trt-xyz-head/1|底座→X→Y→Z→主轴箱|底座→A或B→C|8 link / 7 joint|
|AC / BC 示例桁架型|trt-xyz-gantry/1|底座→X→Y→Z|底座→A或B→C|7 link / 6 joint|
两类均为五个运动轴。桁架型的 `cnc:machine tool="z_slide"` 直接绑定 Z;另有固定 work_frame 挂 C,作为程序参考坐标,并非第六运动轴。四柱/纵向轨道固定在底座,移动横梁属于 X,横梁滑座属于 Y,滑枕及主轴网格属于 Z。
参数修改继续使用旋转中心与轴间偏置入口;实际导入模型保留,当前有效 URDF 和 WASM 同步。桁架与标准型共用相同的 AC/BC 原生参数含义,SI 单位、根坐标转换、刀长和几何编辑规则不变。示例外观尺寸在生成器中定义,不由编辑旋转中心自动重建 CAD 网格。
交付:[AC 桁架 GLB](../../web/react/public/machines/demo-ac-gantry.glb)、[AC 桁架 URDF](../../web/react/public/machines/demo-ac-gantry.urdf)、[BC 桁架 GLB](../../web/react/public/machines/demo-bc-gantry.glb)、[BC 桁架 URDF](../../web/react/public/machines/demo-bc-gantry.urdf)。

View File

@@ -0,0 +1,16 @@
# 子项目程序开发详细步骤
1. GLB-01:记录规范、网络资源与方案;明确节点关系、单位和原生参数映射。
2. GLB-02:实现 GLB 容器预检与 URDF 严格解析、拓扑/绑定/位姿校验;生成独立结构描述。
3. GLB-03:可复现生成 AC/BC 模型、内嵌 URDF、单独导出可阅读 XML 和资源清单;节点名与 XML 一致。
4. GLB-04:预览区导入及示例;先完成验证再重载匹配 INI,写入解析参数,Worker 仍二次解析 INI;显示成功或失败与参数来源。同机型配置改动后保留 GLB,更新有效 URDF 和运行参数;显式更换机型才卸载。
5. GLB-05:URDF link 按真实 WASM 关节做刚体位姿投影,路径附着 C 轴,刀长取运行状态;不在 JS 重写逆解。
6. GLB-06:解析拒绝用例、非零参数/刀长与 WASM 几何交叉验证、浏览器导入/门控/截图、类型检查及构建;整理 SHA 和证据、任务状态、接续入口。
原有本地改动不加入本专项。只运行相关测试,不重跑全仓验收、不修改上游或历史 release gate。
7. GLB-UI01(后续需求):共享可拖动对话框、预览布局和快捷键隔离,适配导入/参数原流程;验证鼠标/触摸、视口边界、焦点和画布尺寸,证据独立保存在 dialogs 子目录。
8. GLB-GEO01:几何参数写入有效 URDF,源 GLB/共享网格保留;校验应用、INI 重读/导入、重复编辑、失败和机型切换边界,以及改参数后的 WASM/模型和真实 RTCP Jog。
9. GLB-GAN01:独立桁架 profile、参数化生成两模型、四例注册入口;验证正确分支运动、导入/下载/几何编辑、真实 WASM/五轴程序及原 profile 兼容,证据 gantry 子目录。

View File

@@ -0,0 +1,103 @@
# 推进台账
## R09 / 2026-09-18 / 初学者工件坐标与 G 代码完整讲义
- 用户要求在RTCP课件基础上系统扩充工件坐标:坐标含义、原点和方向确定、G代码逐值解析与运动,整个讲义面向初学者。
- 新增 `docs/teaching/rtcp-beginners/`,72页A4完整教材,约2.6万正文字符;保留原31页投影概要。新书以坐标尺子入门,区分M/W/J/K/T,再讲工件原点测量、初始方向、G54配准和动态RTCP,最后进入完整程序与实验/答案。
- 核心细化:物理固连工件架与G54偏置表不同;本课G54是零位配准输入,动态方向与原点由运动学继续变换。解释G10 L2/L20、G90/G91、单位、F与其他字的上下文,明确普通坐标旋转和完整刀补不等于自动RTCP。
- 新增六个生成/验证脚本:`generate_rtcp_beginner_data.mjs`、`generate_rtcp_beginner_figures.py`、`generate_rtcp_beginner_html.py`、`subset_rtcp_beginner_fonts.py`、`render_rtcp_beginner_pdf.mjs`、`verify_rtcp_beginner_pdf.py`。
- 数值实测:o=(40,20,10)、BC、P=D=L=0。11个主段、11个额外单位/G54-G55/L20段核对;N10–N90加M2通过实际解释器/TP/WASM执行完成,53个采样,终点与逐行结果一致。M429/M428另按保持物理关节接口核对。
- 图像:9张新增原创坐标图,复用11张旧原创图;72页逐页边界/图片/标题检查和Poppler独立渲染检查。字体同形部首导致复制字符不符的问题,通过按实际字符制作Noto SC子集解决;保留字体许可,严格检查所有72页标题可正确提取。
- 记录能力边界:本项目解释器是功能切片,完整G43/H刀表、G52/G92、任意方向和所有进给模式不在本次全面验收范围;以官方语义讲解时明确区分,未把“解析接受”当成完整实现。
- 验证见E13,文件含目录/书签、HTML源稿、测试数据、教学NGC与复现步骤。未修改运行功能,原本地改动、旧PDF和历史证据保留;未提交/推送。
- 下一步:教材已完整交付,按后续教学内容修订需求推进。
## R08 / 2026-09-18 / 五轴与 RTCP 教学 PDF
- 用户要求完善“非RTCP各轴独立”和“RTCP坐标随转台变换、刀尖跟随”的理解,提供图文教学课件。
- 新增 `docs/teaching/rtcp-five-axis/`:31页16:9中文PDF、可编辑HTML、9张原创原理图、2张无界面控件的桁架模型图、数值报告、目录与逐页验证。
- 明确范围:XYZ加AC或BC;独立驱动不等于不能协调插补;程序坐标须经过单位/增量/零点/刀补;RTCP不仅改变方向,还处理中心/偏置/刀长;模式切换应固定物理关节。加入非RTCP后置计算、TCP/倾斜平面差异、限位与版本化M码说明。
- 生成脚本:`generate_rtcp_teaching_data.mjs`、`generate_rtcp_teaching_figures.py`、`capture_rtcp_teaching_models.mjs`、`generate_rtcp_teaching_html.py`、`render_rtcp_teaching_pdf.mjs`、`verify_rtcp_teaching_pdf.py`。
- 验证 E12:真实WASM十二个姿态正逆解、方向增量/切换算例;31页DOM边界和图片加载检查;Poppler独立渲染所有PDF页并目视检查;PyPDF核验31页、16:9、中文文本、字体自包含、39个书签。
- 中间排版修正:两页接近/越过页脚,调整公式和图形间距后严格边界检查通过;字体检查增加对Chrome嵌入Type3字形程序的正确识别,pdffonts也确认emb=yes。没有改应用功能或覆盖前轮证据。
- 下一步:课件可直接教学,按后续内容修订需求更新。原有本地改动保留,本轮未提交/推送。
## R07 / 2026-09-18 / Jog 限位与序列恢复、阴影警告
- 用户截图:XYZBC B=50.2275°,Connection: ERROR / event_sequence_gap。配置 AXIS_B 范围大,但 JOINT_3 上限=50°;连续 Jog 只以坐标限位作为目标,越过关节限位后原生 FK 返回 -702。首次 Worker 复现得到 `SIM_STEP: wasm_xyzac_forward_-702`。
- 第二层根因:SIM_STEP 执行前把请求的未来 tick 写入事件日志,实际在较早 tick 失败;下一命令发生 tick 回退,未写事件而协议已消费序号,再下一命令出现 sequence_gap。
- `wasm-linuxcnc-tp.mjs`:对于能直接映射关节的坐标,Jog 临时采用 AXIS/JOINT 限位交集,原生 TP 计算目标和减速,随后恢复正常坐标限位。RTCP 耦合的 XYZ 关节由真实 WASM IK/FK 在每个伺服样本检查;越界则取消剩余轨迹并回到上一个有效样本,发布限位停止而不是继续越界。
- `sim-session.mjs`:SIM_STEP 完成/失败后写入实际 tick;成功时仍在 checkpoint 前完成事件记录。调度异常时停止运动,并同步协议/任务时钟。`sim-scheduler.mjs` 中异常保留已尝试 tick,同步 native scheduler,未执行的未来周期不再占用时钟。
- UI 将限位拒绝标为 blocked,与 Worker 连接故障区分;Jog 采样出错显示具体原因。到限位后 JOG_STOP、反向 Jog、SNAPSHOT_REQUEST、checkpoint/恢复均可继续。
- 用户补充控制台截图仅为 PCFSoftShadowMap 弃用提示,与事件故障无关;XyzacMachineView 改为 PCFShadowMap,Chrome 再测 warnings=[]。
- 验证 E11:两机型直接旋转轴50°限位/反向退出、RTCP引发Y接近100mm限位/反向退出、失败后序号及原生事件游标一致、部分tick、无效cycles、checkpoint恢复通过。真实浏览器两机型反复Jog、松开停止、限位后再次运动/画面非空通过;120个精确恢复续跑样本、五轴程序、单步、基础session/scheduler/replay及生产构建通过。
- 旧 `test_xyzac_manual_control.mjs` 在回零尚未完成时期待 homed_mask=1,旧 `test_xyzac_button_constraints.mjs` 期待关机优先而得到 not_all_homed;使用只读 HEAD 模块加载器复核也在相同断言失败,保留日志,未修改门控或放宽断言。
- 证据归入 coverage/glb-machine/jog-limits/,不改此前证据、上游、本地trace/图片/临时文件。无 C/WASM 变更,无需重建原生核心。本轮及前轮变更仍未提交/推送。
- 下一步:专项收口;已进入旧序号错误的浏览器会话需刷新,重新导入模型并回零,不能伪造缺失事件来修补旧会话。
## R06 / 2026-09-18 / AC、BC 参数化桁架示例
- 用户要求保留 AC/BC 示例,新增 AC/BC 桁架型,结构为底座→X→Y→Z、底座→A/B→C。
- 原 AC/BC 导入示例已经采用双链,但存在 Z→主轴箱固定 link。本轮桁架型独立 profile `trt-xyz-gantry/1`,七 link、六 joint、五运动轴,tool 直接绑定 Z。原 profile `trt-xyz-head/1` 与原模型保持。
- `generate_glb_machines.mjs` 新增四柱桁架、固定纵向 X 轨、属于 X 的整根桁架横梁、属于 Y 的横梁滑座、属于 Z 的滑枕/主轴外形。转台仍独立挂到底座;生成两个新单文件 GLB 及 XML。
- `machine-urdf.ts` 只对新 profile 放行对应 link/joint 数量和 Z 工具绑定;保留树/单位/轴向/运动学校验。MachineImportPanel 从 manifest 读取四个例子的按钮名和路径,结构文字根据 profile 显示。
- 新增 `test_gantry_machine_browser.mjs`;原参数编辑测试和五轴程序测试增加可选 GLB_MACHINE_VARIANT/GLB_EVIDENCE_DIR,复用完整原断言。标准校验脚本支持独立证据目录。
- 验证 E10:四个入口和下载、标准 profile 兼容;新模型各分支父子关系、X/Y/Z 分别带动对应外形、底座/转台独立;三类错误新 profile 拒绝;参数应用/INI 保存导入重读保持模型、各18个WASM姿态/刀长、实际 RTCP Jog;每机型41个五轴同时变化采样间隔、42个轨迹投影。四个 GLB 均0错误/警告;重复生成和生产资产一致,原AC/BC字节SHA未变。桌面/手机与类型检查/构建通过。
- 原有本地改动及此前证据保留;本轮独立 `coverage/glb-machine/gantry/`。无 native C/WASM 变更、无外部模型资产。
- 下一步:任务已验收,无待办;按新目标继续。所有功能改动仍未提交/推送。
## R05 / 2026-09-18 / 几何编辑保留导入机床
- 用户发现导入 GLB 后“应用参数”会切回内置机床。根因是 App.applyGeometry 在非导入调用时执行 setImportedMachine(null),属于 R02 为防止参数脱节制定的旧策略。用户新需求覆盖此策略,新增 GLB-GEO01。
- 修复前 `scripts/test_imported_geometry_browser.mjs` 明确复现:应用后 GLB hash 从源文件 SHA 变成空串;before.log 保留。
- `imported-machine.ts` 新增 updateImportedMachineGeometry:验证机型、运行限位/速度及 INI 参数,按节点绑定更新当前有效 URDF 的 A/B、C、work origin,并重新解析校验;支持用户自定义 joint 名称。源 scene、网格、材质、文件名与 SHA 不变。
- buildImportedMachine 的运行克隆使用有效 URDF 设置所有 link 的零位,包括固定 work frame;运动继续采用真实 WASM 关节。App 在 Worker 成功加载配置后提交候选结构;参数预检失败保持旧模型,程序重解析失败则明确报告已应用配置。
- App 资源清理依赖 source scene 是否更换,避免几何对象变更时误释放共享网格。导入详情显示当前参数,并说明源 GLB 未改写。显式机型选择仍卸载旧 GLB。
- 同机型“应用参数”“重新读取 INI”“导入 INI 后应用”均保留模型;重复相同参数不累加位移。对应更新原 GLB 浏览器脚本的 INI 重载预期,保留所有其他断言。
- 验证 E09:AC/BC 的真实 UI 原路径复现、保存/导入/重读、非法输入保留状态、开机门控、机型切换,以及各 18 个不同角度/刀长的 WASM 交叉验证和改参数后实际 RTCP Jog 均通过。原 GLB 全专项、内置参数编辑回归及类型检查/构建通过。
- 测试修正:details 展开状态在 AC→BC 切换时会保留,最初无条件点击反而折叠导致文本断言失败;改为仅在折叠时点击,未放宽内容断言。
- 证据独立在 coverage/glb-machine/geometry-edit/;旧报告保持,不修改源 GLB 或上游/原有本地改动。
- 下一步:本专项已验收,按新需求推进。当前所有本地功能变更仍未提交/推送。
## R04 / 2026-09-18 / 空闲 M429/M428 切换刀尖跳动
- 用户截图中 XYZ 坐标保持不变,而 J0/J1/J2 随按钮切换改变,模型真实反映了错误关节值,并非 GLB 层级或显示坐标 bug。新增 TRT-SW01。
- 复现:新增 `web/worker/test_trt_switch_stationary.mjs`,修复前在 AC、A=4.8675° / C=179.88° 下 M428 将 J0 从 0 改为 47.97481463927447 mm,强断言失败;保留 before.log。
- 根因:`SimSession.switchXyzacKinematics()` 使用保持旧 pose 并逆解的 select()。改为已有 WASM selectPhysical(),输入当前规划器关节,计算新模式下坐标。随后同步 TP 和解释器。
- `wasm-linuxcnc-tp.mjs` 的 setPosition 增加可选模式参数,坐标和模式一起更新后才 read,避免中间态把旧坐标交给新模式逆解,尤其接近行程边界时错误越限。默认调用行为保持。
- `test_xyzac_trt_case.mjs` 保留原坐标同步断言并补充关节不变断言;新增实际浏览器按钮/MDI/后续 Jog 专项。
- 验证 E08:两机型 64 次 Worker 切换、22 次浏览器切换;截图姿态、非零中心/偏置、接近边界、重复模式、M430、空闲 tick、增量/坐标偏置、运行中/非法模式拒绝;实际渲染刀尖不动。原 RTCP Jog、TRT case、单步流程、运行后续和生产构建通过。
- 浏览器测试先等待 MDI 到位,再切回 Manual 刷新控件状态后选择切换按钮;第一次直接等待按钮门控刷新超时,未作为通过证据。
- 证据独立保存 `coverage/glb-machine/switching/`,未覆盖前轮验收;未修改 native C/WASM 或上游 LinuxCNC。
- 下一步:任务已验收,刷新页面载入新 Worker 后重新导入 GLB 即可体验;本轮及前轮改动均未提交/推送,原有本地保留项不变。
## R03 / 2026-09-18 / 预览放大与可拖动设置对话框
- 用户截图显示导入说明和参数表占据预览高度,机床仅剩很小显示区域;新增 GLB-UI01。
- `App.tsx` 把两个入口合为机床预览顶部紧凑工具条;`MachineImportPanel.tsx` 与 `TrtGeometryPanel.tsx` 的表单移入共享 `DraggableDialog.tsx`。模型画布占据其余高度,不改变左右预览比例。
- 原生 dialog 提供模态隔离;标题栏支持鼠标和触摸拖动、视口边界限制、窗口缩小后回到屏幕内;Esc 关闭、Tab/Shift-Tab 循环、焦点返回。关闭保留参数草稿;应用过程中保留结果显示。开机可打开查看,实际导入/参数编辑仍受原门控限制。
- App 快捷键在对话框打开时跳过机床操作,F1 急停保留,防止 Esc 误触 PROGRAM_ABORT 或 F2 误开机。
- 原有 GLB/参数浏览器脚本只适配打开/关闭对话框步骤;新增 `scripts/test_machine_dialog_browser.mjs`。证据独立写入 `coverage/glb-machine/dialogs/`,保留 E02–E06 原报告。
- 验证 E07:2048×859、1440×900、390×844 下机床画布高度分别 351.5、392.5、380 px;占机床面板高度超过 85%;打开对话框画布尺寸不变。拖动、极端边界、触摸、缩屏、焦点、快捷键、草稿、运行门控通过;原参数保存/导入、两机型 GLB 导入和 RTCP Jog 回归通过;类型检查/生产构建通过。
- 中间问题:浏览器原生 Tab 可转到浏览器工具栏,专项断言捕获;补充弹窗内 Tab/Shift-Tab 循环后通过,没有放宽断言。
- 下一步:当前专项所有任务已验收,按新需求推进。所有改动仍未提交/推送,原有本地改动继续保留。
## R02 / 2026-09-18 / 实现与验收收口
- 完成解析器 `web/react/src/machine-urdf.ts`:XML 命名空间、两分支拓扑、正交轴、单位/限位、GLB 自包含/节点绑定/位姿、版本和异常输入校验;推导 AC/BC、rot-point 和 offset。
- 完成模型 `scripts/generate_glb_machines.mjs` 及 `web/react/public/machines/` 的 AC/BC GLB、XML、manifest、许可;底座-XYZ-主轴箱、底座-A/B-C,与原移动工作台模型区分。
- 完成 `imported-machine.ts`、`MachineImportPanel.tsx` 和 App/Viewer/styles 接入:文件导入、示例与下载,应用前验证,参数通过 INI/Worker 进入 WASM;真实关节驱动、刀长与程序路径参考、旧资产卸载和资源释放。
- 新增 `test_glb_machine_browser.mjs`、`test_glb_machine_motion.mjs`、`validate_glb_machines.mjs`;原两个浏览器测试只增加可选证据输出目录,不删除断言。
- 验证 E02–E06:42 项拒绝用例、36 个姿态/刀长样本、8 次导入模型 RTCP Jog、两机型各 41 个五轴同时变化的执行间隔、84 个程序执行投影采样;两 GLB 标准校验 0 错误/警告;旧参数编辑与 Jog 回归、桌面/手机、类型检查及构建通过。
- 中间问题:生成器默认导出 matrix,首次被 TRS 校验拒绝;改为导出 TRS,同时解析器接受与 URDF 等价的 matrix。运动程序抽样过疏导致样本数断言失败,改为全量采样,未放宽断言。测试损坏文件时模型保持不变,后续重新加载成功示例后截图。重复生成 public 资产触发 Vite 自动刷新,曾打断一次进行中的浏览器测试;停止资产写入后独立重跑。
- 证据统一在 `coverage/glb-machine/`;旧 `coverage/trt-parametric/` 未改。原有 trace、子模块、临时文件和图片完整保留。
- 边界:本轮 v1 仅支持已声明的 AC/BC TRT 正交双链;运行 INI 仍负责回零/周期等;GLB 当前页面内存保存,刷新重新导入;不宣称任意机床 URDF、碰撞检测或制造商尺寸标定。
- 下一步:本专项矩阵无待办,按新目标扩展或按用户要求保存;未提交/推送本轮新功能。
## R01 / 2026-09-18 / 需求与契约
- 按用户最新指令确定两分支结构,建立本目录七份文档。
- 已读取原专项索引/矩阵、现有预览、参数写入和 WASM 运动学链路;保留原有工作区改动。
- 已查阅 glTF、URDF、Three.js 和 LinuxCNC 官方资料,检索网络模型资源;尚未找到可确认满足本契约的可再分发完整 GLB。
- 验证:此阶段仅源码和规范核对,未运行新功能测试。
- 下一步:GLB-02 严格结构解析,随后生成两种模型并接入 UI。

View File

@@ -0,0 +1,20 @@
# 任务矩阵
状态:待办、进行中、已验收、阻塞;已验收必须引用证据。
|编号|内容|依赖|状态|验收标准|证据|
|---|---|---|---|---|---|
|GLB-01|方案、规范与资料|无|已验收|七份文档,明确两分支、单位、原生参数映射和来源|E01|
|GLB-02|URDF / GLB 解析校验|01|已验收|树、轴、单位、绑定、格式错误拒绝;提取 AC/BC 与参数|E02|
|GLB-03|原创 AC/BC 示例|02|已验收|独立可用 GLB,层级与内嵌 XML 一致,可复现生成|E03|
|GLB-04|导入与配置联动|02,03|已验收|预览入口、示例下载、识别与重载、保留程序、门控|E02|
|GLB-05|真实关节驱动模型|02,03|已验收|XYZ 刀具侧、A/B-C 工件侧;多姿态及刀长吻合 WASM|E02,E04|
|GLB-06|回归与接续收口|04,05|已验收|自动测试、浏览器截图、构建、SHA 证据和文档一致|E05,E06|
|GLB-UI01|预览区域与可拖动对话框|04|已验收|导入/参数弹窗、拖动与边界、键盘/触摸、画布尺寸、原流程回归|E07|
|TRT-SW01|M429/M428 空闲切换保持机床关节|05|已验收|按钮/MDI 无关节或刀尖跳变;规划器与解释器同步;切换后 Jog/增量及门控通过|E08|
|GLB-GEO01|编辑几何参数保留导入模型|04,05|已验收|应用/INI重读/导入保留GLB;有效URDF/显示与WASM一致;重复编辑与失败不替换模型|E09|
|GLB-GAN01|AC/BC 参数化桁架示例|GEO01|已验收|四个独立入口;桁架XYZ刀具链/独立A或B-C工作台;导入、参数编辑、WASM/联动校验|E10|
|TRT-JOG02|Jog 限位后事件序列与反向恢复|SW01|已验收|关节限位不越界;故障不产生序列缺口;停止/反向Jog/快照可用;原运动和恢复回归|E11|
|GLB-UI02|Three.js 阴影弃用警告|UI01|已验收|使用 PCFShadowMap,真实浏览器无 PCFSoftShadowMap 警告|E11|
|TRT-DOC01|五轴与RTCP中文教学课件|SW01,GAN01|已验收|原理图/数值/程序对照/实验/练习答案;中文PDF可读、分页和算例核验|E12|
|TRT-DOC02|工件坐标与G代码初学者完整讲义|DOC01|已验收|原点/方向/各参考系、G54与RTCP分层、逐字逐行实算、完整A4图文PDF及中文提取核验|E13|

View File

@@ -0,0 +1,190 @@
# 验收证据
## E13 / 工件坐标与G代码初学者完整讲义
- [完整PDF](../teaching/rtcp-beginners/五轴RTCP与工件坐标-初学者完整讲义.pdf):72页A4,约2.1MB,中文可选择/搜索,含可点击目录及书签;原31页课件保留。
- [内容/命令索引](../teaching/rtcp-beginners/README.md)、[逐页目录](../teaching/rtcp-beginners/outline.json)、[编辑源稿](../teaching/rtcp-beginners/handbook.html)。
- [数值证据](../teaching/rtcp-beginners/gcode-evidence.json),report_id=`rtcp-beginners-gcode-v1`:11主段+11附加段;程序W→偏置K→BC逆解关节值;单位、G54/G55、L20、模式切换;完整N10–N90程序通过实际Session/解释器/TP,状态completed、53个样本、终点(-18.480762,40,27.990381,30,90)。
- [版面报告](../teaching/rtcp-beginners/verification/layout.json):72页无越界/缺图;新增图形无缺字警告。独立PDF渲染总览:[1–24页](../teaching/rtcp-beginners/verification/pdf-contact-1.png)、[25–48页](../teaching/rtcp-beginners/verification/pdf-contact-2.png)、[49–72页](../teaching/rtcp-beginners/verification/pdf-contact-3.png)。
- [PDF汇总](../teaching/rtcp-beginners/verification/acceptance.json),report_id=`rtcp-beginners-pdf-v1`:严格匹配72页标题与提取文字、A4页尺寸、字体自包含、书签、PDF/HTML/数值/图形/字体/渲染总览SHA。
- 生成命令在教材README;主要为`generate_rtcp_beginner_data.mjs`、`generate_rtcp_beginner_figures.py`、`generate_rtcp_beginner_html.py`、`subset_rtcp_beginner_fonts.py`、`render_rtcp_beginner_pdf.mjs`、`verify_rtcp_beginner_pdf.py`。Matplotlib/PyPDF/fontTools来自临时目录,未增加应用依赖。`pdfinfo`确认72页,`pdftoppm`独立渲染全部页且非空。
- 本轮只产出教学资料,无应用功能改动、无远程job_id。官方资料链接列在PDF末页,通用功能与Web切片实测范围分开说明。
## E12 / 五轴与 RTCP 教学课件
- [PDF成品](../teaching/rtcp-five-axis/五轴机床与RTCP-教学课件.pdf):31页,16:9,约1.9MB,中文可选择,字体嵌入,39个目录书签。
- [编辑源稿及复现命令](../teaching/rtcp-five-axis/README.md)、[各页目录](../teaching/rtcp-five-axis/outline.json)、[原生数值](../teaching/rtcp-five-axis/numeric-evidence.json)。
- [排版检查](../teaching/rtcp-five-axis/verification/layout.json):31页无图文越界/缺图/页面错误。[独立PDF渲染总览](../teaching/rtcp-five-axis/verification/pdf-contact-sheet.png):Poppler渲染实际PDF,不仅检查HTML截图。
- [汇总](../teaching/rtcp-five-axis/verification/acceptance.json),report_id=`rtcp-teaching-pdf-v1`,包含PDF/源稿/数据/图像SHA,逐页尺寸和文本量、字体、书签及WASM指纹。主数值例子12个姿态正逆解回代通过。
- 主要命令:`node scripts/generate_rtcp_teaching_data.mjs`;`PYTHONPATH=/tmp/rtcp-course-deps python3 scripts/generate_rtcp_teaching_figures.py`;`python3 scripts/generate_rtcp_teaching_html.py`;带PLAYWRIGHT_MODULE运行`render_rtcp_teaching_pdf.mjs`;带PYTHONPATH运行`verify_rtcp_teaching_pdf.py`。PDF还经`pdfinfo`/`pdffonts`与`pdftoppm`核验。
- 查阅官方5-axis-kinematics/switchkins/machining-center文档及本地原生源码,正文脚注与末页列出来源。示意图原创,机床资产沿用项目原创GLB;无远程job_id,无新增应用依赖。
## E11 / Jog 限位和序列恢复、阴影警告
```bash
node web/worker/test_jog_limit_recovery.mjs
PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_jog_limit_browser.mjs
TRT_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/jog-limits node web/worker/test_trt_checkpoint_exact.mjs
GLB_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/jog-limits PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_glb_machine_motion.mjs
node web/worker/test_sim_scheduler.mjs
node web/worker/test_sim_session.mjs
node web/worker/test_replay.mjs
node web/worker/test_xyzac_step_flow.mjs
node web/worker/test_xyzac_recovery.mjs
node web/react/src/test_store_visual_clear.mjs
npm --prefix web/react run build
python3 scripts/generate_jog_limit_acceptance.py
```
- [Worker 专项](../../coverage/glb-machine/jog-limits/worker.report.json),report_id=`jog-limit-recovery-v1`,两机型直接轴到50°停止并退回49°;RTCP转C触发Y关节边界,在Y=99.952445mm有效样本停止,队列为空/速度零;反向退出、JOG_STOP、快照和checkpoint恢复通过。失败时只完成请求5个tick中的1个,事件、native游标、任务与scheduler一致;非法cycles后仍可继续。
- [浏览器专项](../../coverage/glb-machine/jog-limits/browser.report.json),report_id=`jog-limit-browser-v1`:AC/BC真实按钮按住→到限位→松开→反向→多次Jog全部通过,画面恢复运动且WebGL像素非空,无sequence_gap、无pageerror。[AC恢复画面](../../coverage/glb-machine/jog-limits/ac-recovered.png)、[BC恢复画面](../../coverage/glb-machine/jog-limits/bc-recovered.png)。
- [精确恢复](../../coverage/glb-machine/jog-limits/exact-checkpoint.report.json):120个续跑状态hash完全一致,12个恢复后Jog样本、trace/new-session/幂等测试通过。[五轴程序](../../coverage/glb-machine/jog-limits/motion.report.json)两机型均通过。基础scheduler新增部分失败后下一个tick断言,session/replay、单步、旧checkpoint恢复和store保留预览测试均通过。
- [阴影警告报告](../../coverage/glb-machine/jog-limits/shadow.report.json):原模型和导入BC均加载,Chrome console warnings=[],不再出现PCFSoftShadowMap弃用警告;[截图](../../coverage/glb-machine/jog-limits/shadow.png)。页面 http://127.0.0.1:5174/,Google Chrome / SwiftShader。
- [HEAD复现日志](../../coverage/glb-machine/jog-limits/before.log)保留RTCP越界时旧错误响应也因inverse_mode_-702失败。初始现有工作区复现直接B轴越界报forward_-702,随后采用直接轴限位交集修复。
- 额外运行的旧manual_control和button_constraints测试未通过,分别是同步回零假定、前置门控优先级差异;通过Node只读loader从git HEAD加载session/scheduler/tp模块,对比相同失败。日志 `manual.log` / `manual-baseline.log`、`buttons.log` / `buttons-baseline.log` 位于本目录。它们不是本轮回归通过声明,不改生产门控迎合旧断言。
- [构建日志](../../coverage/glb-machine/jog-limits/build.log)通过,已有大chunk提示;无C/WASM或上游修改。没有硬件减速/碰撞安全声明,RTCP限位为仿真在最后有效伺服样本停止。
- [汇总](../../coverage/glb-machine/jog-limits/acceptance.report.json),report_id=`jog-limit-acceptance-v1`,保留证据SHA和已知旧测试失败,无远程job_id。之前验收报告未覆盖。
## E01 / 规范与源码核对 / 2026-09-18
- glTF 2.0: https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html (extras、节点树、米、Y-up)。
- URDF: https://docs.ros.org/en/humble/Tutorials/URDF/Building-a-Movable-Robot-Model-with-URDF.html (joint parent/child/origin/axis、限位、弧度)。
- Three.js: https://threejs.org/docs/pages/GLTFLoader.html (GLB 解析);本地 GLTFLoader 源码核对 extras → userData。
- LinuxCNC: https://www.linuxcnc.org/docs/html/motion/5-axis-kinematics.html ;本地 `linuxcnc/src/emc/kinematics/trtfuncs.c` 核对 AC/BC 旋转中心、轴间偏置和 tool-offset。
- 网络模型候选: https://www.cgtrader.com/3d-models/industrial/industrial-machine/5-axis-machine-194cb656-8e44-4695-81cd-7e2a951bd92d 、 https://www.turbosquid.com/3d-models/milling-machine-cnc-tool-3d-model-2148325 。仅检索到资源页,未下载/购买/确认内嵌 URDF 或再分发许可;不作为交付资产。
- 本轮采用自行程序化创建模型;不宣称网上现成模型已符合要求。
- job_id / PDF:不适用。新功能测试与截图待后续条目记录。
## E02 / 严格解析与浏览器导入
命令(仓库根目录):
```bash
PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_glb_machine_browser.mjs
```
- 页面:`http://127.0.0.1:5174/`,真实 Google Chrome / Playwright / SwiftShader。
- 报告:[`browser.report.json`](../../coverage/glb-machine/browser.report.json),report_id=`glb-machine-browser-v1`;日志 [`browser.log`](../../coverage/glb-machine/browser.log)。
- 两机型共 42 项错误输入/越界配置拒绝:损坏 GLB、外部资源、动画、环、错误父子关系、重复节点、节点位姿、XML、轴绑定/方向、rpy、NaN、mimic、不支持 profile、运行行程/速度。等价 glTF matrix 正常接受,错误矩阵拒绝。
- 两机型各 18 个真实 WASM 逆解样本:六种角度 × 刀长差 0/17/-4 mm;非零 rot-point/offset;刀尖和工件程序点误差小于 1e-8 显示单位。额外验证 XYZ 移动不带动摇篮。
- 文件导入、示例按钮、机型识别、参数进入 Worker、程序路径保持、下载哈希、错误导入不更改模型/配置、开机禁用导入、回零后四次 A/B-C Jog、INI 重读卸载模型均验证。
- Worker 测试故意篡改配置投影值为 999,再确认实际 INI 参数胜出。
- 截图:[AC](../../coverage/glb-machine/ac-imported.png)、[BC](../../coverage/glb-machine/bc-imported.png)、[桌面](../../coverage/glb-machine/viewport-1440.png)、[手机](../../coverage/glb-machine/viewport-390.png)。真实 WebGL 颜色采样非空,控件无横向溢出,browser_errors=[]。
## E03 / 原创模型、格式与可复现性
```bash
node scripts/generate_glb_machines.mjs
npm install --prefix /tmp/linuxcnc-glb-validation --no-package-lock --ignore-scripts gltf-validator@2.0.0-dev.3.10
GLTF_VALIDATOR_MODULE=/tmp/linuxcnc-glb-validation/node_modules/gltf-validator/index.js node scripts/validate_glb_machines.mjs
```
- 交付:`web/react/public/machines/demo-ac-xyz-head.glb`、`demo-bc-xyz-head.glb`;各 71 个原创几何网格,八个结构 link,五个运动轴。
- Khronos glTF Validator 2.0.0-dev.3.10:两文件均 0 errors / 0 warnings;71 条信息为网格存在未用纹理坐标,不影响有效性。报告 [`gltf-validation.report.json`](../../coverage/glb-machine/gltf-validation.report.json),report_id=`glb-machine-khronos-validation-v1`。
- [`manifest.json`](../../web/react/public/machines/manifest.json) 包含文件长度、SHA256、原生参数和来源;[`LICENSE.txt`](../../web/react/public/machines/LICENSE.txt) 为原创模型 CC0-1.0 说明。
- 实际重复运行生成脚本并逐文件 SHA256 比较,通过;生产构建 GLB 与源 GLB 字节相同。报告 [`reproducibility.report.json`](../../coverage/glb-machine/reproducibility.report.json),report_id=`glb-machine-reproducibility-v1`。
- 标准验证器仅临时安装在 /tmp,未向项目新增依赖。
## E04 / 真实解释器和规划器五轴联动
```bash
PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_glb_machine_motion.mjs
```
- 报告 [`motion.report.json`](../../coverage/glb-machine/motion.report.json),report_id=`glb-machine-five-axis-motion-v1`;包含实际 G-code 和采样轨迹;日志 [`motion.log`](../../coverage/glb-machine/motion.log)。
- 两机型分别 LOAD_WORKSPACE、PROGRAM_LOAD、开机/回零、PROGRAM_RUN,通过真实 WASM 执行 M428 后同时改变 XYZ 与 A/B、C 的两段 G1,均正常完成。
- 每机型有 41 个五轴关节同时改变的采样间隔;42 个姿态投影采样。最大误差:AC `2.2591401799415137e-16`,BC `2.482534153247273e-16` 显示单位(当前 1 单位=100 mm)。
- 首次测试按每七个采样间隔抽样,程序较短导致样本数量不足;改为记录全部 RTCP 采样,保持原数量与误差强断言。
## E05 / 原有功能回归与构建
```bash
TRT_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/regression-parametric PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_trt_parametric_browser.mjs
TRT_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/regression-jog PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_trt_rtcp_jog_browser.mjs
npm --prefix web/react run typecheck
npm --prefix web/react run build
```
- 原参数编辑/导入/保存/重新读取/门控/桌面手机交互回归通过;report_id=`trt-parametric-browser-v1`,证据目录 [`regression-parametric`](../../coverage/glb-machine/regression-parametric/)。
- 原内置 AC/BC 各四次 RTCP Jog 回归通过,report_id=`trt-rtcp-jog-browser-v1`,证据 [`rtcp-jog-browser.report.json`](../../coverage/glb-machine/regression-jog/rtcp-jog-browser.report.json)。
- 类型检查及生产构建通过;[`build.log`](../../coverage/glb-machine/build.log)。已有大 chunk 提示保留,不作为失败。
- 未改动 C/WASM,无需重建 native;未重跑全仓测试,未覆盖 `coverage/trt-parametric/` 旧证据。
- job_id / PDF:本地执行,无远程 job,无 PDF;以日志、报告、截图及汇总哈希为证据。
## E06 / 最终汇总
命令:`python3 scripts/generate_glb_machine_acceptance.py`;只汇集已执行证据,不重新跑测试。
[`acceptance.report.json`](../../coverage/glb-machine/acceptance.report.json) 汇集实际报告状态、模型与 WASM SHA256、证据文件 SHA256。接续时先核对此文件,再按任务矩阵决定下一步;不要因历史台账中曾写“待办”而重复执行已验收任务。
## E07 / 模型显示区域与可拖动对话框
```bash
PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_machine_dialog_browser.mjs
TRT_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/dialogs/parametric PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_trt_parametric_browser.mjs
GLB_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/dialogs/import PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_glb_machine_browser.mjs
npm --prefix web/react run build
```
- 页面 `http://127.0.0.1:5174/`;Chrome / Playwright / SwiftShader;本地执行,无远程 job_id。
- [专项报告](../../coverage/glb-machine/dialogs/dialog.report.json),report_id=`machine-dialog-browser-v1`,status=verified。桌面/手机画布高度 351.5 / 392.5 / 380 px,超过机床面板高度 85%,弹窗不改变 canvas 尺寸。
- 两弹窗验证:鼠标移动位移、四边限制、Tab 焦点循环、Esc 关闭/焦点返回、F2 不触发开机、草稿保留;触摸拖动和窗口缩小后不越界;开机编辑门控。
- [参数编辑回归](../../coverage/glb-machine/dialogs/parametric/browser.report.json) 与 [GLB 导入回归](../../coverage/glb-machine/dialogs/import/browser.report.json) 均 verified,包含文件导入/下载、参数保存/重读、错误拒绝、两机型运动与手机交互;无页面错误。
- [构建日志](../../coverage/glb-machine/dialogs/build.log):类型检查及生产构建通过,大 chunk 提示保留。
- 截图:[宽屏机床区域](../../coverage/glb-machine/dialogs/preview-2048.png)、[参数对话框](../../coverage/glb-machine/dialogs/parameters-1440.png)、[手机参数](../../coverage/glb-machine/dialogs/parameters-390.png)、[拖动后的模型对话框](../../coverage/glb-machine/dialogs/machine-glb-settings-dragged.png)。
- [本轮验收汇总](../../coverage/glb-machine/dialogs/acceptance.report.json),report_id=`glb-machine-dialog-acceptance-v1`,列出实际证据 SHA256。之前 E02–E06 报告保留,本轮不重跑 native/五轴轨迹专项。
## E08 / M429/M428 保持物理位置
```bash
node web/worker/test_trt_switch_stationary.mjs
PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_trt_switch_stationary_browser.mjs
node web/worker/test_xyzac_trt_case.mjs
node web/worker/test_xyzac_step_flow.mjs
node web/worker/test_xyzac_runtime_followups.mjs
TRT_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/switching/rtcp-jog PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_trt_rtcp_jog_browser.mjs
npm --prefix web/react run build
```
- [修复前失败日志](../../coverage/glb-machine/switching/before.log):`KINEMATICS_SELECT mode=1 J0: 47.97481463927447 != 0`。
- [Worker 报告](../../coverage/glb-machine/switching/worker.report.json):report_id=`trt-stationary-switch-worker-v1`,64 次按钮/MDI/重复模式切换,两机型关节及可视投影在 1e-8 mm/deg 容差内保持;规划器/解释器同步,后续 3 个 idle tick、G54 偏置后的增量移动、忙碌/非法模式拒绝通过。
- [浏览器报告](../../coverage/glb-machine/switching/browser.report.json):report_id=`trt-stationary-switch-browser-v1`,22 次切换,AC/BC GLB 实际渲染刀尖保持;最大关节误差约 1.50e-13、最大显示坐标误差约 1.45e-15;之后旋转 Jog XYZ 补偿仍有效。
- 截图:[BC Identity](../../coverage/glb-machine/switching/bc-identity.png)、[BC TCP](../../coverage/glb-machine/switching/bc-tcp.png)、[AC Identity](../../coverage/glb-machine/switching/ac-identity.png)、[AC TCP](../../coverage/glb-machine/switching/ac-tcp.png)。页面 `http://127.0.0.1:5174/`,Chrome / SwiftShader;browser_errors=[]。
- 原 TRT case(新增关节不变强断言)、单步、runtime followups、两机型 RTCP Jog、类型检查及生产构建通过;日志在同目录,大 chunk 提示保留。无 C 修改,无需 native 重建,不扩展为全仓 parity 验收。
- [本轮验收汇总](../../coverage/glb-machine/switching/acceptance.report.json),report_id=`trt-stationary-switch-acceptance-v1`,包含 WASM 和所有证据 SHA256。无远程 job_id。
## E09 / 修改几何参数保留 GLB
```bash
PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_imported_geometry_browser.mjs
GLB_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/geometry-edit/import PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_glb_machine_browser.mjs
TRT_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/geometry-edit/parametric PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_trt_parametric_browser.mjs
npm --prefix web/react run build
```
- [修复前失败](../../coverage/glb-machine/geometry-edit/before.log):`applying geometry must retain imported GLB`,源 hash 变为空。
- [新专项报告](../../coverage/glb-machine/geometry-edit/browser.report.json):report_id=`imported-geometry-browser-v1`,AC/BC 均 verified。UI 应用、INI 保存→重读→导入→再应用、非法数值拒绝、开机不可编辑、显式跨机型卸载;原 GLB hash/文件名和程序路径保持。
- 每机型 18 个新几何姿态(6 个角度 × 0/17/-4 mm 刀长)与真实 WASM 逆解一致;源场景/原 XML 未修改、mesh 保留、自定义 joint 名支持、不匹配机型拒绝、相同参数复用。
- 实际浏览器 RTCP Jog 误差:AC `1.9778890766513102e-17`、BC `6.636893469679434e-17` 显示单位,模型计算与画面刀尖投影误差均为 0。
- [原 GLB 回归](../../coverage/glb-machine/geometry-edit/import/browser.report.json)(含42项拒绝、36个姿态、8次Jog)和 [内置参数编辑回归](../../coverage/glb-machine/geometry-edit/parametric/browser.report.json)(含桌面手机、保存/导入/重读)通过。
- [AC 修改后截图](../../coverage/glb-machine/geometry-edit/ac-edited.png)、[BC 修改后截图](../../coverage/glb-machine/geometry-edit/bc-edited.png);页面 `http://127.0.0.1:5174/`,Chrome / SwiftShader,无 pageerror。
- [构建日志](../../coverage/glb-machine/geometry-edit/build.log):类型检查/生产构建通过,大 chunk 提示保留。无 C/WASM 修改,不重复 native 验收。
- [本轮汇总](../../coverage/glb-machine/geometry-edit/acceptance.report.json),report_id=`imported-geometry-acceptance-v1`,包含所有证据及 WASM SHA256。E02/E07 中“INI 重读卸载模型”为历史验证,当前行为由 D11/E09 替代。无远程 job_id。
## E10 / AC、BC 参数化桁架型
```bash
node scripts/generate_glb_machines.mjs
PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_gantry_machine_browser.mjs
GLB_MACHINE_VARIANT=gantry GLB_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/gantry/geometry PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_imported_geometry_browser.mjs
GLB_MACHINE_VARIANT=gantry GLB_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/gantry PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/test_glb_machine_motion.mjs
GLB_EVIDENCE_DIR=/home/mes006/linuxcncWebWASM/coverage/glb-machine/gantry GLTF_VALIDATOR_MODULE=/tmp/linuxcnc-glb-validation/node_modules/gltf-validator/index.js node scripts/validate_glb_machines.mjs
npm --prefix web/react run build
```
- [四例入口和结构报告](../../coverage/glb-machine/gantry/catalog.report.json),report_id=`gantry-machine-browser-v1`:四个按钮及下载 hash;新 profile 七 link/Z 工具绑定;XYZ 零位及逐支外形运动,转台和底座不随 XYZ 移动;每新机型3类不合法结构拒绝;桌面/手机控件不溢出,无页面错误。
- [几何编辑回归](../../coverage/glb-machine/gantry/geometry/browser.report.json),report_id=`imported-geometry-browser-v1`,gantry 环境运行:两机型共36个姿态/刀长、编辑和INI导入/重读保留桁架、非法输入/运行门控、自定义joint名称、真实RTCP Jog 均通过。
- [五轴程序报告](../../coverage/glb-machine/gantry/motion.report.json),report_id=`glb-machine-five-axis-motion-v1`:真实解释器/TP,两桁架各41个五轴同时改变的采样间隔、42个投影样本,最大显示误差小于2.5e-16。
- [Khronos 校验](../../coverage/glb-machine/gantry/gltf-validation.report.json):四文件均0错误/0警告。[重复生成报告](../../coverage/glb-machine/gantry/reproducibility.report.json):所有生成文件可复现、生产GLB字节相同、原AC/BC文件SHA不变。
- [AC 桁架截图](../../coverage/glb-machine/gantry/ac-gantry.png)、[BC 桁架截图](../../coverage/glb-machine/gantry/bc-gantry.png)、[手机入口](../../coverage/glb-machine/gantry/dialog-390.png);页面 `http://127.0.0.1:5174/`,Chrome / SwiftShader。
- [构建日志](../../coverage/glb-machine/gantry/build.log):类型/构建通过,已有大chunk提示保留。[验收汇总](../../coverage/glb-machine/gantry/acceptance.report.json),report_id=`gantry-machine-acceptance-v1`,含模型、WASM与证据SHA。无远程job_id,无上游或native改动。

View File

@@ -0,0 +1,69 @@
# 决策记录
## D13 / Jog 限位失败不破坏传输历史
AXIS 限位是坐标范围,JOINT 限位是物理约束,XYZBC 的两者可以不同。Identity 的 XYZ 和各模式的旋转轴直接对应关节,Jog 目标由原生 TP 按两者交集约束;RTCP XYZ 不可用坐标限位替代关节限位,逐伺服样本调用已有 WASM 求解器验证。
RTCP 到达耦合关节边界时在最后有效样本停止,队列取消并报告限位,可反向退出。本次不声明具备预测未来 RTCP 路径并提前减速的硬件级软限位功能,仍是浏览器仿真边界。
SIM_STEP 事件的 tick 必须是实际完成/停止时间;不预写未执行的未来时刻,不通过跳过序号或删除历史“修复”会话。部分执行失败时统一 native/JS scheduler、task、protocol 的停止 tick,新的停止和撤退命令正常按顺序执行。限位是 motion blocked,不是 Worker transport ERROR。已经损坏的旧会话需刷新重建。
## D01 / 两条链与唯一结构来源
严格采用用户要求的底座-XYZ-主轴箱和底座-A/B-C。URDF 是结构来源;GLB 节点必须匹配,不从视觉网格尺寸猜测运动学。v1 限定现有 WASM 能精确支持的 AC/BC TRT,不将任意 URDF 强行归入该求解器。
## D02 / 单文件与版本化
URDF XML 放入默认场景 extras.linuxcncMachine,经 GLTFLoader 成为 userData。schema 必须匹配版本;glb 几何、材质和纹理须内嵌,无外部依赖。额外导出 XML 供阅读,不是运行必需文件。
## D03 / SI 和坐标转换
URDF 米/弧度与右手 Z-up;根节点显式转为 glTF Y-up。运行参数转毫米/度;旧查看器坐标转换仅在显示外层执行。姿态投影从关节计算刚体变换,逆解仍由 WASM 执行。
## D04 / 几何与运行配置
结构解析得到机型、摇篮位置/偏置,通过现有 INI 参数入口进入 Worker。URDF 不能提供回零接线、加速度或伺服周期,所以沿用已识别机型的运行配置;限位差异显式校验,不默默宣称完整工业控制配置已生成。
## D05 / 原创资产与可验证性
现有网上候选未确认所需层级与许可,交付原创可复现程序化资产,记录来源和许可。不复制未知许可证模型。模型是仿真示例,不是制造商尺寸标定数据。
## D06 / GLB 与 INI 冲突及失败处理
导入完成格式、树、轴和运动范围校验后才提交 LOAD_WORKSPACE。保留当前程序,不按机型偷偷替换 G-code;配置成功而原程序解析失败属于分阶段结果,必须显式报告。后续 INI 修改或手工切换机型会卸载 GLB,避免旧结构驱动新参数。损坏 GLB 不改变已生效模型及参数。
## D07 / 刀长与现有原生坐标约定
`trtfuncs.c` 在逆解中使用 dz + tool-offset。物理摇篮中心不随刀长改变;主轴箱刀尖沿本地 Z 减去 tool-offset,程序参考沿 C 的本地 Z 同样减去该值。多姿态、正负刀长必须用真实 WASM 逆解验证,不能只验证零角姿态。姿态矩阵只用于显示,不替代运动学求解。
## D08 / 保存与发布范围
本轮交付文件、导入和当前页面运行。没有将大型 GLB 塞进现有 1 MiB OPFS checkpoint,也不改变其恢复边界;页面明确提示刷新后需重新导入。证据全部归入 coverage/glb-machine;原测试增加可选 TRT_EVIDENCE_DIR,默认行为不变,防止新回归覆写历史验收文件。
## D09 / 预览优先与对话框交互
用户要求释放机床显示面积,导入和参数表改为按钮打开的可拖动对话框。保留两个入口在一行,不常驻占用模型高度;不改变左右两类预览比例。采用共享原生 dialog,标题栏拖动并限制在视口内,窗口缩小时重新约束位置。关闭不丢失草稿,不因异步导入开始而自动隐藏结果。打开查看与执行编辑分开,编辑仍由既有 Worker/前端门控控制。
弹窗内 Esc 专用于关闭,F2/Jog 等全局机床快捷键不执行;F1 急停继续有效。Tab 在弹窗内循环,关闭返回触发按钮。
## D10 / 空闲运动学切换保持物理关节
只选择 M429/M428/M430 不构成运动指令。应固定当前实际关节,由新模式正解得到坐标,再同步 TP 与解释器;坐标数值允许改变,三维刀尖不能改变。依据本地 LinuxCNC `control.c::handle_kinematicsSwitch()`:复制 joint.pos_cmd → kinematicsSwitch → kinematicsForward → tpSetPos,以及 [官方 switchkins 同步说明](https://linuxcnc.org/docs/html/motion/switchkins.html)。
Web 按钮/MDI 原来使用 select() 保持 pose 的策略不符合上述物理约束,改为调用已有 selectPhysical()。不在 Three.js 中补偿错误关节,也不冻结模型掩盖跳变。规划器 pose/tag 必须一起切换,避免中间态逆解;随后解释器同步确保下一条增量命令使用新坐标参考。运行中切换门控保持。
## D11 / 同机型几何编辑保留导入资产(替代 D06/D08 的卸载策略)
用户确认:导入 GLB 后修改几何参数不应替换成内置模型。导入资产的网格/材质、文件名和源文件 SHA 保持;当前有效 URDF 是独立的会话参数覆盖,A/B origin=P+D、C origin=-D、work origin=-P。修改、重读或导入同机型 INI 都使用这一路径。
在 LOAD_WORKSPACE 前构造并校验候选有效 URDF;成功后提交模型参数和界面配置。源场景不原地修改,渲染克隆采用有效 URDF,包括固定工件坐标节点;程序重解析失败时保留已提交模型并明确报告分阶段结果。资源释放依赖源 scene 是否更换,不因结构参数对象变化释放共享网格。
结构详情显示已应用参数。源 GLB 文件不会被静默改写,示例下载仍是原始示例;可以保存 INI 记录参数。网格外形不自动缩放或重新生成,固定在底座的外观网格仍属于底座;此功能校正结构节点和运动学参数,不宣称对任意导入网格完成 CAD 尺寸重建。显式选择机型配置仍视为更换整机,切换后返回该机型内置模型。
## D12 / 独立的桁架型 profile 与示例注册
用户新增桁架型层级到 Z 结束,因此 tool 直接绑定 Z link,主轴作为 Z 下的外观网格,不另设固定主轴箱 link。新 profile `trt-xyz-gantry/1` 为七 link/六 joint;原 `trt-xyz-head/1` 保留八 link/七 joint。模型类型 AC/BC 仍由实际轴向与两条机械链推断,不靠文件名。
桁架固定四柱与纵轨挂底座,移动横梁挂 X、横梁滑座挂 Y、滑枕/主轴挂 Z;A/B→C 为独立工作台分支。复用原生 TRT 求解器和已有参数映射,不新增 JS 逆解。参数化范围沿用几何中心/轴间偏置及真实关节运动,不增加无实际控制依据的外观尺寸表单。
四个示例共用 manifest 注册名称和文件路径;旧 AC/BC GLB 字节不变。新例子为原创程序化模型,许可证沿用 CC0,单文件含几何与 URDF。

View File

@@ -0,0 +1,35 @@
# GLB / URDF 五轴机床子项目
接续顺序:本索引 → [04-任务矩阵](04-任务矩阵.md) → [03-推进台账](03-推进台账.md) 最新轮 → 当前任务相关方案和代码;实施前核对 [06-决策记录](06-决策记录.md),验收后更新 [05-验收证据](05-验收证据.md)。
最新交付:[工件坐标与RTCP初学者完整PDF](../teaching/rtcp-beginners/五轴RTCP与工件坐标-初学者完整讲义.pdf),72页A4,详解原点/方向/G54/G代码逐字逐行和关节运动;源稿、数据、复现见[完整教材索引](../teaching/rtcp-beginners/README.md)。任务TRT-DOC02,台账R09,证据E13。原[31页投影课件](../teaching/rtcp-five-axis/五轴机床与RTCP-教学课件.pdf)保留为概要;既有功能状态仍见下文R07。
- [01-子项目功能内容](01-子项目功能内容.md)
- [02-子项目程序开发详细步骤](02-子项目程序开发详细步骤.md)
- 原专项 [TRT 参数化](../trt-parametric/README.md) 已验收,不重复实现。
- 工作区原有 trace、LinuxCNC 子模块、临时脚本和图片全部保留。
- 示例交付目录:`web/react/public/machines/`;证据:`coverage/glb-machine/`。
目标:导入一个含层级网格和 URDF XML 的 GLB,识别 AC/BC 结构、提取几何参数,经 INI/Worker 进入真实 WASM;预览由实际关节驱动。
Jog 限位与事件序列修复见 R07/E11:限位后可停止和反向退出,旧的 event_sequence_gap 会话需刷新并重新导入/回零。用户补充的 PCFSoftShadowMap 弃用警告也已消除。
## 当前状态与交付
GLB-01 至 GLB-06、GLB-UI01/02、TRT-SW01、GLB-GEO01、GLB-GAN01、TRT-JOG02 全部已专项验收,最新台账 R07,最新证据 E11(两项既有旧测试失败单独记录)。新功能尚未提交/推送;开发服务 `http://127.0.0.1:5174/` 已启动,重启环境后应重新检查。
- [AC 单文件机床模型](../../web/react/public/machines/demo-ac-xyz-head.glb) / [可阅读 URDF](../../web/react/public/machines/demo-ac-xyz-head.urdf)
- [BC 单文件机床模型](../../web/react/public/machines/demo-bc-xyz-head.glb) / [可阅读 URDF](../../web/react/public/machines/demo-bc-xyz-head.urdf)
- [AC 桁架模型](../../web/react/public/machines/demo-ac-gantry.glb) / [URDF](../../web/react/public/machines/demo-ac-gantry.urdf)
- [BC 桁架模型](../../web/react/public/machines/demo-bc-gantry.glb) / [URDF](../../web/react/public/machines/demo-bc-gantry.urdf)
- [模型 manifest](../../web/react/public/machines/manifest.json) / [验收汇总](../../coverage/glb-machine/acceptance.report.json)
使用:打开页面 → 关机且空闲 → 机床预览顶部“导入机床模型” → 对话框中“AC 示例”“BC 示例”“AC 示例桁架型”“BC 示例桁架型”或“导入 GLB” → 确认显示的机型与参数 → 开机、重新回零 → Jog 或运行匹配的五轴程序。可展开结构详情,并通过“下载 AC/BC”保存完整 GLB。页面刷新后需重新导入。
后续制模先读 01 的契约和完整 XML 示例;软件位置在 03 台账。当前无待办任务,不自动认领旧发布轨道,也不重复已通过测试。若新增任意轴向/头头机型、持久化 GLB 或碰撞检查,应先新增任务和对应决策。
参数入口为机床预览顶部“机床参数”;两个对话框均可拖动标题栏、Esc 关闭,关闭保留未应用草稿。最新 UI 验收见 [E07 汇总](../../coverage/glb-machine/dialogs/acceptance.report.json)。
空闲 M429/M428 切换已改为保持关节和刀尖位置,XYZ 数值按新运动学坐标重新计算;证据见 [E08 汇总](../../coverage/glb-machine/switching/acceptance.report.json)。
导入模型后应用/重读/导入同机型 INI 参数会保留 GLB,并同步有效 URDF 与 WASM;原始 GLB 文件不改写,可通过保存 INI 记录参数。只在显式更换机型时卸载旧模型,见 [E09 汇总](../../coverage/glb-machine/geometry-edit/acceptance.report.json)。

View File

@@ -131,7 +131,7 @@ replaced by a different action.
| View menu | Five preset views, inches/mm, program/rapid/alpha/live/tool/extents/offset/limit/velocity/DTG layers, grid, large DRO font, PyVCP, commanded/actual, machine/relative, joint/world and Clear Live Plot | The menu has five views; the toolbar additionally has inverted-front `Y2`, for six toolbar presets. Supported projections are `SOURCE_ADAPTER`; every omitted view action is recorded below. |
| Toolbar | E-stop, Power, Open, Reload, Run, Step, Pause/Resume, Stop, Block Delete, Optional Stop, zoom, six views, rotate, Clear Plot | Same source order and icon assets are retained for supported controls; unsupported controls are disabled with a source/ABI reason. |
| Manual notebook | Axis/joint selector, continuous/increment jog, Home Axis, Touch Off, Tool Touch Off, Override Limits, spindle direction/stop/speed/brake and coolant | XYZAC axis selector, jog, Home Axis, Touch Off, spindle and coolant are represented. Joint selection, Tool Touch Off and Override Limits are explicitly bounded by the selected configuration/ABI. Tool and probe state is read-only; Prepare/Change/Arm/Disarm are IO/HAL operations, not AXIS main-panel controls. |
| Web case strip | no AXIS equivalent | `Load exact XYZAC TRT case` is a Web workspace/bootstrap control, not an AXIS source button. It may only call the same documented `LOAD_WORKSPACE` + `PROGRAM_LOAD` transaction and must not introduce a second Run/Power/Home flow. |
| Web case strip | no AXIS equivalent | Exact TRT case loading and the 32-entry RTCP source library are Web workspace controls. Compatible main programs may only call the documented `PROGRAM_LOAD` transaction; support files and other kinematics remain source-view/download entries and must not introduce a second Run/Power/Home flow. |
| MDI notebook | MDI entry, Go, history selection/double-click, Up/Down history, Ctrl-M/H/Shift-H clipboard operations | Entry, Go and local history are represented; clipboard/file history operations are host/UI-only and are not sent as machine commands. |
| Help menu/dialogs | About AXIS, Quick Reference, dialog close buttons and website link | About is `SOURCE_ADAPTER`. Quick Reference and the external website link are not rendered; neither is mapped to a machine action. |
| Bottom controls | Linear jog speed, angular jog speed, max velocity, spindle override, feed override and rapid override | Linear jog, max velocity, spindle and feed are adapters. Angular jog and rapid override are `SOURCE_BLOCKED`; one must never stand in for the other. |
@@ -173,7 +173,7 @@ families because their cardinality comes from the selected INI.
| MDI entry, Go, Enter, history activation | `send_mdi`, `send_mdi_command` | `SOURCE_ADAPTER`; source trim, mode and adjacent-history de-duplication apply |
| Linear/angular jog speed, max velocity, spindle/feed/rapid override | `update_*slider_vel`, `set_maxvel`, `set_spindlerate`, `set_feedrate`, `set_rapidrate` | Linear jog/max velocity/spindle/feed: `SOURCE_ADAPTER`; angular jog/rapid: `SOURCE_BLOCKED` |
| About, Quick Reference, clear notifications | About/keys dialogs and `Ctrl-Space` binding | About: local adapter; Quick Reference and notification-clear are not rendered |
| Case selector/load, packaged 3D Chips, Diagnostics, pan/reset buttons, source editor | no AXIS widget equivalent | `WEB_EXTENSION`; may not be counted as AXIS parity |
| Case selector/load, packaged programs, RTCP program catalog, Diagnostics, pan/reset buttons, source editor | no AXIS widget equivalent | `WEB_EXTENSION`; may not be counted as AXIS parity |
## Source Keyboard Contract
@@ -446,8 +446,10 @@ history rows intentionally share the family ID `mdi-history-select`.
| `toolbar-view-z`, `toolbar-view-z2`, `toolbar-view-x`, `toolbar-view-y`, `toolbar-view-y2`, `toolbar-view-p` | `set_view_z/z2/x/y/y2/p` | Local source view selection | Exactly one pressed view; opens Preview tab; machine state unchanged |
| `toolbar-rotate` | `.toolbar.rotate` | Local drag/rotate projection | Toggles pressed state and viewer interaction only |
| `toolbar-clear-live-plot` | `clear_live_plot` -> `positionlogger.clear()` | Worker `VISUAL_CLEAR`; always visual-only | Advances `live_path_epoch`, clears Live Plot only and retains static preview |
| `workspace-case-select` | Web selection of the INI/configuration input | Local selection; selected catalog is restricted to supported XYZAC case | Does not load or change machine state until `toolbar-load-case` |
| `workspace-case-select` | Web selection of the INI/configuration input | Local selection; selected catalog is restricted to supported XYZAC/XYZBC cases | Does not load or change machine state until `toolbar-load-case` |
| `workspace-load-3d-chips` | Web packaged-file equivalent of `open_file_guts` | Fetch published `3D_Chips.ngc`, then `PROGRAM_LOAD`; IDLE only | Same replacement path as Open; retains Live Plot, no automatic Run/Home |
| `workspace-rtcp-programs`, `rtcp-program-scope`, `rtcp-program-select`, `rtcp-program-source`, `rtcp-program-load`, `rtcp-program-download` | Web RTCP source-program catalog backed by the locked LinuxCNC tree | The default scope follows the active machine: AC=`XYZAC`, BC=`XYZBC`; catalog/source/download are local file operations, while compatible main programs use the same `PROGRAM_LOAD` transaction and IDLE gate as Open | AC and BC programs are separated by kinematics. The optional all-source scope retains all 32 files for inspection; remap/subroutine/reference and mismatched kinematics cannot be sent as an executable main program |
| `machine-manager-settings`, `machine-manager-import`, `machine-manager-files`, `machine-manager-translate`, `machine-manager-rotate`, `machine-manager-role`, `machine-manager-parent`, `machine-manager-show-origin`, `machine-manager-apply`, `machine-manager-export` | Web component-level machine assembly extension | Draft import/edit/preview is local. Apply validates the supported AC/BC hierarchy, generates `linuxcnc.machine/1`, then uses the existing `LOAD_WORKSPACE` + `PROGRAM_LOAD` transaction while OFF and IDLE; Export serializes the validated scene and userData to a self-contained GLB | Three.js edits appearance/assembly metadata only; runtime joint motion, tool offset and RTCP remain Worker/WASM authoritative |
| `manual-home-all` | `home_all_joints` | `HOME {all:true}`; ON+IDLE, no concurrent homing/jog | Native homemod selects the configured sequences. No artificial coordinated return-to-zero motion. |
| `switchkins-0`, `switchkins-1`, `switchkins-2` | `M429`, `M428`, `M430` remaps and `motion.switchkins-type` | `KINEMATICS_SELECT`; ON, homed, IDLE, empty TP | Identity/XYZAC/User K canonical type, or stable gate reason |
| `tab-manual`, `tab-mdi` | `ensure_manual` / `ensure_mdi` | `SET_MODE`; manual_ok and motion exclusion | Task mode acknowledgement and WASM motion mode are monitored separately; no local tab is mode authority. |

View File

@@ -0,0 +1,70 @@
# 五轴 RTCP 与工件坐标:初学者完整讲义
[打开完整 PDF](五轴RTCP与工件坐标-初学者完整讲义.pdf) · [可编辑 HTML](handbook.html) · [逐页目录](outline.json)
本版是面向初学者重新组织的 **72 页 A4 完整讲义**,不是只在原投影片后附几页补充。原 [31 页投影课件](../rtcp-five-axis/五轴机床与RTCP-教学课件.pdf) 保留为概要。本讲义适合独立阅读、打印及分 4–6 次授课。
## 新增重点
- 从原点、方向、单位、右手规则、点与增量讲起;区分物理机床参考 M、工件 W、关节 J、运动学输入 K 和刀具 T。
- 工件原点如何选择、测量;为什么一个点不能确定方向;机械找正与初始坐标旋转分别解决什么。
- 分开说明“固连零件的物理坐标架”“G54偏置表”“动态RTCP变换”;G54不是独立完成五轴跟随的开关。
- 详细解释G54/G55、G10 L2/L20、G90/G91、G20/G21、省略轴与模态;说明G52/G92/G53、圆弧字、进给方式、刀补索引的边界。
- 对同一份BC程序逐字、逐行计算工件XYZ、K输入XYZ、角度、实际关节位置,给出完整对照表和连续轨迹图。
- 实验、排错、限位、术语、练习和答案;把数学推导放在附录,不要求初学者先会矩阵。
## 章节与 PDF 页码
| PDF 页码 | 内容 |
| --- | --- |
| 1–3 | 封面、阅读方法、可点击目录 |
| 4–9 | 坐标基础、点与增量、五轴结构、关节与反馈 |
| 10–14 | 各参考系、回零、工件坐标、随动原点、G54表与物理坐标架 |
| 15–20 | 零位参考、原点选择与测量、方向确定、完整点变换 |
| 21–26 | G54/G55、偏置、G10 L2/L20、G52/G92/G53 |
| 27–33 | 非RTCP/RTCP、方向合成、AC/BC、结构参数与刀长 |
| 34–43 | 地址字、模态、单位、G90/G91、G0/G1、圆弧、F及其他字的解析 |
| 44–53 | 完整程序、N10–N110逐行实算、结果表与模式切换 |
| 54–57 | 连续轨迹、姿态、模型显示与分层准备 |
| 58–62 | 三个实验、排错、行程/动力学/碰撞边界 |
| 63–67 | 常见问答、两组练习与答案 |
| 68–72 | 术语、公式、软件实验范围、资料来源与复现 |
正文编号01–69为“节号”,与PDF页码相差封面/导读/目录三页;内部引用按节号,目录按PDF页码。
## 核心实算
主例:XYZBC,零旋转中心/轴间偏置/刀长差,G54零位偏置 `(40,20,10)` mm,初始方向对齐。
| 程序段 | 工件 XYZ | K 输入 XYZ | B/C | 关节 XYZ |
| --- | --- | --- | --- | --- |
| `N50 G1 X10 Y0 Z5 B0 C0 F600` | 10,0,5 | 50,20,15 | 0/0 | 50,20,15 |
| `N60 C90` | 10,0,5 | 50,20,15 | 0/90 | -20,50,15 |
| `N70 G91 X10` | 20,0,5 | 60,20,15 | 0/90 | -20,60,15 |
| `N80 G90 X20 Y0 Z5 B30 C90 F300` | 20,0,5 | 60,20,15 | 30/90 | -9.821,60,22.990 |
| `N90 X0 Y10` | 0,10,5 | 40,30,15 | 30/90 | -18.481,40,27.990 |
这些数值来自 [实际 WASM 验证](gcode-evidence.json),包括11个主程序段、11个额外单位/坐标设置段;N10–N90加M2通过真实Session/解释器/TP完整执行,记录53个轨迹样本,并核对最终关节。下载模型自带非零参数,不能不改条件就要求得到这张表的相同数值。
## 验证与范围
- [版面报告](verification/layout.json):72页图文边界、图片加载、标题和正文检查。
- [PDF核验](verification/acceptance.json):页数、A4尺寸、逐页中文文本、内嵌字体、书签、文件与资产SHA256。
- `verification/` 保留逐页截图及实际PDF的独立渲染总览。
- 9张新增原创坐标示意图,复用此前11张原创原理图/模型图;不是许可不明的网络插画。
- 依据LinuxCNC官方坐标/G代码/五轴/切换资料和当前仓库代码;最后一页有直接链接。
- 当前WASM解释器属于功能切片。通用G52/G92、任意坐标方向变换、完整G43/H刀表、所有进给模式并未在本次全面验收;正文明确标出,不能把“解析接受”当作完整功能正确性。
- 本讲义不修改应用功能,不宣称真实机床的探测/碰撞/硬件安全流程已被验证。
## 重新生成
```bash
node scripts/generate_rtcp_beginner_data.mjs
PYTHONPATH=/tmp/rtcp-course-deps python3 scripts/generate_rtcp_beginner_figures.py
python3 scripts/generate_rtcp_beginner_html.py
PYTHONPATH=/tmp/rtcp-course-deps python3 scripts/subset_rtcp_beginner_fonts.py
PLAYWRIGHT_MODULE=/home/mes006/.npm/_npx/e41f203b7505f1fb/node_modules/playwright/index.mjs node scripts/render_rtcp_beginner_pdf.mjs
PYTHONPATH=/tmp/rtcp-course-deps python3 scripts/verify_rtcp_beginner_pdf.py
```
生成工具依赖临时安装的Matplotlib/PyPDF/fontTools、Chrome、Playwright和Noto CJK字体;PDF成品不需要这些工具,可以离线阅读。HTML需与同目录assets一起保留。中文字体按本书实际字符制作子集,避免同形部首导致复制/搜索文字不同;字体许可证在assets/font-license.txt。

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

View File

@@ -0,0 +1,327 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: noto-cjk
Upstream-Contact: https://github.com/notofonts/noto-cjk/issues
Source: https://github.com/notofonts/noto-cjk
Files-Excluded:
.gitattributes
.gitignore
Sans/Mono/NotoSansMonoCJKhk-Bold.otf
Sans/Mono/NotoSansMonoCJKhk-Regular.otf
Sans/Mono/NotoSansMonoCJKjp-Bold.otf
Sans/Mono/NotoSansMonoCJKjp-Regular.otf
Sans/Mono/NotoSansMonoCJKkr-Bold.otf
Sans/Mono/NotoSansMonoCJKkr-Regular.otf
Sans/Mono/NotoSansMonoCJKsc-Bold.otf
Sans/Mono/NotoSansMonoCJKsc-Regular.otf
Sans/Mono/NotoSansMonoCJKtc-Bold.otf
Sans/Mono/NotoSansMonoCJKtc-Regular.otf
Sans/OTF/Japanese/NotoSansCJKjp-Black.otf
Sans/OTF/Japanese/NotoSansCJKjp-Bold.otf
Sans/OTF/Japanese/NotoSansCJKjp-DemiLight.otf
Sans/OTF/Japanese/NotoSansCJKjp-Light.otf
Sans/OTF/Japanese/NotoSansCJKjp-Medium.otf
Sans/OTF/Japanese/NotoSansCJKjp-Regular.otf
Sans/OTF/Japanese/NotoSansCJKjp-Thin.otf
Sans/OTF/Korean/NotoSansCJKkr-Black.otf
Sans/OTF/Korean/NotoSansCJKkr-Bold.otf
Sans/OTF/Korean/NotoSansCJKkr-DemiLight.otf
Sans/OTF/Korean/NotoSansCJKkr-Light.otf
Sans/OTF/Korean/NotoSansCJKkr-Medium.otf
Sans/OTF/Korean/NotoSansCJKkr-Regular.otf
Sans/OTF/Korean/NotoSansCJKkr-Thin.otf
Sans/OTF/SimplifiedChinese/NotoSansCJKsc-Black.otf
Sans/OTF/SimplifiedChinese/NotoSansCJKsc-Bold.otf
Sans/OTF/SimplifiedChinese/NotoSansCJKsc-DemiLight.otf
Sans/OTF/SimplifiedChinese/NotoSansCJKsc-Light.otf
Sans/OTF/SimplifiedChinese/NotoSansCJKsc-Medium.otf
Sans/OTF/SimplifiedChinese/NotoSansCJKsc-Regular.otf
Sans/OTF/SimplifiedChinese/NotoSansCJKsc-Thin.otf
Sans/OTF/TraditionalChinese/NotoSansCJKtc-Black.otf
Sans/OTF/TraditionalChinese/NotoSansCJKtc-Bold.otf
Sans/OTF/TraditionalChinese/NotoSansCJKtc-DemiLight.otf
Sans/OTF/TraditionalChinese/NotoSansCJKtc-Light.otf
Sans/OTF/TraditionalChinese/NotoSansCJKtc-Medium.otf
Sans/OTF/TraditionalChinese/NotoSansCJKtc-Regular.otf
Sans/OTF/TraditionalChinese/NotoSansCJKtc-Thin.otf
Sans/OTF/TraditionalChineseHK/NotoSansCJKhk-Black.otf
Sans/OTF/TraditionalChineseHK/NotoSansCJKhk-Bold.otf
Sans/OTF/TraditionalChineseHK/NotoSansCJKhk-DemiLight.otf
Sans/OTF/TraditionalChineseHK/NotoSansCJKhk-Light.otf
Sans/OTF/TraditionalChineseHK/NotoSansCJKhk-Medium.otf
Sans/OTF/TraditionalChineseHK/NotoSansCJKhk-Regular.otf
Sans/OTF/TraditionalChineseHK/NotoSansCJKhk-Thin.otf
Sans/SubsetOTF/HK/NotoSansHK-Black.otf
Sans/SubsetOTF/HK/NotoSansHK-Bold.otf
Sans/SubsetOTF/HK/NotoSansHK-DemiLight.otf
Sans/SubsetOTF/HK/NotoSansHK-Light.otf
Sans/SubsetOTF/HK/NotoSansHK-Medium.otf
Sans/SubsetOTF/HK/NotoSansHK-Regular.otf
Sans/SubsetOTF/HK/NotoSansHK-Thin.otf
Sans/SubsetOTF/JP/NotoSansJP-Black.otf
Sans/SubsetOTF/JP/NotoSansJP-Bold.otf
Sans/SubsetOTF/JP/NotoSansJP-DemiLight.otf
Sans/SubsetOTF/JP/NotoSansJP-Light.otf
Sans/SubsetOTF/JP/NotoSansJP-Medium.otf
Sans/SubsetOTF/JP/NotoSansJP-Regular.otf
Sans/SubsetOTF/JP/NotoSansJP-Thin.otf
Sans/SubsetOTF/KR/NotoSansKR-Black.otf
Sans/SubsetOTF/KR/NotoSansKR-Bold.otf
Sans/SubsetOTF/KR/NotoSansKR-DemiLight.otf
Sans/SubsetOTF/KR/NotoSansKR-Light.otf
Sans/SubsetOTF/KR/NotoSansKR-Medium.otf
Sans/SubsetOTF/KR/NotoSansKR-Regular.otf
Sans/SubsetOTF/KR/NotoSansKR-Thin.otf
Sans/SubsetOTF/SC/NotoSansSC-Black.otf
Sans/SubsetOTF/SC/NotoSansSC-Bold.otf
Sans/SubsetOTF/SC/NotoSansSC-DemiLight.otf
Sans/SubsetOTF/SC/NotoSansSC-Light.otf
Sans/SubsetOTF/SC/NotoSansSC-Medium.otf
Sans/SubsetOTF/SC/NotoSansSC-Regular.otf
Sans/SubsetOTF/SC/NotoSansSC-Thin.otf
Sans/SubsetOTF/TC/NotoSansTC-Black.otf
Sans/SubsetOTF/TC/NotoSansTC-Bold.otf
Sans/SubsetOTF/TC/NotoSansTC-DemiLight.otf
Sans/SubsetOTF/TC/NotoSansTC-Light.otf
Sans/SubsetOTF/TC/NotoSansTC-Medium.otf
Sans/SubsetOTF/TC/NotoSansTC-Regular.otf
Sans/SubsetOTF/TC/NotoSansTC-Thin.otf
Sans/SuperOTC/NotoSansCJK.ttc.zip
Sans/Variable/OTC/NotoSansCJK-VF.ttf.ttc
Sans/Variable/OTC/NotoSansMonoCJK-VF.ttf.ttc
Sans/Variable/OTF/Mono/NotoSansMonoCJKhk-VF.otf
Sans/Variable/OTF/Mono/NotoSansMonoCJKjp-VF.otf
Sans/Variable/OTF/Mono/NotoSansMonoCJKkr-VF.otf
Sans/Variable/OTF/Mono/NotoSansMonoCJKsc-VF.otf
Sans/Variable/OTF/Mono/NotoSansMonoCJKtc-VF.otf
Sans/Variable/OTF/NotoSansCJKhk-VF.otf
Sans/Variable/OTF/NotoSansCJKjp-VF.otf
Sans/Variable/OTF/NotoSansCJKkr-VF.otf
Sans/Variable/OTF/NotoSansCJKsc-VF.otf
Sans/Variable/OTF/NotoSansCJKtc-VF.otf
Sans/Variable/OTF/Subset/NotoSansHK-VF.otf
Sans/Variable/OTF/Subset/NotoSansJP-VF.otf
Sans/Variable/OTF/Subset/NotoSansKR-VF.otf
Sans/Variable/OTF/Subset/NotoSansSC-VF.otf
Sans/Variable/OTF/Subset/NotoSansTC-VF.otf
Sans/Variable/TTF/Mono/NotoSansMonoCJKhk-VF.ttf
Sans/Variable/TTF/Mono/NotoSansMonoCJKjp-VF.ttf
Sans/Variable/TTF/Mono/NotoSansMonoCJKkr-VF.ttf
Sans/Variable/TTF/Mono/NotoSansMonoCJKsc-VF.ttf
Sans/Variable/TTF/Mono/NotoSansMonoCJKtc-VF.ttf
Sans/Variable/TTF/NotoSansCJKhk-VF.ttf
Sans/Variable/TTF/NotoSansCJKjp-VF.ttf
Sans/Variable/TTF/NotoSansCJKkr-VF.ttf
Sans/Variable/TTF/NotoSansCJKsc-VF.ttf
Sans/Variable/TTF/NotoSansCJKtc-VF.ttf
Sans/Variable/TTF/Subset/NotoSansHK-VF.ttf
Sans/Variable/TTF/Subset/NotoSansJP-VF.ttf
Sans/Variable/TTF/Subset/NotoSansKR-VF.ttf
Sans/Variable/TTF/Subset/NotoSansSC-VF.ttf
Sans/Variable/TTF/Subset/NotoSansTC-VF.ttf
Serif/OTF/Japanese/NotoSerifCJKjp-Black.otf
Serif/OTF/Japanese/NotoSerifCJKjp-Bold.otf
Serif/OTF/Japanese/NotoSerifCJKjp-ExtraLight.otf
Serif/OTF/Japanese/NotoSerifCJKjp-Light.otf
Serif/OTF/Japanese/NotoSerifCJKjp-Medium.otf
Serif/OTF/Japanese/NotoSerifCJKjp-Regular.otf
Serif/OTF/Japanese/NotoSerifCJKjp-SemiBold.otf
Serif/OTF/Korean/NotoSerifCJKkr-Black.otf
Serif/OTF/Korean/NotoSerifCJKkr-Bold.otf
Serif/OTF/Korean/NotoSerifCJKkr-ExtraLight.otf
Serif/OTF/Korean/NotoSerifCJKkr-Light.otf
Serif/OTF/Korean/NotoSerifCJKkr-Medium.otf
Serif/OTF/Korean/NotoSerifCJKkr-Regular.otf
Serif/OTF/Korean/NotoSerifCJKkr-SemiBold.otf
Serif/OTF/SimplifiedChinese/NotoSerifCJKsc-Black.otf
Serif/OTF/SimplifiedChinese/NotoSerifCJKsc-Bold.otf
Serif/OTF/SimplifiedChinese/NotoSerifCJKsc-ExtraLight.otf
Serif/OTF/SimplifiedChinese/NotoSerifCJKsc-Light.otf
Serif/OTF/SimplifiedChinese/NotoSerifCJKsc-Medium.otf
Serif/OTF/SimplifiedChinese/NotoSerifCJKsc-Regular.otf
Serif/OTF/SimplifiedChinese/NotoSerifCJKsc-SemiBold.otf
Serif/OTF/TraditionalChinese/NotoSerifCJKtc-Black.otf
Serif/OTF/TraditionalChinese/NotoSerifCJKtc-Bold.otf
Serif/OTF/TraditionalChinese/NotoSerifCJKtc-ExtraLight.otf
Serif/OTF/TraditionalChinese/NotoSerifCJKtc-Light.otf
Serif/OTF/TraditionalChinese/NotoSerifCJKtc-Medium.otf
Serif/OTF/TraditionalChinese/NotoSerifCJKtc-Regular.otf
Serif/OTF/TraditionalChinese/NotoSerifCJKtc-SemiBold.otf
Serif/OTF/TraditionalChineseHK/NotoSerifCJKhk-Black.otf
Serif/OTF/TraditionalChineseHK/NotoSerifCJKhk-Bold.otf
Serif/OTF/TraditionalChineseHK/NotoSerifCJKhk-ExtraLight.otf
Serif/OTF/TraditionalChineseHK/NotoSerifCJKhk-Light.otf
Serif/OTF/TraditionalChineseHK/NotoSerifCJKhk-Medium.otf
Serif/OTF/TraditionalChineseHK/NotoSerifCJKhk-Regular.otf
Serif/OTF/TraditionalChineseHK/NotoSerifCJKhk-SemiBold.otf
Serif/SubsetOTF/HK/NotoSerifHK-Black.otf
Serif/SubsetOTF/HK/NotoSerifHK-Bold.otf
Serif/SubsetOTF/HK/NotoSerifHK-ExtraLight.otf
Serif/SubsetOTF/HK/NotoSerifHK-Light.otf
Serif/SubsetOTF/HK/NotoSerifHK-Medium.otf
Serif/SubsetOTF/HK/NotoSerifHK-Regular.otf
Serif/SubsetOTF/HK/NotoSerifHK-SemiBold.otf
Serif/SubsetOTF/JP/NotoSerifJP-Black.otf
Serif/SubsetOTF/JP/NotoSerifJP-Bold.otf
Serif/SubsetOTF/JP/NotoSerifJP-ExtraLight.otf
Serif/SubsetOTF/JP/NotoSerifJP-Light.otf
Serif/SubsetOTF/JP/NotoSerifJP-Medium.otf
Serif/SubsetOTF/JP/NotoSerifJP-Regular.otf
Serif/SubsetOTF/JP/NotoSerifJP-SemiBold.otf
Serif/SubsetOTF/KR/NotoSerifKR-Black.otf
Serif/SubsetOTF/KR/NotoSerifKR-Bold.otf
Serif/SubsetOTF/KR/NotoSerifKR-ExtraLight.otf
Serif/SubsetOTF/KR/NotoSerifKR-Light.otf
Serif/SubsetOTF/KR/NotoSerifKR-Medium.otf
Serif/SubsetOTF/KR/NotoSerifKR-Regular.otf
Serif/SubsetOTF/KR/NotoSerifKR-SemiBold.otf
Serif/SubsetOTF/SC/NotoSerifSC-Black.otf
Serif/SubsetOTF/SC/NotoSerifSC-Bold.otf
Serif/SubsetOTF/SC/NotoSerifSC-ExtraLight.otf
Serif/SubsetOTF/SC/NotoSerifSC-Light.otf
Serif/SubsetOTF/SC/NotoSerifSC-Medium.otf
Serif/SubsetOTF/SC/NotoSerifSC-Regular.otf
Serif/SubsetOTF/SC/NotoSerifSC-SemiBold.otf
Serif/SubsetOTF/TC/NotoSerifTC-Black.otf
Serif/SubsetOTF/TC/NotoSerifTC-Bold.otf
Serif/SubsetOTF/TC/NotoSerifTC-ExtraLight.otf
Serif/SubsetOTF/TC/NotoSerifTC-Light.otf
Serif/SubsetOTF/TC/NotoSerifTC-Medium.otf
Serif/SubsetOTF/TC/NotoSerifTC-Regular.otf
Serif/SubsetOTF/TC/NotoSerifTC-SemiBold.otf
Serif/Variable/OTC/NotoSerifCJK-VF.ttf.ttc
Serif/Variable/OTF/NotoSerifCJKhk-VF.otf
Serif/Variable/OTF/NotoSerifCJKjp-VF.otf
Serif/Variable/OTF/NotoSerifCJKkr-VF.otf
Serif/Variable/OTF/NotoSerifCJKsc-VF.otf
Serif/Variable/OTF/NotoSerifCJKtc-VF.otf
Serif/Variable/OTF/Subset/NotoSerifHK-VF.otf
Serif/Variable/OTF/Subset/NotoSerifJP-VF.otf
Serif/Variable/OTF/Subset/NotoSerifKR-VF.otf
Serif/Variable/OTF/Subset/NotoSerifSC-VF.otf
Serif/Variable/OTF/Subset/NotoSerifTC-VF.otf
Serif/Variable/TTF/NotoSerifCJKhk-VF.ttf
Serif/Variable/TTF/NotoSerifCJKjp-VF.ttf
Serif/Variable/TTF/NotoSerifCJKkr-VF.ttf
Serif/Variable/TTF/NotoSerifCJKsc-VF.ttf
Serif/Variable/TTF/NotoSerifCJKtc-VF.ttf
Serif/Variable/TTF/Subset/NotoSerifHK-VF.ttf
Serif/Variable/TTF/Subset/NotoSerifJP-VF.ttf
Serif/Variable/TTF/Subset/NotoSerifKR-VF.ttf
Serif/Variable/TTF/Subset/NotoSerifSC-VF.ttf
Serif/Variable/TTF/Subset/NotoSerifTC-VF.ttf
Files: *
Copyright: 2010-2012, Google Corporation
License: SIL-1.1
Files: debian/*
Copyright: 2013, Vasudev Kamath <kamathvasudev@gmail.com>
2013-2015, Jonas Smedegaard <dr@jones.dk>
2015-2022, ChangZhuo Chen (陳昌倬) <czchen@debian.org>
License: GPL-3+
License: SIL-1.1
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
.
PREAMBLE
.
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font
creation efforts of academic and linguistic communities, and to provide
a free and open framework in which fonts may be shared and improved in
partnership with others.
.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply to
any document created using the fonts or their derivatives.
.
DEFINITIONS
.
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
.
"Original Version" refers to the collection of Font Software components
as distributed by the Copyright Holder(s).
.
"Modified Version" refers to any derivative made by adding to,
deleting, or substituting -- in part or in whole -- any of the
components of the Original Version, by changing formats or by porting
the Font Software to a new environment.
.
"Author" refers to any designer, engineer, programmer, technical writer
or other person who contributed to the Font Software.
.
PERMISSION & CONDITIONS
.
Permission is hereby granted, free of charge, to any person obtaining a
copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
.
1) Neither the Font Software nor any of its individual components, in
Original or Modified Versions, may be sold by itself.
.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the
corresponding Copyright Holder. This restriction only applies to the
primary font name as presented to the users.
.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
.
5) The Font Software, modified or unmodified, in part or in whole, must
be distributed entirely under this license, and must not be distributed
under any other license. The requirement for fonts to remain under this
license does not apply to any document created using the Font Software.
.
TERMINATION
.
This license becomes null and void if any of the above conditions are
not met.
.
DISCLAIMER
.
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.
License: GPL-3+
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
.
On Debian systems, the complete text of the GNU General
Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@@ -0,0 +1,12 @@
; Teaching fixture only: XYZBC, P=D=tool-offset=0, known initial state.
; Work origin (40,20,10) mm; this is not a production machining program.
N10 G21 G90 G94 G17
N20 G10 L2 P1 X40 Y20 Z10
N30 G54
N40 M428
N50 G1 X10 Y0 Z5 B0 C0 F600
N60 C90
N70 G91 X10
N80 G90 X20 Y0 Z5 B30 C90 F300
N90 X0 Y10
M2

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,362 @@
[
{
"page": 1,
"chapter": "封面 · 完整讲义 / 2026.09",
"title": "五轴 RTCP 与工件坐标"
},
{
"page": 2,
"chapter": "导读",
"title": "怎样使用这份讲义"
},
{
"page": 3,
"chapter": "学习地图",
"title": "内容索引"
},
{
"page": 4,
"chapter": "第1章 · 坐标基础",
"title": "01 坐标是“按照约定量出来的位置”"
},
{
"page": 5,
"chapter": "第1章 · 坐标基础",
"title": "02 一套坐标系至少要规定什么?"
},
{
"page": 6,
"chapter": "第1章 · 坐标基础",
"title": "03 同一个点,可以有两套不同的坐标"
},
{
"page": 7,
"chapter": "第1章 · 坐标基础",
"title": "04 点坐标与移动增量不是一回事"
},
{
"page": 8,
"chapter": "第1章 · 机床结构",
"title": "05 五轴机床里,到底是哪五根轴?"
},
{
"page": 9,
"chapter": "第1章 · 机床结构",
"title": "06 关节位置,不等于工件坐标"
},
{
"page": 10,
"chapter": "第2章 · 参考系",
"title": "07 先认识 M、W、J,再引入 K 和 T"
},
{
"page": 11,
"chapter": "第2章 · 机床参考",
"title": "08 回零解决什么?工件对刀又解决什么?"
},
{
"page": 12,
"chapter": "第2章 · 工件参考",
"title": "09 工件坐标 W 代表什么?"
},
{
"page": 13,
"chapter": "第2章 · 工件随动",
"title": "10 工件转了,原点与方向一起转"
},
{
"page": 14,
"chapter": "第2章 · 最重要的区分",
"title": "11 “物理工件坐标架”和“G54表”不是同一对象"
},
{
"page": 15,
"chapter": "第3章 · 原点与方向的确定",
"title": "12 先约定机床零姿态,再谈工件装在哪里"
},
{
"page": 16,
"chapter": "第3章 · 原点选择",
"title": "13 工件原点放在哪里比较合适?"
},
{
"page": 17,
"chapter": "第3章 · 原点测量",
"title": "14 怎样把选好的原点告诉控制器?"
},
{
"page": 18,
"chapter": "第3章 · 方向测量",
"title": "15 一个原点不能确定三维方向"
},
{
"page": 19,
"chapter": "第3章 · 初始方向与动态方向",
"title": "16 装夹方向和转台姿态,要分开处理"
},
{
"page": 20,
"chapter": "第3章 · 原点和方向合起来",
"title": "17 一个点怎样从工件坐标换算到机床空间?"
},
{
"page": 21,
"chapter": "第4章 · G54与偏置",
"title": "18 G54究竟做了什么?"
},
{
"page": 22,
"chapter": "第4章 · 偏置的物理含义",
"title": "19 G54的40、20、10代表什么?"
},
{
"page": 23,
"chapter": "第4章 · 设置方法一",
"title": "20 G10 L2:把已知偏置写入坐标表"
},
{
"page": 24,
"chapter": "第4章 · 设置方法二",
"title": "21 G10 L20:让当前位置具有指定工件坐标"
},
{
"page": 25,
"chapter": "第4章 · 两个坐标系",
"title": "22 换G54/G55为什么可能只改数字、不动机床?"
},
{
"page": 26,
"chapter": "第4章 · 附加偏置与基础坐标",
"title": "23 G52、G92、G53:先学会不混用"
},
{
"page": 27,
"chapter": "第5章 · 非RTCP与RTCP",
"title": "24 非RTCP:“独立”的准确含义"
},
{
"page": 28,
"chapter": "第5章 · 非RTCP与RTCP",
"title": "25 RTCP控制的是相对目标关系"
},
{
"page": 29,
"chapter": "第5章 · RTCP工件原点",
"title": "26 用G54例子看“原点随动”"
},
{
"page": 30,
"chapter": "第5章 · RTCP方向",
"title": "27 沿工件X前进,哪些电机会动?"
},
{
"page": 31,
"chapter": "第5章 · 倾转与结构顺序",
"title": "28 加入B或A后,方向可以进入三个维度"
},
{
"page": 32,
"chapter": "第5章 · 三类偏置",
"title": "29 G54、旋转中心、轴间偏置各管什么?"
},
{
"page": 33,
"chapter": "第5章 · 刀具参考",
"title": "30 为什么必须知道刀尖究竟在哪里?"
},
{
"page": 34,
"chapter": "第6章 · 读懂G代码",
"title": "31 一行G代码由“地址字”组成"
},
{
"page": 35,
"chapter": "第6章 · 模态状态",
"title": "32 没有写出来的内容,可能沿用上一行"
},
{
"page": 36,
"chapter": "第6章 · 单位",
"title": "33 G20/G21改变长度单位,不把角度变成长度"
},
{
"page": 37,
"chapter": "第6章 · 绝对目标",
"title": "34 G90 X10:去当前编程系的X=10"
},
{
"page": 38,
"chapter": "第6章 · 相对增量",
"title": "35 G91 X10:在当前编程方向增加10"
},
{
"page": 39,
"chapter": "第6章 · 运动方式",
"title": "36 G0/G1分别如何产生运动?"
},
{
"page": 40,
"chapter": "第6章 · 圆弧地址",
"title": "37 G2/G3里的I、J、K不是三根新电机轴"
},
{
"page": 41,
"chapter": "第6章 · 进给",
"title": "38 F到底是速度、时间,还是每转进给?"
},
{
"page": 42,
"chapter": "第6章 · 其他常见字",
"title": "39 不是每个数字都代表位置"
},
{
"page": 43,
"chapter": "第6章 · 从文本到运动",
"title": "40 控制器不是从左到右逐个字移动"
},
{
"page": 44,
"chapter": "第7章 · 完整实算程序",
"title": "41 统一实验条件与完整程序"
},
{
"page": 45,
"chapter": "第7章 · 第一步",
"title": "42 N10–N30:设置模式与工件参考"
},
{
"page": 46,
"chapter": "第7章 · 第二步",
"title": "43 N40 M428:先切模式,不凭空移动"
},
{
"page": 47,
"chapter": "第7章 · 第三步",
"title": "44 N50:把第一个工件点送到刀尖"
},
{
"page": 48,
"chapter": "第7章 · 第四步",
"title": "45 N60 C90:XYZ字没出现,XYZ关节却动了"
},
{
"page": 49,
"chapter": "第7章 · 第五步",
"title": "46 N70 G91 X10:沿转后的工件方向走"
},
{
"page": 50,
"chapter": "第7章 · 第六步",
"title": "47 N80:工件点不变,B倾转带来X/Z补偿"
},
{
"page": 51,
"chapter": "第7章 · 第七步",
"title": "48 N90:省略的Z、B、C保持当前目标"
},
{
"page": 52,
"chapter": "第7章 · 全过程汇总",
"title": "49 把五组数字同时放在一张表里"
},
{
"page": 53,
"chapter": "第7章 · 再切回直接模式",
"title": "50 N100/N110:同一刀尖位置,坐标解释改变"
},
{
"page": 54,
"chapter": "第8章 · 中间轨迹",
"title": "51 RTCP要在运动过程中持续计算"
},
{
"page": 55,
"chapter": "第8章 · 姿态与刀轴",
"title": "52 RTCP不自动决定刀轴该朝哪里"
},
{
"page": 56,
"chapter": "第8章 · 三维显示",
"title": "53 预览画面中的三个对象要分开看"
},
{
"page": 57,
"chapter": "第8章 · 参数准备",
"title": "54 准备数据时,按三层顺序核对"
},
{
"page": 58,
"chapter": "第9章 · 课堂实验",
"title": "55 实验一:观察“转动后的坐标方向”"
},
{
"page": 59,
"chapter": "第9章 · 课堂实验",
"title": "56 实验二:G54与G90/G91的逐行记录"
},
{
"page": 60,
"chapter": "第9章 · 课堂实验",
"title": "57 实验三:原点移动,程序几何不改"
},
{
"page": 61,
"chapter": "第9章 · 排错",
"title": "58 位置不对时,从哪一层开始查?"
},
{
"page": 62,
"chapter": "第9章 · 限位与边界",
"title": "59 RTCP跟得上,还必须到得了"
},
{
"page": 63,
"chapter": "第10章 · 常见问答",
"title": "60 初学者最容易问错的八个问题"
},
{
"page": 64,
"chapter": "第10章 · 练习",
"title": "61 练习A:原点、模式和地址字"
},
{
"page": 65,
"chapter": "第10章 · 练习",
"title": "62 练习B:从工件点推到物理关节"
},
{
"page": 66,
"chapter": "第10章 · 参考答案",
"title": "63 练习A答案"
},
{
"page": 67,
"chapter": "第10章 · 参考答案",
"title": "64 练习B答案"
},
{
"page": 68,
"chapter": "附录A · 术语",
"title": "65 把常见名词翻译成容易理解的话"
},
{
"page": 69,
"chapter": "附录B · 可选数学",
"title": "66 用最少公式描述完整坐标链"
},
{
"page": 70,
"chapter": "附录B · 可选数学",
"title": "67 反过来:从当前物理位置求工件坐标"
},
{
"page": 71,
"chapter": "附录C · 软件实验范围",
"title": "68 这份讲义验证了什么,没有声称什么?"
},
{
"page": 72,
"chapter": "附录D · 来源与复现",
"title": "69 官方资料、验证数据与自学路径"
}
]

View File

@@ -0,0 +1,502 @@
{
"report_id": "rtcp-beginners-pdf-v1",
"status": "verified",
"page_count": 72,
"pdf": "五轴RTCP与工件坐标-初学者完整讲义.pdf",
"bytes": 2187858,
"sha256": "e88f1a796b15c3e0c4af59f6bab5dcfd3c5ee19a80343147ee4edc57068981e7",
"pages": [
{
"page": 1,
"characters": 350,
"title": "五轴 RTCP 与工件坐标"
},
{
"page": 2,
"characters": 473,
"title": "怎样使用这份讲义"
},
{
"page": 3,
"characters": 414,
"title": "内容索引"
},
{
"page": 4,
"characters": 332,
"title": "01 坐标是“按照约定量出来的位置”"
},
{
"page": 5,
"characters": 444,
"title": "02 一套坐标系至少要规定什么?"
},
{
"page": 6,
"characters": 357,
"title": "03 同一个点,可以有两套不同的坐标"
},
{
"page": 7,
"characters": 359,
"title": "04 点坐标与移动增量不是一回事"
},
{
"page": 8,
"characters": 349,
"title": "05 五轴机床里,到底是哪五根轴?"
},
{
"page": 9,
"characters": 416,
"title": "06 关节位置,不等于工件坐标"
},
{
"page": 10,
"characters": 500,
"title": "07 先认识 M、W、J,再引入 K 和 T"
},
{
"page": 11,
"characters": 453,
"title": "08 回零解决什么?工件对刀又解决什么?"
},
{
"page": 12,
"characters": 350,
"title": "09 工件坐标 W 代表什么?"
},
{
"page": 13,
"characters": 354,
"title": "10 工件转了,原点与方向一起转"
},
{
"page": 14,
"characters": 528,
"title": "11 “物理工件坐标架”和“G54表”不是同一对象"
},
{
"page": 15,
"characters": 465,
"title": "12 先约定机床零姿态,再谈工件装在哪里"
},
{
"page": 16,
"characters": 484,
"title": "13 工件原点放在哪里比较合适?"
},
{
"page": 17,
"characters": 479,
"title": "14 怎样把选好的原点告诉控制器?"
},
{
"page": 18,
"characters": 336,
"title": "15 一个原点不能确定三维方向"
},
{
"page": 19,
"characters": 478,
"title": "16 装夹方向和转台姿态,要分开处理"
},
{
"page": 20,
"characters": 415,
"title": "17 一个点怎样从工件坐标换算到机床空间?"
},
{
"page": 21,
"characters": 447,
"title": "18 G54究竟做了什么?"
},
{
"page": 22,
"characters": 421,
"title": "19 G54的40、20、10代表什么?"
},
{
"page": 23,
"characters": 404,
"title": "20 G10 L2:把已知偏置写入坐标表"
},
{
"page": 24,
"characters": 483,
"title": "21 G10 L20:让当前位置具有指定工件坐标"
},
{
"page": 25,
"characters": 505,
"title": "22 换G54/G55为什么可能只改数字、不动机床?"
},
{
"page": 26,
"characters": 471,
"title": "23 G52、G92、G53:先学会不混用"
},
{
"page": 27,
"characters": 374,
"title": "24 非RTCP:“独立”的准确含义"
},
{
"page": 28,
"characters": 372,
"title": "25 RTCP控制的是相对目标关系"
},
{
"page": 29,
"characters": 381,
"title": "26 用G54例子看“原点随动”"
},
{
"page": 30,
"characters": 370,
"title": "27 沿工件X前进,哪些电机会动?"
},
{
"page": 31,
"characters": 415,
"title": "28 加入B或A后,方向可以进入三个维度"
},
{
"page": 32,
"characters": 457,
"title": "29 G54、旋转中心、轴间偏置各管什么?"
},
{
"page": 33,
"characters": 465,
"title": "30 为什么必须知道刀尖究竟在哪里?"
},
{
"page": 34,
"characters": 521,
"title": "31 一行G代码由“地址字”组成"
},
{
"page": 35,
"characters": 473,
"title": "32 没有写出来的内容,可能沿用上一行"
},
{
"page": 36,
"characters": 501,
"title": "33 G20/G21改变长度单位,不把角度变成长度"
},
{
"page": 37,
"characters": 456,
"title": "34 G90 X10:去当前编程系的X=10"
},
{
"page": 38,
"characters": 541,
"title": "35 G91 X10:在当前编程方向增加10"
},
{
"page": 39,
"characters": 485,
"title": "36 G0/G1分别如何产生运动?"
},
{
"page": 40,
"characters": 466,
"title": "37 G2/G3里的I、J、K不是三根新电机轴"
},
{
"page": 41,
"characters": 528,
"title": "38 F到底是速度、时间,还是每转进给?"
},
{
"page": 42,
"characters": 509,
"title": "39 不是每个数字都代表位置"
},
{
"page": 43,
"characters": 491,
"title": "40 控制器不是从左到右逐个字移动"
},
{
"page": 44,
"characters": 569,
"title": "41 统一实验条件与完整程序"
},
{
"page": 45,
"characters": 456,
"title": "42 N10–N30:设置模式与工件参考"
},
{
"page": 46,
"characters": 449,
"title": "43 N40 M428:先切模式,不凭空移动"
},
{
"page": 47,
"characters": 450,
"title": "44 N50:把第一个工件点送到刀尖"
},
{
"page": 48,
"characters": 513,
"title": "45 N60 C90:XYZ字没出现,XYZ关节却动了"
},
{
"page": 49,
"characters": 498,
"title": "46 N70 G91 X10:沿转后的工件方向走"
},
{
"page": 50,
"characters": 507,
"title": "47 N80:工件点不变,B倾转带来X/Z补偿"
},
{
"page": 51,
"characters": 477,
"title": "48 N90:省略的Z、B、C保持当前目标"
},
{
"page": 52,
"characters": 737,
"title": "49 把五组数字同时放在一张表里"
},
{
"page": 53,
"characters": 511,
"title": "50 N100/N110:同一刀尖位置,坐标解释改变"
},
{
"page": 54,
"characters": 336,
"title": "51 RTCP要在运动过程中持续计算"
},
{
"page": 55,
"characters": 408,
"title": "52 RTCP不自动决定刀轴该朝哪里"
},
{
"page": 56,
"characters": 514,
"title": "53 预览画面中的三个对象要分开看"
},
{
"page": 57,
"characters": 497,
"title": "54 准备数据时,按三层顺序核对"
},
{
"page": 58,
"characters": 478,
"title": "55 实验一:观察“转动后的坐标方向”"
},
{
"page": 59,
"characters": 491,
"title": "56 实验二:G54与G90/G91的逐行记录"
},
{
"page": 60,
"characters": 505,
"title": "57 实验三:原点移动,程序几何不改"
},
{
"page": 61,
"characters": 497,
"title": "58 位置不对时,从哪一层开始查?"
},
{
"page": 62,
"characters": 473,
"title": "59 RTCP跟得上,还必须到得了"
},
{
"page": 63,
"characters": 434,
"title": "60 初学者最容易问错的八个问题"
},
{
"page": 64,
"characters": 429,
"title": "61 练习A:原点、模式和地址字"
},
{
"page": 65,
"characters": 466,
"title": "62 练习B:从工件点推到物理关节"
},
{
"page": 66,
"characters": 434,
"title": "63 练习A答案"
},
{
"page": 67,
"characters": 419,
"title": "64 练习B答案"
},
{
"page": 68,
"characters": 472,
"title": "65 把常见名词翻译成容易理解的话"
},
{
"page": 69,
"characters": 477,
"title": "66 用最少公式描述完整坐标链"
},
{
"page": 70,
"characters": 500,
"title": "67 反过来:从当前物理位置求工件坐标"
},
{
"page": 71,
"characters": 525,
"title": "68 这份讲义验证了什么,没有声称什么?"
},
{
"page": 72,
"characters": 731,
"title": "69 官方资料、验证数据与自学路径"
}
],
"embedded_fonts": {
"/AAAAAA+RtcpHandbookCJK-Bold": true,
"/BAAAAA+RtcpHandbookCJK-Regular": true,
"/CAAAAA+NotoSans-Regular": true,
"/DAAAAA+DejaVuSansMono": true
},
"bookmarks": 81,
"numeric_report": "rtcp-beginners-gcode-v1",
"executed_program_status": "completed",
"wasm_sha256": "aa0f5d551e42859eef3b37aee9079f09ae04e668819da4e62aee2b74522e8bc6",
"evidence": [
{
"path": "handbook.html",
"sha256": "525cddf7836d4da6464595fa606d4292dcd14028d24a5686dfff343c00b836d5"
},
{
"path": "outline.json",
"sha256": "a2d61e7fb27f5876be867d95fcd4049cd1dde279813228375e037da508d2ae08"
},
{
"path": "gcode-evidence.json",
"sha256": "57b65da107b22cbfa70bdda6659217d2f854317be3f8e54a9e150b4762f82114"
},
{
"path": "verification/layout.json",
"sha256": "e9345f5594854e9f52168cb7b0bfbe65303e6c3b7c75124ab8fb4004ef9d11f4"
},
{
"path": "assets/absolute-incremental.png",
"sha256": "36099f3c97af8e0d84fb6223bf1a14ed9c45608266aa87314fd7c4d4c9038777"
},
{
"path": "assets/arc-chord.png",
"sha256": "947bfc50ca994ae58b63ed0b198048854690c402a8a2b48d72e306920bf5a93b"
},
{
"path": "assets/arc-words.png",
"sha256": "38c4caf5f8d61b1de510a1946aec58768a468f27bd897a596270605a91e66bdb"
},
{
"path": "assets/bc-frame.png",
"sha256": "b6c467d33eff25e4e02bd04b601388ee4beca460c47426cb906c2ce628dd1eb0"
},
{
"path": "assets/continuous-joints.png",
"sha256": "2aaaa964d93e6e25e654eb239b2baca25f5be43c839f64c8ac37285cf5ede6c0"
},
{
"path": "assets/coordinate-grid.png",
"sha256": "587bbd6ba95422cb96fb07b447bfae0b7c3cd82ca4b96b65b1504909c8cd1e7f"
},
{
"path": "assets/datum-choice.png",
"sha256": "22bcd771e42fbacd5f142a8810670195e760dc9a7722af5daf210c5a16f517e6"
},
{
"path": "assets/font-license.txt",
"sha256": "849f4ea9c214fa4ac3593b770c699f387534b11ce671264c1b10d85bdcb5997b"
},
{
"path": "assets/handbook-bold.otf",
"sha256": "e891f0e63d907ab6b15052fc9a31914bc024b59cf00f55eb4a9dad5920eb5379"
},
{
"path": "assets/handbook-regular.otf",
"sha256": "3a6330ebd1c859e95c3afa190e2845a9826c5c42c33f63ef815cb0365df25dd4"
},
{
"path": "assets/hierarchy.png",
"sha256": "cf76f72ffd315ad17567bf6de507d16c283d3a1882c6f70a9398a04434ccc989"
},
{
"path": "assets/identity-no-follow.png",
"sha256": "1ecb07bdeb7a5015b6c17b32fb3611bec78d8067fb93057d39d5f408eb166f80"
},
{
"path": "assets/machine-ac.png",
"sha256": "ec538e0c0ebe016a1f464ce519875b3338dd60867627ffad2e0a7cdfc425a0ab"
},
{
"path": "assets/machine-bc.png",
"sha256": "46c37c21ef8dbaad203d2aa930796cc96278d9371d28584ac7aade5064b39308"
},
{
"path": "assets/moving-origin.png",
"sha256": "687d10f564f5c7da5c9f8385d6eb536038e3d0c2258441f3e658160d6a517c7b"
},
{
"path": "assets/offset-pipeline.png",
"sha256": "75a7ad25ce9f5f1c677589d824ce607f1b36c7ee379599fa0aa0ead9bd4afb7c"
},
{
"path": "assets/orientation-measure.png",
"sha256": "3b89e366c8d4f058c3758b310735f55608c74215fe22b99fc6dadc4412512c1a"
},
{
"path": "assets/orientation.png",
"sha256": "56e9a6df913e805e07bd00a350f8da9eab4def2cfedaa3ce0cf1b191e65def74"
},
{
"path": "assets/pivot-offset.png",
"sha256": "fc378a8bf7aaf6b8969889bbd4a8f763bc71b01505d063402c0ea4251f06abcd"
},
{
"path": "assets/rotated-direction.png",
"sha256": "9fe171e5e6c95c5f81dd0b395a24351972da7e5d18a37d33e19a6ed9d0a0f645"
},
{
"path": "assets/same-point.png",
"sha256": "79df6b907d4582f82fb45cf03effdf41f2040fe0382e7ee043d34a3e15ec2460"
},
{
"path": "assets/tcp-follow.png",
"sha256": "875eba48ea1cb7b9f990ddc556d38cb4e855af77a3c29130f8c6c249fd3817c8"
},
{
"path": "assets/tool-length.png",
"sha256": "168941e33624f883b09c1cdf54b36ed6e31ba260c7f1abdc495fee3b54cc834a"
},
{
"path": "verification/pdf-contact-1.png",
"sha256": "5434a7798a6d4384d0fc2ff4dacbbc4c93888674e8935d2499569e1e77ec8d46"
},
{
"path": "verification/pdf-contact-2.png",
"sha256": "388a72f9a4ef62fe48e786ca6bbc40aee9ad42fb7a63263be755174b902f01cf"
},
{
"path": "verification/pdf-contact-3.png",
"sha256": "d37d45aba09f2080a43306c31193216011fab37115210f9acf40f7106d2aad92"
}
]
}

View File

@@ -0,0 +1,759 @@
{
"report_id": "rtcp-beginners-layout-v1",
"pages": [
{
"page": 1,
"title": "五轴 RTCP 与工件坐标",
"violations": [],
"overflow": false,
"title_right": 316.921875,
"images": [
{
"src": "assets/machine-bc.png",
"loaded": true
}
],
"characters": 255
},
{
"page": 2,
"title": "怎样使用这份讲义",
"violations": [],
"overflow": false,
"title_right": 262,
"images": [],
"characters": 388
},
{
"page": 3,
"title": "内容索引",
"violations": [],
"overflow": false,
"title_right": 154,
"images": [],
"characters": 350
},
{
"page": 4,
"title": "01 坐标是“按照约定量出来的位置”",
"violations": [],
"overflow": false,
"title_right": 509.859375,
"images": [
{
"src": "assets/coordinate-grid.png",
"loaded": true
}
],
"characters": 250
},
{
"page": 5,
"title": "02 一套坐标系至少要规定什么?",
"violations": [],
"overflow": false,
"title_right": 455.859375,
"images": [],
"characters": 360
},
{
"page": 6,
"title": "03 同一个点,可以有两套不同的坐标",
"violations": [],
"overflow": false,
"title_right": 509.859375,
"images": [
{
"src": "assets/same-point.png",
"loaded": true
}
],
"characters": 274
},
{
"page": 7,
"title": "04 点坐标与移动增量不是一回事",
"violations": [],
"overflow": false,
"title_right": 455.859375,
"images": [
{
"src": "assets/absolute-incremental.png",
"loaded": true
}
],
"characters": 280
},
{
"page": 8,
"title": "05 五轴机床里,到底是哪五根轴?",
"violations": [],
"overflow": false,
"title_right": 482.859375,
"images": [
{
"src": "assets/hierarchy.png",
"loaded": true
}
],
"characters": 267
},
{
"page": 9,
"title": "06 关节位置,不等于工件坐标",
"violations": [],
"overflow": false,
"title_right": 428.859375,
"images": [],
"characters": 335
},
{
"page": 10,
"title": "07 先认识 M、W、J,再引入 K 和 T",
"violations": [],
"overflow": false,
"title_right": 497.859375,
"images": [],
"characters": 405
},
{
"page": 11,
"title": "08 回零解决什么?工件对刀又解决什么?",
"violations": [],
"overflow": false,
"title_right": 563.859375,
"images": [],
"characters": 366
},
{
"page": 12,
"title": "09 工件坐标 W 代表什么?",
"violations": [],
"overflow": false,
"title_right": 384.828125,
"images": [
{
"src": "assets/datum-choice.png",
"loaded": true
}
],
"characters": 261
},
{
"page": 13,
"title": "10 工件转了,原点与方向一起转",
"violations": [],
"overflow": false,
"title_right": 455.859375,
"images": [
{
"src": "assets/moving-origin.png",
"loaded": true
}
],
"characters": 267
},
{
"page": 14,
"title": "11 “物理工件坐标架”和“G54表”不是同一对象",
"violations": [],
"overflow": false,
"title_right": 655.578125,
"images": [],
"characters": 422
},
{
"page": 15,
"title": "12 先约定机床零姿态,再谈工件装在哪里",
"violations": [],
"overflow": false,
"title_right": 563.859375,
"images": [],
"characters": 367
},
{
"page": 16,
"title": "13 工件原点放在哪里比较合适?",
"violations": [],
"overflow": false,
"title_right": 455.859375,
"images": [],
"characters": 383
},
{
"page": 17,
"title": "14 怎样把选好的原点告诉控制器?",
"violations": [],
"overflow": false,
"title_right": 482.859375,
"images": [],
"characters": 373
},
{
"page": 18,
"title": "15 一个原点不能确定三维方向",
"violations": [],
"overflow": false,
"title_right": 428.859375,
"images": [
{
"src": "assets/orientation-measure.png",
"loaded": true
}
],
"characters": 246
},
{
"page": 19,
"title": "16 装夹方向和转台姿态,要分开处理",
"violations": [],
"overflow": false,
"title_right": 509.859375,
"images": [],
"characters": 378
},
{
"page": 20,
"title": "17 一个点怎样从工件坐标换算到机床空间?",
"violations": [],
"overflow": false,
"title_right": 590.859375,
"images": [
{
"src": "assets/moving-origin.png",
"loaded": true
}
],
"characters": 319
},
{
"page": 21,
"title": "18 G54究竟做了什么?",
"violations": [],
"overflow": false,
"title_right": 345.09375,
"images": [],
"characters": 352
},
{
"page": 22,
"title": "19 G54的40、20、10代表什么?",
"violations": [],
"overflow": false,
"title_right": 467.671875,
"images": [
{
"src": "assets/offset-pipeline.png",
"loaded": true
}
],
"characters": 313
},
{
"page": 23,
"title": "20 G10 L2:把已知偏置写入坐标表",
"violations": [],
"overflow": false,
"title_right": 490.75,
"images": [],
"characters": 311
},
{
"page": 24,
"title": "21 G10 L20:让当前位置具有指定工件坐标",
"violations": [],
"overflow": false,
"title_right": 587.6875,
"images": [],
"characters": 378
},
{
"page": 25,
"title": "22 换G54/G55为什么可能只改数字、不动机床?",
"violations": [],
"overflow": false,
"title_right": 649.4375,
"images": [],
"characters": 396
},
{
"page": 26,
"title": "23 G52、G92、G53:先学会不混用",
"violations": [],
"overflow": false,
"title_right": 501.53125,
"images": [],
"characters": 362
},
{
"page": 27,
"title": "24 非RTCP:“独立”的准确含义",
"violations": [],
"overflow": false,
"title_right": 458.03125,
"images": [
{
"src": "assets/identity-no-follow.png",
"loaded": true
}
],
"characters": 275
},
{
"page": 28,
"title": "25 RTCP控制的是相对目标关系",
"violations": [],
"overflow": false,
"title_right": 444.53125,
"images": [
{
"src": "assets/tcp-follow.png",
"loaded": true
}
],
"characters": 269
},
{
"page": 29,
"title": "26 用G54例子看“原点随动”",
"violations": [],
"overflow": false,
"title_right": 426.09375,
"images": [
{
"src": "assets/moving-origin.png",
"loaded": true
}
],
"characters": 281
},
{
"page": 30,
"title": "27 沿工件X前进,哪些电机会动?",
"violations": [],
"overflow": false,
"title_right": 472.796875,
"images": [
{
"src": "assets/rotated-direction.png",
"loaded": true
}
],
"characters": 283
},
{
"page": 31,
"title": "28 加入B或A后,方向可以进入三个维度",
"violations": [],
"overflow": false,
"title_right": 545.5625,
"images": [
{
"src": "assets/bc-frame.png",
"loaded": true
}
],
"characters": 316
},
{
"page": 32,
"title": "29 G54、旋转中心、轴间偏置各管什么?",
"violations": [],
"overflow": false,
"title_right": 561.078125,
"images": [
{
"src": "assets/pivot-offset.png",
"loaded": true
}
],
"characters": 365
},
{
"page": 33,
"title": "30 为什么必须知道刀尖究竟在哪里?",
"violations": [],
"overflow": false,
"title_right": 509.859375,
"images": [
{
"src": "assets/tool-length.png",
"loaded": true
}
],
"characters": 347
},
{
"page": 34,
"title": "31 一行G代码由“地址字”组成",
"violations": [],
"overflow": false,
"title_right": 448.21875,
"images": [],
"characters": 426
},
{
"page": 35,
"title": "32 没有写出来的内容,可能沿用上一行",
"violations": [],
"overflow": false,
"title_right": 536.859375,
"images": [],
"characters": 384
},
{
"page": 36,
"title": "33 G20/G21改变长度单位,不把角度变成长度",
"violations": [],
"overflow": false,
"title_right": 622.4375,
"images": [],
"characters": 386
},
{
"page": 37,
"title": "34 G90 X10:去当前编程系的X=10",
"violations": [],
"overflow": false,
"title_right": 491.71875,
"images": [],
"characters": 355
},
{
"page": 38,
"title": "35 G91 X10:在当前编程方向增加10",
"violations": [],
"overflow": false,
"title_right": 512.859375,
"images": [],
"characters": 449
},
{
"page": 39,
"title": "36 G0/G1分别如何产生运动?",
"violations": [],
"overflow": false,
"title_right": 428.5625,
"images": [],
"characters": 397
},
{
"page": 40,
"title": "37 G2/G3里的I、J、K不是三根新电机轴",
"violations": [],
"overflow": false,
"title_right": 552.34375,
"images": [
{
"src": "assets/arc-words.png",
"loaded": true
}
],
"characters": 348
},
{
"page": 41,
"title": "38 F到底是速度、时间,还是每转进给?",
"violations": [],
"overflow": false,
"title_right": 552.65625,
"images": [],
"characters": 440
},
{
"page": 42,
"title": "39 不是每个数字都代表位置",
"violations": [],
"overflow": false,
"title_right": 401.875,
"images": [],
"characters": 421
},
{
"page": 43,
"title": "40 控制器不是从左到右逐个字移动",
"violations": [],
"overflow": false,
"title_right": 482.859375,
"images": [],
"characters": 369
},
{
"page": 44,
"title": "41 统一实验条件与完整程序",
"violations": [],
"overflow": false,
"title_right": 401.875,
"images": [],
"characters": 442
},
{
"page": 45,
"title": "42 N10–N30:设置模式与工件参考",
"violations": [],
"overflow": false,
"title_right": 493.71875,
"images": [],
"characters": 372
},
{
"page": 46,
"title": "43 N40 M428:先切模式,不凭空移动",
"violations": [],
"overflow": false,
"title_right": 530.90625,
"images": [],
"characters": 358
},
{
"page": 47,
"title": "44 N50:把第一个工件点送到刀尖",
"violations": [],
"overflow": false,
"title_right": 480.953125,
"images": [],
"characters": 348
},
{
"page": 48,
"title": "45 N60 C90:XYZ字没出现,XYZ关节却动了",
"violations": [],
"overflow": false,
"title_right": 606.53125,
"images": [],
"characters": 423
},
{
"page": 49,
"title": "46 N70 G91 X10:沿转后的工件方向走",
"violations": [],
"overflow": false,
"title_right": 539.21875,
"images": [],
"characters": 409
},
{
"page": 50,
"title": "47 N80:工件点不变,B倾转带来X/Z补偿",
"violations": [],
"overflow": false,
"title_right": 570.265625,
"images": [],
"characters": 417
},
{
"page": 51,
"title": "48 N90:省略的Z、B、C保持当前目标",
"violations": [],
"overflow": false,
"title_right": 533.59375,
"images": [],
"characters": 352
},
{
"page": 52,
"title": "49 把五组数字同时放在一张表里",
"violations": [],
"overflow": false,
"title_right": 455.859375,
"images": [
{
"src": "assets/continuous-joints.png",
"loaded": true
}
],
"characters": 647
},
{
"page": 53,
"title": "50 N100/N110:同一刀尖位置,坐标解释改变",
"violations": [],
"overflow": false,
"title_right": 629.34375,
"images": [],
"characters": 399
},
{
"page": 54,
"title": "51 RTCP要在运动过程中持续计算",
"violations": [],
"overflow": false,
"title_right": 471.53125,
"images": [
{
"src": "assets/arc-chord.png",
"loaded": true
}
],
"characters": 255
},
{
"page": 55,
"title": "52 RTCP不自动决定刀轴该朝哪里",
"violations": [],
"overflow": false,
"title_right": 471.53125,
"images": [
{
"src": "assets/orientation.png",
"loaded": true
}
],
"characters": 318
},
{
"page": 56,
"title": "53 预览画面中的三个对象要分开看",
"violations": [],
"overflow": false,
"title_right": 482.859375,
"images": [],
"characters": 426
},
{
"page": 57,
"title": "54 准备数据时,按三层顺序核对",
"violations": [],
"overflow": false,
"title_right": 455.859375,
"images": [],
"characters": 411
},
{
"page": 58,
"title": "55 实验一:观察“转动后的坐标方向”",
"violations": [],
"overflow": false,
"title_right": 536.859375,
"images": [],
"characters": 369
},
{
"page": 59,
"title": "56 实验二:G54与G90/G91的逐行记录",
"violations": [],
"overflow": false,
"title_right": 538.65625,
"images": [],
"characters": 390
},
{
"page": 60,
"title": "57 实验三:原点移动,程序几何不改",
"violations": [],
"overflow": false,
"title_right": 509.859375,
"images": [],
"characters": 401
},
{
"page": 61,
"title": "58 位置不对时,从哪一层开始查?",
"violations": [],
"overflow": false,
"title_right": 482.859375,
"images": [],
"characters": 418
},
{
"page": 62,
"title": "59 RTCP跟得上,还必须到得了",
"violations": [],
"overflow": false,
"title_right": 444.53125,
"images": [],
"characters": 384
},
{
"page": 63,
"title": "60 初学者最容易问错的八个问题",
"violations": [],
"overflow": false,
"title_right": 455.859375,
"images": [],
"characters": 353
},
{
"page": 64,
"title": "61 练习A:原点、模式和地址字",
"violations": [],
"overflow": false,
"title_right": 446.171875,
"images": [],
"characters": 327
},
{
"page": 65,
"title": "62 练习B:从工件点推到物理关节",
"violations": [],
"overflow": false,
"title_right": 474.25,
"images": [],
"characters": 358
},
{
"page": 66,
"title": "63 练习A答案",
"violations": [],
"overflow": false,
"title_right": 230.171875,
"images": [],
"characters": 344
},
{
"page": 67,
"title": "64 练习B答案",
"violations": [],
"overflow": false,
"title_right": 231.25,
"images": [],
"characters": 317
},
{
"page": 68,
"title": "65 把常见名词翻译成容易理解的话",
"violations": [],
"overflow": false,
"title_right": 482.859375,
"images": [],
"characters": 386
},
{
"page": 69,
"title": "66 用最少公式描述完整坐标链",
"violations": [],
"overflow": false,
"title_right": 428.859375,
"images": [],
"characters": 384
},
{
"page": 70,
"title": "67 反过来:从当前物理位置求工件坐标",
"violations": [],
"overflow": false,
"title_right": 536.859375,
"images": [],
"characters": 389
},
{
"page": 71,
"title": "68 这份讲义验证了什么,没有声称什么?",
"violations": [],
"overflow": false,
"title_right": 563.859375,
"images": [],
"characters": 439
},
{
"page": 72,
"title": "69 官方资料、验证数据与自学路径",
"violations": [],
"overflow": false,
"title_right": 482.859375,
"images": [],
"characters": 626
}
],
"errors": []
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Some files were not shown because too many files have changed in this diff Show More