第27章 工业机器人轨迹:关节空间轨迹 vs 笛卡尔空间轨迹、奇异点处理

各位工程师朋友,今天我们来聊聊工业机器人轨迹规划里一个绕不开的话题——关节空间和笛卡尔空间的抉择,以及那个让人头疼的奇异点问题。

说实话,我刚入行那会儿,也在这两个空间的选择上栽过跟头。有一次调试一台六轴机器人,明明仿真跑得好好的,一上机就抖得跟筛糠似的。后来才发现,是笛卡尔空间轨迹遇到了奇异点。嗯,从那以后,我对这两个概念的理解就深刻多了。

27.1 关节空间轨迹 vs 笛卡尔空间轨迹

先说说最核心的区别。关节空间轨迹,规划的是每个关节的角度随时间的变化。笛卡尔空间轨迹,规划的是机器人末端在三维空间的位置和姿态。

说白了,一个管「关节怎么动」,一个管「手往哪儿走」。

27.1.1 关节空间轨迹的特点

我个人习惯在以下场景优先考虑关节空间:

  • 点到点运动:比如抓取-放置,中间路径不重要
  • 避障需求简单:关节空间计算量小,实时性好
  • 避免奇异点:关节空间天生不会遇到奇异点问题

关节空间轨迹的规划,本质上就是每个关节独立做插补。比如用三次多项式或五次多项式,让关节从θ₀平滑运动到θ₁。

// 关节空间五次多项式插补示例
double q0 = 0.0;    // 起始角度
double q1 = 90.0;   // 目标角度
double t = 0.5;     // 归一化时间 [0,1]

// 五次多项式系数
double a0 = q0;
double a1 = 0;      // 起始速度=0
double a2 = 0;      // 起始加速度=0
double a3 = 10 * (q1 - q0);
double a4 = -15 * (q1 - q0);
double a5 = 6 * (q1 - q0);

double q = a0 + a1*t + a2*t*t + a3*t*t*t + a4*t*t*t*t + a5*t*t*t*t*t;

你看,代码很简单。但有个坑——关节空间轨迹无法保证末端走直线。如果你需要机器人沿着焊缝走直线,关节空间就不行了。

我的经验:在码垛、搬运这类任务中,我几乎只用关节空间。计算量小,运动平滑,调试也快。

27.1.2 笛卡尔空间轨迹的特点

笛卡尔空间轨迹,说白了就是让末端执行器在三维空间走一条精确的路径。比如直线、圆弧、样条曲线。

什么时候必须用笛卡尔空间?

  • 直线运动:比如涂胶、焊接、切割
  • 圆弧运动:比如打磨曲面、装配圆孔
  • 姿态约束:比如保持工具垂直于工件表面

笛卡尔空间轨迹的规划流程是这样的:

  1. 在笛卡尔空间插补出路径点(位置+姿态)
  2. 通过逆运动学将每个路径点映射到关节空间
  3. 在关节空间执行运动

这里有个关键问题——逆运动学求解。每插补一个点,就要解一次逆运动学。如果机器人构型复杂,计算量会很大。

注意:笛卡尔空间轨迹在奇异点附近会出大问题。我曾经遇到过,机器人末端走直线,经过奇异点时关节速度瞬间飙升,差点撞到工件。

27.2 奇异点处理

奇异点,是每个做机器人轨迹规划的人绕不开的坎。说白了,就是机器人某些关节的构型导致末端在某些方向上失去自由度。

27.2.1 奇异点的本质

从数学上看,奇异点对应的是雅可比矩阵秩亏损。从物理上看,就是机器人某个关节无论怎么动,末端都只能朝一个方向走。

常见的奇异点类型:

类型 描述 典型场景
腕部奇异点 关节4和关节6轴线共线 末端姿态变化时
肩部奇异点 关节1和关节2轴线共线 机器人手臂伸直时
肘部奇异点 关节3和关节4轴线共线 肘关节完全伸展时

为什么会这样?你想想看,当两个关节的轴线重合时,它们其实在做同一个自由度的运动。这时候雅可比矩阵就「缺了一维」。

27.2.2 奇异点的处理方法

我在项目中遇到过好几次奇异点问题,总结下来有几种处理思路:

方法一:阻尼最小二乘法(DLS)

这是最常用的方法。在逆运动学求解时,给雅可比矩阵加一个阻尼项,避免关节速度发散。

// 阻尼最小二乘法伪代码
Matrix J;           // 雅可比矩阵
Matrix J_damped;    // 阻尼雅可比
double lambda;      // 阻尼系数

// 标准DLS公式
J_damped = J^T * (J * J^T + lambda^2 * I)^(-1);

// 关节速度
q_dot = J_damped * v_desired;

阻尼系数λ的选择很关键。λ太大,轨迹精度下降;λ太小,奇异点附近速度仍然很大。我一般取λ = 0.01 ~ 0.1,根据实际调试效果调整。

方法二:奇异值分解(SVD)

SVD可以精确分析雅可比矩阵的奇异值。当某个奇异值接近0时,就说明接近奇异点了。

// SVD分解雅可比矩阵
[U, S, V] = svd(J);

// 检查奇异值
for i = 1:6
    if S(i,i) < epsilon
        // 该方向接近奇异,做特殊处理
        S_inv(i,i) = 0;  // 或者用阻尼
    else
        S_inv(i,i) = 1 / S(i,i);
    end
end

// 重构逆雅可比
J_inv = V * S_inv * U^T;

方法三:路径重规划

如果奇异点不可避免,我建议直接修改路径。比如在奇异点附近插入过渡点,或者改用关节空间轨迹绕过奇异区域。

避坑指南:我曾经在一个焊接项目中,非要让机器人末端走一条经过奇异点的直线。结果焊枪抖动,焊缝质量不合格。后来我改成了在奇异点附近走一段圆弧过渡,问题就解决了。

27.2.3 工程实践中的建议

说了这么多理论,最后给几条实际建议:

  • 离线仿真一定要做:在仿真中检查轨迹是否经过奇异点。很多商业软件都有奇异点检测功能。
  • 预留安全裕度:不要刚好在奇异点边界上规划轨迹。留出5-10度的安全角度。
  • 关节空间优先:如果对路径精度要求不高,优先用关节空间。省心省力。
  • 笛卡尔空间加保护:必须用笛卡尔空间时,加上奇异点检测和阻尼处理。

嗯,关于关节空间和笛卡尔空间的抉择,以及奇异点的处理,今天就聊到这儿。这两个概念看似基础,但真正用好需要大量实践。下次遇到机器人抖动、速度异常的问题,不妨先想想——是不是碰到了奇异点?