Add AC/BC RTCP programs and 3D machine manager
45
docs/glb-machine-manager/01-项目功能内容.md
Normal 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 明确拒绝,已生效模型不改变。
|
||||
13
docs/glb-machine-manager/02-项目程序开发详细步骤.md
Normal 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。
|
||||
22
docs/glb-machine-manager/03-推进台账.md
Normal 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 权威。
|
||||
- 当前任务:已完成。
|
||||
- 下一步:按新需求继续;本专项不重复执行。
|
||||
13
docs/glb-machine-manager/04-任务矩阵.md
Normal 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 完整更新|
|
||||
39
docs/glb-machine-manager/05-验收证据.md
Normal 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。该依赖边界不影响新管理器的浏览器导入、导出和运行证据。
|
||||
29
docs/glb-machine-manager/06-决策记录.md
Normal 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。
|
||||
25
docs/glb-machine-manager/README.md
Normal 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 识别、几何参数同步和实际关节驱动,本专项不重复这些底层能力。
|
||||
103
docs/glb-machine/01-子项目功能内容.md
Normal 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)。
|
||||
16
docs/glb-machine/02-子项目程序开发详细步骤.md
Normal 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 子目录。
|
||||
103
docs/glb-machine/03-推进台账.md
Normal 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。
|
||||
20
docs/glb-machine/04-任务矩阵.md
Normal 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|
|
||||
190
docs/glb-machine/05-验收证据.md
Normal 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改动。
|
||||
69
docs/glb-machine/06-决策记录.md
Normal 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。
|
||||
35
docs/glb-machine/README.md
Normal 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)。
|
||||
@@ -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. |
|
||||
|
||||
70
docs/teaching/rtcp-beginners/README.md
Normal 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。
|
||||
BIN
docs/teaching/rtcp-beginners/assets/absolute-incremental.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
docs/teaching/rtcp-beginners/assets/arc-chord.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
docs/teaching/rtcp-beginners/assets/arc-words.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
docs/teaching/rtcp-beginners/assets/bc-frame.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
docs/teaching/rtcp-beginners/assets/continuous-joints.png
Normal file
|
After Width: | Height: | Size: 93 KiB |
BIN
docs/teaching/rtcp-beginners/assets/coordinate-grid.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
docs/teaching/rtcp-beginners/assets/datum-choice.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
327
docs/teaching/rtcp-beginners/assets/font-license.txt
Normal 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".
|
||||
BIN
docs/teaching/rtcp-beginners/assets/handbook-bold.otf
Normal file
BIN
docs/teaching/rtcp-beginners/assets/handbook-regular.otf
Normal file
BIN
docs/teaching/rtcp-beginners/assets/hierarchy.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
docs/teaching/rtcp-beginners/assets/identity-no-follow.png
Normal file
|
After Width: | Height: | Size: 87 KiB |
BIN
docs/teaching/rtcp-beginners/assets/machine-ac.png
Normal file
|
After Width: | Height: | Size: 114 KiB |
BIN
docs/teaching/rtcp-beginners/assets/machine-bc.png
Normal file
|
After Width: | Height: | Size: 116 KiB |
BIN
docs/teaching/rtcp-beginners/assets/moving-origin.png
Normal file
|
After Width: | Height: | Size: 67 KiB |
BIN
docs/teaching/rtcp-beginners/assets/offset-pipeline.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
BIN
docs/teaching/rtcp-beginners/assets/orientation-measure.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
docs/teaching/rtcp-beginners/assets/orientation.png
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
docs/teaching/rtcp-beginners/assets/pivot-offset.png
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
docs/teaching/rtcp-beginners/assets/rotated-direction.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
docs/teaching/rtcp-beginners/assets/same-point.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
docs/teaching/rtcp-beginners/assets/tcp-follow.png
Normal file
|
After Width: | Height: | Size: 84 KiB |
BIN
docs/teaching/rtcp-beginners/assets/tool-length.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
12
docs/teaching/rtcp-beginners/examples/beginner-g54-rtcp.ngc
Normal 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
|
||||
3635
docs/teaching/rtcp-beginners/gcode-evidence.json
Normal file
65
docs/teaching/rtcp-beginners/handbook.html
Normal file
362
docs/teaching/rtcp-beginners/outline.json
Normal 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 官方资料、验证数据与自学路径"
|
||||
}
|
||||
]
|
||||
502
docs/teaching/rtcp-beginners/verification/acceptance.json
Normal 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"
|
||||
}
|
||||
]
|
||||
}
|
||||
759
docs/teaching/rtcp-beginners/verification/layout.json
Normal 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": []
|
||||
}
|
||||
BIN
docs/teaching/rtcp-beginners/verification/page-01.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-02.png
Normal file
|
After Width: | Height: | Size: 143 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-03.png
Normal file
|
After Width: | Height: | Size: 114 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-04.png
Normal file
|
After Width: | Height: | Size: 114 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-05.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-06.png
Normal file
|
After Width: | Height: | Size: 114 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-07.png
Normal file
|
After Width: | Height: | Size: 119 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-08.png
Normal file
|
After Width: | Height: | Size: 115 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-09.png
Normal file
|
After Width: | Height: | Size: 128 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-10.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-11.png
Normal file
|
After Width: | Height: | Size: 132 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-12.png
Normal file
|
After Width: | Height: | Size: 122 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-13.png
Normal file
|
After Width: | Height: | Size: 119 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-14.png
Normal file
|
After Width: | Height: | Size: 161 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-15.png
Normal file
|
After Width: | Height: | Size: 147 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-16.png
Normal file
|
After Width: | Height: | Size: 148 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-17.png
Normal file
|
After Width: | Height: | Size: 151 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-18.png
Normal file
|
After Width: | Height: | Size: 118 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-19.png
Normal file
|
After Width: | Height: | Size: 142 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-20.png
Normal file
|
After Width: | Height: | Size: 132 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-21.png
Normal file
|
After Width: | Height: | Size: 112 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-22.png
Normal file
|
After Width: | Height: | Size: 128 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-23.png
Normal file
|
After Width: | Height: | Size: 106 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-24.png
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-25.png
Normal file
|
After Width: | Height: | Size: 135 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-26.png
Normal file
|
After Width: | Height: | Size: 137 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-27.png
Normal file
|
After Width: | Height: | Size: 137 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-28.png
Normal file
|
After Width: | Height: | Size: 130 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-29.png
Normal file
|
After Width: | Height: | Size: 112 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-30.png
Normal file
|
After Width: | Height: | Size: 116 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-31.png
Normal file
|
After Width: | Height: | Size: 133 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-32.png
Normal file
|
After Width: | Height: | Size: 151 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-33.png
Normal file
|
After Width: | Height: | Size: 138 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-34.png
Normal file
|
After Width: | Height: | Size: 141 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-35.png
Normal file
|
After Width: | Height: | Size: 126 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-36.png
Normal file
|
After Width: | Height: | Size: 130 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-37.png
Normal file
|
After Width: | Height: | Size: 120 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-38.png
Normal file
|
After Width: | Height: | Size: 143 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-39.png
Normal file
|
After Width: | Height: | Size: 148 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-40.png
Normal file
|
After Width: | Height: | Size: 132 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-41.png
Normal file
|
After Width: | Height: | Size: 151 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-42.png
Normal file
|
After Width: | Height: | Size: 129 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-43.png
Normal file
|
After Width: | Height: | Size: 156 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-44.png
Normal file
|
After Width: | Height: | Size: 126 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-45.png
Normal file
|
After Width: | Height: | Size: 127 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-46.png
Normal file
|
After Width: | Height: | Size: 126 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-47.png
Normal file
|
After Width: | Height: | Size: 107 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-48.png
Normal file
|
After Width: | Height: | Size: 114 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-49.png
Normal file
|
After Width: | Height: | Size: 122 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-50.png
Normal file
|
After Width: | Height: | Size: 125 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-51.png
Normal file
|
After Width: | Height: | Size: 119 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-52.png
Normal file
|
After Width: | Height: | Size: 140 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-53.png
Normal file
|
After Width: | Height: | Size: 131 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-54.png
Normal file
|
After Width: | Height: | Size: 122 KiB |
BIN
docs/teaching/rtcp-beginners/verification/page-55.png
Normal file
|
After Width: | Height: | Size: 140 KiB |