第3章:轨迹规划入门:梯形速度曲线、S型速度曲线原理与实现

大家好,我是老张。今天咱们聊聊轨迹规划里最基础、也最实用的两个东西——梯形速度曲线和S型速度曲线。

说实话,我刚入行那会儿,觉得轨迹规划挺玄乎的。后来在产线上调了几年机器人,才明白这东西说白了就是:怎么让电机从A点跑到B点,跑得又快又稳,还不抖

你想想看,如果直接给电机发一个阶跃速度指令,电机瞬间从0冲到3000转,那后果是什么?轻则抖动,重则过流报警,甚至机械结构都可能受损。所以,我们需要一个平滑的速度过渡过程。

3.1 梯形速度曲线

梯形速度曲线,顾名思义,速度曲线像个梯形。它分为三个阶段:匀加速、匀速、匀减速

我个人习惯叫它“三段式”。为什么叫梯形?你看速度-时间图,先斜着上去(加速),然后平着走(匀速),最后斜着下来(减速),形状就是个梯形。

核心公式(位移-时间关系):

加速段:s = 0.5 * a * t₁²

匀速段:s = v_max * t₂

减速段:s = v_max * t₃ - 0.5 * a * t₃²

其中 a 为加速度,v_max 为最大速度。

我在项目中遇到过一个问题:梯形曲线在加速段和匀速段的切换点,加速度会突变。说白了,就是加加速度(Jerk)是无穷大。这在一些对冲击敏感的场合(比如精密装配、晶圆搬运)是致命的。

避坑指南:

我曾经在一个高速点胶机上用了梯形曲线,结果胶水飞溅严重。后来发现是加速度突变导致机械臂末端抖动。如果你对运动平滑度有要求,梯形曲线要慎用。

梯形曲线的实现代码其实很简单。我一般这样写:

// 梯形速度曲线生成(伪代码)
void TrapezoidalProfile(float total_dist, float v_max, float a) {
    float t_acc = v_max / a;          // 加速时间
    float s_acc = 0.5 * a * t_acc * t_acc;  // 加速段位移
    
    // 判断是否达到最大速度
    if (total_dist < 2 * s_acc) {
        // 三角形曲线(未达到最大速度)
        // 处理逻辑...
    } else {
        // 标准梯形曲线
        float s_const = total_dist - 2 * s_acc;  // 匀速段位移
        float t_const = s_const / v_max;         // 匀速段时间
        // 输出三段的时间点...
    }
}

嗯,这里要注意:当总位移太小时,梯形会退化成三角形。很多新手会忽略这个边界条件,导致曲线生成失败。

3.2 S型速度曲线

S型速度曲线,说白了就是给梯形曲线“圆角”。它把加速度的变化也做了平滑处理,引入了加加速度(Jerk)的概念。

为什么叫S型?因为速度曲线从加速到匀速的过渡是S形的,不是直角拐弯。你想想看,这样机械冲击就小多了。

S型曲线分为七个阶段:加加速、匀加速、减加速、匀速、加减速、匀减速、减减速。听着复杂,其实核心就是让加速度也连续变化。

我的经验:

在实际项目中,我很少用完整的七段S型曲线。太复杂了,计算量大,而且参数调起来很痛苦。我一般用五段S型曲线(去掉匀加速和匀减速段),效果已经足够好。

S型曲线的核心参数有三个:最大速度 v_max、最大加速度 a_max、最大加加速度 j_max。其中j_max决定了曲线的“圆润程度”。

我曾经在一个六轴机器人上调试S型曲线,发现j_max设得太小,曲线太“软”,运动效率低;设得太大,又跟梯形曲线没区别。后来总结出一个经验公式:j_max ≈ 5 * a_max / t_acc,效果比较均衡。

3.3 两种曲线的对比

特性 梯形速度曲线 S型速度曲线
加速度连续性 不连续(有突变) 连续
加加速度 无穷大(切换点) 有限值(可设定)
计算复杂度 中高
运动平滑度 一般 优秀
适用场景 传送带、简单搬运 精密装配、CNC、机器人
参数数量 2个(v_max, a) 3个(v_max, a_max, j_max)

你看这个表就明白了。梯形曲线简单粗暴,适合对成本敏感、对精度要求不高的场合。S型曲线复杂但平滑,适合高端应用。

3.4 核心逻辑流程图

下面我用一张SVG图,把这两种曲线的核心逻辑串起来。你一看就明白。

轨迹规划核心逻辑 输入参数 总位移、最大速度、加速度 是否达到最大速度? 三角形曲线 无匀速段 梯形曲线 有匀速段 是否需要平滑? 输出梯形曲线 输出S型曲线

这张图把决策逻辑讲得很清楚。你从输入参数开始,先判断能不能达到最大速度,然后决定用三角形还是梯形。最后根据平滑需求,决定是否升级成S型曲线。

3.5 实现中的几个坑

最后,我分享几个实战中踩过的坑:

  • 浮点数精度问题:在计算加速段位移时,如果总位移很小,浮点数误差会导致曲线异常。我习惯用定点数或双精度来算。
  • 时间片对齐:梯形曲线的三段时间,必须与伺服周期对齐。否则会出现最后一个周期跑不完的情况。
  • S型曲线的Jerk限制:j_max不能设得太小,否则加速段会变得很长,影响效率。我一般取a_max的5-10倍作为初始值。
  • 实时性:S型曲线计算量比梯形大,在低端MCU上要注意优化。我试过在STM32F1上跑七段S型,CPU占用率直接飙到40%。后来改用查表法才压下来。

总结一句话:

梯形曲线是基础,S型曲线是进阶。先吃透梯形,再玩S型。别一上来就搞七段S型,容易把自己绕进去。

好了,这一章就到这里。梯形和S型曲线是轨迹规划的基石,后面讲更复杂的样条曲线、前瞻算法时,都会用到这些概念。你先把这两种曲线在代码里跑通,后面就顺了。


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