# 通用机器人项目主要实施步骤 版本:0.1 日期:2026-06-27 来源:`/home/meswork/kdl_work/work/working1` 用途:作为阅读参考,概览项目从 KDL WASM 计算接口到 GRL 编译与后处理的主要实施步骤。 ## 1. 实施主线 项目实施分两条主线推进: 1. KDL WASM 计算接口线 - 任务编号:`KW-001` 到 `KW-013` - 对标:`KDL_WASM计算接口设计.md` - 目标:提供稳定的 Worker API、机器人模型、运动学、轨迹规划、Path 验证、诊断和性能能力。 2. GRL 编程语法线 - 任务编号:`KW-100` 到 `KW-112` - 对标:`通用机器人编程语法规范.md` - 目标:实现 GRL lexer/parser、AST、语义检查、IR、Path/Operation、IO/wait、后处理和自动生成。 两条线的集成点是:GRL 的 `movej/movel/movec/path/operation` 编译为 KDL WASM 的 `MoveJRequest/MoveLRequest/MoveCRequest/PathPlanRequest`,由 KDL WASM 返回轨迹和诊断。 ## 2. 推荐工程结构 ```text /home/meswork/kdl_work/ orocos_kinematics_dynamics/ orocos_kdl/ kdl-wasm/ CMakeLists.txt bindings/ kdl_c_api.cpp kdl_embind.cpp web/ src/ kdl/ kdlClient.ts kdl.worker.ts rpc.ts types.ts robot/ urdfParser.ts normalizedRobotModel.ts grl/ lexer/ parser/ ast/ semantic/ ir/ generator/ post/ abb/ fanuc/ kuka/ tests/ kdl/ grl/ integration/ post/ ``` ## 3. 阶段 1:基础工程、Worker RPC 和 GRL 词法骨架 关联任务:`KW-001`、`KW-100`、`KW-101` 目标: 1. 建立 `kdl-wasm` wrapper 工程。 2. 使用 Emscripten 编译 Orocos KDL,生成 `kdl.js`、`kdl.wasm`、`kdl.d.ts`。 3. 建立 `KdlRpcRequest/KdlRpcResponse` 和 `KdlWorkerClient`。 4. KDL WASM 只在 Worker 中运行。 5. 建立 GRL lexer,支持注释、标识符、字符串、数字、单位和保留关键字。 6. 建立 GRL parser 和 AST 骨架,支持 `language grl 0.1`、`module`、`import`、顶层声明。 输入: 1. Orocos KDL 源码。 2. GRL 源文件。 输出: 1. KDL WASM 构建产物。 2. Worker RPC 基础 API。 3. GRL Tokens 和 AST。 验收重点: 1. `init()` 返回 `KdlRuntimeInfo`。 2. Worker 请求有唯一 id。 3. 错误返回 `{ code, message, diagnostics }`。 4. GRL 最小文件可解析。 5. AST 保留 source range、注释位置、单位原文和规范化值。 ## 4. 阶段 2:机器人模型、GRL 数据声明和共享类型 关联任务:`KW-002`、`KW-102` 目标: 1. TypeScript 解析 URDF XML。 2. 检查 link/joint 连通性和单位。 3. 生成 `NormalizedRobotModel`。 4. WASM 根据标准模型构造 KDL `Tree/Chain`。 5. 创建 `RobotHandle` 并缓存求解器。 6. GRL 支持 `const/var/persistent`、基础类型、机器人类型。 7. GRL 支持 `tool/frame/load/joint_target/pose_target/pose/poseq/robot_config/ext_axis/speed/zone/offset/offset_in`。 输入: 1. `robot.urdf` 2. GRL 中的 tool/frame/target/speed/zone 声明。 输出: 1. `NormalizedRobotModel` 2. `RobotHandle` 3. `JointTarget` 4. `PoseTarget` 5. `SpeedSpec` 6. `ZoneSpec` 7. `OffsetSpec` 验收重点: 1. URDF joint 顺序稳定。 2. base/tip 不连通返回 `KDL_INVALID_MODEL`。 3. `getRobotInfo/getJointLimits` 正确。 4. GRL target 能编译为 KDL 共享数据结构。 5. speed/zone 能编译为 `SpeedSpec/ZoneSpec`。 ## 5. 阶段 3:KDL 基础运动学和 GRL 运动指令 关联任务:`KW-003` 到 `KW-006`、`KW-103` 目标: 1. 实现 KDL `fk`、`fkAllLinks`。 2. 实现 KDL `ik`、`ikBatch`。 3. 实现 KDL `jacobian`、`checkSingularity`、`checkJointLimits`、`checkReachability`、`checkReachabilityBatch`、`checkVelocityLimits`。 4. 实现 KDL `normalizePose`、`composePose`、`inversePose`、`applyToolAndFrame`、`applyOffset`。 5. GRL 支持 `movej/movel/movec` 和 `set_tool/set_frame/set_speed/set_zone`。 6. GRL 运动指令编译为 `MotionInstruction`,再映射为 KDL request。 输入: 1. `RobotHandle` 2. `JointTarget` 3. `PoseTarget` 4. `tool/frame/speed/zone` 5. GRL 运动语句。 输出: 1. FK/TCP 位姿。 2. IK 关节解。 3. Jacobian 和奇异性诊断。 4. `MotionInstruction` 5. `MoveJRequest/MoveLRequest/MoveCRequest` 验收重点: 1. FK 与 golden 数据或原生 KDL 对比在容差内。 2. IK 后 FK 回代误差小于容差。 3. `ikBatch` 返回顺序与输入顺序一致。 4. 奇异点返回 `KDL_SINGULARITY` warning。 5. `offset`、`offset_in tool`、`offset_in frame` 结果正确。 6. GRL 编译到 IR 前能解析确定的 tool、frame、speed、zone。 ## 6. 阶段 4:梯形速度和三类基础运动轨迹 关联任务:`KW-007` 到 `KW-010` 目标: 1. 实现 `makeTrapProfile` 和 `sampleTrapProfile`。 2. 实现 `planMoveJ`。 3. 实现 `planMoveL`。 4. 实现 `planMoveC`。 MOVEJ 重点: 1. `joint_target` 直接作为 `qEnd`。 2. `pose_target` 先 IK 得到 `qEnd`。 3. 各关节同起同停。 4. 每个采样点 FK 输出 TCP。 MOVEL 重点: 1. 起点由 `startJoints` FK 得到。 2. 目标点应用 tool/frame/offset。 3. 生成 TCP 直线采样。 4. 逐点 IK,seed 使用上一采样点关节。 MOVEC 重点: 1. 起点由当前关节 FK 得到。 2. via 和 target 应用 tool/frame/offset。 3. 检查三点重合或近似共线。 4. 计算圆心、半径、法向、角度、弧长。 5. `TrajectoryResult.meta.circle` 包含 `CirclePlanMeta`。 输入: 1. `MoveJRequest` 2. `MoveLRequest` 3. `MoveCRequest` 4. `TrapProfileOptions` 输出: 1. `TrapProfileResult` 2. `TrajectoryResult` 3. `MotionDiagnostic` 验收重点: 1. 梯形速度曲线长距离为 trapezoid,短距离为 triangle。 2. 采样首点 `s=0`,末点 `s=1`,`s` 单调递增。 3. MOVEJ 关节同起同停。 4. MOVEL TCP 直线误差小于容差。 5. MOVEC 圆弧元数据正确。 6. 三点共线返回 `KDL_ARC_DEGENERATE`。 7. P0 中非 fine zone 返回 `KDL_ZONE_APPROXIMATED`。 ## 7. 阶段 5:Path、Operation 和批量路径验证 关联任务:`KW-011`、`KW-104`、`KW-105` 目标: 1. GRL 支持 `path/defaults/source/point/event/run_path`。 2. GRL 支持 `operation/kind/path/process/start_action/end_action/run_operation`。 3. Path 编译为 `PathPlanRequest`。 4. Operation 展开为 start action + path + end action。 5. KDL 实现 `planPath` 和 `validatePath`。 输入: 1. GRL Path。 2. GRL Operation。 3. `MotionSegmentRequest[]` 4. `PathPlanRequest` 输出: 1. `PathPlanResult` 2. `PathValidationResult` 3. Path source map。 4. Operation 展开结果。 验收重点: 1. 空 Path 报错。 2. 重复 point 名称报错。 3. `run_path` 可生成 `PathPlanRequest`。 4. `planPath` 按 segment 顺序规划。 5. 上一段终点关节作为下一段起点。 6. 轨迹点合并后重新编号和更新时间。 7. 保留 `segmentId/targetId/sourceMap`。 8. `run_operation` 展开后 KDL 只处理 motion segment。 ## 8. 阶段 6:IO、wait、pulse 和流程控制 关联任务:`KW-106`、`KW-107` 目标: 1. 支持 `io.di/do/ai/ao/gi/go/ri/ro`。 2. 支持 `io.alias.*`。 3. 支持 IO 赋值。 4. 支持 `wait` 条件、`timeout`、`on_timeout alarm/call`。 5. 支持 `all/any/rising/falling/changed`。 6. 支持 `pulse`。 7. 支持 `if/elseif/else`、`while`、`for`、`switch/case/default`。 8. 支持 `break/continue/label/jump`。 输入: 1. IO map。 2. GRL IO/wait/pulse 语句。 3. GRL 流程控制语句。 输出: 1. `IoInstruction` 2. `WaitInstruction` 3. `BranchInstruction` 4. pulse IR。 验收重点: 1. IO 地址按 io_map 或允许范围校验。 2. wait 条件可编译。 3. pulse trace 必须包含置位和复位事件。 4. 条件表达式必须为 bool。 5. `break/continue` 位置合法。 6. `switch case` 为常量表达式且不重复。 7. `jump` 不能跳入非法块结构。 8. IO、wait、pulse 和流程控制不直接进入 KDL。 ## 9. 阶段 7:proc、func、异常、报警、中断和多任务语法 关联任务:`KW-108`、`KW-109` 目标: 1. 支持 `proc`、`func`、`call`、`return`。 2. 支持参数方向 `in/out/inout`。 3. 实现作用域和名称解析。 4. 对递归给出 warning 或 error。 5. 支持 `alarm`、`raise`、`try/catch/finally`。 6. P1 语法保留 `trap/interrupt/enable/disable/task cycle`。 输入: 1. GRL 子程序和函数。 2. GRL 异常和中断语法。 输出: 1. `CallInstruction` 2. `ReturnInstruction` 3. `AlarmInstruction` 4. 异常处理 IR。 5. P1 语法 AST。 验收重点: 1. `out` 参数所有正常返回路径赋值。 2. `inout/out` 实参必须为左值。 3. `func` 所有正常返回路径返回兼容类型。 4. `func` 默认不允许执行运动、wait、pulse、run_path、run_operation。 5. P0 支持 alarm/raise/try/catch 基础语义。 6. P1 未实现语义必须在后处理或运行时报明确诊断。 ## 10. 阶段 8:语义检查、IR、source map 和 KDL 集成 关联任务:`KW-110`、`KW-012` 目标: 1. 实现 Symbol Table。 2. 实现 Semantic Analyzer。 3. 生成 Executable IR。 4. 保留 source map。 5. 完成 GRL 到 KDL request 的编译桥接。 6. KDL 实现 `estimateCycleTime` 和 `resampleTrajectory`。 7. 建立统一诊断分级:error、warning、info。 必须检查: 1. 标识符重复或未声明。 2. 类型是否匹配。 3. 目标点类型是否适合运动指令。 4. `movec` 是否缺少 via 点。 5. 圆弧三点是否重合或共线。 6. 工具、坐标系、速度、过渡是否可解析。 7. 单位是否正确。 8. IO 地址是否存在。 9. 子程序参数数量和类型是否匹配。 10. `out` 参数是否赋值。 11. `func` 返回路径是否正确。 12. `break/continue/jump` 是否合法。 13. Path 是否为空或点名重复。 14. Operation 是否引用不存在的 Path。 15. 目标点是否可达。 16. 关节是否超限。 17. 后处理目标品牌是否支持所用语义。 输入: 1. AST。 2. Symbol Table。 3. `RobotHandle`。 4. KDL 检查结果。 输出: 1. Executable IR。 2. KDL request。 3. `CycleTimeResult`。 4. `MotionDiagnostic`。 验收重点: 1. 完整 GRL 示例可编译为 IR。 2. IR 运动指令可映射到 KDL request。 3. source map 能定位 GRL 行列、path point、operation。 4. `estimateCycleTime` 只计算运动时间。 5. `resampleTrajectory` 时间和点序稳定。 6. 所有错误返回结构化诊断。 ## 11. 阶段 9:三品牌后处理原型 关联任务:`KW-111` 目标: 1. ABB RAPID 后处理。 2. FANUC LS/TP 风格后处理。 3. KUKA KRL 后处理。 4. 支持 `post_hint` 和 `@brand.*`。 5. 生成后处理转换报告。 输入: 1. Executable IR。 2. target/tool/frame/speed/zone 数据。 3. post profile。 4. brand metadata。 输出: 1. ABB RAPID 程序。 2. FANUC LS/TP 风格文本。 3. KUKA KRL 程序。 4. 转换报告。 验收重点: 1. `movej/movel/movec` 三品牌 golden file 通过。 2. target/tool/frame/speed/zone 映射正确。 3. IO/wait 基础映射正确。 4. `post_hint` 和 `@brand.*` 只影响指定品牌。 5. 不支持语义进入转换报告,不能静默丢失。 ## 12. 阶段 10:自动生成、往返和性能优化 关联任务:`KW-112`、`KW-013` 目标: 1. 自动生成 GRL 时优先生成 target/path/operation。 2. 点名稳定。 3. path defaults 和单点 override 稳定。 4. source metadata 稳定。 5. 支持 compact/expanded 输出风格。 6. 生成 GRL 可再解析回等价对象。 7. KDL 底层导出稳定 C ABI。 8. 高频 FK/IK 增加 TypedArray 版本。 9. RobotHandle 缓存 FK、IK、Jacobian solver。 10. 长路径分块计算或提供进度。 输入: 1. 自动编程对象。 2. Path/Operation 数据。 3. KDL 批量计算输入。 输出: 1. 稳定 GRL 文本。 2. 可回读 AST/IR。 3. C ABI / Embind API。 4. TypedArray 批量接口。 5. 性能报告。 验收重点: 1. 同一输入重复生成结果一致。 2. 生成文本可 diff。 3. 生成文本可解析、语义检查并后处理。 4. 单机器人 6 轴初始化小于 1 秒。 5. 单次 FK 小于 1 ms。 6. 单次 IK 平均小于 10 ms。 7. 1000 个目标点批量可达性检查在可接受交互时间内完成。 8. 10 秒轨迹按 4 ms 采样约 2500 点可稳定生成和回放。 ## 13. 推荐集成顺序 ```text 1. KW-001 + KW-100 + KW-101 基础工程、Worker RPC、Lexer/Parser 骨架。 2. KW-002 + KW-102 URDF/标准模型和 GRL target/tool/frame/speed/zone。 3. KW-003 到 KW-006 + KW-103 运动指令编译到 KDL FK/IK/变换。 4. KW-007 到 KW-010 梯形速度、MOVEJ、MOVEL、MOVEC。 5. KW-104 + KW-011 Path 编译为 PathPlanRequest,KDL 生成整条路径。 6. KW-105 + KW-011 Operation 展开后复用 Path 规划。 7. KW-106 到 KW-110 完成 P0 语义检查和 IR。 8. KW-111 三品牌后处理原型。 9. KW-112 + KW-013 自动生成、往返、性能和批量优化。 ``` ## 14. 常用验证命令 实际命令以工程 `package.json` 和 CMake 配置为准。每个阶段至少应提供等效命令: ```bash npm run typecheck npm run test -- grl npm run test -- kdl npm run test -- integration npm run test -- post npm run build ``` KDL WASM 构建: ```bash cd /home/meswork/kdl_work 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 ``` ## 15. 阅读建议 1. 先读本文,理解项目主要阶段和集成顺序。 2. 再读 `通用机器人项目功能与数据流程图.md`,理解功能流和数据流。 3. 需要接口细节时读 `KDL_WASM计算接口设计.md`。 4. 需要语言语法和后处理细节时读 `通用机器人编程语法规范.md`。 5. 需要执行级任务和证据时读 `/home/meswork/kdl_work/work/working1` 下的实施文档。