关键点规划
一个机器人程序通常是由十几个到数百个点位串起来的. 这些点位并不是任意选的 — 哪些点是Home、哪些是过渡点、哪些是工作点 关系到程序的节拍、安全性、可维护性。本页给出 4 类关键点 的定义、选取原则, 以及路径规划的常见反模式。
4 类关键点
| 类别 | 简称 | 定位 | 数量 (典型) |
|---|---|---|---|
| Home 点 | Home / HomePos | 程序入口 / 出口, 机械稳定姿态 | 1 |
| 安全过渡点 | Safe / TransXX | 远离工件的高空点, 切换工作区域时的中转 | 3~10 |
| 工作预位点 | Approach / PreXX | 工作点正上方 / 前方的安全逼近位 | 与工作点 1:1 |
| 工作点 | Pick / Place / WeldN | 实际进行取料 / 放料 / 焊接 / 涂胶的精确点 | 程序中绝大多数 |
Home 点
定义
程序的入口点和最终退出点, 必须满足:
- 机器人在此姿态下不下坠 (关节角度不在重力臂杆最长处)
- 远离工件、工装、人员 (至少 200 mm 安全距离)
- 机器人从任意工作位出发, 走 MoveJ 到 Home 不会撞到任何东西
- 关节角度远离关节限位和奇异点
推荐 Home 姿态
- 6 轴工业臂: J1 = 0°, J2 = -90° (大臂水平), J3 = 90° (小臂向上), J4 = 0°, J5 = -90°, J6 = 0°
- SCARA: J1 = 0°, J2 = 0°, Z 轴最高
- Delta: 所有臂杆呈静态平衡状态 (垂直向下)
- UR 协作臂: Home = [0, -90°, 0, -90°, 0, 0], 折叠姿态
Home 的多种用途
- 程序开头回 Home, 确保起点可知
- 每轮循环结束回 Home, 便于在任意位置按 Stop 安全停止
- 上电后自动回 Home, 确认机械完好
安全过渡点
定义
从一个工作区到另一个工作区之间的中转点, 必须满足:
- 在所有工作区的安全高度以上 (比最高工件 + 夹具高 100 mm)
- 姿态与下一段工作点的进入姿态接近, 避免到达后再大幅调姿态
- 不在奇异点附近
使用时机
什么时候需要过渡点?
- 从 Pick 位到 Place 位, 两位置距离 > 500 mm → 加 1~2 个过渡点
- 需要跨越工装, 直接走 MoveL 会撞 → 加过渡点绕过
- 工件大, 姿态从 Pick 的水平变成 Place 的倾斜 → 加过渡点提前调姿态
过渡点的优化
| 方法 | 效果 |
|---|---|
| 用 MoveJ 连续 | 最快, 路径不精确 |
| 加 Zone (平滑半径) | MoveJ / MoveL 混用, 既快又不停顿 |
| 3D 视口验证 | 看 TCP 轨迹, 确保不碰工件 |
MoveJ(Target := Home, Velocity := 100, Zone := 0); // 精确 Home
MoveJ(Target := Trans1, Velocity := 200, Zone := 50); // 过渡, 50 mm 平滑
MoveJ(Target := Trans2, Velocity := 200, Zone := 50); // 过渡
MoveJ(Target := PickApproach, Velocity := 150, Zone := 10); // 接近
MoveL(Target := Pick, Velocity := 30, Zone := 0); // 精确下降
工作预位点 (Approach)
定义
工作点正上方 / 前方的安全逼近位, 是必须存在的中间点. 原因:
- 直接 MoveJ 到工作点, TCP 路径不确定, 可能撞工件侧边
- 工作点需要精确到位, 但高速接近是浪费
典型布置
| 工作类型 | Approach 位置 |
|---|---|
| 取料 (Pick) | 工作点正上方 100~200 mm |
| 放料 (Place) | 工作点正上方 100~200 mm |
| 焊接 (Weld Start) | 焊点沿法向抬起 50 mm |
| 焊接 (Weld End) | 焊点终点沿法向抬起 50 mm |
| 涂胶 (Glue) | 胶道起点沿法向抬起 20 mm |
| 去毛刺 | 工件表面沿法向抬起 10 mm |
| 喷涂 | 工件表面沿喷涂方向 300 mm |
典型运动模式
// 取料: Approach → Pick → Retreat
MoveJ(Target := Pick_Approach, Velocity := 150, Zone := 20); // 快速接近
MoveL(Target := Pick, Velocity := 30, Zone := 0); // 直线精确下降
DO_Gripper := TRUE; // 夹爪关
Wait(Time := 200); // 等待
MoveL(Target := Pick_Approach, Velocity := 50, Zone := 20); // 直线抬起 (避免拖工件)
工作点
定义
实际进行操作的精确点, 要求:
- 相对于工件坐标系定义 (而非 World)
- 姿态精确: 焊枪垂直焊缝 / 夹爪平行孔方向
- 位置精确: 通常要求 ±0.5 mm 以内
工作点的批量生成
实际工况常有成百上千个工作点 (码垛、网格焊点), 手工示教不现实. 常见方法:
| 方法 | 适用 |
|---|---|
| Offset 数组计算 | 码垛, 规则网格 |
| CAD 导入 | 焊接, 直接从焊接路径 CAD 提取 |
| 视觉引导 | 随机位置工件, 实时计算 |
| 示教一行 + 数组偏移 | 汽车点焊, 示教一行然后阵列 |
VAR
i, j : INT;
pBase : ROBOT_POS := (X := 0, Y := 0, Z := 0);
pWork : ROBOT_POS;
END_VAR
FOR j := 0 TO 4 DO // 5 行
FOR i := 0 TO 9 DO // 10 列 = 50 个焊点
pWork.X := pBase.X + 20.0 * i; // X 间距 20 mm
pWork.Y := pBase.Y + 20.0 * j; // Y 间距 20 mm
pWork.Z := pBase.Z;
MoveL(Target := pWork, Velocity := 50);
Weld();
END_FOR;
END_FOR;
路径规划原则
原则 1: 分层
World (最外层)
└─ Home
└─ 安全过渡点 (Trans)
└─ 预位点 (Approach)
└─ 工作点 (Work)
程序出入都严格按层级 进入 / 退出, 不跨层级跳。跨层级跳 (比如从 Trans 直接到 Work) → 路径不可控。
原则 2: 空行程用关节 + 高速 + 大 Zone
// 空行程 (不碰任何东西)
MoveJ(Target := Trans1, Velocity := 200, Zone := 80); // 高速大平滑
MoveJ(Target := Trans2, Velocity := 200, Zone := 80);
原则 3: 工作行程用直线 + 低速 + 小 Zone 或 0 Zone
// 工作行程 (碰工件)
MoveL(Target := Weld_Start, Velocity := 20, Zone := 0); // 精确到位
MoveL(Target := Weld_Mid, Velocity := 10, Zone := 2); // 小平滑
MoveL(Target := Weld_End, Velocity := 20, Zone := 0); // 精确退出
原则 4: 最小回转
规划时相邻点关节角变化应尽量小. J1 从 0 → 170° → 0 是大回转, 浪费 5~10 秒。改成 0 → -170° → 0 是小回转, 一样到达。
原则 5: 避开奇异点
路径经过奇异点 (腕奇异 J5 = 0° 附近) 会导致伪速度爆炸。规划时加 姿态约束 或插入绕开点。
最优路径计算
遗传算法 TSP
对 50+ 个独立工作点 (如焊点阵列), 手工排序耗时且不一定最优。Darra IDE 内置路径优化器:
- 点位管理面板 → 选中多个点位 → 右键 → 路径优化
- 选择优化目标:
- 最短总路径 (默认)
- 最短总时间 (考虑加减速)
- 最少关节大回转
- 算法: 遗传算法 + 局部搜索
- 计算时间: 100 点 < 5 秒
- 结果: 输出点位顺序, 可导入程序
障碍物避让
有障碍物时, 两点之间不一定能直连。需要RRT-Connect 规划:
- IDE 加载障碍物模型 (见 模型导入)
- 指定起点 / 终点
- 运行 RRT-Connect, 自动找到无碰撞路径
- 后处理: 路径平滑 + 拐点简化
RRT 不保证最短路径, 但保证可行。实际应用中大多数场景手工规划过渡点更高效。
参数表
| 参数 | 类型 | 单位 | 范围 | 默认 | 说明 |
|---|---|---|---|---|---|
| HomeJoint | REAL[6] | ° | - | - | Home 关节角 |
| SafeHeight | LREAL | mm | 50..1000 | 200 | 安全过渡高度 |
| ApproachOffset | LREAL | mm | 10..500 | 100 | 预位点相对工作点的偏移 |
| ApproachDir | VECTOR3 | - | - | (0,0,1) | 预位方向 (工作坐标系下) |
| DefaultZoneLarge | LREAL | mm | 10..200 | 50 | 空行程默认平滑半径 |
| DefaultZoneSmall | LREAL | mm | 0..20 | 2 | 工作行程默认平滑半径 |
排错清单
| 现象 | 原因 | 解决 |
|---|---|---|
| 程序运行到一半撞工件 | 缺预位点, MoveL 直接冲下来 | 在每个工作点前加 Approach |
| 节拍慢 | 所有运动都用 MoveL + 0 Zone | 空行程改 MoveJ + 大 Zone |
| 机器人到某点突然大角度转腕 | 邻近点姿态连续性差 | 调整点位姿态使相邻点欧拉角接近 |
| 每次循环机器人路径不一样 | MoveJ 起点不同结果不同 | 改 MoveL 或加 Approach 确保进入姿态一致 |
| Home 点一启动就撞人 | Home 距离工装太近 | 重新选 Home, 离工装 > 200 mm |
| 过渡点飞过工件上方, 抖动 | 过渡点离工件太近, 减速避撞 | 把过渡点抬高 100 mm |
最佳实践
- 先画纸, 再示教: 程序流程图列出所有点位和顺序, 再到机器人前示教
- 4 类点分目录: 点位管理里按
Home / Safe / Approach / Work分组, 一眼能看到什么缺失 - 命名规则:
P_{区域}_{类别}_{序号}, 如P_PickStn_Approach_1 - 一个文件最多 200 个点: 超了分模块, 每个子程序独立点集
- 路径仿真再下放: 每改一个点先在 3D 视口仿真, 看 TCP 曲线
- 日志驱动调优: 运行时记录每段耗时, 超预期的段拉出来看点位设置
- 关键点加注释: 点位列表旁边写"焊缝起点 / 装配孔 1", 接班人看得懂