Upload project files

This commit is contained in:
wangdequan
2026-06-28 08:20:33 +08:00
parent f0e96308d2
commit 84a5b54195
162 changed files with 14070 additions and 31381 deletions

View File

@@ -0,0 +1,405 @@
# 01-项目功能内容
版本0.1
日期2026-06-27
## 1. 总体需求
以 ABB IRB120 3/58 的 URDF fixture 为真实 6 轴工业机器人基准,构建一套端到端全面测试能力:
1. 编写通用机器人语言 GRL 测试程序覆盖运动、路径、IO、等待、工艺、报警和异常。
2. 在项目运行时加载 ABB120 URDF执行 FK、IK、Jacobian、限位、轨迹规划、虚拟控制器运行和调试。
3. 将同一 GRL/IR 输出为 ABB RAPID、FANUC LS 风格和 KUKA KRL 风格程序,并生成转换报告。
4. 建立离线编程全面测试包括资源建模、路径生成、可达性、节拍、碰撞、IO/Wait、品牌导入导出、报告和客户交付包。
5. 用 HTML 实现本项目虚拟控制器界面,对标 ABB RobotStudio 的 Station、Controller、RAPID、Simulation、Virtual FlexPendant 等工作流。
6. 补齐 GRL 运算表达式能力,覆盖 ABB、FANUC、KUKA 三类机器人语言共同具备的算术、比较、逻辑和常用数学函数,并能在运动参数编译期求值。
## 2. ABB120 URDF 基准
基准机器人来自 `/home/meswork/kdl_work/kdl-wasm/web/tests/fixtures/abbIrb120.ts` 中的 `ABB_IRB120_3_58_URDF`
| 项 | 值 |
| --- | --- |
| robotId | `abb_irb120_3_58` |
| baseLink | `base_link` |
| tipLink | `tool0` |
| DOF | 6 |
| active joints | `joint_1``joint_6` |
| fixed links | `base``flange``tool0` |
| URDF 来源 | ROS-Industrial ABB IRB120 3/58 xacro 派生,当前 fixture 省略 mesh、material、inertial、xacro-only 元素 |
关节限位以 fixture 为准:
| 关节 | lower rad | upper rad | velocity rad/s |
| --- | ---: | ---: | ---: |
| `joint_1` | -2.87979 | 2.87979 | 4.36332 |
| `joint_2` | -1.91986 | 1.91986 | 4.36332 |
| `joint_3` | -1.91986 | 1.22173 | 4.36332 |
| `joint_4` | -2.79253 | 2.79253 | 5.58505 |
| `joint_5` | -2.094395 | 2.094395 | 5.58505 |
| `joint_6` | -6.98132 | 6.98132 | 7.33038 |
标准测试关节位:
| 名称 | rad |
| --- | --- |
| `home` | `[0, 0, 0, 0, 0, 0]` |
| `pick` | `[0.2, -0.35, 0.45, 0.1, -0.2, 0.3]` |
| `place` | `[-0.35, -0.25, 0.35, -0.25, 0.15, -0.4]` |
| `approach` | `[0, -0.4, 0.5, 0, 0.2, 0]` |
## 3. 通用机器人测试程序集
测试程序以 GRL 为主,命名建议为 `A120_XX_*.grl`。所有程序必须能解析为 AST、编译为 Semantic IR、进入 KDL bridge并保留 source map。
### 3.1 `A120_00_Smoke.grl`
目标:最小链路冒烟测试。
覆盖点:
1. 语言头、module、speed、zone、target。
2. `movej home`
3. FK、限位检查、轨迹规划和 ABB 后处理。
验收:程序运行完成,无 error diagnosticABB/FANUC/KUKA 输出均非空。
### 3.2 `A120_10_JointPickPlace.grl`
目标:关节空间 pick/place 主流程。
基准程序:
```grl
language grl 0.1
module A120JointPickPlace
const speed v_fast = joint(40 %)
const speed v_slow = joint(20 %)
const zone z10 = z(10 mm)
target home = joint_target { joints: [0 deg, 0 deg, 0 deg, 0 deg, 0 deg, 0 deg] }
target approach = joint_target { joints: [0 deg, -22.918312 deg, 28.647890 deg, 0 deg, 11.459156 deg, 0 deg] }
target pick = joint_target { joints: [11.459156 deg, -20.053523 deg, 25.783101 deg, 5.729578 deg, -11.459156 deg, 17.188734 deg] }
target place = joint_target { joints: [-20.053523 deg, -14.323945 deg, 20.053523 deg, -14.323945 deg, 8.594367 deg, -22.918312 deg] }
path pick_place {
defaults { speed: v_fast, zone: z10 }
point p_home movej home zone fine
point p_approach movej approach
event before p_pick io.do[1] = true
point p_pick movej pick speed v_slow zone fine
point p_place movej place
event after p_place io.do[1] = false
}
proc main()
run_path pick_place
end
end
```
验收:`planPath` 产生 4 段 MOVEJ终点关节等于 `place`IO 事件进入 trace。
### 3.3 `A120_20_CartesianBlend.grl`
目标:笛卡尔运动和 blend 规则测试。
覆盖点:
1.`home/pick/place` FK 自动生成 reachable pose targets。
2. `movel` 接近点、工件点和离开点。
3. `movec` 中间点和终点。
4. `zone fine``z(10 mm)` 对比。
验收:每个 pose target 通过 IK笛卡尔段输出最大 TCP 直线误差和圆弧误差。
### 3.4 `A120_30_IOWaitPulse.grl`
目标IO、等待、脉冲和 timeout。
覆盖点:
1. `io.do[n] = true/false`
2. `wait io.di[n] == true timeout 2 s`
3. `pulse io.do[n] duration 100 ms`
4. timeout 后 alarm 或 fallback path。
5. IO script 驱动 DI 上升沿、下降沿和 changed。
验收:虚拟控制器可显示 wait 表达式、已等待时间、剩余 timeout、相关 IO 最近变化和脚本状态。
### 3.5 `A120_40_ErrorDiagnostics.grl`
目标:故障路径和诊断稳定性。
覆盖点:
1. 超出关节限位目标。
2. 明确不可达 pose target。
3. 奇异姿态或接近奇异姿态。
4. 未定义 target/path/operation。
5. wait timeout。
验收:每类故障都有稳定 code、severity、source map 和报告条目。
### 3.6 `A120_50_OperationProcess.grl`
目标:工艺 operation 和离线编程对象闭环。
覆盖点:
1. `path``operation``run_operation`
2. start/end action如夹爪、吹气、扫码、视觉等待。
3. 工艺参数进入报告和交付包。
4. OLP 对象模型可反向生成 GRL。
验收:`operation` 展开为 action + path + action报告包含工艺步骤、节拍和 IO 事件。
## 4. GRL 运算功能需求
目标:将“运算功能”作为 GRL 语言和语义基础能力补齐,而不是只让 parser 能读。首版按 ABB RAPID、FANUC LS/KAREL、KUKA KRL 的公共数学子集建模,保证同一 GRL 程序可以稳定编译到统一 IR再由后处理器输出三品牌程序。
### 4.1 语法范围
GRL 表达式必须支持:
1. 算术:一元 `+`、一元 `-``+``-``*``/``mod`
2. 比较:`==``!=``<``<=``>``>=`
3. 逻辑:`and``or``not`,可兼容 `&&``||``!` 作为输入别名IR 中统一为 GRL 关键字。
4. 括号:`(...)` 明确优先级。
5. 函数调用:沿用当前 `callee(args...)` 形式。
6. 现有结构表达式array、object、call、identifier、offset 表达式必须继续兼容。
优先级从高到低:
| 层级 | 运算 |
| --- | --- |
| 1 | 函数调用、对象、数组、括号、offset |
| 2 | 一元 `+``-``not``!` |
| 3 | `*``/``mod` |
| 4 | `+``-` |
| 5 | `<``<=``>``>=` |
| 6 | `==``!=` |
| 7 | `and``&&` |
| 8 | `or``||` |
### 4.2 函数和常量
首版内置常量:
| 名称 | 含义 |
| --- | --- |
| `pi` | 圆周率 |
| `e` | 自然常数 |
首版内置函数:
| 类别 | 函数 |
| --- | --- |
| 三角函数 | `sin``cos``tan``asin``acos``atan``atan2` |
| 数值函数 | `sqrt``abs``pow``min``max``clamp``floor``ceil``round` |
三角函数语义:
1. `sin/cos/tan` 接收角度量;带 `deg``rad` 单位时归一化为弧度,纯数按弧度处理。
2. `asin/acos/atan/atan2` 返回角度量;在 `pose(...)` 姿态项或 `joint_target.joints` 等角度上下文中可直接使用。
3. 函数必须做定义域检查,例如 `sqrt(-1)``acos(2)` 必须产生 diagnostic。
### 4.3 编译期求值位置
常量表达式必须在编译阶段求值,并把结果写入 Semantic IR / KDL request而不是把表达式字符串传到运动规划层。
必须支持的求值位置:
1. 数据声明 initializer`const``persistent`、需要静态初值的 `var`
2. `speed``linear(...)``joint(...)``acc ...` 参数。
3. `zone``fine``z(...)``cnt(...)`
4. `pose(...)``poseq(...)``robot_config(...)`
5. `joint_target { joints: [...] }`
6. `pose_target { pose: ... }`
7. `tool { tcp: ..., mass: ... }`
8. `frame { origin: ... }`
9. path defaults/source 属性。
10. path point 内联 `speed``zone``tool``frame``via``target` 参数。
11. path event 的 `distance`
12. `wait ... timeout ...``pulse ... duration ...` 中的时间常量。
13. operation process 中需要数值常量的工艺参数。
比较和逻辑表达式也必须进入 AST。纯常量比较/逻辑可在编译期折叠;依赖 IO、变量或运行态状态的条件先保留为结构化控制表达式供虚拟控制器和后续品牌映射使用。
### 4.4 单位和数值语义
数值求值采用统一 SI 归一化:
| GRL 输入 | IR/KDL 归一化 |
| --- | --- |
| `mm` | m |
| `mm/s` | m/s |
| `mm/s2` | m/s2 |
| `deg` | rad |
| `rad` | rad |
| `%` | 0 到 1 的比例 |
| `s` | s |
| `ms` | s |
| `kg` | kg |
规则:
1. 同维度数值可以相加、相减,结果保留该维度并归一化。
2. 纯数可以参与乘除;维度乘除首版只允许编译器明确支持的上下文,避免产生复杂复合单位。
3. 不同维度相加或比较必须报错,例如 `10 mm + 2 s`
4. 构造器可以提供默认上下文单位:`linear(...)` 默认 `mm/s``z(...)` 默认 `mm``pose(...)` 前三项默认 `mm`、后三项默认 `deg``joint_target.joints` 默认 `deg``duration/timeout` 默认 `s`
5. 因此 `linear(100 + 50 mm/s)``linear` 速度上下文中等价于 `linear(150 mm/s)`;推荐生成器输出时使用显式单位,减少人工歧义。
### 4.5 示例
```grl
language grl 0.1
module MathMotion
const num blend_base = 5 + 5
const speed v_pick = linear(100 + 50 mm/s)
const speed v_safe = linear(max(50 mm/s, 200 mm/s / 2))
const zone z_app = z(clamp(blend_base mm, 1 mm, 50 mm))
target home = joint_target {
joints: [0 deg, (10 + 5) deg, -90 deg, 0 deg, 0 deg, 0 deg]
}
target pick = pose_target {
pose: pose(400 + 50 mm, 20 * 2 mm, sqrt(90000) mm, 0 deg, 0 deg, atan2(1, 1))
}
path main_path {
defaults { speed: v_pick, zone: z_app }
point p0 movej home speed linear(100 + 50 mm/s) zone z(clamp(8 mm, 1 mm, 20 mm))
point p1 movel pick
}
end
```
编译期结果要求:
1. `v_pick` 进入 IR 后为 `linear`,速度 `0.15 m/s`
2. `z_app` 进入 IR 后为 `distance`,距离 `0.01 m`
3. `home.joints[1]` 进入 IR 后为 `15 deg` 对应的弧度值。
4. `pick.pose.position[0]` 进入 IR 后为 `0.45 m`
5. path point 内联 speed/zone 同样求值后进入 KDL request。
### 4.6 诊断需求
运算功能必须输出稳定 diagnostic
| code | 场景 |
| --- | --- |
| `GRL_EXPR_PARSE` | 表达式语法错误或括号不匹配。 |
| `GRL_EXPR_UNKNOWN_SYMBOL` | 常量求值遇到未知标识符。 |
| `GRL_EXPR_UNKNOWN_FUNCTION` | 未知函数。 |
| `GRL_EXPR_ARITY` | 函数参数数量错误。 |
| `GRL_EXPR_DOMAIN` | 数学定义域错误。 |
| `GRL_EXPR_DIV_ZERO` | 除零。 |
| `GRL_EXPR_UNIT_MISMATCH` | 单位维度不兼容。 |
| `GRL_EXPR_NON_CONSTANT` | 需要常量的位置出现运行时表达式。 |
| `GRL_EXPR_UNSUPPORTED_RUNTIME` | 后续品牌映射暂不支持的复杂运行时表达式。 |
每个 diagnostic 必须包含 severity、message、source range并能通过 source map 定位到 GRL 源文件行列。
### 4.7 跨品牌边界
首版跨品牌输出不直接翻译复杂表达式字符串,而是优先输出编译期折叠后的常量:
1. `linear(100 + 50 mm/s)` 输出为各品牌可表达的具体速度值。
2. `z(clamp(...))` 输出为具体 ABB zone、FANUC CNT 或 KUKA 近似 blend。
3. runtime 条件表达式如果后处理器无法保真映射,必须进入转换报告,不得静默丢失。
4. 品牌专用数学函数或控制器变量不作为首版目标,后续通过 post/import report 增量支持。
## 5. 程序运行需求
运行器必须支持以下流程:
1. 加载 ABB120 URDF fixture生成 `NormalizedRobotModel` 和 RobotHandle。
2. 编译 GRLLexer、Parser、Semantic Analyzer、IR、source map。
3. 对每个 target/path/operation 生成 KDL request。
4. 执行 KDLFK、fkAllLinks、Jacobian、IK、limit、singularity、planMoveJ、planMoveL、planMoveC、planPath、validatePath。
5. 执行虚拟控制器load、run、pause、step、stop、reset、breakpoint、motion queue、IO、wait、pulse、trace。
6. 输出结构化 job`job_id`、输入文件、运行参数、诊断、轨迹、trace、报告、截图路径。
## 6. 跨品牌程序转换需求
同一 Semantic IR 必须输出:
| 品牌 | 输出文件 | 核心指令 |
| --- | --- | --- |
| ABB | `.mod` | `MoveJ``MoveL``MoveC``SetDO``WaitUntil``PulseDO` |
| FANUC | `.ls` | `J``L``C``DO[]``WAIT``PULSE` |
| KUKA | `.src`,必要时 `.dat` | `PTP``LIN``CIRC``$OUT[]``WAIT FOR` |
转换报告必须记录:
1. 速度、zone、tool、frame 映射。
2. 近似语义,如 ABB zone 到 FANUC CNT、KUKA C_DIS。
3. 不支持语义,如复杂 trap、多任务、品牌专用工艺包。
4. source mapGRL 行列、path point、operation、品牌输出行号。
5. 回读校验品牌文本重新导入后target/path/motion 顺序与原 IR 等价或输出差异报告。
## 7. 离线编程全面测试需求
全面测试必须覆盖:
1. 项目建模Station、Robot、Tool、Frame、Target、Path、Operation、Program、Report。
2. 工作区OPFS-like 保存、bundle 导入导出、损坏检测、迁移。
3. 几何和路径:点、边、曲线生成 Path路径采样和姿态策略。
4. 可达性单点、批量、路径段、operation。
5. 轨迹节拍、速度、加速度、采样、重采样、blend 近似。
6. 碰撞:机器人自身、工具、工件、夹具、禁入区的基础碰撞时间点。
7. IO/Wait脚本、timeout、边沿、trace、报告。
8. 品牌链路GRL 到三品牌、三品牌导入、交叉品牌再导出。
9. 客户交付源程序、品牌程序、IO map、校准数据、报告 HTML/PDF、trace、截图。
10. 自动化证据命令输出、job JSON、report JSON、HTML 页面、截图、PDF。
## 8. HTML 虚拟控制器需求
### 8.1 对标范围
对标 ABB RobotStudio 的工作方式,而不是复制视觉资产。公开参考资料包括 ABB RobotStudio Suite 官方页面和 RobotStudio Operating Manual 2026.2。参考点:
1. Station / Graphics机器人、工具、工件、路径和碰撞对象。
2. Controller虚拟控制器状态、RobotWare/robot model 信息、权限和运行控制。
3. RAPID / Program Editor程序树、模块、当前行、诊断、断点。
4. Simulation播放、暂停、单步、重置、速度倍率、时间轴。
5. Virtual FlexPendant模式、Motors On、PP to Main、Start、Stop、Hold、Jog、IO、Alarms。
### 8.2 页面信息架构
首屏必须直接进入工程工作台,不做营销页。
建议 HTML 布局:
1. 顶部命令栏:项目、导入、保存、运行、暂停、停止、单步、导出报告。
2. 左侧对象树Station、Robot、Tool、Frame、Target、Path、Operation、Program、Reports。
3. 中央工作区3D/2D station viewport、路径轨迹、机器人姿态、碰撞和选中对象。
4. 右侧虚拟示教器:状态灯、模式、关节/TCP、Jog、速度倍率、程序指针、报警。
5. 底部面板日志、诊断、IO、Wait、Motion Queue、Trace、报告。
6. 编辑区GRL/RAPID/FANUC/KUKA 多标签查看source map 双向定位。
### 8.3 交互需求
1. 加载 ABB120 测试项目后,页面显示机器人模型、程序树和默认 `main` 程序。
2. 点击 Run 后虚拟控制器状态变化程序指针、motion queue、IO trace 和时间轴同步更新。
3. 点击 Step 时执行单条 IR 指令。
4. 点击 path point 时,编辑器跳转 GRL source map3D/2D viewport 高亮目标。
5. wait 卡住时,右侧面板显示 wait 条件、当前子表达式值、相关 IO 最近变化、timeout 倒计时和手动置位动作。
6. 后处理导出后ABB/FANUC/KUKA 代码可在标签页查看并下载。
7. 报告页可打开 HTML 报告,并能导出 PDF 或打印。
### 8.4 技术边界
1. 首版可以是 HTML + CSS + TypeScript 的静态工作台页面,接入现有 facade 和 runtime。
2. 3D 视图可先使用简化连杆模型;如果引入 Three.js应验证桌面和移动视口截图非空、机器人正确入框。
3. 不承诺复刻 ABB RobotStudio 的真实 RobotWare、完整 RAPID 解释器、真实安全系统、真实控制器通信。
4. 不复制 ABB 商标、图标、界面皮肤或专有资源。
## 9. 非目标
1. 不以 FANUC 二进制 TP 为首版输入。
2. 不实现完整 CAD kernel。
3. 不实现品牌控制器 look-ahead 完全复刻。
4. 不将浏览器虚拟控制器声明为真实机器人安全控制器。
5. 不绕过 ABB、FANUC、KUKA 的真实控制器安全、权限和认证流程。