# 05-验收证据 版本:0.3 日期:2026-06-27 ## 1. 记录规则 每条证据必须包含: 1. 证据编号。 2. 关联任务。 3. 对标章节。 4. 命令、页面、报告、截图、日志或产物路径。 5. 执行环境。 6. 结果摘要。 7. 是否通过。 状态取值: | 状态 | 含义 | | --- | --- | | 待验证 | 任务未执行或证据未产生。 | | 通过 | 结果满足验收标准。 | | 不通过 | 已执行但不满足验收标准。 | | 阻塞 | 因环境、依赖或设计问题无法验证。 | ## 2. 环境基线 | 项 | 当前值 | | --- | --- | | 工作区 | `/home/meswork/kdl_work` | | KDL 源码 | `/home/meswork/kdl_work/orocos_kinematics_dynamics/orocos_kdl` | | KDL 对标文档 | `/home/meswork/kdl_work/work/doc/KDL_WASM计算接口设计.md` | | GRL 对标文档 | `/home/meswork/kdl_work/work/doc/通用机器人编程语法规范.md` | | 实施文档目录 | `/home/meswork/kdl_work/work/working1` | | Emscripten | `emcc 6.0.0` | | Node.js | `v22.23.0` | | 浏览器 | 待 Playwright 安装后记录 | ## 3. 管理证据 ### EV-000:对标实施文档 关联任务:`KW-000` 对标章节:两份源文档全文 类型:文件清单 命令: ```bash find /home/meswork/kdl_work/work/working1 -maxdepth 1 -type f -print | sort ``` 预期结果: ```text README.md 01-项目功能内容.md 02-项目程序开发详细步骤.md 03-推进台账.md 04-任务矩阵.md 05-验收证据.md 06-决策记录.md ``` 结果摘要:实际文件清单包含 `README.md`、`01-项目功能内容.md`、`02-项目程序开发详细步骤.md`、`03-推进台账.md`、`04-任务矩阵.md`、`05-验收证据.md`、`06-决策记录.md`,与预期一致。 是否通过:通过。 ## 4. KDL WASM 证据 ### EV-001:WASM 工程和 Worker RPC 关联任务:`KW-001` 对标章节:KDL 2、17、18、24 类型:构建和单元测试 命令: ```bash cd /home/meswork/kdl_work npm run typecheck emcmake cmake -S kdl-wasm -B kdl-wasm/build-wasm \ -DCMAKE_BUILD_TYPE=Release \ -DKDL_SOURCE_DIR=/home/meswork/kdl_work/orocos_kinematics_dynamics/orocos_kdl cmake --build kdl-wasm/build-wasm -j16 npm run test -- kdl rpc node --input-type=module -e "import createKdlModule from './kdl-wasm/build-wasm/kdl.js'; const m=await createKdlModule({ locateFile: (p) => new URL('./kdl-wasm/build-wasm/' + p, import.meta.url).pathname }); const rc=m.ccall('kdl_init','number',['string'],['{}']); console.log(JSON.stringify({ rc, hasCwrap: typeof m.cwrap === 'function' }));" ``` 预期产物: ```text kdl-wasm/build-wasm/kdl.js kdl-wasm/build-wasm/kdl.wasm kdl-wasm/build-wasm/kdl.d.ts ``` 执行环境: ```text Node.js v22.23.0 npm 10.9.8 cmake 3.22.1 emcmake/emcc: /home/meswork/emsdk/upstream/emscripten ``` 结果摘要: 1. `npm run typecheck` 通过。 2. CMake 配置和 `cmake --build kdl-wasm/build-wasm -j16` 通过。 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 生命周期和结构化错误边界;轮次 024 已进一步接入 native KDL Chain、FK 和 Jacobian,native IK 和轨迹计算仍由 TypeScript runtime 基线承载。 是否通过:通过。 ### EV-002:URDF 和 `NormalizedRobotModel` 关联任务:`KW-002` 对标章节:KDL 6、22、23、24 类型:单元测试 命令: ```bash npm run typecheck npm run test -- kdl urdf normalized-model ``` 验证点: 1. URDF link/joint/origin/axis/limit 解析。 2. base/tip 连通性诊断。 3. activeJointNames 顺序稳定。 4. `createRobotFromModel/getRobotInfo/getJointLimits/destroyRobot`。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- kdl urdf normalized-model` 通过,4 个测试文件共 19 个测试通过。 3. URDF 解析覆盖 link、joint、origin、axis、limit。 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. Worker runtime 当前仍由 TypeScript registry 管理 RobotHandle;C ABI 已可根据同一 `NormalizedRobotModel` 构造 native KDL Chain 并执行 FK/Jacobian。 是否通过:通过。 ### EV-003:FK 和 fkAllLinks 关联任务:`KW-003` 对标章节:KDL 8.1、8.2、22、23 类型:单元测试 命令: ```bash npm run typecheck npm run test -- kdl fk ``` 验证点: 1. `fk` 返回 flange、tcp、joints、diagnostics。 2. `fkAllLinks` 返回 link pose 列表。 3. FK golden 数据误差在容差内。 4. 关节维度错误返回结构化诊断。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- kdl fk` 通过,6 个测试文件共 28 个测试通过。 3. `cmake --build kdl-wasm/build-wasm -j16` 回归通过。 4. `fk` 返回 `ok/flange/tcp/joints/diagnostics`。 5. `fkAllLinks` 返回 base-to-tip link pose 顺序。 6. 覆盖零位 FK、revolute + prismatic 关节、tool TCP 偏移、link 顺序和关节维度结构化诊断。 7. Worker `fk/fkAllLinks` 当前为 TypeScript 标准模型数值基线;C ABI 已补 native `kdl_fk` golden 测试,`fkAllLinks` native JSON 序列化仍待后续接入。 是否通过:通过。 ### EV-004:IK 和 ikBatch 关联任务:`KW-004` 对标章节:KDL 8.3、15、22、23 类型:单元测试 命令: ```bash npm run typecheck npm run test -- kdl ik ``` 验证点: 1. IK 后 FK 回代误差小于容差。 2. `ikBatch` 顺序保持。 3. seed、多 seed、qMin/qMax、maxIterations 生效。 4. 不可达、限位、奇异、迭代失败原因稳定。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 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 链;native 通用 6 轴迭代 IK 与 Orocos KDL solver 接入后继续扩展。 是否通过:通过。 ### EV-005:Jacobian、奇异性和检查 API 关联任务:`KW-005` 对标章节:KDL 8.4、15、22、23 类型:单元测试 命令: ```bash npm run typecheck npm run test -- kdl jacobian checks ``` 验证点: 1. Jacobian rows/cols/data 正确。 2. 奇异点 warning。 3. 关节限位、速度限位、可达性诊断。 4. 批量可达性结果与输入一一对应。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- kdl jacobian checks` 通过,9 个测试文件共 38 个测试通过。 3. `npm test` 通过,9 个测试文件共 38 个测试通过。 4. `cmake --build kdl-wasm/build-wasm -j16` 通过。 5. `jacobian` 返回 `ok/rows/cols/data/diagnostics`,覆盖 6 x dof 矩阵和关键线速度分量。 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 矩阵。 是否通过:通过。 ### EV-006:位姿变换和 offset 关联任务:`KW-006` 对标章节:KDL 7、21、22、23 类型:单元测试 命令: ```bash npm run typecheck npm run test -- kdl pose offset npm test cmake --build kdl-wasm/build-wasm -j16 ``` 验证点: 1. `normalizePose` 处理 `pose/poseq`。 2. `composePose/inversePose` 数值正确。 3. `applyToolAndFrame` 与 GRL tool/frame 语义一致。 4. `applyOffset` 支持 frame/tool/world。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- kdl pose offset` 通过,10 个测试文件共 43 个测试通过。 3. `npm test` 通过,10 个测试文件共 43 个测试通过。 4. `cmake --build kdl-wasm/build-wasm -j16` 通过。 5. `normalizePose` 支持 `position/quaternion`、`xyz/rpy`、`xyz/quat`,并规范化四元数。 6. `composePose/inversePose` 覆盖平移组合和逆变换回到 identity。 7. `applyToolAndFrame` 按当前 FK 约定执行 `frame * target.pose * tool`。 8. `applyOffset` 覆盖 `frame/world` 左乘偏移、`tool` 右乘偏移,并保留目标点元数据。 9. 非法位姿输入返回 `KDL_INVALID_POSE` 结构化诊断。 是否通过:通过。 ### EV-007:梯形速度曲线 关联任务:`KW-007` 对标章节:KDL 9、22、23 类型:单元测试 命令: ```bash npm run typecheck npm run test -- kdl trap-profile npm test cmake --build kdl-wasm/build-wasm -j16 ``` 验证点: 1. 长距离为 trapezoid。 2. 短距离为 triangle。 3. 首末采样点严格对应 `s=0` 和 `s=1`。 4. `s` 单调递增。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- kdl trap-profile` 通过,11 个测试文件共 47 个测试通过。 3. `npm test` 通过,11 个测试文件共 47 个测试通过。 4. `cmake --build kdl-wasm/build-wasm -j16` 通过。 5. 长距离场景生成 trapezoid,覆盖 `tAccel/tConst/tDecel/duration/vPeak`。 6. 短距离场景自动退化为 triangle,并输出 `KDL_TRAP_TRIANGLE_PROFILE` info 诊断。 7. `makeTrapProfile` 返回完整 profile 和 samples,`sampleTrapProfile` 返回同一采样规则下的 samples。 8. 首末采样点严格对应 `s=0` 和 `s=1`,采样时间和 `s` 单调递增。 9. 非法输入返回 `KDL_INVALID_TRAP_PROFILE` 结构化诊断。 是否通过:通过。 ### EV-008:MOVEJ 轨迹 关联任务:`KW-008` 对标章节:KDL 11、21、22、23 类型:运动测试 命令: ```bash npm run typecheck npm run test -- kdl movej planMoveJ npm test cmake --build kdl-wasm/build-wasm -j16 ``` 验证点: 1. 关节同起同停。 2. `joint_target` 和 `pose_target` 两类目标。 3. FK 输出 TCP。 4. 限位、速度、加速度、奇异性诊断。 5. 非 fine zone 返回 `KDL_ZONE_APPROX_FINE`。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- kdl movej planMoveJ` 通过,12 个测试文件共 51 个测试通过。 3. `npm test` 通过,12 个测试文件共 51 个测试通过。 4. `cmake --build kdl-wasm/build-wasm -j16` 通过。 5. `planMoveJ` 支持 `joint_target` 直接规划和 `pose_target` IK 求终点关节。 6. 轨迹点输出 `time/dt/s/sd/sdd/joints/jointVelocity/jointAcceleration/flange/tcp`。 7. 使用梯形速度曲线生成关节同步轨迹,首末点速度归零。 8. 终点关节限位失败返回 `TrajectoryResult.ok=false` 和 `KDL_JOINT_LIMIT`。 9. 速度、加速度保持在 joint limits 内;非 fine zone 返回 `KDL_ZONE_APPROX_FINE` warning;采样点奇异性返回 `KDL_SINGULARITY` warning。 是否通过:通过。 ### EV-009:MOVEL 轨迹 关联任务:`KW-009` 对标章节:KDL 12、21、22、23 类型:运动测试 命令: ```bash npm run typecheck npm run test -- kdl movel planMoveL npm test cmake --build kdl-wasm/build-wasm -j16 ``` 验证点: 1. 起点 FK。 2. 目标 tool/frame/offset。 3. TCP 直线误差。 4. 逐点 IK 连续。 5. 速度、加速度、姿态误差和配置突变诊断。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- kdl movel planMoveL` 通过,13 个测试文件共 54 个测试通过。 3. `npm test` 通过,13 个测试文件共 54 个测试通过。 4. `cmake --build kdl-wasm/build-wasm -j16` 通过。 5. `planMoveL` 使用起点 FK 得到 TCP 起点,按 TCP 直线生成采样 pose。 6. 每个采样点逐点 IK,seed 使用上一采样点关节解。 7. 轨迹点输出 `MOVEL` 的 `joints/jointVelocity/jointAcceleration/flange/tcp`。 8. 可达直线测试覆盖 TCP 直线误差和终点 TCP;不可达采样点返回 `TrajectoryResult.ok=false` 和 `KDL_JOINT_LIMIT`。 9. 非 linear speed 返回 `KDL_MOVEL_JOINT_SPEED_APPROX` warning;非 fine zone 返回 `KDL_ZONE_APPROX_FINE` warning。 是否通过:通过。 ### EV-010:MOVEC 轨迹 关联任务:`KW-010` 对标章节:KDL 13、21、22、23 类型:运动测试 命令: ```bash npm run typecheck npm run test -- kdl movec planMoveC npm test cmake --build kdl-wasm/build-wasm -j16 ``` 验证点: 1. 圆心、半径、法向、角度、弧长正确。 2. `TrajectoryResult.meta.circle` 包含 `CirclePlanMeta`。 3. 三点共线返回 `KDL_ARC_DEGENERATE`。 4. 逐点 IK 和圆弧误差诊断。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- kdl movec planMoveC` 通过,14 个测试文件共 57 个测试通过。 3. `npm test` 通过,14 个测试文件共 57 个测试通过。 4. `cmake --build kdl-wasm/build-wasm -j16` 通过。 5. `planMoveC` 基于起点 TCP、via、target 三点计算圆心、半径、法向、角度和弧长。 6. `TrajectoryResult.meta.circle` 包含 `center/radius/normal/angle/length/direction/maxArcError`。 7. 圆弧采样逐点 IK,seed 使用上一采样点关节解。 8. 三点重合或共线返回 `TrajectoryResult.ok=false` 和 `KDL_ARC_DEGENERATE`。 9. 非 linear speed 返回 `KDL_MOVEC_JOINT_SPEED_APPROX` warning;非 fine zone 返回 `KDL_ZONE_APPROX_FINE` warning。 是否通过:通过。 ### EV-011:Path 规划和验证 关联任务:`KW-011` 对标章节:KDL 14、15、21、22、23 类型:集成测试 命令: ```bash npm run typecheck npm run test -- kdl path validation npm test cmake --build kdl-wasm/build-wasm -j16 ``` 验证点: 1. `planPath` 多段轨迹合并。 2. `validatePath` 返回 `PathValidationResult`。 3. 空路径返回 `KDL_PATH_EMPTY`。 4. segmentId、targetId、sourceMap 保留。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- kdl path validation` 通过,15 个测试文件共 60 个测试通过。 3. `npm test` 通过,15 个测试文件共 60 个测试通过。 4. `cmake --build kdl-wasm/build-wasm -j16` 通过。 5. `PathPlanRequest/MotionSegmentRequest/PathPlanResult/PathValidationResult` 已从占位类型改为明确结构。 6. `planPath` 按段调用 `planMoveJ/planMoveL/planMoveC`,并用上一段终点关节作为下一段起点。 7. 合并轨迹点重新编号并更新时间,保留 `segmentId/targetId/sourceMap`。 8. `validatePath` 返回 `segmentReports`、`cycleTime`、速度/加速度比例和诊断。 9. 空路径返回 `TrajectoryResult.ok=false` 风格的 `KDL_PATH_EMPTY` 诊断。 是否通过:通过。 ### EV-012:节拍估算、重采样和诊断 关联任务:`KW-012` 对标章节:KDL 16、19、20、22、23 类型:单元测试 命令: ```bash npm run typecheck npm run test -- kdl cycle-time resample diagnostics npm test cmake --build kdl-wasm/build-wasm -j16 ``` 验证点: 1. `estimateCycleTime` 只计算运动时间。 2. `resampleTrajectory` 时间和点序稳定。 3. error/warning/info 分级正确。 4. KDL API 不抛裸字符串错误。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- kdl cycle-time resample diagnostics` 通过,16 个测试文件共 63 个测试通过。 3. `npm test` 通过,16 个测试文件共 63 个测试通过。 4. `cmake --build kdl-wasm/build-wasm -j16` 通过。 5. `estimateCycleTime` 支持单段 `TrajectoryResult` 和多段 `PathPlanResult`,当前只统计 KDL 运动时间,`waitTime/ioTime` 保留为 0。 6. `resampleTrajectory` 按固定 `sampleTime` 重采样,首末点保持稳定,时间单调并重新编号。 7. 重采样对关节、速度、加速度、flange 和 tcp 位置做线性插值,并输出 `KDL_TRAJECTORY_RESAMPLED` info。 8. 空轨迹重采样返回 `KDL_RESAMPLE_EMPTY_TRAJECTORY` warning;非法采样时间抛出 `KDL_INVALID_SAMPLE_TIME` 结构化错误。 9. Path 段级 points 也保留 `segmentId/sourceMap`,便于节拍估算和诊断报告定位。 是否通过:通过。 ### EV-013:C ABI、Embind 和性能 关联任务:`KW-013` 对标章节:KDL 18、19、24 类型:构建、性能报告 命令: ```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 ``` 指标: | 指标 | 结果 | | --- | --- | | 单机器人 6 轴初始化 | 3.536 ms,目标 < 1000 ms | | 单次 FK | `fkPose7` TypedArray 平均 0.019288 ms,目标 < 1 ms | | 单次 IK | 平面 Rz+Px IK 平均 0.010930 ms,目标 < 10 ms | | 1000 个目标点批量可达性 | 7.166 ms,目标 < 500 ms | | 10 秒轨迹 4 ms 采样 | 2526 点,48.864 ms,目标 < 500 ms | 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 Emscripten emcc 6.0.0 ``` 结果摘要: 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 个测试通过。 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 覆盖。 是否通过:通过。 ## 5. GRL 证据 ### EV-100:Lexer、单位和关键字 关联任务:`KW-100` 对标章节:GRL 4、24 类型:单元测试 命令: ```bash npm run typecheck npm run test -- grl lexer units ``` 验证点: 1. 注释、标识符、字符串、数字。 2. 保留关键字表。 3. 长度、角度、时间、质量、速度、加速度单位规范化。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- grl lexer` 通过,1 个测试文件 5 个测试通过。 3. Lexer 覆盖单行/多行注释、关键字、标识符、字符串、数字、source range 和 EOF token。 4. 关键字表覆盖 GRL 规范第 4.5 节 85 个保留关键字。 5. 单位规范化覆盖 `mm/m/deg/rad/mm/s/%/ms/kg/mm/s2`,`100 mm -> 0.1 m`、`180 deg -> pi rad`、`300 mm/s -> 0.3 m/s` 通过。 是否通过:通过。 ### EV-101:Parser 和 AST 关联任务:`KW-101` 对标章节:GRL 5、22、23、24 类型:parser 测试和 snapshot 命令: ```bash npm run typecheck npm run test -- grl parser ast ``` 验证点: 1. 最小文件解析。 2. 第 23 章完整示例解析。 3. AST source range、注释、单位原文、metadata。 4. 非法语法行列号。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- grl parser ast` 通过,2 个测试文件共 8 个测试通过。 3. 最小文件 `language grl 0.1 / module / proc / end` 可解析。 4. AST 保留 `LanguageDeclaration`、`ModuleDeclaration`、`ImportDeclaration`、`ProcedureDeclaration` 和 source range。 5. 顶层 `const/target/path/operation/func/trap/task/post_hint` 当前保留为 RawTopLevelDeclaration,后续 KW-102 到 KW-109 逐步细化。 6. 非法语法错误行列号稳定。 是否通过:通过。 ### EV-102:类型、数据声明和目标点 关联任务:`KW-102` 对标章节:GRL 6、7、8、24 类型:单元测试 命令: ```bash npm run typecheck npm run test -- grl types declarations targets ``` 验证点: 1. `const/var/persistent`。 2. `tool/frame/load`。 3. `joint_target/pose_target`。 4. `pose/poseq/robot_config/ext_axis`。 5. `speed/zone/offset/offset_in` 编译为共享结构。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- grl types declarations targets` 通过,3 个测试文件共 12 个测试通过。 3. Parser 结构化输出 `DataDeclaration`、`TargetDeclaration`、表达式 AST、对象表达式、数组、调用和 offset 表达式。 4. `tool/frame` 可编译为包含 TCP/origin 的共享结构。 5. `joint_target/pose_target` 可编译为 `JointTarget/PoseTarget`,单位规范化为 SI。 6. `speed/zone` 可编译为 `SpeedSpec/ZoneSpec`。 7. `offset/offset_in tool` 可编译为 `OffsetSpec`。 是否通过:通过。 ### EV-103:运动指令 关联任务:`KW-103` 对标章节:GRL 9、20、21、24;KDL 21 类型:单元测试、集成测试 命令: ```bash npm run typecheck npm run test -- grl motion npm test ``` 验证点: 1. `movej/movel/movec` AST。 2. tool/frame/speed/zone 参数优先级。 3. MotionInstruction。 4. KDL `MoveJRequest/MoveLRequest/MoveCRequest`。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- grl motion` 通过,4 个测试文件共 14 个测试通过。 3. `npm test` 通过,8 个测试文件共 34 个测试通过。 4. `movej/movel/movec` 可从 `proc` body token 编译为 `MotionInstruction`。 5. 当前 `set_tool/set_frame/set_speed/set_zone` 可作为运行上下文默认值。 6. 显式 motion 参数优先于当前上下文。 7. `MotionInstruction` 可编译为 `MoveJRequest/MoveLRequest/MoveCRequest`,包含 startJoints、target/via、speed、zone、tool、frame、sampleTime、sourceMap。 8. 预留命令 `npm run test -- integration grl-kdl-motion` 当前无独立测试文件,集成点由 `grl motion` 和全量测试覆盖。 是否通过:通过。 ### EV-104:Path 和 `run_path` 关联任务:`KW-104` 对标章节:GRL 10、18、20、21、24;KDL 14、21 类型:单元测试、集成测试 命令: ```bash npm run typecheck npm run test -- grl path run_path event npm test cmake --build kdl-wasm/build-wasm -j16 ``` 验证点: 1. `defaults/source/point/event`。 2. 空 Path、重复点名诊断。 3. `run_path` 编译为 `PathPlanRequest`。 4. source map 到 path point。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- grl path run_path event` 通过,6 个测试文件共 22 个测试通过。 3. `npm test` 通过,19 个测试文件共 75 个测试通过。 4. `cmake --build kdl-wasm/build-wasm -j16` 通过。 5. Parser 将 `path` 从 raw declaration 提升为 `PathDeclaration`,覆盖 `defaults/source/point/event before/after/at distance`。 6. Path defaults 支持 tool、frame、speed、zone,并按高于当前控制器上下文的优先级应用到 point motion。 7. Source metadata 编译为 `PathPlanRequest.source`,数值单位规范化,例如 `5 mm -> 0.005`。 8. Path point 编译为 `MotionSegmentRequest`,保留 point id、targetId、sourceMap 和 source metadata。 9. `run_path` 从 procedure body token 编译为 `RunPathInstruction`,保留 sourceMap。 10. Event 当前编译为 `PathEventRequest` metadata,保留 timing、pointId、distance、kind、statement 和 sourceMap;具体 IO/Wait/Pulse IR 在 `KW-106` 展开。 11. 空 Path 返回 `GRL_PATH_EMPTY`,重复 point 返回 `GRL_PATH_POINT_DUPLICATE`,event 引用缺失 point 返回 `GRL_PATH_EVENT_POINT_NOT_FOUND`。 是否通过:通过。 ### EV-105:Operation 和 `run_operation` 关联任务:`KW-105` 对标章节:GRL 11、20、21、24;KDL 14 类型:单元测试 命令: ```bash npm run typecheck npm run test -- grl operation run_operation npm test cmake --build kdl-wasm/build-wasm -j16 ``` 验证点: 1. `operation kind/path/process/start_action/end_action`。 2. Operation 引用不存在 Path 报错。 3. `run_operation` 展开后 KDL 只处理 motion segment。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- grl operation run_operation` 通过,6 个测试文件共 23 个测试通过。 3. `npm test` 通过,20 个测试文件共 79 个测试通过。 4. `cmake --build kdl-wasm/build-wasm -j16` 通过。 5. Parser 将 `operation` 从 raw declaration 提升为 `OperationDeclaration`,覆盖 `kind/path/process/start_action/end_action`。 6. `compileOperation` 验证 operation 引用的 path 存在,缺失时报 `GRL_OPERATION_PATH_NOT_FOUND`。 7. Process 参数编译为 metadata,保留数值、字符串和 identifier。 8. start/end action 编译为 `OperationActionInstruction` metadata,保留 actionKind、operationId、statement、sourceMap。 9. `parseProcedureRunOperationStatements` 从 procedure body token 提取 `run_operation` 并保留 sourceMap。 10. `expandRunOperation` 展开为 start action、`RUN_PATH`、end action;缺失 operation 报 `GRL_OPERATION_NOT_FOUND`。 11. KDL 仍只接收 Path 展开后的 motion segment;operation action 的 IO/Wait/Pulse 语义在 `KW-106` 继续展开。 是否通过:通过。 ### EV-106:IO、wait 和 pulse 关联任务:`KW-106` 对标章节:GRL 12、20、21、24;KDL 21.1 类型:单元测试 命令: ```bash npm run typecheck npm run test -- grl io wait pulse npm test cmake --build kdl-wasm/build-wasm -j16 ``` 验证点: 1. IO 地址和别名。 2. wait 条件、timeout、on_timeout。 3. all/any/rising/falling/changed。 4. pulse IR。 5. IO/wait/pulse 不直接调用 KDL。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- grl io wait pulse` 通过,7 个测试文件共 28 个测试通过。 3. `npm test` 通过,21 个测试文件共 84 个测试通过。 4. `cmake --build kdl-wasm/build-wasm -j16` 通过。 5. 新增 `IoWriteInstruction/WaitInstruction/PulseInstruction/IoFlowInstruction`,覆盖 IO 写入、等待和脉冲 IR。 6. `parseIoFlowStatements` 支持 `io.di/do/ai/ao/gi/go/ri/ro`、`io.alias.*`、IO map 范围校验和 `GRL_IO_ADDRESS_NOT_FOUND`。 7. `wait` 支持条件字符串、`timeout`、`on_timeout alarm/call`,并覆盖 `all/any/rising/falling/changed` 条件表达。 8. `pulse` 生成 set/reset trace,单位归一化保留到秒。 9. `compilePathEventIo` 和 `compileOperationActionIo` 可将 Path event / Operation action metadata 展开为 IO/wait/pulse IR。 10. Path/Operation action token 原样保留,statement fallback 使用 GRL lexer,确保 `true/false` 和 `ms/s` 单位类型正确。 11. KDL 边界保持不变:IO/wait/pulse 不进入 KDL motion segment 或 wasm 运动规划。 是否通过:通过。 ### EV-107:流程控制 关联任务:`KW-107` 对标章节:GRL 13、20、21、24 类型:单元测试 命令: ```bash npm run typecheck npm run test -- grl control-flow npm test cmake --build kdl-wasm/build-wasm -j16 ``` 验证点: 1. if/elseif/else。 2. while/for/switch。 3. break/continue 合法性。 4. label/jump 规则。 5. jump 进入非法块结构诊断。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- grl control-flow` 通过,8 个测试文件共 33 个测试通过。 3. `npm test` 通过,22 个测试文件共 89 个测试通过。 4. `cmake --build kdl-wasm/build-wasm -j16` 通过。 5. 新增流程控制 IR:`IfInstruction/WhileInstruction/ForInstruction/SwitchInstruction/BreakInstruction/ContinueInstruction/LabelInstruction/JumpInstruction`。 6. `parseProcedureControlFlow` 从 procedure body token 编译结构化流程控制树。 7. `if/elseif/else`、`while`、`for`、`switch/case/default` 均保留 sourceMap、条件/表达式文本和原始 token。 8. 条件表达式做 P0 bool 检查,明显数值/字符串条件报 `GRL_CONTROL_CONDITION_NOT_BOOL`。 9. `break/continue` 做位置合法性检查,非法位置分别报 `GRL_BREAK_OUTSIDE_FLOW` 和 `GRL_CONTINUE_OUTSIDE_LOOP`。 10. switch case 要求常量表达式,重复 case/default 会报结构化错误。 11. label/jump 做重复、缺失和跳入内层块检查,覆盖 `GRL_LABEL_DUPLICATE`、`GRL_LABEL_NOT_FOUND`、`GRL_JUMP_INTO_BLOCK`。 是否通过:通过。 ### EV-108:proc、func、参数方向和作用域 关联任务:`KW-108` 对标章节:GRL 14、20、21、24 类型:单元测试 命令: ```bash npm run typecheck npm run test -- grl proc func scope npm test cmake --build kdl-wasm/build-wasm -j16 ``` 验证点: 1. proc/call/return。 2. func 返回路径。 3. in/out/inout。 4. out 所有正常返回路径赋值。 5. func 非法副作用诊断。 6. 名称解析和遮蔽 warning。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- grl proc func scope` 通过,9 个测试文件共 39 个测试通过。 3. `npm test` 通过,23 个测试文件共 95 个测试通过。 4. `cmake --build kdl-wasm/build-wasm -j16` 通过。 5. `func` 从 raw top-level declaration 提升为结构化 `FunctionDeclaration`。 6. 新增 procedure/function signature IR,支持 `in/out/inout` 参数方向。 7. `analyzeProcFunctionSemantics` 建立 proc/func 签名表,解析 `call` 和 `return`。 8. `out/inout` 实参必须为左值,参数数量和基础类型不匹配会返回结构化错误。 9. `out` 参数做正常返回路径赋值检查,支持通过 `call` 写入 out/inout 实参。 10. `func` 检查缺失返回、返回类型不兼容、proc return value 非法。 11. `func` 默认禁止运动、wait、pulse、run_path、run_operation 和调用 proc。 12. 名称遮蔽和自递归以 warning diagnostic 返回。 是否通过:通过。 ### EV-109:异常、报警、中断和多任务语法 关联任务:`KW-109` 对标章节:GRL 15、16、24 类型:单元测试 命令: ```bash npm run typecheck npm run test -- grl alarm interrupt task npm test cmake --build kdl-wasm/build-wasm -j16 ``` 验证点: 1. alarm/raise。 2. try/catch/finally。 3. trap/interrupt 语法。 4. task cycle 语法。 5. P1 未实现语义有明确诊断。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- grl alarm interrupt task` 通过,10 个测试文件共 43 个测试通过。 3. `npm test` 通过,24 个测试文件共 99 个测试通过。 4. `cmake --build kdl-wasm/build-wasm -j16` 通过。 5. 新增异常/报警 IR:`AlarmInstruction/RaiseInstruction/TryInstruction/CatchInstruction/FinallyInstruction/UnsupportedRuntimeInstruction`。 6. `parseProcedureExceptionFlow` 支持 `alarm`、`raise`、`try/catch/finally`。 7. `alarm` 保留 alarm id、message、severity 和 sourceMap。 8. `try` 要求至少一个 `catch` 或 `finally`,否则报 `GRL_TRY_HANDLER_MISSING`。 9. `trap` 和 `task ... cycle ... end` 保持为 raw top-level declaration,AST 可表达完整 token block。 10. `analyzeExceptionSemantics` 对 P1 的 trap/task 返回 `UNSUPPORTED_RUNTIME` 并输出 `GRL_P1_UNIMPLEMENTED` warning diagnostic。 11. procedure body 内 `enable/disable interrupt` 编译为 `UNSUPPORTED_RUNTIME`,明确标识 P0 不执行。 是否通过:通过。 ### EV-110:语义检查、IR 和 source map 关联任务:`KW-110` 对标章节:GRL 20、21、24;KDL 21 类型:语义测试、IR snapshot 命令: ```bash npm run typecheck npm run test -- grl semantic ir sourcemap npm test cmake --build kdl-wasm/build-wasm -j16 ``` 验证点: 1. 语法规范第 21 章 22 项检查覆盖。 2. Executable IR。 3. Motion IR 到 KDL request。 4. source map 定位 GRL、Path、Operation。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- grl semantic ir sourcemap` 通过,11 个测试文件共 46 个测试通过。 3. `npm test` 通过,25 个测试文件共 102 个测试通过。 4. `cmake --build kdl-wasm/build-wasm -j16` 通过。 5. 新增 `compileSemanticProgram` 统一语义入口,组合数据、target、path、operation、proc/func、IO、流程控制、异常/报警语义。 6. 新增 `SemanticProgramIr`,包含 `symbols/semanticChecks/procedures/paths/operations/diagnostics/sourceMap/kdlBridge`。 7. `semanticChecks` 覆盖 22 项检查清单,用于对齐 GRL 第 21 章 P0 语义检查面。 8. Executable IR 支持 Motion、IO、Wait、Pulse、RunPath、RunOperation、Call、Return、Branch、Alarm、UnsupportedRuntime。 9. `kdlBridge.motionRequests` 可从 executable motion 映射到 KDL request,`kdlBridge.pathRequests` 保留 PathPlanRequest。 10. source map 聚合 GRL procedure 行列、path point/event、operation action。 11. 修正 motion 语句参数解析的跨行边界,避免 `movej ... zone fine` 吞掉下一行 IO/wait/control token。 12. 重复符号通过 semantic diagnostic 返回 `GRL_SYMBOL_DUPLICATE`。 是否通过:通过。 ### EV-111:三品牌后处理原型 关联任务:`KW-111` 对标章节:GRL 17、19、24 类型:golden file 测试 命令: ```bash npm run typecheck npm run test -- post abb fanuc kuka npm test cmake --build kdl-wasm/build-wasm -j16 ``` 验证点: 1. ABB RAPID。 2. FANUC LS/TP 风格。 3. KUKA KRL。 4. post_hint。 5. brand metadata。 6. 不支持语义转换报告。 执行环境: ```text Node.js v22.23.0 npm 10.9.8 Vitest 3.2.6 ``` 结果摘要: 1. `npm run typecheck` 通过。 2. `npm run test -- post abb fanuc kuka` 通过,1 个测试文件共 2 个测试通过。 3. `npm test` 通过,26 个测试文件共 104 个测试通过。 4. `cmake --build kdl-wasm/build-wasm -j16` 通过。 5. 新增 `postProcessBrand/postProcessAllBrands`,以 `SemanticProgramIr` 为后处理输入。 6. ABB RAPID 原型输出 `MoveJ/MoveL/MoveC/SetDO/WaitUntil/PulseDO`。 7. FANUC LS/TP 风格原型输出 `/PROG`、`J/L/C`、`DO/WAIT/PULSE`。 8. KUKA KRL 原型输出 `DEF`、`PTP/LIN/CIRC`、`$OUT/WAIT FOR/PULSE`。 9. speed/zone 映射覆盖 joint percent、linear mm/s、fine、distance zone。 10. `post_hint abb` 对 ABB 生效,对 FANUC/KUKA 输出 `GRL_POST_HINT_IGNORED` report。 11. 不支持语义进入转换报告,测试覆盖 `ALARM` 的 `GRL_POST_UNSUPPORTED`。 是否通过:通过。 ### EV-112:自动生成规则和往返 关联任务:`KW-112` 对标章节:GRL 18、24 类型:生成器测试、往返测试 命令: ```bash npm run typecheck npm run test -- grl generator roundtrip npm test cmake --build kdl-wasm/build-wasm -j16 ``` 验证点: 1. 优先生成 target/path/operation。 2. 点名稳定。 3. defaults 和单点 override 稳定。 4. source metadata 保留。 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 标识符。 是否通过:通过。