整理项目文档目录

This commit is contained in:
wangdequan
2026-06-27 08:55:15 -04:00
parent 95c684fc4d
commit ef5f14aa2a
7 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,490 @@
# 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 初始化、崩溃恢复和取消请求测试通过。

View File

@@ -0,0 +1,596 @@
# 02-项目程序开发详细步骤
版本0.3
日期2026-06-27
对标文档:
1. `/home/meswork/kdl_work/work/doc/KDL_WASM计算接口设计.md`
2. `/home/meswork/kdl_work/work/doc/通用机器人编程语法规范.md`
## 1. 推荐目录
目录按两条主线组织:`grl` 负责语言、AST、语义、IR、后处理`kdl-wasm` 负责 KDL Worker API 和运动计算。
```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/
```
## 2. KDL 实施线
KDL 实施顺序严格对标 `KDL_WASM计算接口设计.md` 第 24 章。
### 2.1 KW-001WASM 工程骨架和 Worker RPC
目标:
1. 新建 `kdl-wasm` wrapper 工程。
2. 使用 Emscripten 编译 Orocos KDL。
3. 生成 `kdl.js``kdl.wasm``kdl.d.ts`
4. 建立 `KdlRpcRequest/KdlRpcResponse`
5. 建立 `KdlWorkerClient`,所有 KDL API 异步调用。
核心要求:
1. KDL 运行在 Worker 中。
2. Worker 请求必须有唯一 id。
3. Worker 初始化失败可恢复并重新初始化。
4. 错误返回结构化 `{ code, message, diagnostics }`
验收:
1. `init()` 返回 `KdlRuntimeInfo`
2. `dispose()` 可释放 Worker。
3. Worker RPC 单元测试通过。
### 2.2 KW-002`NormalizedRobotModel` 到 KDL Chain
目标:
1. TypeScript 解析 URDF XML。
2. 检查 link/joint 连通性和单位。
3. 生成 `NormalizedRobotModel`
4. WASM 根据标准模型构造 KDL `Tree/Chain`
5. 创建 `RobotHandle` 并缓存求解器。
必须实现:
1. `loadRobotFromUrdf`
2. `createRobotFromModel`
3. `destroyRobot`
4. `getRobotInfo`
5. `getJointLimits`
验收:
1. URDF joint 顺序稳定。
2. base/tip 不连通返回 `KDL_INVALID_MODEL`
3. 不支持 joint 类型返回诊断。
4. 机器人信息中的 `dof/jointNames/limits` 正确。
### 2.3 KW-003FK 和 fkAllLinks
目标:
1. 实现 `fk`
2. 实现 `fkAllLinks`
3. 支持 tool/frame 选项。
4. 输出法兰位姿、TCP 位姿和 link 位姿。
验收:
1. FK 与 golden 数据或原生 KDL 对比在容差内。
2. `fkAllLinks` link 数量和顺序正确。
3. 关节维度错误有结构化诊断。
### 2.4 KW-004IK 和 ikBatch
目标:
1. 实现 `ik`
2. 实现 `ikBatch`
3. 支持 seed、qMin/qMax、多 seed、容差、最大迭代次数。
4. 失败原因覆盖 `unreachable/joint_limit/singularity/max_iteration/invalid_model`
验收:
1. IK 后 FK 回代误差小于容差。
2. `ikBatch` 返回顺序与输入顺序一致。
3. 不可达目标返回 `KDL_TARGET_UNREACHABLE``KDL_IK_FAILED`
4. 连续点 seed 使用上一点结果。
### 2.5 KW-005Jacobian、奇异性和基础检查
目标:
1. 实现 `jacobian`
2. 实现 `checkSingularity`
3. 实现 `checkJointLimits`
4. 实现 `checkReachability``checkReachabilityBatch`
5. 实现 `checkVelocityLimits`
验收:
1. Jacobian 行列数正确。
2. 奇异点附近产生 `KDL_SINGULARITY` warning。
3. 关节超限产生 `KDL_JOINT_LIMIT`
4. 批量可达性保持输入顺序。
### 2.6 KW-006位姿变换和 offset
目标:
1. 实现 `normalizePose`
2. 实现 `composePose`
3. 实现 `inversePose`
4. 实现 `applyToolAndFrame`
5. 实现 `applyOffset`
验收:
1. `pose()` 欧拉角可规范化为四元数。
2. `poseq()` 四元数可归一化。
3. `offset` 默认在 frame 下解释。
4. `offset_in tool``offset_in frame fixture` 结果正确。
### 2.7 KW-007梯形速度曲线
目标:
1. 实现 `makeTrapProfile`
2. 实现 `sampleTrapProfile`
3. 长距离输出 trapezoid。
4. 短距离自动退化为 triangle。
验收:
1. 首点 `s=0`
2. 末点 `s=1`
3. `s` 单调递增。
4. 所有 `TrajectoryResult` 保留实际速度曲线采样。
### 2.8 KW-008`planMoveJ`
目标:
1. 对应 GRL `movej`
2. target 为 `joint_target` 时直接得到 `qEnd`
3. target 为 `pose_target` 时先 IK。
4. 按关节速度、加速度约束计算同步运动时长。
5. 每个采样点 FK 输出 TCP。
必须诊断:
1. 目标 IK 失败。
2. 起点或终点关节超限。
3. 采样点速度或加速度超限。
4. 接近奇异点。
5. P0 zone 被近似为 fine。
### 2.9 KW-009`planMoveL`
目标:
1. 对应 GRL `movel`
2. 起点由 `startJoints` FK 得到。
3. 目标点应用 tool/frame/offset。
4. 生成 TCP 直线采样。
5. 姿态使用 fixed 或 slerp。
6. 每个采样点 IKseed 使用上一采样点关节。
必须诊断:
1. 目标不可达。
2. 采样点 IK 失败。
3. TCP 直线误差超过容差。
4. 姿态误差超过容差。
5. 关节配置突变。
6. 速度或加速度超限。
### 2.10 KW-010`planMoveC`
目标:
1. 对应 GRL `movec via ... target ...`
2. 起点由当前关节 FK 得到。
3. via 和 target 应用 tool/frame/offset。
4. 检查三点重合或近似共线。
5. 计算圆心、半径、法向、角度、弧长。
6. 每个圆弧采样点 IK。
7. `TrajectoryResult.meta.circle` 包含 `CirclePlanMeta`
必须诊断:
1. via 或 target 不可达。
2. 三点重合、近似重合或近似共线。
3. 半径过小或弧长过短。
4. 采样点 IK 失败。
5. 圆弧误差超过容差。
6. 速度或加速度超限。
### 2.11 KW-011`planPath` 和 `validatePath`
目标:
1. `planPath` 用于 `run_path` 展开后的整条路径轨迹生成。
2. `validatePath` 用于离线编程路径验证。
3. `run_operation` 在 TypeScript 层展开KDL 只处理 motion segment。
验收:
1. 段顺序正确。
2. 上一段终点关节作为下一段起点。
3. 合并后轨迹点重新编号和更新时间。
4. 保留 `segmentId/targetId/sourceMap`
5. 空路径返回 `KDL_PATH_EMPTY`
### 2.12 KW-012节拍估算、重采样和诊断报告
目标:
1. 实现 `estimateCycleTime`
2. 实现 `resampleTrajectory`
3. KDL 只估算运动时间。
4. waitTime、ioTime 由调用方补充。
验收:
1. `CycleTimeResult.motionTime/totalTime/segmentTimes` 正确。
2. 重采样后轨迹时间、点序、source map 稳定。
3. error/warning/info 分级正确。
### 2.13 KW-013C ABI / Embind 和性能优化
目标:
1. 底层导出稳定 C ABI。
2. TypeScript API 包装 C ABI 或 Embind。
3. 高频 FK/IK 增加 TypedArray 版本。
4. RobotHandle 缓存 FK、IK、Jacobian solver。
5. 长路径分块计算或提供进度。
性能目标:
1. 单机器人 6 轴初始化小于 1 秒。
2. 单次 FK 小于 1 ms。
3. 单次 IK 平均小于 10 ms。
4. 1000 个目标点批量可达性检查在可接受交互时间内完成。
5. 10 秒轨迹按 4 ms 采样约 2500 点可稳定生成和回放。
## 3. GRL 实施线
GRL 实施顺序严格对标 `通用机器人编程语法规范.md` 第 24 章。
### 3.1 KW-100Lexer、单位和关键字
目标:
1. UTF-8 输入。
2. 识别单行、多行注释。
3. 识别标识符、字符串、数字、单位。
4. 识别保留关键字。
5. 单位规范化到 SI。
验收:
1. `100 mm` -> `0.1 m`
2. `180 deg` -> `pi rad`
3. `300 mm/s` -> `0.3 m/s`
4. 注释位置可保留。
### 3.2 KW-101Parser 和 AST 骨架
目标:
1. 实现 EBNF 第 22 章主体。
2. 支持 `language grl 0.1`
3. 支持 `module/import/end`
4. 支持 top-level declarations。
5. AST 保留 source range、原始单位文本、规范化值和 metadata。
验收:
1. 最小文件可解析。
2. 错误行列号准确。
3. AST snapshot 稳定。
### 3.3 KW-102数据声明、类型系统和目标点
目标:
1. `const/var/persistent`
2. 基础类型和机器人类型。
3. `tool/frame/load`
4. `joint_target/pose_target`
5. `pose/poseq/robot_config/ext_axis`
6. `speed/zone`
7. `offset/offset_in`
验收:
1. 类型 AST 正确。
2. target 能编译为 `JointTarget/PoseTarget`
3. speed/zone 能编译为 `SpeedSpec/ZoneSpec`
4. offset 能编译为 `OffsetSpec`
### 3.4 KW-103运动指令和当前上下文
目标:
1. `movej`
2. `movel`
3. `movec`
4. `set_tool`
5. `set_frame`
6. `set_speed`
7. `set_zone`
编译规则:
1. 显式运动参数优先。
2. path defaults 次之。
3. target 自带 tool/frame 次之。
4. 当前控制器状态最低。
5. 编译到 IR 前必须解析出确定 tool/frame/speed/zone。
验收:
1. `movej` 可生成 `MotionInstruction(joint)`
2. `movel` 可生成 `MotionInstruction(linear)`
3. `movec` 可生成 `MotionInstruction(circular)`
4. `movej/movel/movec` 可生成 KDL request。
### 3.5 KW-104Path、event 和 `run_path`
目标:
1. `path`
2. `defaults`
3. `source`
4. `point`
5. `event before/after`
6. `event at ... distance`
7. `run_path`
编译语义:
1. 展开 defaults、points、events。
2. 每个 point 变为 Motion IR。
3. event 变为 IO/Wait/Process IR。
4. 保留 pathId、pointId、source metadata。
验收:
1. 空 path 报错。
2. 重复 point 名称报错。
3. `run_path` 可生成 `PathPlanRequest`
### 3.6 KW-105Operation 和 `run_operation`
目标:
1. `operation`
2. `kind`
3. `path`
4. `process`
5. `start_action`
6. `end_action`
7. `run_operation`
编译语义:
1. 执行 start action。
2. 执行引用 path。
3. 执行 end action。
4. 保留工艺参数,供仿真、报告和后处理使用。
验收:
1. Operation 引用不存在 Path 报错。
2. `run_operation` 可展开为 action + path + action。
3. KDL 只接收展开后的 motion segment。
### 3.7 KW-106IO、wait 和 pulse
目标:
1. `io.di/do/ai/ao/gi/go/ri/ro`
2. `io.alias.*`
3. IO 赋值。
4. `wait` 条件。
5. `timeout`
6. `on_timeout alarm/call`
7. `all/any/rising/falling/changed`
8. `pulse`
验收:
1. IO 地址可按 io_map 或允许范围校验。
2. wait 条件可编译为 WaitInstruction。
3. pulse trace 必须包含置位和复位事件。
4. IO/wait 不进入 KDL。
### 3.8 KW-107流程控制
目标:
1. `if/elseif/else`
2. `while`
3. `for`
4. `switch/case/default`
5. `break`
6. `continue`
7. `label`
8. `jump`
验收:
1. 条件表达式必须为 bool。
2. `break/continue` 位置合法。
3. `switch case` 为常量表达式且不重复。
4. `jump` 不能跳入非法块结构。
### 3.9 KW-108proc、func、参数方向和作用域
目标:
1. `proc`
2. `func`
3. `call`
4. `return`
5. `in/out/inout`
6. 作用域和名称解析。
7. 递归 warning 或 error。
验收:
1. `out` 参数所有正常返回路径赋值。
2. `inout/out` 实参必须为左值。
3. `func` 所有正常返回路径返回兼容类型。
4. `func` 默认不允许执行运动、wait、pulse、run_path、run_operation。
### 3.10 KW-109异常、报警、中断和多任务语法
目标:
1. `alarm`
2. `raise`
3. `try/catch/finally`
4. `trap`
5. `interrupt`
6. `enable/disable interrupt`
7. `task ... cycle ...`
范围:
1. P0 至少实现 `alarm``raise` 和简单 `catch`
2. `trap/interrupt/task` 按 P1 语法保留,可先不做完整调度。
验收:
1. AST 能表达全部语法。
2. P0 支持 alarm/raise/try/catch 基础语义。
3. P1 未实现语义在后处理或运行时报明确诊断。
### 3.11 KW-110语义检查、IR 和 source map
目标:
1. Symbol Table。
2. Semantic Analyzer。
3. Executable IR。
4. Source map。
5. GRL 到 KDL request 的编译桥接。
必须检查:
1. 语法规范第 21 章全部 22 项。
2. KDL 可达性、关节限位和圆弧退化。
3. 后处理目标品牌是否支持所用语义。
验收:
1. 完整示例可编译为 IR。
2. IR 运动指令可映射到 KDL request。
3. source map 能定位 GRL 行列、path point、operation。
### 3.12 KW-111ABB、FANUC、KUKA 后处理原型
目标:
1. ABB RAPID 映射。
2. FANUC LS/TP 风格映射。
3. KUKA KRL 映射。
4. 后处理报告。
5. `post_hint``@brand.*`
验收:
1. `movej/movel/movec` 三品牌 golden file 通过。
2. target/tool/frame/speed/zone 映射正确。
3. IO/wait 基础映射正确。
4. 不支持语义进入转换报告。
### 3.13 KW-112自动生成规则和往返
目标:
1. 自动生成程序优先生成 target/path/operation。
2. 点名稳定。
3. path defaults 和单点 override 稳定。
4. source metadata 稳定。
5. compact/expanded 输出风格。
6. 生成 GRL 可再解析回等价对象。
验收:
1. 同一输入重复生成结果一致。
2. 生成文本可 diff。
3. 生成文本可解析、语义检查并后处理。
## 4. 集成顺序
1. KW-001 + KW-100 + KW-101基础工程、Worker RPC、Lexer/Parser 骨架。
2. KW-002 + KW-102URDF/标准模型和 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-011Path 编译为 `PathPlanRequest`KDL 生成整条路径。
6. KW-105 + KW-011Operation 展开后复用 Path 规划。
7. KW-106 到 KW-110完成 P0 语义检查和 IR。
8. KW-111三品牌后处理原型。
9. KW-112 + KW-013自动生成、性能和批量优化。
## 5. 通用命令约定
实际命令以工程 `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
```

1187
working/03-推进台账.md Normal file

File diff suppressed because it is too large Load Diff

150
working/04-任务矩阵.md Normal file
View File

@@ -0,0 +1,150 @@
# 04-任务矩阵
版本0.3
日期2026-06-27
## 1. 状态定义
| 状态 | 含义 |
| --- | --- |
| Todo | 尚未开始。 |
| Doing | 正在执行。 |
| Blocked | 被依赖、环境、设计问题阻塞。 |
| Review | 已实现,等待验证或复核。 |
| Done | 已实现且验收证据完整。 |
## 2. 任务编号规则
| 编号范围 | 对标文档 | 说明 |
| --- | --- | --- |
| `KW-000` | 管理任务 | 文档维护和推进记录。 |
| `KW-001``KW-099` | `KDL_WASM计算接口设计.md` | KDL WASM API、轨迹、诊断、Worker、性能。 |
| `KW-100``KW-199` | `通用机器人编程语法规范.md` | GRL 语法、AST、语义、IR、后处理。 |
## 3. 任务总表
| 编号 | 任务 | 状态 | 依赖 | 对标章节 | 验收标准 |
| --- | --- | --- | --- | --- | --- |
| KW-000 | 对标实施文档维护 | Done | 无 | 两份文档全文 | README、功能范围、开发步骤、任务矩阵、证据、ADR 已对齐两份源文档。 |
| KW-001 | WASM 工程骨架和 Worker RPC | Done | KW-000 | KDL 2、17、18、24 | `init/dispose`、RPC、结构化错误、Worker 加载通过测试。 |
| KW-002 | `NormalizedRobotModel` 到 KDL Chain | Done | KW-001 | KDL 6、22、24 | URDF 解析、标准模型、RobotHandle、机器人信息和限位测试通过。 |
| KW-003 | FK 和 fkAllLinks | Done | KW-002 | KDL 8.1、8.2、22、23 | FK golden 对比、link 位姿顺序和维度诊断通过。 |
| KW-004 | IK 和 ikBatch | Done | KW-003 | KDL 8.3、15、22、23 | IK 回代、批量顺序、失败原因和限位测试通过。 |
| KW-005 | Jacobian、奇异性和基础检查 | Done | KW-004 | KDL 8.4、15、22、23 | Jacobian、奇异性、关节限位、可达性、速度检查通过。 |
| KW-006 | 位姿变换和 offset | Done | KW-005 | KDL 7、21、22、23 | normalize/compose/inverse/applyToolAndFrame/applyOffset 测试通过。 |
| KW-007 | 梯形速度曲线 | Done | KW-006 | KDL 9、22、23 | trapezoid/triangle、采样单调、首末点规则通过。 |
| KW-008 | `planMoveJ` | Done | KW-007 | KDL 11、21、22、23 | 关节同起同停、限位、速度、zone 近似诊断通过。 |
| KW-009 | `planMoveL` | Done | KW-008 | KDL 12、21、22、23 | TCP 直线误差、逐点 IK、速度和加速度诊断通过。 |
| KW-010 | `planMoveC` | Done | KW-009 | KDL 13、21、22、23 | 圆弧元数据、退化诊断、逐点 IK 和误差测试通过。 |
| KW-011 | `planPath``validatePath` | Done | KW-010 | KDL 14、15、21、22、23 | Path 轨迹合并、段报告、source map、空路径诊断通过。 |
| KW-012 | 节拍估算、重采样和诊断报告 | Done | KW-011 | KDL 16、19、20、22、23 | CycleTime、resample、error/warning/info 分级通过。 |
| KW-013 | C ABI / Embind 和性能优化 | Done | KW-012 | KDL 18、19、24 | C ABI 稳定、TypedArray 批量接口和性能基线达标。 |
| KW-100 | Lexer、单位和关键字 | Done | KW-000 | GRL 4、24 | 注释、标识符、单位、保留关键字测试通过。 |
| KW-101 | Parser 和 AST 骨架 | Done | KW-100 | GRL 5、22、23、24 | 最小文件、完整示例、AST source range 和快照通过。 |
| KW-102 | 数据声明、类型系统和目标点 | Done | KW-101 | GRL 6、7、8、24 | tool/frame/speed/zone/target/offset 编译为共享类型。 |
| KW-103 | 运动指令和当前上下文 | Done | KW-102, KW-006 | GRL 9、20、21、24 | movej/movel/movec 编译为 MotionInstruction 和 KDL request。 |
| KW-104 | Path、event 和 `run_path` | Done | KW-103, KW-011 | GRL 10、18、20、21、24 | path 编译为 PathPlanRequestevent 和 source map 正确。 |
| KW-105 | Operation 和 `run_operation` | Done | KW-104 | GRL 11、20、21、24 | operation 展开为 action + path + action引用检查正确。 |
| KW-106 | IO、wait 和 pulse | Done | KW-101 | GRL 12、20、21、24 | IO 地址、WaitInstruction、pulse 语义和 KDL 边界正确。 |
| KW-107 | 流程控制 | Done | KW-101 | GRL 13、20、21、24 | if/while/for/switch/break/continue/label/jump 语义检查通过。 |
| KW-108 | proc、func、参数方向和作用域 | Done | KW-101 | GRL 14、20、21、24 | 参数方向、返回路径、作用域、func 副作用检查通过。 |
| 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、24KDL 21 | 语法规范第 21 章检查项全部覆盖IR 可调用 KDL。 |
| KW-111 | ABB、FANUC、KUKA 后处理原型 | Done | KW-110 | GRL 17、19、24 | 三品牌 golden file、post_hint、brand metadata 和转换报告通过。 |
| KW-112 | 自动生成规则和往返 | Done | KW-111 | GRL 18、24 | 自动生成 GRL 稳定、可 diff、可解析回等价对象。 |
## 4. KDL 子任务
### KW-001WASM 工程骨架和 Worker RPC
| 编号 | 内容 | 状态 | 验收 |
| --- | --- | --- | --- |
| KW-001.1 | 创建 `kdl-wasm` wrapper 工程 | Done | CMake 可配置。 |
| KW-001.2 | 编译 KDL WASM 产物 | Done | `kdl.js/kdl.wasm/kdl.d.ts` 存在。 |
| KW-001.3 | 定义 `KdlRpcRequest/KdlRpcResponse` | Done | 请求 id、method、payload、结构化错误完整。 |
| KW-001.4 | 实现 `kdl.worker.ts` | Done | Worker 加载 WASM 并响应 `init/dispose`。 |
| KW-001.5 | 实现 `KdlWorkerClient` | Done | Promise API 可用。 |
### KW-002`NormalizedRobotModel` 到 KDL Chain
| 编号 | 内容 | 状态 | 验收 |
| --- | --- | --- | --- |
| 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 | Done | C ABI 根据 `NormalizedRobotModel` 构造 native KDL ChainFK/Jacobian golden 通过。 |
| KW-002.5 | RobotHandle 生命周期 | Done | create/getInfo/getLimits/destroy 通过。 |
### KW-003 到 KW-013KDL P0 计算接口
| 编号 | 内容 | 状态 | 验收 |
| --- | --- | --- | --- |
| KW-003.1 | `fk` | Done | 返回 flange、tcp、diagnostics。 |
| KW-003.2 | `fkAllLinks` | Done | 返回 link pose 列表。 |
| KW-004.1 | `ik` | Done | 返回 joints、iterations、residual、reason。 |
| KW-004.2 | `ikBatch` | Done | 顺序保持。 |
| KW-005.1 | `jacobian` | Done | Float64Array 矩阵正确。 |
| KW-005.2 | `checkSingularity` | Done | manipulability 或 conditionNumber 可用。 |
| KW-005.3 | `checkJointLimits/checkVelocityLimits` | Done | 限位诊断正确。 |
| KW-005.4 | `checkReachability/checkReachabilityBatch` | Done | 可达性和失败原因正确。 |
| KW-006.1 | `normalizePose/composePose/inversePose` | Done | 位姿数值测试通过。 |
| KW-006.2 | `applyToolAndFrame/applyOffset` | Done | 与 GRL offset 语义一致。 |
| KW-007.1 | `makeTrapProfile/sampleTrapProfile` | Done | 采样规则正确。 |
| KW-008.1 | `planMoveJ` | Done | MOVEJ 运动测试通过。 |
| KW-009.1 | `planMoveL` | Done | MOVEL 运动测试通过。 |
| KW-010.1 | `planMoveC` | Done | MOVEC 运动测试通过。 |
| KW-011.1 | `planPath` | Done | 多段轨迹合并正确。 |
| KW-011.2 | `validatePath` | Done | 段报告和诊断正确。 |
| KW-012.1 | `estimateCycleTime/resampleTrajectory` | Done | 节拍和重采样正确。 |
| KW-013.1 | C ABI / Embind 稳定导出 | Done | TypeScript 可包装全部 P0 API。 |
| KW-013.2 | TypedArray 和批量性能 | Done | 性能指标有记录。 |
## 5. GRL 子任务
### KW-100 到 KW-103语法基础和运动
| 编号 | 内容 | 状态 | 验收 |
| --- | --- | --- | --- |
| KW-100.1 | Lexer token 和关键字 | Done | 保留关键字表覆盖规范。 |
| KW-100.2 | 单位规范化 | Done | 长度、角度、时间、速度、质量转换正确。 |
| KW-101.1 | EBNF parser | Done | 已覆盖 language/module/import/proc 和顶层 raw 声明骨架。 |
| KW-101.2 | AST source range | Done | 行列、注释过滤、单位原文保留在 token 中。 |
| KW-102.1 | 类型系统和变量声明 | Done | const/var/persistent 类型检查。 |
| KW-102.2 | tool/frame/target/speed/zone | Done | 编译为共享数据结构。 |
| KW-102.3 | offset/offset_in | Done | 编译为 `OffsetSpec`。 |
| KW-103.1 | movej/movel/movec parser | Done | 运动语句 AST 正确。 |
| KW-103.2 | 当前 tool/frame/speed/zone 解析 | Done | 参数优先级正确。 |
| KW-103.3 | MotionInstruction 到 KDL request | Done | KDL 调用关系正确。 |
### KW-104 到 KW-110Path、Operation、IO、流程和 IR
| 编号 | 内容 | 状态 | 验收 |
| --- | --- | --- | --- |
| KW-104.1 | path defaults/source/point/event | Done | Path AST 正确。 |
| KW-104.2 | `run_path` 编译 | Done | 生成 `PathPlanRequest`。 |
| KW-105.1 | operation/process/actions | Done | Operation AST 正确。 |
| KW-105.2 | `run_operation` 展开 | Done | start action + path + end action。 |
| KW-106.1 | IO 地址和别名 | Done | IO map 校验正确。 |
| KW-106.2 | wait/pulse | Done | WaitInstruction 和 pulse IR 正确。 |
| KW-107.1 | 结构化流程控制 | Done | if/while/for/switch 语义正确。 |
| KW-107.2 | label/jump | Done | P1 语法和非法跳转诊断。 |
| KW-108.1 | proc/func/call/return | Done | 调用和返回检查正确。 |
| KW-108.2 | in/out/inout 和作用域 | Done | 左值、赋值路径、遮蔽 warning。 |
| KW-109.1 | alarm/raise/try/catch | Done | P0 异常基础语义。 |
| KW-109.2 | trap/interrupt/task | Done | P1 语法可解析。 |
| KW-110.1 | Semantic Analyzer | Done | 规范第 21 章 22 项检查覆盖。 |
| KW-110.2 | Executable IR | Done | Motion/Wait/Call/Branch/IO/Alarm/Return。 |
| KW-110.3 | Source map | Done | GRL 行列、path point、operation 可定位。 |
### KW-111 到 KW-112后处理和自动生成
| 编号 | 内容 | 状态 | 验收 |
| --- | --- | --- | --- |
| KW-111.1 | ABB RAPID 后处理 | Done | golden file 通过。 |
| KW-111.2 | FANUC LS/TP 风格后处理 | Done | golden file 通过。 |
| 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 自动生成 | Done | 命名稳定、defaults 和 override 正确。 |
| KW-112.2 | compact/expanded 输出 | Done | 同一输入输出稳定。 |
| KW-112.3 | 生成后再解析 | Done | 可恢复等价对象和 IR。 |

1200
working/05-验收证据.md Normal file

File diff suppressed because it is too large Load Diff

331
working/06-决策记录.md Normal file
View File

@@ -0,0 +1,331 @@
# 06-决策记录
版本0.3
日期2026-06-27
## ADR-001`working1` 只对标两份源文档
状态Accepted
日期2026-06-27
关联任务:`KW-000`
### 背景
用户要求 `/home/meswork/kdl_work/work/working1` 内实施文档完全对标:
1. `/home/meswork/kdl_work/work/doc/KDL_WASM计算接口设计.md`
2. `/home/meswork/kdl_work/work/doc/通用机器人编程语法规范.md`
### 决策
`working1` 的范围只从这两份文档抽取。其他技术方案不作为本目录任务、验收和 ADR 的来源。
### 后果
1. 任务分为 KDL WASM 计算接口线和 GRL 编程语法线。
2. OPFS、UI、虚拟控制器和碰撞检测等内容不单独展开除非两份源文档明确作为工程结构、调用关系、后处理或测试项出现。
3. 所有 P0/P1 以两份源文档的实施优先级为准。
## ADR-002KDL WASM 是 GRL 的运动计算内核,不解释 GRL
状态Accepted
日期2026-06-27
关联任务:`KW-001``KW-013``KW-103``KW-110`
### 背景
KDL WASM 接口设计明确规定 KDL 不负责 GRL 词法语法解析、流程控制、变量、IO、wait、子程序调用、碰撞检测和 OPFS 项目文件管理。
### 决策
KDL WASM 只接收已经由 TypeScript 编译层解析完成的模型、目标点、速度、zone、tool、frame 和 motion request。
### 后果
1. `movej/movel/movec/run_path` 编译后调用 KDL。
2. `if/for/switch/call/wait/io/alarm` 不直接调用 KDL。
3. `operation.process` 不进入 KDLTypeScript 只把 operation 展开的 motion segment 交给 KDL。
## ADR-003GRL AST、语义检查、IR 和 KDL request 分层实现
状态Accepted
日期2026-06-27
关联任务:`KW-100``KW-110`
### 背景
GRL 语法规范定义的编译管线为:
```text
GRL Source -> Lexer -> Parser -> AST -> Symbol Table -> Semantic Analyzer -> Executable IR -> Virtual Controller -> Post Processor
```
KDL 接口设计要求 GRL 编译器把 `movej/movel/movec` 解析为 IR 后,由虚拟控制器调用 KDL 函数。
### 决策
实现中明确区分:
1. AST保留语法结构、source range、单位原文和品牌 metadata。
2. Semantic Analyzer完成类型、单位、名称、路径、operation、IO 和运动语义检查。
3. IR作为虚拟控制器和后处理的统一输入。
4. KDL request只由运动 IR、Path IR 派生。
### 后果
1. KDL API 不依赖 GRL AST。
2. 后处理不直接消费 KDL 轨迹点,而是优先消费 IR、目标点和品牌 profile。
3. source map 必须贯穿 AST、IR、KDL request 和诊断。
## ADR-004机器人结构以 URDF 为源数据TypeScript 生成标准模型
状态Accepted
日期2026-06-27
关联任务:`KW-002`
### 背景
KDL 接口设计规定机器人结构源数据为 URDFTypeScript 解析 XML 并生成 `NormalizedRobotModel`WASM 根据标准模型构造 KDL `Tree/Chain`
### 决策
实现 `loadRobotFromUrdf`TypeScript 负责:
1. 解析 URDF XML。
2. 检查 link/joint 连通性和单位。
3. 生成 `NormalizedRobotModel`
WASM 负责:
1.`NormalizedRobotModel` 构造 KDL Chain。
2. 创建 FK、IK、Jacobian solver。
3. 返回 `RobotHandle`
### 后果
1. `NormalizedRobotModel` schema 是 TypeScript 与 WASM 的稳定边界。
2. GRL 编译器在编译 `joint_target` 时按 `RobotInfo.dof` 检查长度。
3. WASM 仍需对模型做防御性校验并返回 `KDL_INVALID_MODEL`
## ADR-005内部统一使用 SI 单位和位置 + 四元数位姿
状态Accepted
日期2026-06-27
关联任务:`KW-006``KW-100``KW-102`
### 背景
GRL 支持 `mm``deg``mm/s` 等带单位字面量。KDL 接口设计要求内部位姿统一为位置 + 四元数。
### 决策
1. GRL lexer/parser 保留单位原文。
2. 语义层将单位规范化为 SI。
3. `pose()` 在编译层转换为四元数。
4. `poseq()` 四元数必须归一化。
5. KDL API 只接收规范化后的 `Pose`
### 后果
1. 所有后处理时再按品牌格式转换。
2. 单位错误在 GRL 语义检查阶段报告。
3. 位姿数值约定由 KDL `normalizePose/composePose/inversePose` 测试固定。
## ADR-006P0 zone 只保留语义并近似为 fine
状态Accepted
日期2026-06-27
关联任务:`KW-008``KW-011``KW-111`
### 背景
KDL 接口设计写明首版 `zone` 可只用于诊断和后处理,运动规划先按 `fine` 到点执行P1 再实现连续 blend。
### 决策
P0 中 `ZoneSpec` 必须保留在 IR、KDL request、TrajectoryResult 和后处理中。KDL 轨迹规划按 `fine` 到点执行,并返回 `KDL_ZONE_APPROXIMATED` warning。
### 后果
1. P0 轨迹不声称复现品牌控制器连续过渡。
2. 后处理仍可输出 ABB `zonedata`、FANUC `CNT`、KUKA `C_DIS` 等语义。
3. P1 再实现 `planBlendPath` 或等价连续过渡。
## ADR-007所有 KDL API 返回结构化诊断
状态Accepted
日期2026-06-27
关联任务:`KW-001``KW-013`
### 背景
KDL 接口设计要求所有 API 不抛裸字符串错误,必须返回结构化错误和诊断。
### 决策
KDL Worker RPC 错误统一为:
```ts
interface KdlError {
code: string;
message: string;
diagnostics: MotionDiagnostic[];
}
```
KDL 诊断固定包含:
1. `KDL_INVALID_MODEL`
2. `KDL_TARGET_UNREACHABLE`
3. `KDL_IK_FAILED`
4. `KDL_JOINT_LIMIT`
5. `KDL_VELOCITY_LIMIT`
6. `KDL_ACCEL_LIMIT`
7. `KDL_SINGULARITY`
8. `KDL_ARC_DEGENERATE`
9. `KDL_PATH_EMPTY`
10. `KDL_ZONE_APPROXIMATED`
### 后果
1. 自动测试断言诊断 code不依赖 message 文本。
2. sourceMap 必须随诊断传递。
3. 后处理和报告可区分 error、warning、info。
## ADR-008Worker RPC 是 KDL TypeScript API 的唯一调用入口
状态Accepted
日期2026-06-27
关联任务:`KW-001``KW-013`
### 背景
KDL 接口设计要求 KDL WASM 运行在 Worker 中,避免阻塞 UI 主线程,并要求大数组使用 Transferable 或共享内存策略。
### 决策
主线程或 GRL 编译/运行层只调用 `KdlWorkerClient`。C ABI / Embind 仅在 Worker 内封装。
### 后果
1. 所有 KDL API 为 Promise 风格。
2. Worker 崩溃和初始化失败必须可恢复。
3. 高频轨迹和批量 IK/FK 优先在 Worker 内整段计算,减少跨线程往返。
## ADR-009KDL 底层导出稳定 C ABI / Embind 包装
状态Accepted
日期2026-06-27
关联任务:`KW-013`
### 背景
KDL 接口设计不建议把 KDL C++ 类完整暴露给 TypeScript而是通过稳定函数导出。
### 决策
P0 底层导出以 C ABI 为基准:
1. `kdl_init`
2. `kdl_create_robot`
3. `kdl_destroy_robot`
4. `kdl_get_robot_info`
5. `kdl_fk`
6. `kdl_fk_all_links`
7. `kdl_jacobian`
8. `kdl_ik`
9. `kdl_plan_movej`
10. `kdl_plan_movel`
11. `kdl_plan_movec`
12. `kdl_plan_path`
13. `kdl_sample_trap`
14. `kdl_last_error`
TypeScript API 在 Worker 内包装这些函数,向上暴露 `KdlWasmApi`
### 后果
1. C++ 对象生命周期不泄漏到 TypeScript 业务层。
2. 高频接口可增加 TypedArray 版本。
3. C ABI 返回码和 `kdl_last_error` 必须有测试。
## ADR-010GRL P0 严格按语法规范第 24 章实现
状态Accepted
日期2026-06-27
关联任务:`KW-100``KW-112`
### 背景
GRL 语法规范第 24 章明确列出 P0 和 P1。
### 决策
GRL 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 参数方向。
11. func 和返回值检查。
12. io.do/di、wait、pulse。
13. AST、语义检查、IR、source map。
14. ABB、FANUC、KUKA 后处理原型。
### 后果
1. label/jump、trap/interrupt、多任务、完整品牌导入等 P1 内容不得阻塞 P0。
2. 但 P1 语法若已解析,未实现语义必须有明确诊断。
## ADR-011后处理以 GRL IR 为输入,必须保留品牌差异报告
状态Accepted
日期2026-06-27
关联任务:`KW-111`
### 背景
GRL 语法规范要求 GRL 可转换为 ABB RAPID、FANUC LS/TP 风格文本和 KUKA KRL并要求无法支持的品牌扩展进入转换报告。
### 决策
后处理器以 GRL IR、目标点、tool/frame、speed/zone 和 post profile 为输入。`post_hint``@brand.*` 只影响指定品牌。
### 后果
1. 不支持语义不能静默丢失。
2. 后处理 golden file 必须覆盖运动、目标点、工具、坐标系、速度、zone、IO 和 wait。
3. 转换报告是后处理验收的一部分。
## ADR-012自动生成 GRL 优先生成 target/path/operation
状态Accepted
日期2026-06-27
关联任务:`KW-112`
### 背景
GRL 语法规范第 18 章要求自动生成程序优先生成 `target``path``operation`,不要直接把大量运动语句塞进 `proc main()`
### 决策
GRL Generator 的默认输出为结构化对象风格:
1. 目标点命名稳定。
2. 路径点命名稳定。
3. 路径整体参数放入 `defaults`
4. 单点差异写在 point 上。
5. CAD 或工艺来源写入 `source`
6. 支持 compact 和 expanded 两种输出。
### 后果
1. 同一输入重复生成结果必须一致。
2. 生成文本必须可 diff。
3. 生成后必须能解析回等价对象和 IR。

69
working/README.md Normal file
View File

@@ -0,0 +1,69 @@
# working1 实施文档索引
版本0.3
日期2026-06-27
主题GRL 编程语法规范与 KDL WASM 计算接口设计的对标实施方案。
## 1. 文档依据
本目录只对标以下两份文档:
1. `/home/meswork/kdl_work/work/doc/通用机器人编程语法规范.md`
2. `/home/meswork/kdl_work/work/doc/KDL_WASM计算接口设计.md`
OPFS、虚拟控制器、UI、报告等内容只在上述两份文档明确要求的接口边界、编译调用关系或测试场景中出现。
## 2. 对标主线
`working1` 的实施主线分为两条:
1. GRL 语言实施
- 词法、单位、保留关键字。
- 顶层结构、类型系统、变量声明。
- tool、frame、target、speed、zone。
- `movej/movel/movec`
- `path/event/run_path`
- `operation/run_operation`
- IO、wait、pulse。
- if/while/for/switch、label/jump。
- proc/func、参数方向、作用域。
- alarm/raise/try/catch、trap/interrupt、多任务语法。
- post_hint、brand metadata、后处理映射。
- AST、语义检查、IR、source map。
2. KDL WASM 计算接口实施
- Worker RPC 和稳定 TypeScript API。
- URDF 到 `NormalizedRobotModel`,再到 KDL Chain。
- RobotHandle 生命周期。
- 位姿规范化、组合、逆、offset、tool/frame 变换。
- FK、fkAllLinks、Jacobian、IK、ikBatch。
- 关节限位、奇异性、可达性批量检查。
- 梯形速度曲线。
- `planMoveJ/planMoveL/planMoveC`
- `planPath/validatePath`
- 节拍估算、重采样、结构化诊断。
- C ABI / Embind 暴露和性能优化。
## 3. 文档入口
| 文件 | 用途 |
| --- | --- |
| `01-项目功能内容.md` | 两份规范的功能范围、P0/P1 边界、模块职责和验收口径。 |
| `02-项目程序开发详细步骤.md` | 按 GRL 和 KDL WASM 对标项拆解可执行开发步骤。 |
| `03-推进台账.md` | 记录每轮修改、验证、风险和下一步。 |
| `04-任务矩阵.md` | 管理任务编号、状态、依赖和验收标准。 |
| `05-验收证据.md` | 保存测试命令、报告路径、产物和结果摘要。 |
| `06-决策记录.md` | 固化两份规范中影响实施的关键设计决策。 |
## 4. 推进规则
1. 所有任务编号统一使用 `KW-###`
2. `KW-001``KW-099` 对标 KDL WASM 计算接口设计。
3. `KW-100``KW-199` 对标 GRL 编程语法规范。
4. 每个 P0 项必须能映射回源文档对应章节。
5. 任务完成必须补充 `05-验收证据.md`
6. 任何 P1 内容不得阻塞 P0 验收,除非源文档明确将其列为 P0。
## 5. 当前首要任务
`KW-001``KW-013``KW-100``KW-112` 的文档对标任务已完成并补充验收证据。C ABI 已能从 `NormalizedRobotModel` 构造 native Orocos KDL Chain并完成 native FK/Jacobian golden 对比;后续首要关注点是继续接入 native IK、fkAllLinks 序列化和轨迹规划。