第四章 轨迹规划基础:关节空间与笛卡尔空间

各位同学,今天我们来聊聊轨迹规划。说实话,这是离线编程里最核心的环节之一。我见过不少新手,代码写得挺溜,但机器人一动起来就各种抖、各种冲击,甚至直接撞到工件上。嗯,问题多半出在轨迹规划上。

轨迹规划说白了就是:告诉机器人怎么从A点走到B点。但这里面的门道可不少。你想想看,是让每个关节各自转过去?还是让末端工具走一条直线?这两种思路,就是今天要讲的关节空间规划笛卡尔空间规划

核心区别一句话总结:

  • 关节空间规划:控制每个关节的角度变化,末端路径不可控(但计算快)
  • 笛卡尔空间规划:控制末端位姿的路径,关节运动不可控(但路径直观)
轨迹规划知识体系 关节空间轨迹规划 笛卡尔空间轨迹规划 梯形速度曲线 S形速度曲线 直线插补 圆弧插补 关键选择依据 关节空间:无碰撞风险、起点终点明确、追求速度 笛卡尔空间:需要精确路径、避障要求高、焊接/涂胶等工艺

4.1 关节空间轨迹规划

先讲关节空间。为什么?因为这是最常用的方式。我做过统计,在一般的搬运、码垛场景里,超过80%的轨迹都是用关节空间规划的。原因很简单——计算量小,而且不容易出现奇异点。

4.1.1 梯形速度曲线

梯形速度曲线,也叫T型曲线。它分三段:加速、匀速、减速。名字很形象,速度曲线画出来就是个梯形。

我记得刚入行时,有个老师傅跟我说:「梯形曲线是最朴实的规划方式,但也是最容易出问题的。」后来我在一个码垛项目里深有体会——加速段设得太猛,机器人末端直接甩飞了一个工件。

梯形曲线核心参数:

  • 最大速度 v_max —— 决定了匀速段的速度
  • 最大加速度 a_max —— 决定了加减速的斜率
  • 总位移 S —— 起点到终点的关节角度差

梯形曲线的数学表达其实很简单。假设总位移为S,最大速度为v_max,加速度为a_max:

// 梯形速度曲线 - 三段式时间计算
// 加速段时间 t_acc = v_max / a_max
// 加速段位移 s_acc = 0.5 * a_max * t_acc²
// 如果 2 * s_acc >= S,说明没有匀速段(三角形曲线)
// 否则,匀速段时间 t_const = (S - 2*s_acc) / v_max

我的经验:梯形曲线最大的坑在「终点冲击」。因为减速段结束时速度突变到0,理论上加速度是阶跃的。在重载场景下,这个冲击力可能损坏工件或机器人本体。我建议:如果负载超过额定负载的60%,优先考虑S形曲线。

4.1.2 S形速度曲线

S形曲线,说白了就是给梯形曲线「加了个圆角」。它把加速度的变化也做了平滑处理,分成七段:加加速、匀加速、减加速、匀速、加减速、匀减速、减减速。

你可能会问:「有必要搞这么复杂吗?」嗯,我举个例子。有一次做精密装配,公差只有0.02mm。用梯形曲线,每次到位都会有一瞬间的抖动,死活装不进去。换成S形曲线后,问题立刻解决了。为什么?因为S形曲线的加加速度(jerk)是连续的,没有冲击。

S形曲线 vs 梯形曲线:

对比项 梯形曲线 S形曲线
加速度连续性 阶跃(不连续) 连续
加加速度 无穷大(冲击) 有限值(可控)
运动时间 较短 稍长(约10-20%)
适用场景 搬运、码垛 装配、涂胶、高精度
// S形曲线 - 七段式核心逻辑(伪代码)
// 输入:总位移S,最大速度v_max,最大加速度a_max,最大加加速度j_max
// 1. 计算加加速段时间 t_j = a_max / j_max
// 2. 计算匀加速段时间 t_a = v_max / a_max - t_j
// 3. 如果 t_a < 0,说明达不到最大速度,需要重新计算
// 4. 类似地计算减速段
// 5. 最终得到完整的七段时间参数

注意:S形曲线虽然平滑,但参数调起来比较麻烦。我曾经在一个项目里,因为j_max设得太小,导致整个运动周期延长了30%。建议从梯形曲线开始调试,确认运动范围没问题后,再切换到S形曲线做精调。

4.2 笛卡尔空间轨迹规划

好,现在讲笛卡尔空间。什么时候必须用笛卡尔空间?焊接、涂胶、打磨——这些工艺要求末端工具走一条精确的路径。关节空间规划虽然快,但你没法保证末端走直线。

4.2.1 直线插补

直线插补,就是让机器人末端从点A直线运动到点B。听起来简单,但实现起来有个关键问题:位姿插补。

位置插补好办,线性插值就行。但姿态呢?你不能直接对欧拉角做线性插值——会出现万向锁。我个人习惯用四元数球面线性插值(SLERP),虽然计算量大一点,但姿态过渡非常平滑。

// 直线插补 - 位置与姿态分离处理
// 位置插补(线性)
P(t) = P_start + t * (P_end - P_start),  t ∈ [0, 1]

// 姿态插补(四元数SLERP)
q(t) = (q_start * sin((1-t)*θ) + q_end * sin(t*θ)) / sin(θ)
// 其中 θ = acos(q_start · q_end)

避坑指南:我曾经在一条焊接产线上遇到过怪事——直线插补走到一半,机器人突然反转。查了半天,发现是起点和终点的姿态差超过了180度。四元数SLERP会走「短弧」,但如果你期望它走「长弧」,就会出问题。解决办法:在规划前检查姿态差,必要时插入中间点。

4.2.2 圆弧插补

圆弧插补比直线复杂一些。通常有三种定义方式:

  • 三点定圆:起点、中间点、终点
  • 圆心+半径+角度:适合整圆
  • 起点+终点+圆心:最常用

圆弧插补的核心步骤:

  1. 根据输入参数计算圆心和半径
  2. 确定圆弧的起始角和终止角
  3. 在角度域做插值(同样用梯形或S形速度曲线)
  4. 将角度插值结果映射回笛卡尔坐标

圆弧插补的精度问题:理论上,圆弧插补的精度取决于插补周期和速度。我做过测试:在100mm/s的速度下,1ms插补周期,圆弧误差可以控制在0.01mm以内。但如果速度提到500mm/s,误差会放大到0.1mm左右。所以高速圆弧运动时,要么降低速度,要么缩短插补周期。

// 圆弧插补 - 角度域插值
// 1. 计算圆心O、半径R、起始角θ_start、终止角θ_end
// 2. 在角度域规划速度曲线(梯形或S形)
// 3. 每个插补点:
//    θ(t) = θ_start + Δθ * s(t)   // s(t)是归一化后的运动进度
//    P(t) = O + R * [cos(θ(t)), sin(θ(t)), 0]  // 假设在XY平面
// 4. 姿态插补同直线插补

重要提醒:圆弧插补有一个隐藏问题——当圆弧接近半圆(180度)时,圆心计算会变得不稳定。如果三点几乎共线,计算出的半径会趋于无穷大。我在一个打磨项目里遇到过,当时工件轮廓有个接近180度的弧,程序直接报错。解决方案:把大圆弧拆成多个小圆弧段,每段不超过90度。

4.3 关节空间 vs 笛卡尔空间:怎么选?

说了这么多,到底怎么选?我个人的决策流程是这样的:

  1. 先问工艺要求:末端路径有没有精确要求?有→笛卡尔空间;没有→关节空间
  2. 再问碰撞风险:关节空间运动会不会撞到周围设备?会→笛卡尔空间做避障路径
  3. 最后问效率:如果前两个都不敏感,优先用关节空间——它更快、更稳定

嗯,其实还有一个「偷懒」的办法:先用关节空间做快速运动,接近目标点时切换到笛卡尔空间做精确到位。这种混合策略在很多工业机器人控制器里都有支持。

我的习惯:在离线编程软件里,我会先做关节空间的碰撞检测。如果检测到碰撞,再手动调整几个路径点,用笛卡尔空间规划绕过障碍物。这样既保证了效率,又兼顾了安全。记住:离线编程最大的优势就是可以反复试错,别怕多试几次。

好了,轨迹规划的基础就讲到这里。梯形曲线和S形曲线是关节空间的两把刷子,直线和圆弧是笛卡尔空间的基本功。把这些搞明白,后面讲复杂路径规划、避障算法时,你才能跟得上。


公众号:蓝海资料掘金营,微信deep3321