更新KDL与GRL推进记录

This commit is contained in:
wangdequan
2026-06-27 08:40:51 -04:00
parent fe13b081e3
commit 93d8ede54b
4 changed files with 144 additions and 23 deletions

View File

@@ -1095,3 +1095,93 @@
1. 执行 `KW-112`:自动生成规则和往返。 1. 执行 `KW-112`:自动生成规则和往返。
2. 生成稳定 GRL 文本,确保可 diff、可解析、可语义检查并可后处理。 2. 生成稳定 GRL 文本,确保可 diff、可解析、可语义检查并可后处理。
### 轮次 023
日期2026-06-27
关联任务:`KW-112`
本轮目标:完成 GRL 自动生成规则和往返,确保生成文本稳定、可 diff、可解析并可进入语义 IR 与后处理链路。
做了什么:
1. 复核 `kdl-wasm/web/src/grl/generator` 现有生成器实现和 roundtrip 测试。
2. 修正 source metadata 字符串格式化规则:`id` 等外部标识保留字符串引号,`type` 等类别值可保持 GRL 标识符。
3. 确认 `generateGrlProgram` 支持 expanded/compact 两种输出。
4. 确认 target 按名称稳定排序,未显式命名的 path point 自动生成 `p00/p01/...`
5. 确认生成文本可解析为 target/path/operation且可进入 `compileSemanticProgram` 和三品牌后处理。
6. 更新 `README.md`、任务矩阵和验收证据,将 `KW-112` 收口为完成状态。
改了哪些文件:
1. `/home/meswork/kdl_work/kdl-wasm/web/src/grl/generator/generator.ts`
2. `/home/meswork/kdl_work/work/working1/README.md`
3. `/home/meswork/kdl_work/work/working1/03-推进台账.md`
4. `/home/meswork/kdl_work/work/working1/04-任务矩阵.md`
5. `/home/meswork/kdl_work/work/working1/05-验收证据.md`
验证了什么:
1. `npm run typecheck` 通过。
2. `npm run test -- grl generator roundtrip` 通过12 个 GRL 相关测试文件共 49 个测试通过。
3. `npm test` 通过27 个测试文件共 107 个测试通过。
4. `cmake --build kdl-wasm/build-wasm -j16` 通过。
问题和风险:
1. `KW-112` 已完成自动生成和往返,但当前生成器仍聚焦 target/path/operation不覆盖完整 GRL 程序自动合成。
2. 任务矩阵中 `KW-002.4` 保持 `Review`:当前 RobotHandle 由 TypeScript registry 管理,真实 Orocos KDL `Tree/Chain` solver 深度绑定仍需后续专门推进。
3. FANUC 输出仍为 LS/TP 风格文本原型,不是 TP 二进制。
下一步:
1. 若继续深化 KDL 主线,优先推进真实 Orocos KDL WASM `Tree/Chain`、FK/IK/Jacobian solver 接入和 golden 对比。
2. 若继续深化 GRL 主线,可扩展自动生成器覆盖更完整的 proc/func/control/IO/exception 程序生成。
### 轮次 024
日期2026-06-27
关联任务:`KW-002.4``KW-003``KW-005``KW-013`
本轮目标:继续深化 KDL native 主线,让 C ABI 从 `NormalizedRobotModel` 构造 Orocos KDL Chain并补 native FK/Jacobian golden 对比。
做了什么:
1. `kdl-wasm` CMake 接入 Orocos KDL 最小源码集Chain、Segment、Joint、Frame、JntArray、Jacobian、FK solver、Jacobian solver 和必要 utility/inertia 文件。
2. C ABI 增加轻量 JSON 解析,读取 `NormalizedRobotModel``robotId/name/baseLink/tipLink/joints/activeJointNames`
3. `kdl_create_robot` 根据标准模型构造 native KDL Chain并返回包含 `nativeState: "kdl_chain"`、dof 和 jointNames 的 info。
4. 实现 native `kdl_fk`,通过 `ChainFkSolverPos_recursive` 输出 pose7。
5. 实现 native `kdl_jacobian`,通过 `ChainJntToJacSolver` 输出 6 x dof 行主序矩阵。
6. 修复 native solver 生命周期问题FK/Jacobian solver 必须在 map 内稳定 `RobotRecord` 上构造,避免持有 move 前 Chain 引用。
7. Emscripten 构建导出 `HEAPF64` 并启用 C++ exception catching用于 C ABI 测试和结构化错误边界。
8. C ABI 测试新增 Rz+Px 链 native FK/Jacobian golden case。
9. 更新 `README.md`、任务矩阵和验收证据,将 `KW-002.4` 收口为完成状态。
改了哪些文件:
1. `/home/meswork/kdl_work/kdl-wasm/CMakeLists.txt`
2. `/home/meswork/kdl_work/kdl-wasm/bindings/kdl_c_api.cpp`
3. `/home/meswork/kdl_work/kdl-wasm/web/src/kdl/nativeModule.ts`
4. `/home/meswork/kdl_work/kdl-wasm/web/tests/kdl/cAbi.test.ts`
5. `/home/meswork/kdl_work/work/working1/README.md`
6. `/home/meswork/kdl_work/work/working1/03-推进台账.md`
7. `/home/meswork/kdl_work/work/working1/04-任务矩阵.md`
8. `/home/meswork/kdl_work/work/working1/05-验收证据.md`
验证了什么:
1. `npm run typecheck` 通过。
2. `cmake --build kdl-wasm/build-wasm -j16` 通过。
3. `npm test -- kdl-wasm/web/tests/kdl/cAbi.test.ts` 通过1 个测试文件共 5 个测试通过。
4. `npm run test -- kdl fk jacobian checks c-abi` 通过27 个测试文件共 108 个测试通过。
5. `npm test` 通过27 个测试文件共 108 个测试通过。
问题和风险:
1. native `fkAllLinks` 仍未做 JSON 序列化输出Worker `fkAllLinks` 继续由 TypeScript baseline 承载。
2. native IK 尚未接入,当前 IK 和相关 MOVEL/MOVEC 逐点求解仍由 TypeScript baseline 承载。
3. native `planMoveJ/planMoveL/planMoveC/planPath/sampleTrap` 仍返回 `KDL_NOT_IMPLEMENTED`,轨迹规划继续由 TypeScript runtime 承载。
4. C ABI 轻量 JSON 解析只覆盖当前 `NormalizedRobotModel` 必需字段,后续若模型 schema 扩展需要同步增强。
下一步:
1. 若继续深化 KDL native 主线,优先接入 native `fkAllLinks` JSON 输出和 native IK。
2. native IK 稳定后,再逐步把 `planMoveL/planMoveC/planPath` 从 TypeScript baseline 切到 native solver。

View File

@@ -51,7 +51,7 @@
| KW-109 | 异常、报警、中断和多任务语法 | Done | KW-101 | GRL 15、16、24 | alarm/raise/try/catch P0 可用trap/interrupt/task 语法可表达。 | | KW-109 | 异常、报警、中断和多任务语法 | Done | KW-101 | GRL 15、16、24 | alarm/raise/try/catch P0 可用trap/interrupt/task 语法可表达。 |
| KW-110 | 语义检查、IR 和 source map | Done | KW-103, KW-104, KW-105, KW-106, KW-107, KW-108 | GRL 20、21、24KDL 21 | 语法规范第 21 章检查项全部覆盖IR 可调用 KDL。 | | KW-110 | 语义检查、IR 和 source map | Done | KW-103, KW-104, KW-105, KW-106, KW-107, KW-108 | GRL 20、21、24KDL 21 | 语法规范第 21 章检查项全部覆盖IR 可调用 KDL。 |
| KW-111 | ABB、FANUC、KUKA 后处理原型 | Done | KW-110 | GRL 17、19、24 | 三品牌 golden file、post_hint、brand metadata 和转换报告通过。 | | KW-111 | ABB、FANUC、KUKA 后处理原型 | Done | KW-110 | GRL 17、19、24 | 三品牌 golden file、post_hint、brand metadata 和转换报告通过。 |
| KW-112 | 自动生成规则和往返 | Todo | KW-111 | GRL 18、24 | 自动生成 GRL 稳定、可 diff、可解析回等价对象。 | | KW-112 | 自动生成规则和往返 | Done | KW-111 | GRL 18、24 | 自动生成 GRL 稳定、可 diff、可解析回等价对象。 |
## 4. KDL 子任务 ## 4. KDL 子任务
@@ -72,7 +72,7 @@
| KW-002.1 | URDF XML 解析 | Done | link/joint/origin/axis/limit 可读取。 | | KW-002.1 | URDF XML 解析 | Done | link/joint/origin/axis/limit 可读取。 |
| KW-002.2 | 连通性和单位检查 | Done | base/tip 不连通有诊断。 | | KW-002.2 | 连通性和单位检查 | Done | base/tip 不连通有诊断。 |
| KW-002.3 | 生成 `NormalizedRobotModel` | Done | activeJointNames 和 limits 稳定。 | | KW-002.3 | 生成 `NormalizedRobotModel` | Done | activeJointNames 和 limits 稳定。 |
| KW-002.4 | WASM 创建 KDL Chain | Review | `createRobotFromModel` 返回 RobotHandle当前为 TypeScript registry真实 KDL Chain 绑定在 KW-003 起逐步接入。 | | KW-002.4 | WASM 创建 KDL Chain | Done | C ABI 根据 `NormalizedRobotModel` 构造 native KDL ChainFK/Jacobian golden 通过。 |
| KW-002.5 | RobotHandle 生命周期 | Done | create/getInfo/getLimits/destroy 通过。 | | KW-002.5 | RobotHandle 生命周期 | Done | create/getInfo/getLimits/destroy 通过。 |
### KW-003 到 KW-013KDL P0 计算接口 ### KW-003 到 KW-013KDL P0 计算接口
@@ -145,6 +145,6 @@
| KW-111.3 | KUKA KRL 后处理 | Done | golden file 通过。 | | KW-111.3 | KUKA KRL 后处理 | Done | golden file 通过。 |
| KW-111.4 | post_hint 和 brand metadata | Done | 只影响指定品牌。 | | KW-111.4 | post_hint 和 brand metadata | Done | 只影响指定品牌。 |
| KW-111.5 | 转换报告 | Done | 不支持和近似语义明确列出。 | | KW-111.5 | 转换报告 | Done | 不支持和近似语义明确列出。 |
| KW-112.1 | target/path/operation 自动生成 | Todo | 命名稳定、defaults 和 override 正确。 | | KW-112.1 | target/path/operation 自动生成 | Done | 命名稳定、defaults 和 override 正确。 |
| KW-112.2 | compact/expanded 输出 | Todo | 同一输入输出稳定。 | | KW-112.2 | compact/expanded 输出 | Done | 同一输入输出稳定。 |
| KW-112.3 | 生成后再解析 | Todo | 可恢复等价对象和 IR。 | | KW-112.3 | 生成后再解析 | Done | 可恢复等价对象和 IR。 |

View File

@@ -62,8 +62,8 @@ README.md
06-决策记录.md 06-决策记录.md
``` ```
结果摘要:待复核 结果摘要:实际文件清单包含 `README.md``01-项目功能内容.md``02-项目程序开发详细步骤.md``03-推进台账.md``04-任务矩阵.md``05-验收证据.md``06-决策记录.md`,与预期一致
是否通过:待验证 是否通过:通过
## 4. KDL WASM 证据 ## 4. KDL WASM 证据
@@ -109,7 +109,7 @@ emcmake/emcc: /home/meswork/emsdk/upstream/emscripten
3. 产物存在:`kdl-wasm/build-wasm/kdl.js``kdl-wasm/build-wasm/kdl.wasm``kdl-wasm/build-wasm/kdl.d.ts` 3. 产物存在:`kdl-wasm/build-wasm/kdl.js``kdl-wasm/build-wasm/kdl.wasm``kdl-wasm/build-wasm/kdl.d.ts`
4. `npm run test -- kdl rpc` 通过2 个测试文件共 11 个测试通过。 4. `npm run test -- kdl rpc` 通过2 个测试文件共 11 个测试通过。
5. Node 动态加载 `kdl.js` 并调用 `kdl_init`,输出 `{"rc":0,"hasCwrap":true}` 5. Node 动态加载 `kdl.js` 并调用 `kdl_init`,输出 `{"rc":0,"hasCwrap":true}`
6. 当前 C ABI 在 `KW-013` 已补稳定导出、RobotHandle 生命周期和结构化错误边界;真实 FK/IK 和轨迹计算仍由 TypeScript runtime 基线承载。 6. 当前 C ABI 在 `KW-013` 已补稳定导出、RobotHandle 生命周期和结构化错误边界;轮次 024 已进一步接入 native KDL Chain、FK 和 Jacobiannative IK 和轨迹计算仍由 TypeScript runtime 基线承载。
是否通过:通过。 是否通过:通过。
@@ -148,7 +148,7 @@ Vitest 3.2.6
4. `NormalizedRobotModel` 生成 `activeJointNames``limits``source.urdfHash` 4. `NormalizedRobotModel` 生成 `activeJointNames``limits``source.urdfHash`
5. base/tip 不连通、unsupported joint type 返回 `KDL_INVALID_MODEL` 结构化诊断。 5. base/tip 不连通、unsupported joint type 返回 `KDL_INVALID_MODEL` 结构化诊断。
6. Worker runtime 支持 `loadRobotFromUrdf/createRobotFromModel/getRobotInfo/getJointLimits/destroyRobot` 的 RobotHandle 生命周期。 6. Worker runtime 支持 `loadRobotFromUrdf/createRobotFromModel/getRobotInfo/getJointLimits/destroyRobot` 的 RobotHandle 生命周期。
7. 当前 RobotHandle 由 TypeScript registry 管理;真实 KDL `Tree/Chain` 和求解器绑定在后续 FK/IK 任务中接入 7. Worker runtime 当前仍由 TypeScript registry 管理 RobotHandleC ABI 已可根据同一 `NormalizedRobotModel` 构造 native KDL Chain 并执行 FK/Jacobian
是否通过:通过。 是否通过:通过。
@@ -187,7 +187,7 @@ Vitest 3.2.6
4. `fk` 返回 `ok/flange/tcp/joints/diagnostics` 4. `fk` 返回 `ok/flange/tcp/joints/diagnostics`
5. `fkAllLinks` 返回 base-to-tip link pose 顺序。 5. `fkAllLinks` 返回 base-to-tip link pose 顺序。
6. 覆盖零位 FK、revolute + prismatic 关节、tool TCP 偏移、link 顺序和关节维度结构化诊断。 6. 覆盖零位 FK、revolute + prismatic 关节、tool TCP 偏移、link 顺序和关节维度结构化诊断。
7. 当前 FK 为 TypeScript 标准模型数值基线,真实 Orocos KDL solver 对比可在后续 WASM 求解器接入时补充 golden 对比 7. Worker `fk/fkAllLinks` 当前为 TypeScript 标准模型数值基线C ABI 已补 native `kdl_fk` golden 测试,`fkAllLinks` native JSON 序列化仍待后续接入
是否通过:通过。 是否通过:通过。
@@ -224,7 +224,7 @@ Vitest 3.2.6
2. `npm run test -- kdl ik` 通过8 个测试文件共 34 个测试通过。 2. `npm run test -- kdl ik` 通过8 个测试文件共 34 个测试通过。
3. `ik` 返回 `ok/joints/iterations/residualPosition/residualOrientation/reason/diagnostics` 3. `ik` 返回 `ok/joints/iterations/residualPosition/residualOrientation/reason/diagnostics`
4. 覆盖可达目标 IK、FK 回代误差、`ikBatch` 顺序保持、关节限位失败、unsupported model 的 `invalid_model` reason。 4. 覆盖可达目标 IK、FK 回代误差、`ikBatch` 顺序保持、关节限位失败、unsupported model 的 `invalid_model` reason。
5. 当前 IK 为 TypeScript 基线几何求解器,支持 single-prismatic 和 Rz+Px 链;通用 6 轴迭代 IK 与真实 Orocos KDL solver 接入后继续扩展。 5. 当前 IK 为 TypeScript 基线几何求解器,支持 single-prismatic 和 Rz+Px 链;native 通用 6 轴迭代 IK 与 Orocos KDL solver 接入后继续扩展。
是否通过:通过。 是否通过:通过。
@@ -265,6 +265,7 @@ Vitest 3.2.6
6. `checkSingularity` 返回 `nearSingularity/manipulability/conditionNumber`,奇异场景返回 `KDL_SINGULARITY` warning。 6. `checkSingularity` 返回 `nearSingularity/manipulability/conditionNumber`,奇异场景返回 `KDL_SINGULARITY` warning。
7. `checkJointLimits/checkVelocityLimits` 返回 `KDL_JOINT_LIMIT/KDL_VELOCITY_LIMIT/KDL_ACCEL_LIMIT` 结构化诊断。 7. `checkJointLimits/checkVelocityLimits` 返回 `KDL_JOINT_LIMIT/KDL_VELOCITY_LIMIT/KDL_ACCEL_LIMIT` 结构化诊断。
8. `checkReachability/checkReachabilityBatch` 基于 IK 返回可达性、关节解、残差和批量顺序。 8. `checkReachability/checkReachabilityBatch` 基于 IK 返回可达性、关节解、残差和批量顺序。
9. 轮次 024 已补 C ABI native `kdl_jacobian` golden 测试,覆盖 Orocos KDL `ChainJntToJacSolver` 输出的 6 x dof 矩阵。
是否通过:通过。 是否通过:通过。
@@ -581,6 +582,8 @@ Vitest 3.2.6
```bash ```bash
npm run typecheck npm run typecheck
cmake --build kdl-wasm/build-wasm -j16 cmake --build kdl-wasm/build-wasm -j16
npm test -- kdl-wasm/web/tests/kdl/cAbi.test.ts
npm run test -- kdl fk jacobian checks c-abi
npm run test -- kdl c-abi performance npm run test -- kdl c-abi performance
npm test npm test
``` ```
@@ -608,15 +611,20 @@ Emscripten emcc 6.0.0
1. `npm run typecheck` 通过。 1. `npm run typecheck` 通过。
2. `cmake --build kdl-wasm/build-wasm -j16` 通过。 2. `cmake --build kdl-wasm/build-wasm -j16` 通过。
3. `npm run test -- kdl c-abi performance` 通过18 个测试文件共 68 个测试通过。 3. `npm test -- kdl-wasm/web/tests/kdl/cAbi.test.ts` 通过1 个测试文件共 5 个测试通过。
4. `npm test` 通过,18 个测试文件共 70 个测试通过。 4. `npm run test -- kdl fk jacobian checks c-abi` 通过,27 个测试文件共 108 个测试通过。
5. C ABI 稳定导出 `kdl_init/create_robot/destroy_robot/get_robot_info/fk/fk_all_links/jacobian/ik/plan_movej/plan_movel/plan_movec/plan_path/sample_trap/last_error` 5. `npm test` 通过27 个测试文件共 108 个测试通过
6. C++ ABI 现支持 `kdl_create_robot/kdl_destroy_robot/kdl_get_robot_info` 的 handle 生命周期和 JSON 输出 6. C ABI 稳定导出 `kdl_init/create_robot/destroy_robot/get_robot_info/fk/fk_all_links/jacobian/ik/plan_movej/plan_movel/plan_movec/plan_path/sample_trap/last_error`
7. C ABI 失败统一通过 `kdl_last_error` 返回结构化 `code/message/diagnostics`,覆盖 `KDL_NOT_IMPLEMENTED``KDL_BUFFER_TOO_SMALL` 7. C++ ABI 现支持 `kdl_create_robot/kdl_destroy_robot/kdl_get_robot_info` 的 handle 生命周期和 JSON 输出
8. 新增 `KdlNativeAbi` 封装 C ABI 导出检查、缓冲区读取、返回码检查和错误归一化 8. WASM wrapper 链接 Orocos KDL 最小源码集C ABI 可从 `NormalizedRobotModel` 构造 native KDL Chain
9. 新增 `fkPose7` TypedArray 高频 FK 接口,支持复用输出缓冲区并覆盖输出维度错误 9. `kdl_fk` 通过 `ChainFkSolverPos_recursive` 输出 pose7测试覆盖 Rz+Px 链 `[pi/2, 0.4]` 的位置和四元数 golden
10. 性能基线已记录 6 轴初始化、TypedArray FK、平面 IK、1000 点批量可达性和 10 秒 4 ms 轨迹采样 10. `kdl_jacobian` 通过 `ChainJntToJacSolver` 输出 6 x dof 行主序矩阵,测试覆盖线速度和角速度分量
11. 真实通用 6 轴 IK/轨迹求解仍按当前 TypeScript baseline 能力覆盖;后续接入 Orocos KDL solver 时复用本轮 ABI 和性能测试作为回归基线 11. 修复 native solver 生命周期FK/Jacobian solver 在 map 内稳定 `RobotRecord` 上构造,避免持有 move 前 Chain 引用
12. C ABI 失败统一通过 `kdl_last_error` 返回结构化 `code/message/diagnostics`,覆盖 `KDL_NOT_IMPLEMENTED``KDL_BUFFER_TOO_SMALL`
13. 新增 `KdlNativeAbi` 封装 C ABI 导出检查、缓冲区读取、返回码检查和错误归一化。
14. 新增 `fkPose7` TypedArray 高频 FK 接口,支持复用输出缓冲区并覆盖输出维度错误。
15. 性能基线已记录 6 轴初始化、TypedArray FK、平面 IK、1000 点批量可达性和 10 秒 4 ms 轨迹采样。
16. native IK、fkAllLinks JSON 序列化和 native 轨迹规划仍未接入;这些能力继续由 TypeScript baseline 覆盖。
是否通过:通过。 是否通过:通过。
@@ -1153,7 +1161,10 @@ Vitest 3.2.6
命令: 命令:
```bash ```bash
npm run typecheck
npm run test -- grl generator roundtrip npm run test -- grl generator roundtrip
npm test
cmake --build kdl-wasm/build-wasm -j16
``` ```
验证点: 验证点:
@@ -1165,5 +1176,25 @@ npm run test -- grl generator roundtrip
5. compact/expanded 输出。 5. compact/expanded 输出。
6. 生成后可再解析为等价对象和 IR。 6. 生成后可再解析为等价对象和 IR。
结果摘要:待执行。 执行环境:
是否通过:待验证。
```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
cmake 3.22.1
```
结果摘要:
1. `npm run typecheck` 通过。
2. `npm run test -- grl generator roundtrip` 通过12 个 GRL 相关测试文件共 49 个测试通过。
3. `npm test` 通过27 个测试文件共 107 个测试通过。
4. `cmake --build kdl-wasm/build-wasm -j16` 通过。
5. 新增 `generateGrlProgram`,从结构化 spec 生成稳定 GRL 文本和 stable ids。
6. target 按名称稳定排序,未显式命名的 path point 自动生成 `p00/p01/...`
7. speed、zone、path defaults、point override、source metadata 和 operation action 输出稳定。
8. expanded 与 compact 两种输出均可解析;生成后可进入 parser、semantic IR 和三品牌后处理链路。
9. 修正 source metadata 字符串格式化:`id` 等外部标识保留字符串引号,`type` 等类别值可保持 GRL 标识符。
是否通过:通过。

View File

@@ -66,4 +66,4 @@ OPFS、虚拟控制器、UI、报告等内容只在上述两份文档明确要
## 5. 当前首要任务 ## 5. 当前首要任务
从 KDL WASM 工程骨架与 Worker RPC 开始,同时建立 GRL lexer/parser 骨架。两条线的第一个集成点是:把 GRL `movej/movel/movec/path` 编译为 KDL `MotionSegmentRequest` 并生成轨迹 `KW-001``KW-013``KW-100``KW-112` 的文档对标任务已完成并补充验收证据。C ABI 已能从 `NormalizedRobotModel` 构造 native Orocos KDL Chain并完成 native FK/Jacobian golden 对比;后续首要关注点是继续接入 native IK、fkAllLinks 序列化和轨迹规划