# 通用机器人项目主要实施步骤

版本：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` 下的实施文档。
