From 93d8ede54b28680e132a0379ebffabeeba6ce292 Mon Sep 17 00:00:00 2001 From: wangdequan Date: Sat, 27 Jun 2026 08:40:51 -0400 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0KDL=E4=B8=8EGRL=E6=8E=A8?= =?UTF-8?q?=E8=BF=9B=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 03-推进台账.md | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++ 04-任务矩阵.md | 10 +++--- 05-验收证据.md | 65 ++++++++++++++++++++++++++---------- README.md | 2 +- 4 files changed, 144 insertions(+), 23 deletions(-) diff --git a/03-推进台账.md b/03-推进台账.md index cebdbef..1c33223 100644 --- a/03-推进台账.md +++ b/03-推进台账.md @@ -1095,3 +1095,93 @@ 1. 执行 `KW-112`:自动生成规则和往返。 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。 diff --git a/04-任务矩阵.md b/04-任务矩阵.md index f04c6ab..e5013a1 100644 --- a/04-任务矩阵.md +++ b/04-任务矩阵.md @@ -51,7 +51,7 @@ | 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、24;KDL 21 | 语法规范第 21 章检查项全部覆盖,IR 可调用 KDL。 | | 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 子任务 @@ -72,7 +72,7 @@ | KW-002.1 | URDF XML 解析 | Done | link/joint/origin/axis/limit 可读取。 | | KW-002.2 | 连通性和单位检查 | Done | base/tip 不连通有诊断。 | | 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 Chain,FK/Jacobian golden 通过。 | | KW-002.5 | RobotHandle 生命周期 | Done | create/getInfo/getLimits/destroy 通过。 | ### KW-003 到 KW-013:KDL P0 计算接口 @@ -145,6 +145,6 @@ | KW-111.3 | KUKA KRL 后处理 | Done | golden file 通过。 | | KW-111.4 | post_hint 和 brand metadata | Done | 只影响指定品牌。 | | KW-111.5 | 转换报告 | Done | 不支持和近似语义明确列出。 | -| KW-112.1 | target/path/operation 自动生成 | Todo | 命名稳定、defaults 和 override 正确。 | -| KW-112.2 | compact/expanded 输出 | Todo | 同一输入输出稳定。 | -| KW-112.3 | 生成后再解析 | Todo | 可恢复等价对象和 IR。 | +| KW-112.1 | target/path/operation 自动生成 | Done | 命名稳定、defaults 和 override 正确。 | +| KW-112.2 | compact/expanded 输出 | Done | 同一输入输出稳定。 | +| KW-112.3 | 生成后再解析 | Done | 可恢复等价对象和 IR。 | diff --git a/05-验收证据.md b/05-验收证据.md index 47a288e..e6d70c2 100644 --- a/05-验收证据.md +++ b/05-验收证据.md @@ -62,8 +62,8 @@ README.md 06-决策记录.md ``` -结果摘要:待复核。 -是否通过:待验证。 +结果摘要:实际文件清单包含 `README.md`、`01-项目功能内容.md`、`02-项目程序开发详细步骤.md`、`03-推进台账.md`、`04-任务矩阵.md`、`05-验收证据.md`、`06-决策记录.md`,与预期一致。 +是否通过:通过。 ## 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`。 4. `npm run test -- kdl rpc` 通过,2 个测试文件共 11 个测试通过。 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 和 Jacobian,native IK 和轨迹计算仍由 TypeScript runtime 基线承载。 是否通过:通过。 @@ -148,7 +148,7 @@ Vitest 3.2.6 4. `NormalizedRobotModel` 生成 `activeJointNames`、`limits`、`source.urdfHash`。 5. base/tip 不连通、unsupported joint type 返回 `KDL_INVALID_MODEL` 结构化诊断。 6. Worker runtime 支持 `loadRobotFromUrdf/createRobotFromModel/getRobotInfo/getJointLimits/destroyRobot` 的 RobotHandle 生命周期。 -7. 当前 RobotHandle 由 TypeScript registry 管理;真实 KDL `Tree/Chain` 和求解器绑定在后续 FK/IK 任务中接入。 +7. Worker runtime 当前仍由 TypeScript registry 管理 RobotHandle;C ABI 已可根据同一 `NormalizedRobotModel` 构造 native KDL Chain 并执行 FK/Jacobian。 是否通过:通过。 @@ -187,7 +187,7 @@ Vitest 3.2.6 4. `fk` 返回 `ok/flange/tcp/joints/diagnostics`。 5. `fkAllLinks` 返回 base-to-tip link pose 顺序。 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 个测试通过。 3. `ik` 返回 `ok/joints/iterations/residualPosition/residualOrientation/reason/diagnostics`。 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。 7. `checkJointLimits/checkVelocityLimits` 返回 `KDL_JOINT_LIMIT/KDL_VELOCITY_LIMIT/KDL_ACCEL_LIMIT` 结构化诊断。 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 npm run typecheck 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 test ``` @@ -608,15 +611,20 @@ Emscripten emcc 6.0.0 1. `npm run typecheck` 通过。 2. `cmake --build kdl-wasm/build-wasm -j16` 通过。 -3. `npm run test -- kdl c-abi performance` 通过,18 个测试文件共 68 个测试通过。 -4. `npm test` 通过,18 个测试文件共 70 个测试通过。 -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`。 -6. C++ ABI 现支持 `kdl_create_robot/kdl_destroy_robot/kdl_get_robot_info` 的 handle 生命周期和 JSON 输出。 -7. C ABI 失败统一通过 `kdl_last_error` 返回结构化 `code/message/diagnostics`,覆盖 `KDL_NOT_IMPLEMENTED` 和 `KDL_BUFFER_TOO_SMALL`。 -8. 新增 `KdlNativeAbi` 封装 C ABI 导出检查、缓冲区读取、返回码检查和错误归一化。 -9. 新增 `fkPose7` TypedArray 高频 FK 接口,支持复用输出缓冲区并覆盖输出维度错误。 -10. 性能基线已记录 6 轴初始化、TypedArray FK、平面 IK、1000 点批量可达性和 10 秒 4 ms 轨迹采样。 -11. 真实通用 6 轴 IK/轨迹求解仍按当前 TypeScript baseline 能力覆盖;后续接入 Orocos KDL solver 时复用本轮 ABI 和性能测试作为回归基线。 +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 个测试通过。 +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_create_robot/kdl_destroy_robot/kdl_get_robot_info` 的 handle 生命周期和 JSON 输出。 +8. WASM wrapper 链接 Orocos KDL 最小源码集,C ABI 可从 `NormalizedRobotModel` 构造 native KDL Chain。 +9. `kdl_fk` 通过 `ChainFkSolverPos_recursive` 输出 pose7,测试覆盖 Rz+Px 链 `[pi/2, 0.4]` 的位置和四元数 golden。 +10. `kdl_jacobian` 通过 `ChainJntToJacSolver` 输出 6 x dof 行主序矩阵,测试覆盖线速度和角速度分量。 +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 +npm run typecheck 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 输出。 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 标识符。 + +是否通过:通过。 diff --git a/README.md b/README.md index 8922d6c..92088c1 100644 --- a/README.md +++ b/README.md @@ -66,4 +66,4 @@ OPFS、虚拟控制器、UI、报告等内容只在上述两份文档明确要 ## 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 序列化和轨迹规划。