4. 梯形速度规划:梯形速度曲线原理、加速段/匀速段/减速段计算、S形速度曲线简介、实际项目中的选型考量

速度规划,说白了就是告诉电机「你该怎么跑」。在运动控制里,梯形速度曲线是最经典、最基础、也最常用的一种。我入行那会儿,第一个独立调试的项目用的就是梯形速度规划。当时觉得这东西太简单了,不就是加速、匀速、减速三段嘛。结果真上了设备,发现坑比想象的多。

今天咱们就把梯形速度曲线彻底讲透。从原理到计算,再到实际选型,我会把我在项目里踩过的坑、总结的经验都摊开来说。

4.1 梯形速度曲线的原理

梯形速度曲线,顾名思义,速度随时间变化的形状像个梯形。它由三段组成:加速段、匀速段、减速段。

你想想看,一个电机从静止开始,先以恒定加速度加速到目标速度,然后保持这个速度匀速跑一段,最后以恒定减速度减速到零。整个过程的速度曲线就是梯形。

核心参数:

  • Vmax:最大速度(目标速度)
  • Acc:加速度
  • Dec:减速度
  • Total Distance:总位移

这里有个关键点:加速度和减速度可以不一样。我在做一台高速贴片机时,就发现加速段电机负载轻,可以加得快;但减速段带着大惯量负载,必须减得慢,否则会过冲。所以实际项目中,Acc 和 Dec 往往是独立设置的。

下面这张图,把梯形速度规划的完整流程画出来了。你可以看到,从输入参数到最终输出位置指令,每一步都有明确的逻辑。

梯形速度规划流程 输入:Vmax, Acc, Dec, 总位移 判断:能否达到 Vmax? 能到达:三段式(加速+匀速+减速) 不能到达:两段式(加速+减速) 计算:加速时间 / 匀速时间 / 减速时间 输出:位置-时间曲线(插补指令) 说明:梯形规划的核心是判断「能否达到 Vmax」,这决定了最终是两段还是三段

4.2 三段计算:加速段、匀速段、减速段

好,咱们来算一算。假设总位移为 S,最大速度为 Vmax,加速度为 Acc,减速度为 Dec。

4.2.1 加速段

加速时间:t_acc = Vmax / Acc

加速段位移:S_acc = 0.5 * Acc * t_acc² = Vmax² / (2 * Acc)

4.2.2 减速段

减速时间:t_dec = Vmax / Dec

减速段位移:S_dec = 0.5 * Dec * t_dec² = Vmax² / (2 * Dec)

4.2.3 匀速段

匀速段位移:S_const = S - S_acc - S_dec

匀速段时间:t_const = S_const / Vmax

注意:如果 S_const < 0,说明总位移太短,根本跑不到 Vmax。这时候就要退化成两段式:加速到某个中间速度后直接减速。我曾经在一个点对点搬运项目里遇到过这种情况,当时没检查 S_const 的正负,结果算出来负的时间,电机直接报错。从那以后,我每次写梯形规划代码,第一件事就是判断 S_const 是否大于等于零。

4.2.4 两段式(三角形速度曲线)

当无法达到 Vmax 时,实际能达到的最高速度 V_peak 需要重新计算:

V_peak = sqrt(2 * S * (Acc * Dec) / (Acc + Dec))

然后加速时间:t_acc = V_peak / Acc

减速时间:t_dec = V_peak / Dec

总时间:t_total = t_acc + t_dec

我的经验:两段式在短距离频繁启停的场景下非常常见。比如我做过的一个小型分拣机器人,每次移动距离只有 50mm,Vmax 设到 1m/s 根本跑不起来,实际 V_peak 只有 0.3m/s 左右。这时候用两段式反而更平滑,效率也更高。

4.3 梯形规划的代码实现

下面是一个简单的梯形速度规划函数。它接受目标位置、最大速度、加速度、减速度,返回每个插补周期的位置指令。

def trapezoidal_plan(target_pos, Vmax, Acc, Dec, dt):
    """
    梯形速度规划
    target_pos: 目标位置(相对位移)
    Vmax: 最大速度
    Acc: 加速度
    Dec: 减速度
    dt: 插补周期
    返回: 位置列表
    """
    # 1. 计算加速/减速段位移
    S_acc = Vmax**2 / (2 * Acc)
    S_dec = Vmax**2 / (2 * Dec)
    S_const = target_pos - S_acc - S_dec

    # 2. 判断是否达到Vmax
    if S_const >= 0:
        # 三段式
        t_acc = Vmax / Acc
        t_dec = Vmax / Dec
        t_const = S_const / Vmax
        t_total = t_acc + t_const + t_dec
    else:
        # 两段式
        V_peak = math.sqrt(2 * target_pos * (Acc * Dec) / (Acc + Dec))
        t_acc = V_peak / Acc
        t_dec = V_peak / Dec
        t_total = t_acc + t_dec

    # 3. 生成位置序列(此处省略插补细节)
    # 实际项目中需要按dt离散化,并分段计算位置
    return pos_list

关键点:实际项目中,梯形规划通常不是一次性算完所有位置,而是在每个插补周期(比如 1ms)实时计算当前应处的位置。这样做的好处是:可以随时响应急停、速度变更等外部指令。

4.4 S形速度曲线简介

梯形速度曲线虽然简单,但它有一个硬伤:加速度在切换点处突变。加速段结束时,加速度从 Acc 瞬间降到 0;减速段开始时,加速度从 0 瞬间跳到 -Dec。这种突变会产生冲击力,也就是我们常说的「急动度(Jerk)」。

S形速度曲线就是为了解决这个问题而生的。它把加速度的变化也做了平滑处理,让加速度本身也按照梯形或正弦曲线变化。

特性 梯形速度曲线 S形速度曲线
加速度变化 阶跃突变 连续平滑
急动度(Jerk) 无穷大(理论) 有限值
运动平滑性 一般 优秀
计算复杂度 低 高
适用场景 普通搬运、点对点 精密加工、高速高精度

我记得有一次做晶圆搬运项目,客户要求启停时振动小于 0.1g。梯形规划一跑,加速度突变直接导致末端抖动超标。换成 S 形曲线后,振动降到了 0.05g 以下。嗯,这就是 S 形曲线的价值所在。

4.5 实际项目中的选型考量

梯形还是 S 形?这不是一个非黑即白的问题。我根据多年项目经验,总结了几个选型原则:

  • 普通搬运、码垛、传送带:梯形速度曲线完全够用。计算简单,调试方便,维护成本低。
  • 高速高精度、精密装配、晶圆搬运:必须上 S 形曲线。梯形曲线的加速度突变会激发机械共振,影响定位精度。
  • 短距离频繁启停:梯形曲线往往跑不成三段,两段式(三角形)更实用。S 形曲线在这种场景下计算量太大,收益不明显。
  • 大惯量负载:建议用 S 形曲线,或者至少把梯形曲线的减速度设得比加速度小很多。我曾经有个项目,减速段加速度设得和加速段一样,结果负载过冲了 5mm,差点撞坏夹具。

避坑指南:千万不要在梯形规划里把加速度设得太大。我曾经为了赶节拍,把加速度调到电机额定值的 90%。结果运行了两个月,减速机就出现了明显的齿隙磨损。后来我学乖了,加速度一般只用到额定值的 60%-70%,给机械系统留点余量。

另外,选型时还要考虑控制器的算力。梯形规划几乎不占 CPU,但 S 形曲线在高速插补时,如果每个周期都要算七段甚至九段曲线,对低端控制器是个不小的负担。我见过有人用 STM32F103 跑 S 形规划,结果插补周期从 1ms 拖到了 3ms,位置精度反而下降了。

最后说一句:没有最好的规划,只有最合适的规划。梯形速度曲线虽然简单,但用好了,能解决 80% 的运动控制问题。剩下的 20%,再考虑 S 形曲线或者其他更高级的规划方法。