第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样条的地方在于:
- 可以局部调整——改一个点不影响全局
- 凸包性质——曲线不会超出控制点围成的凸包
- 连续性可控——阶数越高越平滑
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样条优化,容易把自己绕晕。
好了,这一章就到这里。轨迹表示是机器人控制的地基,地基打不牢,后面优化做得再好也白搭。下一章咱们聊聊轨迹优化的具体方法,到时候会用到今天讲的这些知识。