4、梯形速度规划:梯形速度曲线的数学模型、加速/匀速/减速阶段计算

梯形速度曲线,说白了就是运动控制里最经典、最常用的速度规划方式。你想想看,一个电机从静止加速到目标速度,跑一段匀速,再减速停下来——整个过程的速度-时间图像就像一个梯形,所以叫梯形速度曲线。

我个人习惯把这种规划叫做「三段式」:加速段、匀速段、减速段。简单、直观、计算量小,非常适合点位运动(Point-to-Point Motion)。

4.1 梯形速度曲线的数学模型

先看一个典型的梯形速度曲线长什么样。横轴是时间 t,纵轴是速度 v。

t v t₀ t₁ t₂ t₃ v_max 加速段 匀速段 减速段

图中 t₀ 到 t₁ 是加速段,t₁ 到 t₂ 是匀速段,t₂ 到 t₃ 是减速段。整个运动的总时间就是 t₃ - t₀。

核心参数就这几个:

  • v_max:最大速度(目标速度)
  • a:加速度(加速段和减速段通常取相同值)
  • s_total:总位移
  • t_acc:加速时间
  • t_dec:减速时间
  • t_const:匀速时间

关键公式:

加速段位移:s_acc = ½ · a · t_acc²

匀速段位移:s_const = v_max · t_const

减速段位移:s_dec = ½ · a · t_dec²

总位移:s_total = s_acc + s_const + s_dec

4.2 加速阶段计算

加速阶段从速度 0 开始,以恒定加速度 a 加速到 v_max。这个阶段的时间 t_acc 怎么算?

很简单:

t_acc = v_max / a

加速段的位移:

s_acc = 0.5 * a * t_acc² = 0.5 * v_max² / a

我在项目中遇到过一个问题:有些工程师直接拿 v_max 和 a 算 t_acc,结果发现总位移不够,梯形变成了三角形。嗯,这里要注意——如果总位移太小,可能根本跑不到 v_max 就得开始减速了。

避坑指南:我曾经在一个贴片机项目里,因为没检查总位移是否足够,导致加速还没完成就开始减速,速度曲线变成了三角形。后来我养成了一个习惯:先判断能不能达到 v_max,再决定用梯形还是三角形规划。

4.3 匀速阶段计算

匀速阶段相对简单。如果总位移足够大,加速到 v_max 后,会以 v_max 匀速跑一段。

匀速时间怎么算?

s_const = s_total - s_acc - s_dec
t_const = s_const / v_max

这里有个隐含条件:s_const 必须大于等于 0。如果算出来是负数,说明总位移不够,跑不到 v_max,这时候就要用三角形速度曲线了。

你想想看,如果 s_const 是负数,意味着什么?意味着你还没加速到 v_max 就得开始减速了。这种情况在实际工程中很常见,尤其是短距离运动。

4.4 减速阶段计算

减速阶段和加速阶段是对称的。假设减速加速度也是 a(通常如此),那么:

t_dec = v_max / a
s_dec = 0.5 * a * t_dec² = 0.5 * v_max² / a

减速段从 t₂ 时刻开始,到 t₃ 时刻结束。速度从 v_max 线性下降到 0。

减速段的实时速度:

v(t) = v_max - a * (t - t₂)   (t₂ ≤ t ≤ t₃)

减速段的实时位置:

s(t) = s(t₂) + v_max * (t - t₂) - 0.5 * a * (t - t₂)²

注意:减速段的终点位置必须精确等于目标位置。如果计算有误差,电机要么过冲,要么不到位。我见过一个案例,因为浮点精度问题,减速段终点差了 0.01mm,结果在精密装配中直接导致零件压坏。

4.5 完整计算流程

把三个阶段串起来,完整的梯形速度规划计算流程如下:

  1. 输入参数:总位移 s_total、最大速度 v_max、加速度 a
  2. 计算加速/减速时间:t_acc = t_dec = v_max / a
  3. 计算加速/减速位移:s_acc = s_dec = 0.5 * v_max² / a
  4. 判断是否达到 v_max
    • 如果 s_acc + s_dec ≤ s_total:可以到达 v_max,有匀速段
    • 如果 s_acc + s_dec > s_total:无法到达 v_max,使用三角形规划
  5. 计算匀速段:s_const = s_total - s_acc - s_dec,t_const = s_const / v_max
  6. 输出时间节点:t₀=0, t₁=t_acc, t₂=t_acc+t_const, t₃=t_acc+t_const+t_dec

下面是一个简单的 Python 实现:

def trapezoidal_profile(s_total, v_max, a):
    # 计算加速/减速参数
    t_acc = v_max / a
    s_acc = 0.5 * a * t_acc**2
    s_dec = s_acc
    
    # 判断是否可达 v_max
    if s_acc + s_dec <= s_total:
        # 梯形规划
        s_const = s_total - s_acc - s_dec
        t_const = s_const / v_max
        t_total = 2 * t_acc + t_const
        return {
            'type': 'trapezoidal',
            't0': 0, 't1': t_acc, 't2': t_acc + t_const, 't3': t_total,
            'v_max': v_max, 'a': a
        }
    else:
        # 三角形规划(达不到 v_max)
        t_acc_tri = (s_total / a) ** 0.5
        v_peak = a * t_acc_tri
        return {
            'type': 'triangular',
            't0': 0, 't1': t_acc_tri, 't2': 2 * t_acc_tri,
            'v_peak': v_peak, 'a': a
        }

个人经验:我建议在实际项目中,把梯形规划封装成一个独立的函数,输入输出接口标准化。这样不管是伺服电机、步进电机还是直线电机,都能复用同一套逻辑。我在做多轴联动时,每个轴都调同一个规划函数,省了不少事。

4.6 梯形规划的优缺点

优点 缺点
计算简单,实时性好 加速度突变,有冲击
参数直观,容易调试 加减速段连接处有 jerk 无限大
适合点位运动 高速时振动较大
代码实现容易 不适合对平滑度要求高的场景

说白了,梯形规划就是「够用就好」的典型代表。如果你的应用对运动平滑度要求不高,比如传送带、简单的搬运、点胶机等,梯形规划完全够用。但如果是高精度加工、激光切割、3D打印这些对轨迹平滑度有要求的场景,我建议你考虑 S 形速度规划。

嗯,关于梯形速度规划,核心内容就这些。记住三个关键点:加速段、匀速段、减速段的计算逻辑,以及判断是否可达 v_max 的条件。下次遇到需要做速度规划的项目,先拿梯形规划试试,简单可靠,不容易出错。


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