奇异点处理
奇异点 (Singularity) 是机器人运动学中雅可比矩阵秩亏的位姿 — 在这些位姿上, 机器人失去某些方向的运动能力, 或要求某关节以无限大角速度才能维持 TCP 的有限笛卡尔速度。实际表现就是:
- MoveL 走到某一点时突然某个关节飞速旋转
- 报警 "Singularity" 并急停
- JOG 笛卡尔方向时机器人完全不动或剧烈颤抖
本页讲 6 轴工业臂的 3 类奇异点, 检测方法, 和 4 种处理策略。
奇异点本质
正运动学 x = f(q), 其雅可比矩阵 J(q) = ∂f/∂q 给出了关节速度 q̇ 与笛卡尔速度 ẋ 的关系:
ẋ = J(q) · q̇
逆解时:
q̇ = J⁻¹(q) · ẋ
当 det(J) = 0 或 J 秩亏时, J⁻¹ 不存在或趋无穷, 即奇异点。几何上, 奇异点处机器人失去一个自由度, 无法在那一瞬间沿某方向运动。
6 轴工业臂的 3 类奇异点
1. 肩奇异 (Shoulder Singularity)
发生位置: 腕心 (J5 轴中心) 落在 J1 旋转轴 (机身 Z 轴) 上, 即"机器人中心正上方或正下方"。
几何描述: 以机身 Z 轴为中心的半径 ≈ 50 mm 的圆柱范围内。
现象:
- J1 方向自由度退化: 在该点无法沿 TCP 的水平圆周方向 (绕 Z) 有限速度运动, J1 趋无穷
- 笛卡尔 JOG 某方向触发 → J1 告警
避免:
- 工作区规划: 避免 TCP 穿越机身正上方 / 正下方的柱形区域
- 工件不放正对机身中心
- 路径穿越时强制用 MoveJ 而非 MoveL
2. 肘奇异 (Elbow Singularity)
发生位置: 大臂 + 小臂完全伸直或完全折叠 (J3 ≈ 0° 或 180°)。
几何描述: 机器人臂展边缘 (外圈) 或最紧折叠(内圈)。
现象:
- J3 方向自由度退化
- TCP 无法沿径向 (远离 / 靠近机身) 移动, 因为臂已经伸到极限
- 路径走到工作区边缘时出现此奇异
避免:
- 工作区规划: 工件不放在机器人最大臂展的 95% 处
- 留出 50~100 mm 裕量
- 3D 视口显示工作空间时, 关注红色边界环 = 肘奇异
3. 腕奇异 (Wrist Singularity, 最常见)
发生位置: J5 ≈ 0° (或 ±180°), 此时 J4 和 J6 轴共线。
几何描述: 工具平行于小臂延长线 ("工具直着往前伸")。
现象:
- J4 和 J6 退化为一个自由度, 二者可以等量反向旋转而 TCP 不动
- 执行需要 J4 或 J6 单独转的运动时, J4 和 J6 一起飞速转 (甚至无限速)
- 焊接 / 涂胶工具沿小臂延长线时最容易撞
避免:
- TCP 姿态规划时让 J5 保持 ≠ 0°, 推荐 J5 ∈ [±15°, ±135°]
- 不允许 J5 经过 0°
- 示教点时刻意加点姿态倾斜
奇异点检测
几何检测 (快)
bShoulder = sqrt(TCP.X² + TCP.Y²) < 50 mm (落入机身柱内)
bElbow = |J3| < 5° 或 |J3 - 180°| < 5°
bWrist = |J5| < 5°
系统每毫秒检测一次, 接近时自动限速 (proximity slow-down).
数值检测 (精确)
manip = sqrt(det(J · J^T)) -- 可操作度
manip = 0 → 奇异; manip 越小 → 越接近奇异。阈值 0.001 rad·m 通常设为预警。
4 种处理策略
策略 1: 避让 (Avoidance, 推荐)
编程阶段就规划路径不碰奇异. 具体方法:
- 示教点时在3D 视口查看"奇异区标记" (红色球 / 柱)
- 不要让示教点或路径中间穿过这些区
- 工作区选在机器人"舒服"的姿态区:
- TCP 距机身 300~800 mm (非肘奇异区)
- TCP 姿态让 J5 落在 ±30° ~ ±90°
- TCP 水平投影不落在机身中心 ±50 mm
策略 2: 关节运动绕过 (MoveJ Workaround)
路径必须经过奇异区时, 插入 MoveJ 段绕过:
// 原路径: Pick (TCP 在机身正上方) → Place
// 直接 MoveL 会经过肩奇异
MoveL(Target := Pick_Approach, Velocity := 50);
MoveL(Target := Pick, Velocity := 20); // 下降取料
// 关键: 用 MoveJ 回到安全点, 关节空间运动不触发奇异
MoveJ(Target := Safe_Trans, Velocity := 150); // 关节运动避奇异
MoveL(Target := Place_Approach, Velocity := 80);
MoveL(Target := Place, Velocity := 20);
策略 3: 阻尼最小二乘法 (DLS, Damped Least Squares)
在奇异点附近人为加阻尼, 让逆解平滑退化:
q̇ = J^T · (J · J^T + λ² · I)⁻¹ · ẋ
其中 λ 是阻尼系数, 在 manip < 阈值 时 λ 从 0 线性增加到 0.1。效果:
- 奇异点附近关节速度被限制在可执行范围
- TCP 速度稍低于指令速度 (牺牲一点精度换可执行)
- 系统不报警, 机器人继续运动
Darra 默认开启 DLS, 可通过 EnableDLS / DLSLambda 参数配置:
SetDLSConfig(Robot := Robot1, Enable := TRUE, Lambda := 0.05, ProxyThreshold := 0.01);
代价: 奇异点处 TCP 误差可能 ±0.5 mm, 焊接 / 高精度操作不可用。
策略 4: 姿态约束松弛 (Relax Orientation)
如果路径对姿态要求低, 可以允许机器人在奇异点微调姿态来避开:
mcL(
TargetPosition := pWork,
OriToleranceRx := 5.0, // 允许 Rx 偏差 ±5°
OriToleranceRy := 5.0,
OriToleranceRz := 15.0, // Rz (工具绕轴) 容忍大
Velocity := 30
);
系统在姿态容许范围内寻找最远离奇异的姿态。焊接对 Rz 通常不敏感 → 可以容忍 15°, 帮助避开腕奇异。
DLS 详解
Lambda 参数
| Lambda | 效果 |
|---|---|
| 0 | 无阻尼, 奇异处报警 |
| 0.01 | 轻微阻尼, 精度损失 < 0.1 mm |
| 0.05 (默认) | 中等, 损失 < 0.5 mm |
| 0.1 | 强, 损失 ~2 mm, 最平滑 |
| > 0.2 | 几乎不可动, 不推荐 |
激活策略
自适应 Lambda (推荐):
λ(manip) = λ_max · (1 - manip / manip_threshold)² if manip < manip_threshold
= 0 otherwise
- manip > threshold → λ = 0 (全精度)
- manip → 0 → λ → λ_max (最大阻尼)
- 平滑过渡, 无速度跳变
示教器奇异提示
接近奇异时, 示教器:
- 视觉: TCP 指示颜色变橙色, 报警区域变红
- 数字: 面板显示
manip = 0.008 (WARN) - 速度: 自动降到 30% 以内
- 触觉 (部分示教器): 手柄轻微振动
极近奇异 (manip < 0.001):
- 红色闪烁
- 示教器警告 "即将进入奇异"
- 笛卡尔 JOG 被禁止, 只能关节 JOG
SCL 代码检查
VAR
manip : LREAL;
bSingular : BOOL;
END_VAR
GetManipulability(Robot := Robot1, Value := manip);
IF manip < 0.005 THEN
bSingular := TRUE;
Log.Warn('Near singularity, manip = %f', manip);
END_IF;
// 运动前检查目标点
IF CheckTargetSingularity(Robot := Robot1, Target := pNext) THEN
Log.Warn('Target is singular, switching to MoveJ');
MoveJ(Target := pNext, Velocity := 100);
ELSE
MoveL(Target := pNext, Velocity := 50);
END_IF;
参数表
| 参数 | 类型 | 单位 | 范围 | 默认 | 说明 |
|---|---|---|---|---|---|
| EnableDLS | BOOL | - | - | TRUE | 启用 DLS |
| DLSLambdaMax | LREAL | - | 0..0.2 | 0.05 | 最大阻尼 |
| DLSThreshold | LREAL | - | 0.001..0.1 | 0.01 | 可操作度阈值 |
| EnableProxSlowdown | BOOL | - | - | TRUE | 接近奇异自动降速 |
| ProxSlowdownFactor | LREAL | - | 0.1..1.0 | 0.5 | 降速比例 |
| RejectSingularPath | BOOL | - | - | FALSE | 拒绝直接经过奇异的路径 |
| Manipulability | LREAL | - | 0..1 | - | 只读, 当前可操作度 |
排错清单
| 现象 | 原因 | 解决 |
|---|---|---|
| 运行时报 "Singularity detected" | 路径穿越奇异 | 插入 MoveJ 段或改路径 |
| MoveL 到目标, 某轴突然 360° 翻转 | 目标点在腕奇异 | 改目标姿态, 让 J5 ≠ 0 |
| JOG 按 +Z 机器人抖动 | 接近奇异, J4 / J6 争夺 | 切关节 JOG 先走开 |
| 工作区边缘报肘奇异 | 臂展用到 98% | 工装往内移 100 mm |
| DLS 开着但精度下降 | λ 太大 | 减小 DLSLambdaMax |
| 3D 视口奇异区提示颜色不对 | 工具坐标系未标对 | 重做 TCP 标定 |
| 路径之前没事, 换工具后报奇异 | 新工具 TCP 远, 导致姿态布局变 | 重做路径姿态 |
最佳实践
- 教学时就避开: 示教阶段看 3D 视口奇异提示, 点位都靠外、偏下、姿态斜
- MoveJ + MoveL 混用: 长距离跨越用 MoveJ, 工作段用 MoveL
- J5 不过零: 焊接涂胶工具姿态 J5 至少 15° 倾斜
- 工作区设在机器人"舒服区": 机身前方 400
700 mm, 高度 300800 mm - DLS 开着兜底: 即使规划好也开 DLS 防意外路径
- 路径预检: 程序下发前用路径仿真 + 奇异扫描工具扫一遍
- 视觉引导尤其注意: 动态计算的目标点可能飘到奇异, 加目标点过滤步骤
7 轴 / 冗余机器人
7 轴机器人 (如 Kuka iiwa, Franka Panda) 有冗余自由度, 可以在保持 TCP 不变的情况下调整肘部位置来避开奇异。Darra 对 7 轴机器人的处理:
- 冗余参数 (肘角 θ_e): 用户可指定 [-180°, 180°]
- 自动模式: 系统实时选择远离奇异的 θ_e
- 手动模式: 示教时用第 7 个 JOG 按钮调肘角
7 轴避奇异能力 = 6 轴 + 肘角冗余, 大多数场景完全不碰奇异。
数学补充: 可操作度椭球
每个位姿的可操作度 (manipulability) 可以可视化为椭球:
- 长轴 = 该方向可达最大速度
- 短轴 = 难移动方向 (短轴趋 0 = 奇异)
3D 视口可以打开 可操作度椭球 显示, 红色扁椭球 = 即将奇异, 绿色球形 = 姿态最好。用这个图找最优工作姿态比手算快。