4. 梯形速度规划:从数学到实战

梯形速度曲线,这名字听着挺学术,其实说白了就是「加速-匀速-减速」三段式。我刚开始做运动控制那会儿,第一个接触的就是它。为什么?因为它简单、直观、好调。

你想想看,一个电机从静止启动,直接给最大速度会怎样?轻则抖动,重则丢步。梯形规划就是给速度加个「缓启动」和「缓停止」的过程。嗯,咱们今天就把它的数学模型、计算方法、还有坑,一次性说透。

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

先看一个典型的梯形速度曲线长什么样:

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

图中很清晰:三段直线,斜率代表加速度。加速段斜率正,减速段斜率负,匀速段斜率为零。数学上,速度 v(t) 是个分段函数:

v(t) = 
  a * t,              0 ≤ t < t₁      // 加速阶段
  v_max,              t₁ ≤ t < t₂     // 匀速阶段
  v_max - a*(t-t₂),   t₂ ≤ t ≤ t₃     // 减速阶段

其中 a 是加速度(绝对值),v_max 是最大速度。注意,这里假设加速和减速的加速度大小相等。我在项目中遇到过不对称的情况,比如升降机构,上升和下降的加速度不同,那就得拆成两段单独算。

4.2 三个阶段的计算方法

实际编程时,我们通常已知三个参数:总位移 S、最大速度 v_max、加速度 a。需要算出三个时间点 t₁、t₂、t₃。

第一步:判断是否达到最大速度

先算一个「理想加速距离」:从0加速到v_max需要走多远?

S_acc = v_max² / (2 * a)

如果 S > 2 * S_acc,说明有匀速段。否则,就是三角形速度曲线(只有加速和减速)。

核心公式:

加速时间:t₁ = v_max / a

匀速时间:t₂ - t₁ = (S - 2*S_acc) / v_max

总时间:t₃ = t₁ + (t₂ - t₁) + t₁ = 2*t₁ + (S - 2*S_acc)/v_max

第二步:离散化计算

实际代码里,我们按固定周期(比如1ms)更新位置。我习惯这样写:

// 伪代码示例
float t = 0;           // 当前时间
float dt = 0.001;      // 控制周期 1ms
float pos = 0;         // 当前位置
float vel = 0;         // 当前速度

while (pos < S) {
    if (t < t₁) {
        vel = a * t;                    // 加速
    } else if (t < t₂) {
        vel = v_max;                    // 匀速
    } else if (t < t₃) {
        vel = v_max - a * (t - t₂);     // 减速
    } else {
        vel = 0;                        // 停止
    }
    
    pos += vel * dt;
    t += dt;
}

嗯,这里要注意:浮点数累加会有误差。我建议用整数运算,或者每步做一次位置校验。

4.3 优缺点分析

优点 缺点
  • 实现简单,代码量少
  • 计算量小,适合低端MCU
  • 参数直观,好调试
  • 速度变化可控
  • 加速度突变,有冲击
  • 启停瞬间 jerk 无穷大
  • 不适合高精度场景
  • 柔性不够,容易抖动

我的经验:梯形规划最适合步进电机开环控制。我做过一个贴片机项目,用梯形规划跑了两年,没出过问题。但如果是伺服电机带负载,尤其是大惯量负载,梯形规划的冲击感会很明显。

避坑指南:我曾经在减速段没处理好,导致电机过冲。原因是减速开始时间算晚了,速度还没降到零就到目标位置了。解决办法是:在减速段每步都算一下「剩余距离」,如果剩余距离小于当前速度对应的刹车距离,就强制进入减速。

4.4 什么时候该用梯形规划?

说白了,梯形规划适合「够用就行」的场景:

  • 对启停冲击不敏感:比如传送带、简单的XY平台
  • 计算资源有限:8位单片机、低端DSP
  • 调试周期短:原型验证、快速打样
  • 速度变化不频繁:点对点运动,不是连续轨迹

反过来,如果要求平滑、无抖动、高精度,那就得上S形曲线或者多项式规划了。这个咱们后面章节会细讲。

最后说一句:梯形规划虽然简单,但它是理解所有速度规划的基础。你把它吃透了,后面学S形、Jerk控制都会轻松很多。我当年就是先啃透梯形,再一步步往上走的。


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