梯形速度曲线基础:匀加速、匀速、匀减速三段式结构

做运动控制这些年,我见过太多新手一上来就怼PID参数,结果电机抖得像筛子。其实,很多问题的根源不在控制算法,而在最基础的速度规划上。今天咱们就聊聊梯形速度曲线——这个看似简单,但门道不少的东西。

核心思想:梯形速度曲线把整个运动过程切成三段——匀加速、匀速、匀减速。说白了,就是让电机先平稳加速到目标速度,跑一会儿,再平稳停下来。

为什么是梯形?

你想想看,如果让电机直接全速启动,冲击力有多大?我早期做过一个贴标机项目,就是因为加速太猛,标签飞出去好几米。梯形曲线的好处在于:加速度恒定,意味着力是平稳的,机械结构不会受到冲击。

嗯,这里要注意:梯形曲线不是万能的。它适合大多数点位运动,但如果你做的是高精度轨迹跟踪,那得考虑S形曲线。不过那是后面章节的事,今天先把梯形吃透。

三段式结构拆解

我们用一个实际例子来说明。假设电机要从位置0走到位置100mm,最大速度100mm/s,加速度500mm/s²。整个过程是这样的:

  1. 匀加速段:速度从0线性增加到100mm/s,用时0.2秒,走了10mm
  2. 匀速段:以100mm/s跑80mm,用时0.8秒
  3. 匀减速段:速度从100mm/s降到0,用时0.2秒,走了10mm

总时间1.2秒,总位移100mm。你看,速度曲线画出来就是个梯形。

我的习惯:做运动规划时,我总会在纸上先画速度-时间图。图形出来了,参数就清楚了。梯形曲线最怕的就是距离太短,还没加速到目标速度就得减速——这种情况叫"三角曲线",后面会讲。

运动学公式推导

这部分是硬核内容,但别怕,我用最直白的方式讲。

设加速度为a,最大速度为v_max,总位移为S。三段分别用下标1、2、3表示:

匀加速段

加速度a恒定,初速度0,末速度v_max:

  • 时间:t₁ = v_max / a
  • 位移:S₁ = ½ · a · t₁² = v_max² / (2a)

匀速段

速度v_max恒定,加速度为0:

  • 时间:t₂ = S₂ / v_max
  • 位移:S₂ = S - S₁ - S₃

匀减速段

加速度-a(减速),初速度v_max,末速度0:

  • 时间:t₃ = v_max / a
  • 位移:S₃ = v_max² / (2a)

总时间:T = t₁ + t₂ + t₃ = 2·v_max/a + S₂/v_max

我曾经踩过的坑:有一次做多轴同步,我直接用上面的公式算时间,结果发现实际运动比理论慢了0.1秒。查了半天,原来是加减速时间算对了,但忽略了控制器内部的插补周期。所以,实际应用中一定要留余量,至少多算5%的时间。

位移与速度的几何关系

这个关系特别直观。你想想看,在速度-时间图上,曲线下方的面积就是位移。梯形面积怎么算?上底加下底乘高除以2?不对,那是梯形面积公式。这里更简单:

梯形面积 = 矩形面积 + 两个三角形面积

矩形面积 = v_max × t₂(匀速段位移)

三角形面积 = ½ × v_max × t₁(加速段位移)

所以总位移:S = v_max·t₂ + 2 × (½·v_max·t₁) = v_max·(t₁ + t₂ + t₃) - v_max·t₁

嗯,绕晕了?直接看下面的图就明白了。

时间 t 速度 v t₁ t₂ t₃ v_max 加速区 匀速区 减速区 位移 S = 梯形面积 = ½(v_max + v_max)·(t₁+t₂+t₃) - ½·v_max·t₁

上图就是典型的梯形速度曲线。加速区、匀速区、减速区一目了然。我个人习惯把加速和减速的斜率画成一样,这样对称,计算方便。但实际中,如果负载变化大,加减速时间可以不同。

实际应用中的参数选择

参数 影响 我的建议
加速度 a 越大,启停越快,但冲击也大 先按电机额定转矩的70%算,再实测调整
最大速度 v_max 决定匀速段效率 别超过电机额定转速的80%,留余量
总位移 S 决定是否出现三角曲线 如果 S < v_max²/a,自动降速

避坑指南:我曾经在一个项目中,为了赶节拍,把加速度设得很大。结果电机是跑得快了,但机械臂末端抖得厉害,定位精度从0.1mm掉到0.5mm。后来把加速度降了30%,精度就回来了。所以,加速度不是越大越好,要综合考虑机械刚性和负载惯量。

代码实现示例

下面是一个简单的梯形速度规划函数,用C语言写的。实际项目中我会加上滤波和异常处理,这里展示核心逻辑:

// 梯形速度规划 - 核心函数
// 输入:总位移S,最大速度v_max,加速度a
// 输出:各段时间和位移
void trapezoidal_plan(float S, float v_max, float a) {
    float t_acc = v_max / a;          // 加速时间
    float S_acc = 0.5 * a * t_acc * t_acc;  // 加速位移
    
    // 检查是否够距离加速到v_max
    if (2 * S_acc >= S) {
        // 三角曲线模式 - 到不了v_max
        float v_peak = sqrt(a * S);    // 实际能达到的最高速度
        t_acc = v_peak / a;
        S_acc = 0.5 * a * t_acc * t_acc;
        printf("三角曲线模式,峰值速度: %.2f\n", v_peak);
    } else {
        // 标准梯形模式
        float S_const = S - 2 * S_acc; // 匀速段位移
        float t_const = S_const / v_max;
        printf("梯形模式,匀速时间: %.2f\n", t_const);
    }
    
    printf("加速时间: %.2f, 加速位移: %.2f\n", t_acc, S_acc);
}

小技巧:实际调试时,我习惯先用上面的公式算出理论值,然后在示波器上抓速度曲线对比。如果实际曲线和理论偏差超过5%,说明要么电机力矩不够,要么机械有卡滞。这个方法帮我排查过好几次机械故障。

好了,梯形速度曲线的基础就这些。匀加速、匀速、匀减速三段式结构,配上运动学公式和几何关系,你已经掌握了核心。下一节我们会深入讨论梯形曲线的变种——三角曲线和带S形过渡的改进型。但今天先到这里,消化一下,动手算个例子试试。


专注资料整理