梯形速度规划:从入门到实战

大家好,我是老张。今天咱们聊聊梯形速度规划。

说实话,梯形速度曲线是运动控制里最基础、最常用的规划方式。我入行那会儿,第一个项目就是给一台三轴龙门机器人做速度规划,用的就是梯形曲线。那时候不懂什么S形、多项式,梯形曲线帮我解决了大问题。

梯形速度曲线,说白了就是让速度先匀加速、再匀速、最后匀减速。你想想看,这就像开车——先踩油门加速,到了巡航速度就稳住,快到目的地了再踩刹车。简单直观,容易理解。

梯形速度曲线的数学模型

我们先看数学表达。梯形曲线有三个阶段:

  • 加速阶段:速度从0线性增加到目标速度Vmax
  • 匀速阶段:保持Vmax运行
  • 减速阶段:速度从Vmax线性减到0

对应的位移公式是这样的:

加速阶段:s(t) = 0.5 * a * t²,0 ≤ t ≤ ta
匀速阶段:s(t) = s_acc + Vmax * (t - ta),ta ≤ t ≤ ta + tc
减速阶段:s(t) = s_acc + s_const + Vmax * (t - ta - tc) - 0.5 * d * (t - ta - tc)²,ta + tc ≤ t ≤ T

其中a是加速度,d是减速度,ta是加速时间,tc是匀速时间,T是总时间。

嗯,这里要注意:加速度和减速度可以不一样。我在项目中遇到过,有些负载在加速和减速时表现完全不同,这时候就得分别设置。

加速/匀速/减速阶段计算

实际应用中,我们最关心的是:给定总位移S和最大速度Vmax,怎么算出各阶段的时间?

我习惯分两种情况讨论:

情况一:能跑到最大速度

如果位移足够大,就能完整跑完三个阶段。计算步骤:

  1. 先算加速距离:s_acc = Vmax² / (2 * a)
  2. 再算减速距离:s_dec = Vmax² / (2 * d)
  3. 匀速距离:s_const = S - s_acc - s_dec
  4. 匀速时间:tc = s_const / Vmax
  5. 总时间:T = Vmax/a + tc + Vmax/d

情况二:跑不到最大速度

位移不够大时,还没加速到Vmax就得开始减速了。这时候是三角形速度曲线。计算稍微复杂点:

  1. 先假设最大速度Vpeak,满足:Vpeak²/(2a) + Vpeak²/(2d) = S
  2. 解出Vpeak = sqrt(2 * S * a * d / (a + d))
  3. 加速时间:ta = Vpeak / a
  4. 减速时间:td = Vpeak / d

核心要点:判断能不能跑到Vmax,就看S是否大于Vmax²/(2a) + Vmax²/(2d)。小于的话,就是三角形曲线。

代码实现示例

下面是我常用的梯形规划函数,C语言风格,移植性很好:

typedef struct {
    float accel;      // 加速度
    float decel;      // 减速度  
    float max_vel;    // 最大速度
    float total_dist; // 总位移
    float t_acc;      // 加速时间
    float t_const;    // 匀速时间
    float t_dec;      // 减速时间
    float total_time; // 总时间
} TrapezoidProfile;

void Trapezoid_Plan(TrapezoidProfile *profile) {
    float s_acc = profile->max_vel * profile->max_vel / (2 * profile->accel);
    float s_dec = profile->max_vel * profile->max_vel / (2 * profile->decel);
    
    if (profile->total_dist >= s_acc + s_dec) {
        // 能跑到最大速度
        profile->t_acc = profile->max_vel / profile->accel;
        profile->t_dec = profile->max_vel / profile->decel;
        profile->t_const = (profile->total_dist - s_acc - s_dec) / profile->max_vel;
    } else {
        // 三角形曲线
        float v_peak = sqrt(2 * profile->total_dist * profile->accel * profile->decel 
                          / (profile->accel + profile->decel));
        profile->t_acc = v_peak / profile->accel;
        profile->t_dec = v_peak / profile->decel;
        profile->t_const = 0;
    }
    profile->total_time = profile->t_acc + profile->t_const + profile->t_dec;
}

个人经验:实际项目中,我习惯在规划前加一个判断——如果位移小于某个阈值(比如1mm),直接走点对点运动,不做速度规划。这样可以避免频繁启停带来的抖动。

梯形规划的局限性分析

梯形曲线最大的问题是什么?冲击大。

为什么会这样?因为加速度在阶段切换点处是突变的。你想想看:

  • 启动瞬间:加速度从0跳变到a
  • 加速结束:加速度从a跳变到0
  • 减速开始:加速度从0跳变到-d
  • 停止瞬间:加速度从-d跳变到0

每次跳变都对应一个冲击(Jerk = 加速度变化率)。冲击大的后果:

  1. 机械振动:龙门机器人结构刚性有限,冲击会激发共振
  2. 定位精度下降:振动导致末端抖动,影响最终定位
  3. 电机过载:频繁的大冲击电流会缩短驱动器寿命
  4. 噪音大:机械撞击声,听着就不舒服

避坑指南:我曾经在一个高速贴片机项目里用了梯形规划,结果机器跑起来整个机架都在抖。后来换成S形曲线,抖动问题才解决。所以,如果你的应用对振动敏感(比如精密装配、高精度定位),梯形曲线可能不是最佳选择。

什么时候该用梯形规划?

虽然梯形曲线有冲击问题,但它也有优势:

优势 劣势
计算简单,实时性好 加速度突变,冲击大
参数少,调试方便 容易激发机械共振
速度利用率高 不适合高精度场景
适合大行程、低负载 噪音相对较大

我个人建议:

  • 大行程搬运(比如1米以上),负载轻,用梯形没问题
  • 精密定位、高速高加速度场景,考虑S形或多项式曲线
  • 如果必须用梯形,可以适当降低加速度,或者加滤波

梯形速度规划知识体系

下面这张图总结了梯形速度规划的核心内容:

梯形速度规划知识体系 梯形速度规划 数学模型 加速阶段:s=0.5*a*t² 匀速阶段:s=Vmax*t 减速阶段:s=Vmax*t-0.5*d*t² 冲击:加速度突变 阶段计算 加速时间:ta=Vmax/a 匀速时间:tc=S_const/Vmax 减速时间:td=Vmax/d 三角形/梯形判断 局限性分析 冲击大(Jerk大) 机械振动 定位精度下降 电机过载风险 适用:大行程、低负载 不适用:高精度、高速 改进方向:S形曲线、多项式规划、滤波

梯形速度规划是入门必备,但绝不是终点。我建议初学者先吃透梯形,理解加速、匀速、减速的物理含义,然后再去学更高级的规划方法。基础打牢了,后面学什么都快。

好了,梯形速度规划就聊到这儿。记住:简单不等于没用,梯形曲线在工业现场依然有大量应用。关键是要知道它的优缺点,选对场景。


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