轨迹规划入门:梯形速度曲线、S形曲线、多项式插值

各位工程师朋友,今天我们来聊聊轨迹规划。说实话,这是运动控制里最基础也最容易被忽视的一块。我见过不少项目,电机选型没问题,驱动器也够高端,但跑起来就是一顿一顿的——十有八九是轨迹规划没做好。

轨迹规划说白了,就是告诉机器人「你该怎么从A点走到B点」。不是简单地说「走」,而是规定好每一步的速度、加速度,甚至加加速度。嗯,这里面的门道,我们一个一个来看。

核心观点:轨迹规划的质量,直接决定了机器人运动的平滑性、效率和安全性。一个好的轨迹,能让电机少发热、机械少磨损、产品少报废。

梯形速度曲线

梯形速度曲线,也叫T型曲线,是我最早接触的轨迹规划方式。它的速度曲线长什么样?像个梯形——匀加速、匀速、匀减速三段。

我记得刚入行时做一个小型SCARA机器人,用的就是梯形曲线。当时觉得挺简单,不就是三段嘛。结果一跑起来,末端抖动得厉害。后来才明白,梯形曲线在加速度突变的地方,会产生无限大的加加速度(Jerk),这就是抖动的根源。

梯形曲线的数学表达其实很直观:

// 梯形速度曲线参数
总位移 S
最大速度 Vmax
加速度 A
减速度 D(通常等于A)

// 三段的时间分配
加速时间 t1 = Vmax / A
匀速时间 t2 = (S - 0.5 * A * t1^2 - 0.5 * D * t1^2) / Vmax
减速时间 t3 = Vmax / D

这里有个坑,我必须要提醒大家:

我曾经踩过的坑:梯形曲线在短距离运动时,可能根本达不到最大速度。这时候整个曲线就变成了三角形——只有加速和减速。如果你还用三段式去算,结果会非常离谱。一定要先判断是否达到Vmax。

梯形曲线的优缺点很明显:

  • 优点:计算简单,实时性好,适合低端MCU
  • 缺点:加速度突变,产生冲击,不适合高精度场景

你想想看,如果你的机器人只是做简单的搬运,对末端抖动不敏感,梯形曲线完全够用。但如果是焊接、涂胶、装配这类对轨迹平滑度要求高的应用,就得考虑更高级的曲线了。

S形曲线

S形曲线,顾名思义,速度曲线像字母S。它解决了梯形曲线的核心问题——加速度不再突变,而是连续变化。

S形曲线把加速段又分成了三小段:加加速度段、匀加速段、减加速度段。减速段同理。这样加加速度(Jerk)就是有限值,不会产生冲击。

我个人习惯把S形曲线分成七段:

  1. 加加速度段(Jerk为正,加速度从0增加到Amax)
  2. 匀加速段(加速度保持Amax)
  3. 减加速度段(Jerk为负,加速度从Amax降到0)
  4. 匀速段(速度保持Vmax)
  5. 加减速度段(Jerk为负,加速度从0降到-Dmax)
  6. 匀减速段(加速度保持-Dmax)
  7. 减减速度段(Jerk为正,加速度从-Dmax升到0)

是不是听着有点复杂?其实写代码的时候,核心就是算好每个阶段的切换时间点。

// S形曲线关键参数
最大速度 Vmax
最大加速度 Amax
最大加加速度 Jmax

// 加速阶段时间
t_j = Amax / Jmax  // 加加速/减加速时间
t_a = (Vmax - Amax * t_j) / Amax  // 匀加速时间(如果存在)

我的经验:实际项目中,我很少用完整的七段S形曲线。大多数情况下,短距离运动根本到不了匀加速段。我一般会先判断运动距离是否足够长,然后动态决定用三段、五段还是七段。这样既保证了平滑度,又节省了计算量。

S形曲线比梯形曲线复杂不少,但效果也是立竿见影的。我做过一个对比测试:同样的运动距离和速度,梯形曲线的末端加速度突变达到50m/s³,而S形曲线控制在5m/s³以内。机械寿命至少延长了30%。

多项式插值

梯形和S形曲线都是基于「速度-时间」的规划。但有些场景下,我们需要更灵活的轨迹——比如让机器人末端走一条特定的空间曲线。这时候就要用到多项式插值。

多项式插值的思路很简单:给定几个关键点(位置、速度、加速度约束),用多项式函数把这些点光滑地连接起来。

最常用的是三次多项式插值:

// 三次多项式:θ(t) = a0 + a1*t + a2*t^2 + a3*t^3
// 已知起点位置θ0、终点位置θf、起点速度ω0、终点速度ωf

a0 = θ0
a1 = ω0
a2 = (3*(θf - θ0) - (2*ω0 + ωf)*tf) / tf^2
a3 = (2*(θ0 - θf) + (ω0 + ωf)*tf) / tf^3

三次多项式能保证位置和速度连续,但加速度是阶跃的。如果对加速度也有连续要求,就得用五次多项式:

// 五次多项式:θ(t) = a0 + a1*t + a2*t^2 + a3*t^3 + a4*t^4 + a5*t^5
// 额外约束:起点加速度α0、终点加速度αf

// 六个方程解六个未知数,这里不展开推导
// 实际项目中我一般用矩阵求解,或者直接套用现成公式

实用建议:多项式插值虽然灵活,但有个问题——高阶多项式容易产生「龙格现象」,即在端点附近剧烈振荡。我建议不要超过七次多项式。如果路径点很多,用分段三次样条插值更稳妥。

我在做六轴机器人轨迹规划时,就吃过这个亏。当时用了七次多项式插值,结果在中间点附近轨迹出现了明显的过冲,差点撞到工件。后来改用分段三次样条,问题就解决了。

三种方法的对比

方法 计算复杂度 平滑度 适用场景
梯形速度曲线 低(加速度突变) 简单搬运、低速运动
S形曲线 高(加加速度有限) 通用工业机器人、数控机床
多项式插值 可调(取决于阶数) 复杂路径、高精度轨迹

说白了,没有最好的方法,只有最合适的。我个人建议:

  • 如果MCU资源紧张,用梯形曲线,但要做好加速度限制
  • 如果对平滑度有要求,优先考虑S形曲线
  • 如果需要走复杂空间路径,用多项式插值或样条插值

一个小技巧:实际项目中,我经常把S形曲线和多项式插值结合起来。比如在关节空间用S形曲线规划速度,在笛卡尔空间用多项式插值规划路径。这样既保证了速度平滑,又保证了路径精度。

知识体系总览

下面这张图,是我自己总结的轨迹规划知识体系。你可以把它当作一个快速索引:

轨迹规划知识体系 轨迹规划 梯形速度曲线 S形曲线 多项式插值 三段式结构 加速度突变 计算简单 适合低端MCU 七段式结构 Jerk有限 平滑度高 通用性强 三次/五次多项式 样条插值 灵活性强 计算量大 选择原则:根据应用场景、硬件资源、精度要求综合权衡

嗯,以上就是轨迹规划的三种基本方法。说实话,这些内容看起来简单,但真正用好需要大量的实践。我建议你在仿真环境里多跑跑,看看不同参数对轨迹的影响。纸上得来终觉浅,绝知此事要躬行嘛。

专注资料整理