整理项目文档目录
This commit is contained in:
596
working/02-项目程序开发详细步骤.md
Normal file
596
working/02-项目程序开发详细步骤.md
Normal 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-001:WASM 工程骨架和 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-003:FK 和 fkAllLinks
|
||||
|
||||
目标:
|
||||
|
||||
1. 实现 `fk`。
|
||||
2. 实现 `fkAllLinks`。
|
||||
3. 支持 tool/frame 选项。
|
||||
4. 输出法兰位姿、TCP 位姿和 link 位姿。
|
||||
|
||||
验收:
|
||||
|
||||
1. FK 与 golden 数据或原生 KDL 对比在容差内。
|
||||
2. `fkAllLinks` link 数量和顺序正确。
|
||||
3. 关节维度错误有结构化诊断。
|
||||
|
||||
### 2.4 KW-004:IK 和 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-005:Jacobian、奇异性和基础检查
|
||||
|
||||
目标:
|
||||
|
||||
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. 每个采样点 IK,seed 使用上一采样点关节。
|
||||
|
||||
必须诊断:
|
||||
|
||||
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-013:C 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-100:Lexer、单位和关键字
|
||||
|
||||
目标:
|
||||
|
||||
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-101:Parser 和 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-104:Path、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-105:Operation 和 `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-106:IO、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-108:proc、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-111:ABB、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-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:自动生成、性能和批量优化。
|
||||
|
||||
## 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
|
||||
```
|
||||
Reference in New Issue
Block a user