轨迹规划入门:梯形速度曲线、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形曲线分成七段:
- 加加速度段(Jerk为正,加速度从0增加到Amax)
- 匀加速段(加速度保持Amax)
- 减加速度段(Jerk为负,加速度从Amax降到0)
- 匀速段(速度保持Vmax)
- 加减速度段(Jerk为负,加速度从0降到-Dmax)
- 匀减速段(加速度保持-Dmax)
- 减减速度段(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形曲线规划速度,在笛卡尔空间用多项式插值规划路径。这样既保证了速度平滑,又保证了路径精度。
知识体系总览
下面这张图,是我自己总结的轨迹规划知识体系。你可以把它当作一个快速索引:
嗯,以上就是轨迹规划的三种基本方法。说实话,这些内容看起来简单,但真正用好需要大量的实践。我建议你在仿真环境里多跑跑,看看不同参数对轨迹的影响。纸上得来终觉浅,绝知此事要躬行嘛。