第1章:轨迹表示方法——关节空间 vs 笛卡尔空间

大家好,我是老张。今天咱们聊聊轨迹表示这个基础话题。

说实话,我刚入行那会儿,觉得轨迹规划不就是让机器人从A点到B点嘛。后来踩了不少坑才明白——选错轨迹表示方法,后面优化做得再好也白搭。

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

先说说最核心的区别。

关节空间轨迹,说白了就是直接控制每个关节的角度变化。比如你让机械臂的J1从0°转到30°,J2从20°转到50°……每个关节独立插值,最后合成运动。

笛卡尔空间轨迹,则是控制末端执行器在三维空间中的位置和姿态。比如让焊枪沿着一条直线移动,或者让吸盘保持水平姿态。

我个人的习惯是:

  • 如果任务对末端路径有严格要求(比如焊接、涂胶),用笛卡尔空间
  • 如果只是点到点搬运,关节空间更省事

关键区别表

对比项 关节空间 笛卡尔空间
控制对象 各关节角度 末端位姿
计算复杂度 低(无逆解) 高(需实时逆解)
路径可预测性 末端路径不可控 末端路径精确可控
奇异性风险 较低 较高(逆解可能失效)

嗯,这里要注意——笛卡尔空间轨迹虽然听起来高大上,但逆解计算很费时。我曾经在一个项目中,因为逆解频率不够,导致机器人运动卡顿,后来改成关节空间才解决。

1.2 多项式插值

多项式插值是最基础的轨迹生成方法。你想想看,给定起点和终点的位置、速度甚至加速度,用多项式拟合出一条平滑曲线。

最常见的几种:

  • 三次多项式:给定起点和终点的位置、速度,4个约束条件
  • 五次多项式:额外约束起点和终点的加速度,6个约束条件
  • 七次多项式:再加急动度约束,8个条件

代码实现其实很简单:

def cubic_trajectory(t, t0, tf, q0, qf, v0, vf):
    """
    三次多项式插值
    t: 当前时间
    t0, tf: 起始和结束时间
    q0, qf: 起始和结束位置
    v0, vf: 起始和结束速度
    """
    # 归一化时间
    tau = (t - t0) / (tf - t0)
    
    # 系数矩阵
    a0 = q0
    a1 = v0 * (tf - t0)
    a2 = 3*(qf - q0) - (2*v0 + vf)*(tf - t0)
    a3 = -2*(qf - q0) + (v0 + vf)*(tf - t0)
    
    # 位置
    q = a0 + a1*tau + a2*tau**2 + a3*tau**3
    return q

我的经验:三次多项式适合低速场景,但如果你需要末端运动特别平滑(比如精密装配),至少用五次多项式。我吃过亏——有一次用三次多项式做码垛,结果末端在转折点抖动,产品全倒了。

1.3 样条曲线

多项式插值有个问题——如果路径点太多,高阶多项式会剧烈振荡。这就是所谓的龙格现象。

样条曲线就是来解决这个问题的。它把整个轨迹分成若干段,每段用低阶多项式拟合,然后在连接点保证连续性。

最常见的三次样条:

  • 每段是三次多项式
  • 段与段之间位置、速度、加速度连续
  • 边界条件自由选择(自然样条、固定端点等)

你想想看,这就像用几根短木棍拼成一条长曲线,每根木棍自己弯一点,但接缝处必须平滑过渡。

避坑指南:我曾经在一条有20多个路径点的轨迹上直接用高阶多项式,结果末端在中间点之间疯狂振荡,差点撞到夹具。后来换成三次样条,问题立刻解决。记住——路径点多于5个,就别用全局多项式了。

1.4 B样条曲线

B样条是样条曲线的升级版。它最大的特点是——局部控制。

什么意思呢?你调整一个控制点,只影响附近一小段曲线,不会牵一发动全身。这在轨迹优化时特别有用。

B样条的核心参数:

  • 控制点:决定曲线大致形状
  • 节点向量:决定曲线分段位置
  • 阶数:决定曲线平滑程度(3阶是三次B样条)

我个人最喜欢B样条的地方在于:

  1. 可以局部调整——改一个点不影响全局
  2. 凸包性质——曲线不会超出控制点围成的凸包
  3. 连续性可控——阶数越高越平滑
import numpy as np

def bspline_basis(i, k, u, knots):
    """
    计算B样条基函数
    i: 控制点索引
    k: 阶数
    u: 参数值
    knots: 节点向量
    """
    if k == 0:
        return 1.0 if knots[i] <= u < knots[i+1] else 0.0
    
    # 递归计算
    coef1 = 0.0
    if knots[i+k] - knots[i] > 0:
        coef1 = (u - knots[i]) / (knots[i+k] - knots[i])
    
    coef2 = 0.0
    if knots[i+k+1] - knots[i+1] > 0:
        coef2 = (knots[i+k+1] - u) / (knots[i+k+1] - knots[i+1])
    
    return coef1 * bspline_basis(i, k-1, u, knots) + \
           coef2 * bspline_basis(i+1, k-1, u, knots)

实际应用建议

  • 轨迹优化时,把B样条控制点作为优化变量
  • 阶数选3-5阶,太低不够平滑,太高计算量太大
  • 节点向量均匀分布即可,除非有特殊约束

1.5 本章知识体系

下面这张图展示了四种轨迹表示方法的关系和适用场景:

轨迹表示方法知识体系 轨迹表示方法 关节空间轨迹 笛卡尔空间轨迹 多项式插值 样条曲线 B样条曲线 其他方法 三次多项式 五次多项式 三次样条 均匀B样条 非均匀B样条 应用场景 焊接/涂胶 → 笛卡尔空间 + B样条 | 搬运/码垛 → 关节空间 + 多项式 精密装配 → 笛卡尔空间 + 五次多项式 | 高速运动 → 关节空间 + 样条

这张图把四种方法的关系理清楚了。从上往下看,先选空间,再选插值方法,最后匹配应用场景。

我的建议:新手先从关节空间+三次多项式入手,跑通了再尝试笛卡尔空间。别一上来就搞B样条优化,容易把自己绕晕。

好了,这一章就到这里。轨迹表示是机器人控制的地基,地基打不牢,后面优化做得再好也白搭。下一章咱们聊聊轨迹优化的具体方法,到时候会用到今天讲的这些知识。


专注资料整理