4. S形速度规划:七段式S曲线原理与参数计算

大家好,我是你们的老朋友。今天我们来聊聊机器人轨迹规划里一个绕不开的话题——S形速度规划

说实话,我刚入行那会儿,用的最多的就是梯形速度规划。简单、直观、好算。但有一次做高速码垛项目,机器人一启动就抖得跟筛糠似的,末端执行器上的工件差点飞出去。我查了半天,最后发现是加速度突变惹的祸。从那以后,我对S形曲线就再也不敢马虎了。

4.1 为什么需要S形曲线?

梯形速度规划的问题在哪?说白了,就是加速度不连续。启动瞬间加速度从0跳到最大值,结束瞬间又从最大值跳回0。这种突变会产生无穷大的加加速度(Jerk),物理上不可能实现,实际表现就是机械振动和冲击。

你想想看,电机和减速器都是有惯性的。突然要求它们瞬间改变加速度,就像你开车时一脚油门踩到底又一脚刹车踩到底——车上的乘客肯定受不了。机器人也是一样,尤其是精密装配或高速搬运场景,这种冲击轻则影响定位精度,重则损坏机械结构。

S形曲线的核心思想,就是让加速度也平滑变化。它把整个运动过程分成七段,每一段都有明确的物理意义。这样加加速度就是有限值,机械系统受到的冲击大大减小。

核心结论:S形曲线通过控制加加速度(Jerk)为常数,实现了加速度的连续变化,从而消除冲击。这是高性能机器人运动控制的基石。

4.2 七段式S曲线的结构

七段式S曲线,顾名思义,整个运动过程被分成7个阶段。我习惯用一张图来理解它,这样最直观。

七段式S曲线速度-时间关系图 t₀ t₁ t₂ t₃ t₄ t₅ t₆ t₇ v_max 加加速 匀加速 减加速 匀速 加减速 匀减速 减减速

这七段分别是:

  1. 加加速段(t₀→t₁):加速度从0开始,以恒定加加速度J增加。速度曲线呈抛物线上升。
  2. 匀加速段(t₁→t₂):加速度达到最大值A_max并保持。速度线性增加。
  3. 减加速段(t₂→t₃):加速度从A_max以恒定-J减小到0。速度曲线呈抛物线上升,但曲率方向改变。
  4. 匀速段(t₃→t₄):加速度为0,速度保持最大值V_max。
  5. 加减速段(t₄→t₅):加速度从0以恒定-J减小(即反向加速)。速度开始下降,呈抛物线。
  6. 匀减速段(t₅→t₆):加速度达到反向最大值-A_max并保持。速度线性下降。
  7. 减减速段(t₆→t₇):加速度从-A_max以恒定J增加到0。速度曲线呈抛物线下降至0。

我的小技巧:记不住七段顺序?你只需要记住「加速三兄弟」和「减速三兄弟」,中间夹个匀速段。加速三兄弟分别是:加加速、匀加速、减加速。减速同理。这样就好记多了。

4.3 参数计算的核心公式

搞清楚了结构,接下来就是算参数了。七段式S曲线涉及几个关键参数:

参数 符号 单位 说明
总位移 S mm 或 rad 需要运动的距离或角度
最大速度 V_max mm/s 或 rad/s 系统允许的最高速度
最大加速度 A_max mm/s² 或 rad/s² 系统允许的最大加速度
加加速度 J mm/s³ 或 rad/s³ 加速度的变化率,S曲线的核心
各段时间 T₁~T₇ s 每段持续的时间

嗯,这里要注意:并不是每次运动都能跑满七段。如果位移S太小,可能还没加速到V_max就要开始减速了。这时候就会退化成五段甚至三段S曲线。我待会儿会讲怎么判断。

4.4 完整七段式的参数计算

假设我们已知S、V_max、A_max、J,且位移足够大,能跑满七段。那么计算步骤如下:

第一步:计算加速段和减速段的时间

由于对称性,加速三段时间之和等于减速三段时间之和。每段时间为:

T₁ = T₃ = T₅ = T₇ = A_max / J
T₂ = T₆ = (V_max / A_max) - (A_max / J)

这里T₂必须大于等于0。如果T₂ < 0,说明V_max太高,实际跑不到,需要重新计算。

第二步:计算加速段和减速段的总时间

T_acc = T₁ + T₂ + T₃ = (V_max / A_max) + (A_max / J)
T_dec = T_acc  // 对称

第三步:计算加速段和减速段的总位移

这个公式稍微复杂一点,我直接给结论:

S_acc = V_max * (V_max / A_max + A_max / J) / 2
S_dec = S_acc  // 对称

第四步:计算匀速段时间

T₄ = (S - S_acc - S_dec) / V_max

如果T₄ >= 0,恭喜你,七段完整。如果T₄ < 0,说明位移不够,跑不到V_max,需要降速处理。

关键判断条件:

  • T₂ >= 0 且 T₄ >= 0 → 完整七段
  • T₂ >= 0 且 T₄ < 0 → 五段S曲线(无匀速段)
  • T₂ < 0 → 三段S曲线(无匀加速/匀减速段)

4.5 代码实现示例

纸上得来终觉浅。我写了一个简单的Python函数,用来计算七段式S曲线的参数。你可以在自己的项目里直接套用这个框架。

def s_curve_plan(S, V_max, A_max, J):
    """
    七段式S曲线参数计算
    :param S: 总位移 (mm)
    :param V_max: 最大速度 (mm/s)
    :param A_max: 最大加速度 (mm/s²)
    :param J: 加加速度 (mm/s³)
    :return: 各段时间列表 [T1, T2, T3, T4, T5, T6, T7]
    """
    # 1. 计算加加速段时间
    T1 = A_max / J
    
    # 2. 计算匀加速段时间
    T2 = (V_max / A_max) - (A_max / J)
    
    # 3. 判断是否降速
    if T2 < 0:
        # 三段式情况:达不到最大加速度
        V_actual = A_max * (A_max / J)  # 实际能达到的速度
        T1 = A_max / J
        T2 = 0
        T3 = T1
        T4 = 0
        T5 = T1
        T6 = 0
        T7 = T1
        # 这里需要重新计算实际位移,略
        return [T1, T2, T3, T4, T5, T6, T7]
    
    # 4. 计算加速段总位移
    S_acc = V_max * (V_max / A_max + A_max / J) / 2
    S_dec = S_acc
    
    # 5. 计算匀速段时间
    T4 = (S - S_acc - S_dec) / V_max
    
    if T4 < 0:
        # 五段式情况:达不到最大速度
        # 需要求解实际能达到的速度V_actual
        # 这里用二分法或解析法求解,略
        pass
    
    # 6. 对称赋值
    T3 = T1
    T5 = T1
    T6 = T2
    T7 = T1
    
    return [T1, T2, T3, T4, T5, T6, T7]

我曾经踩过的坑:有一次我直接套用七段公式,没检查T₂和T₄的正负,结果算出来的时间有负数。机器人执行时直接报错,差点把末端执行器撞坏。所以一定要先判断运动类型,再选择对应的公式。

4.6 实际项目中的经验

最后分享几个我在项目中积累的经验:

  • J值怎么选?我一般取J = A_max / (0.1~0.2)。也就是说,加加速段占加速总时间的10%~20%。太短了冲击大,太长了运动效率低。
  • 对称性不是必须的。有些场景加速和减速的A_max可以不同。比如抓取时加速可以快一点,放置时减速要慢一点。这时候七段就不对称了,但计算原理一样。
  • 实时性要求高怎么办?如果是在嵌入式系统里跑,建议把公式离线算好,查表或者用多项式拟合。在线实时计算三角函数或开方,对MCU压力很大。
  • 别忘了单位一致性。这个看起来是废话,但我真见过有人把mm和m混着用,结果算出来的速度是光速级别的。

好了,关于七段式S曲线的原理和参数计算,今天就聊到这里。记住一句话:S形规划的本质,是用加加速度的有限性换取加速度的连续性,从而消除冲击。理解了这个,你就能灵活应对各种轨迹平滑的需求。


专注资料整理