# 01-项目功能内容 版本:0.3 日期:2026-06-27 对标文档: 1. `/home/meswork/kdl_work/work/doc/通用机器人编程语法规范.md` 2. `/home/meswork/kdl_work/work/doc/KDL_WASM计算接口设计.md` ## 1. 项目定位 本目录用于把 GRL 编程语法规范和 KDL WASM 计算接口设计落成实施计划。实施目标是形成一套互相闭合的语言层和运动计算层: ```text GRL Source -> Lexer / Parser -> AST -> Symbol Table -> Semantic Analyzer -> Executable IR / MotionSegmentRequest -> KdlWorkerClient -> KDL WASM -> TrajectoryResult / PathValidationResult / Diagnostics ``` Web UI、OPFS、碰撞检测和真实控制器通信不作为独立实施主线;相关内容只在两份对标文档明确要求的 GRL 工程结构、轨迹 trace、虚拟控制器调用关系、后处理或测试场景中进入范围。 ## 2. GRL 语言功能范围 ### 2.1 设计目标 GRL 是用于离线编程和虚拟调试的通用机器人程序语言,必须满足: 1. 支持目标点、路径、工艺、IO、等待、流程控制、报警、仿真执行、报告和后处理。 2. 可由规划点、CAD 曲线、工艺模板或 AI 规划器自动生成程序。 3. 可转换为 ABB RAPID、FANUC LS/TP 风格文本、KUKA KRL。 4. 可反向导入品牌程序,恢复为统一 IR、GRL 和 OLP 对象模型。 5. 程序文本稳定、可读、可 diff。 6. 编译后生成统一可执行 IR,虚拟控制器不依赖品牌控制器细节。 ### 2.2 语法必须覆盖 1. 文件工程结构: - `project.json` - `robots/*.urdf` - `programs/*.grl` - `targets/*.json` - `paths/*.json` - `operations/*.json` - `io/io_map.json` - `post/{abb,fanuc,kuka}.profile.json` - `generated/{abb,fanuc,kuka}/` - `reports/*.json` 2. 词法: - UTF-8。 - 小写关键字。 - 大小写敏感标识符。 - `snake_case` 推荐。 - 单行和多行注释。 - 带单位数值。 - 保留关键字表。 3. 顶层结构: - `language grl 0.1` - `module` - `import` - `persistent/const/var` - `target` - `path` - `operation` - `proc` - `func` - `trap` - `task` - `post_hint` 4. 类型系统: - `bool/int/real/string/time/length/angle/percent` - `pose/joint_array/pose_target/joint_target/tool/frame/speed/zone/load/robot_config/ext_axis/path/operation` 5. 数据声明: - `tool` - `frame` - `joint_target` - `pose_target` - `pose` - `poseq` - `robot_config` - 偏移表达式 `offset`、`offset_in` 6. 速度和过渡: - `joint(percent)` - `joint(angle/s)` - `linear(length/s)` - `angular(angle/s)` - 可选 `acc` - `fine` - `z(distance)` - `cnt(percent)` - `continuous` 7. 运动指令: - `movej TargetExpr [speed Speed] [zone Zone] [tool Tool] [frame Frame]` - `movel TargetExpr [speed Speed] [zone Zone] [tool Tool] [frame Frame]` - `movec via ViaTargetExpr target EndTargetExpr [speed Speed] [zone Zone] [tool Tool] [frame Frame]` - `set_tool` - `set_frame` - `set_speed` - `set_zone` 8. Path: - `path` - `defaults` - `source` - `point` - `event before/after/at` - `run_path` 9. Operation: - `operation` - `kind` - `path` - `process` - `start_action` - `end_action` - `run_operation` 10. IO 与等待: - `io.di/do/ai/ao/gi/go/ri/ro` - `io.alias.*` - IO 赋值。 - `wait` - `timeout` - `on_timeout alarm` - `on_timeout call` - `all/any/rising/falling/changed` - `pulse` 11. 流程控制: - `if/elseif/else` - `while` - `for` - `switch/case/default` - `break` - `continue` - `label` - `jump` 12. 子程序和函数: - `proc` - `func` - `call` - `return` - 参数方向 `in/out/inout` - 作用域和名称解析。 13. 异常、报警和中断: - `alarm` - `raise` - `try/catch/finally` - `trap` - `interrupt` - `enable/disable interrupt` 14. 多任务语法: - `task ... cycle ...` - 首版只定义语法,不要求完整实时调度。 15. 品牌扩展: - `post_hint abb/fanuc/kuka` - `@brand.abb` - `@brand.fanuc` - `@brand.kuka` - 无法支持的品牌扩展必须进入转换报告。 ### 2.3 GRL P0 按语法规范第 24 章,P0 必须实现: 1. `language`、`module`、`proc`。 2. `const`、`var`、`persistent`。 3. `tool`、`frame`、`speed`、`zone`。 4. `joint_target`、`pose_target`。 5. `movej`、`movel`、`movec`。 6. `path`、`point`、`event`、`run_path`。 7. `operation`、`run_operation`。 8. `if`、`elseif`、`else`、`while`、`for`、`switch`。 9. `call`、`return`、`break`、`continue`。 10. `proc` 参数方向 `in/out/inout`。 11. `func`、函数调用表达式和返回值检查。 12. `io.do/di`、`wait`、`pulse`。 13. AST、语义检查、IR、source map。 14. ABB、FANUC、KUKA 后处理原型。 ### 2.4 GRL P1 按语法规范第 24 章,P1 扩展: 1. `label/jump` 和品牌标签程序导入。 2. `trap`、`interrupt`。 3. 多任务 `task`。 4. 更完整的 IO 类型。 5. 工艺模板库。 6. 品牌程序导入。 7. 复杂品牌扩展和转换报告。 ## 3. KDL WASM 功能范围 ### 3.1 目标 KDL WASM 是 GRL、虚拟控制器、离线编程、路径验证和轨迹回放共用的运动学与轨迹计算内核。接口设计从 GRL 语义反推,不直接暴露 KDL C++ 类。 KDL WASM 负责: 1. `joint_target`、`pose_target` 的目标点解析和可达性验证。 2. `tool`、`frame`、`offset`、`offset_in` 的位姿变换。 3. `movej` 关节角度差分运行。 4. `movel` TCP 直线运行。 5. `movec` TCP 圆弧运行。 6. `path`、`run_path`、`operation` 的批量轨迹生成和批量诊断。 7. 速度、加速度、zone、采样周期、节拍估算。 8. 当前 TCP、当前关节、轨迹采样点、报警诊断。 KDL WASM 不负责: 1. GRL 词法和语法解析。 2. 程序流程控制、变量、IO、wait、子程序调用。 3. 碰撞检测和几何布尔运算。 4. 真实品牌控制器完整 look-ahead 和伺服细节。 5. OPFS 项目文件管理。 ### 3.2 顶层 TypeScript API 必须实现 `KdlWasmApi` 中的异步接口: 1. 生命周期: - `init` - `dispose` 2. 机器人模型: - `loadRobotFromUrdf` - `createRobotFromModel` - `destroyRobot` - `getRobotInfo` - `getJointLimits` 3. 位姿变换: - `normalizePose` - `composePose` - `inversePose` - `applyToolAndFrame` - `applyOffset` 4. 运动学: - `fk` - `fkAllLinks` - `jacobian` - `ik` - `ikBatch` 5. 检查: - `checkJointLimits` - `checkVelocityLimits` - `checkSingularity` - `checkReachability` - `checkReachabilityBatch` 6. 梯形速度: - `makeTrapProfile` - `sampleTrapProfile` 7. 轨迹规划: - `planMoveJ` - `planMoveL` - `planMoveC` - `planPath` - `validatePath` - `estimateCycleTime` - `resampleTrajectory` ### 3.3 KDL P0 按 KDL WASM 接口设计第 22 章,P0 必须暴露: 1. `init` 2. `loadRobotFromUrdf` 3. `createRobotFromModel` 4. `destroyRobot` 5. `getRobotInfo` 6. `getJointLimits` 7. `normalizePose` 8. `composePose` 9. `inversePose` 10. `applyOffset` 11. `applyToolAndFrame` 12. `fk` 13. `fkAllLinks` 14. `jacobian` 15. `ik` 16. `ikBatch` 17. `checkJointLimits` 18. `checkSingularity` 19. `checkReachability` 20. `checkReachabilityBatch` 21. `makeTrapProfile` 22. `sampleTrapProfile` 23. `planMoveJ` 24. `planMoveL` 25. `planMoveC` 26. `planPath` 27. `validatePath` 28. `estimateCycleTime` 29. `resampleTrajectory` ### 3.4 KDL P1 按 KDL WASM 接口设计第 22 章,P1 扩展: 1. `planBlendPath` 2. `planMoveSpline` 3. `checkCollisionInputPoses`,只提供 link poses,不做碰撞本身。 4. `optimizeSeedSequence` 5. `compareTrajectory` 6. 外部轴协调相关函数。 ## 4. 共享数据和单位 ### 4.1 单位 GRL 编译器内部必须统一: | 物理量 | 内部单位 | | --- | --- | | 长度 | meter | | 角度 | radian | | 时间 | second | | 质量 | kilogram | | 线速度 | meter/second | | 角速度 | radian/second | | 加速度 | meter/second^2 或 radian/second^2 | ### 4.2 位姿 内部统一为: ```ts interface Pose { position: [number, number, number]; quaternion: [number, number, number, number]; // x, y, z, w } ``` GRL `pose(x, y, z, rx, ry, rz)` 必须在 TypeScript 编译层规范化为 KDL `Pose`。 ### 4.3 目标点 必须统一到: ```ts interface PoseTarget { id?: string; pose: Pose; config?: RobotConfiguration; tool?: Pose; frame?: Pose; extAxis?: number[]; sourceMap?: MotionSourceMap; } interface JointTarget { id?: string; joints: number[]; extAxis?: number[]; sourceMap?: MotionSourceMap; } ``` ### 4.4 速度和 zone GRL 速度和过渡必须编译为: ```ts type SpeedSpec = | { kind: "joint_percent"; value: number } | { kind: "joint_abs"; velocity: number; acceleration?: number } | { kind: "linear"; velocity: number; acceleration?: number; angularVelocity?: number }; type ZoneSpec = | { kind: "fine" } | { kind: "distance"; value: number } | { kind: "cnt"; value: number } | { kind: "continuous" }; ``` 首版 `zone` 只用于诊断和后处理,运动规划按 `fine` 到点执行,并产生 `KDL_ZONE_APPROXIMATED`。 ### 4.5 诊断 所有语言、语义、KDL 和后处理错误必须结构化。KDL 固定 code 至少包含: | code | 含义 | | --- | --- | | `KDL_INVALID_MODEL` | 机器人模型非法 | | `KDL_TARGET_UNREACHABLE` | 目标不可达 | | `KDL_IK_FAILED` | IK 求解失败 | | `KDL_JOINT_LIMIT` | 关节超限 | | `KDL_VELOCITY_LIMIT` | 速度超限 | | `KDL_ACCEL_LIMIT` | 加速度超限 | | `KDL_SINGULARITY` | 接近奇异 | | `KDL_ARC_DEGENERATE` | 圆弧退化 | | `KDL_PATH_EMPTY` | 空路径 | | `KDL_ZONE_APPROXIMATED` | zone 被近似处理 | GRL 语义诊断至少覆盖: 1. 未定义符号。 2. 重复声明。 3. 类型不匹配。 4. 单位错误。 5. 目标点类型不适合运动指令。 6. `movec` 缺 via 或三点退化。 7. 工具、坐标系、速度、zone 不可解析。 8. IO 地址非法。 9. 参数数量、类型、方向错误。 10. `func` 返回路径错误或包含非法副作用。 11. `break/continue/jump` 位置非法。 12. Path 为空或点名重复。 13. Operation 引用不存在的 Path。 14. 后处理品牌不支持所用语义。 ## 5. GRL 与 KDL 的调用关系 | GRL 语法 | 编译结果 | KDL WASM 函数 | | --- | --- | --- | | `target home = joint_target` | `JointTarget` | `checkJointLimits` | | `target pick = pose_target` | `PoseTarget` | `checkReachability` | | `pick offset z 100 mm` | `OffsetSpec` | `applyOffset` | | `movej home` | `MoveJRequest` | `planMoveJ` | | `movel pick` | `MoveLRequest` | `planMoveL` | | `movec via mid target end` | `MoveCRequest` | `planMoveC` | | `run_path pick_path` | `PathPlanRequest` | `planPath` | | Path 可达性检查 | `PathPlanRequest` | `validatePath` | | 节拍报告 | `TrajectoryResult/PathPlanResult` | `estimateCycleTime` | 以下 GRL 语义不进入 KDL WASM: 1. `if/elseif/else` 2. `while/for/switch` 3. `proc/func/call/return` 4. `io.do/di/ai/ao` 5. `wait/pulse/timer` 6. `alarm/raise/try/catch` 7. `operation.process` ## 6. 验收口径 ### 6.1 GRL P0 验收 1. EBNF 覆盖语法规范第 22 章。 2. 语法规范第 23 章完整示例可解析。 3. AST 保留 source range、单位原文、规范化值和品牌 metadata。 4. 语义检查覆盖语法规范第 21 章全部检查项。 5. `path` 可编译为 `PathPlanRequest`。 6. `operation` 可展开为 start action、path、end action。 7. `movej/movel/movec` 可编译为对应 KDL request。 8. ABB、FANUC、KUKA 后处理原型有 golden file。 ### 6.2 KDL P0 验收 1. P0 29 个函数全部在 TypeScript API 和 Worker RPC 中可调用。 2. URDF 到 KDL Chain joint 顺序稳定。 3. FK 与 golden 或原生 KDL 结果对比在容差内。 4. IK 后 FK 回代误差小于容差。 5. Jacobian 尺寸和奇异性指标正确。 6. 梯形速度曲线长距离/短距离测试通过。 7. `planMoveJ` 关节同起同停。 8. `planMoveL` TCP 直线误差小于容差。 9. `planMoveC` 圆心、半径、弧长、圆弧误差正确,共线返回 `KDL_ARC_DEGENERATE`。 10. `planPath/validatePath` 保留 segment、target 和 source map。 11. 错误处理不抛裸字符串,返回结构化 `KdlError` 或 `MotionDiagnostic`。 ### 6.3 集成验收 1. GRL `movej/movel/movec` 编译为 KDL request 并生成轨迹。 2. GRL `path` 编译为 `PathPlanRequest` 并生成整条路径。 3. `run_operation` 展开后 KDL 只处理 motion segment。 4. `if/for/switch/call/wait/io` 不直接调用 KDL,但能影响虚拟控制器何时调用运动函数。 5. 长路径批量验证有性能记录。 6. Worker 初始化、崩溃恢复和取消请求测试通过。