梯形加减速算法:原理介绍、速度曲线分析、加速度与减速度的对称性

梯形加减速,这个名字你一听就大概能猜到它的速度曲线长什么样——像个梯形。没错,这是运动控制里最基础、最常用的加减速策略。我刚开始做运动控制那会儿,第一个接触的就是它。说白了,梯形加减速就是让电机先匀加速,再匀速,最后匀减速,整个过程速度变化像爬坡、走平路、再下坡。

一、梯形加减速的原理

为什么需要加减速?你想想看,电机如果一启动就直接跑到目标速度,那冲击力有多大?轻则丢步,重则机械结构直接报废。梯形加减速的核心思想就是:让速度的变化率可控

它的工作流程分三段:

  • 加速段:以恒定加速度 a 从 0 加速到目标速度 Vmax
  • 匀速段:以 Vmax 匀速运行
  • 减速段:以恒定减速度 a(通常等于加速度)从 Vmax 减速到 0

这里有个关键点——加速度和减速度的对称性。我个人习惯把加速度和减速度设成一样大,这样计算简单,曲线也漂亮。但并不是所有场合都适合对称,后面我会细说。

核心公式:

加速段距离:S_acc = Vmax² / (2 × a)

减速段距离:S_dec = Vmax² / (2 × a)

匀速段距离:S_const = S_total - S_acc - S_dec

匀速段时间:T_const = S_const / Vmax

二、速度曲线分析

梯形速度曲线长什么样?我画个图给你看,你就明白了。

时间 t 速度 v 加速段 匀速段 减速段 Vmax t₁ t₂ t₃ 加速 匀速 减速

这张图很直观吧?红色是加速段,蓝色是匀速段,绿色是减速段。注意看,加速和减速的斜率是一样的——这就是对称性。斜率代表加速度的大小,斜率越陡,加速度越大。

为什么会这样设计?其实很简单:加速和减速的物理过程是对称的。加速时电机出力克服惯性,减速时电机出力被惯性反推。如果加速度和减速度一样,电机承受的力就是对称的,对机械结构最友好。

三、加速度与减速度的对称性

对称性这个话题,我得好好跟你聊聊。很多初学者觉得对称就是理所当然的,但实际项目中,情况往往没那么简单。

我的经验:

在大多数通用运动控制场景中,我建议保持加速度 = 减速度。这样做的好处是:

  • 计算简单,代码好写
  • 电机受力对称,寿命更长
  • 速度曲线平滑,冲击小

但是,有些场合必须打破对称性。我记得有一次做垂直升降机构,上升时电机要克服重力,下降时重力反而帮忙。这时候如果还用对称的加减速,上升时加速太慢,下降时减速又不够。后来我把上升加速度调大,下降减速度调小,才解决了问题。

什么时候该用非对称?我列个表给你参考:

应用场景 推荐策略 原因
水平运动(通用) 对称(a = d) 受力均衡,简单可靠
垂直升降(上升重载) 加速 > 减速 克服重力需要更大加速力
垂直升降(下降重载) 减速 > 加速 重力辅助,需要更强减速
高速高精度定位 减速 > 加速 防止过冲,提高定位精度
柔性材料输送 加速 < 减速 避免材料拉伸或褶皱

避坑指南:

我曾经在一个项目中,为了追求速度,把加速度设得特别大,减速度却很小。结果电机加速时抖得厉害,减速时又滑出去老远。后来才明白,加速度受电机扭矩限制,减速度受机械惯性和制动能力限制。两个参数必须分别标定,不能拍脑袋设。

四、梯形加减速的代码实现

说了这么多理论,来点实际的。下面是我常用的梯形加减速计算函数,C语言风格,移植性很好:

// 梯形加减速参数计算
typedef struct {
    float v_max;      // 目标最大速度
    float a;          // 加速度
    float d;          // 减速度
    float s_total;    // 总位移
    float s_acc;      // 加速段位移
    float s_dec;      // 减速段位移
    float s_const;    // 匀速段位移
    float t_acc;      // 加速段时间
    float t_dec;      // 减速段时间
    float t_const;    // 匀速段时间
} TrapezoidProfile;

void CalcTrapezoidProfile(TrapezoidProfile *p) {
    // 计算加速和减速所需位移
    p->s_acc = (p->v_max * p->v_max) / (2.0f * p->a);
    p->s_dec = (p->v_max * p->v_max) / (2.0f * p->d);
    
    // 判断是否能达到最大速度
    if (p->s_acc + p->s_dec <= p->s_total) {
        // 能达到最大速度,有匀速段
        p->s_const = p->s_total - p->s_acc - p->s_dec;
        p->t_acc = p->v_max / p->a;
        p->t_dec = p->v_max / p->d;
        p->t_const = p->s_const / p->v_max;
    } else {
        // 达不到最大速度,三角形曲线
        // 需要重新计算实际能达到的最高速度
        float v_peak = sqrtf(2.0f * p->s_total * 
                          (p->a * p->d) / (p->a + p->d));
        p->s_acc = (v_peak * v_peak) / (2.0f * p->a);
        p->s_dec = (v_peak * v_peak) / (2.0f * p->d);
        p->s_const = 0;
        p->t_acc = v_peak / p->a;
        p->t_dec = v_peak / p->d;
        p->t_const = 0;
    }
}

这段代码我用了好多年,核心逻辑就两点:先算能不能跑到目标速度,能跑就按梯形算,跑不到就按三角形算(没有匀速段)。你注意看,我用了 sqrtf 来计算三角形模式下的峰值速度,这个公式是从能量守恒推导出来的,很实用。

五、实际应用中的注意事项

梯形加减速虽然简单,但坑也不少。我踩过的几个,分享给你:

  • 加速度不能无限大:电机扭矩有限,加速度太大直接堵转。我一般留 20% 的余量。
  • 减速度受制动方式影响:如果是电阻制动,减速度可以大一些;如果是回馈制动,要考虑母线电压。
  • 短距离运动要小心:位移太短时,可能还没加速到目标速度就要减速了,这时候就是三角形曲线。
  • 对称性不是必须的:别被「对称」两个字框住,实际项目该调就调。

一句话总结:

梯形加减速是运动控制的入门必修课。它简单、可靠、容易理解。对称性在大多数场合都适用,但遇到特殊工况,别犹豫,该打破就打破。记住,理论是死的,应用是活的

嗯,梯形加减速就聊到这儿。下一章我们聊聊 S 形加减速,那个曲线更平滑,但计算也更复杂。到时候再细说。


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