4、梯形速度规划:梯形速度曲线的原理,加速-匀速-减速三段式,参数计算

好,咱们今天聊聊梯形速度规划。这名字听着挺硬核,其实说白了就是让机器人或者电机,先加速跑一段,再匀速跑一段,最后减速停下来。嗯,就像你开车一样——红灯起步踩油门,路况好了稳住速度,快到路口了提前松油门刹车。

我在做第一个运动控制项目时,用的就是梯形速度曲线。当时觉得这东西太简单了,结果一跑起来,末端抖动得厉害。后来才发现,不是梯形曲线不好,是我参数没算对。今天咱们就把这块彻底讲透。

4.1 梯形速度曲线的核心思想

梯形速度曲线,顾名思义,速度-时间图像是个梯形。它由三段组成:

  • 加速段:从0加速到目标速度 \( v_{max} \),加速度为 \( a \)
  • 匀速段:以 \( v_{max} \) 匀速运动,加速度为0
  • 减速段:从 \( v_{max} \) 减速到0,减速度为 \( -a \)(通常与加速段对称)

你想想看,为什么用梯形而不是直接加速到目标速度就停?因为实际系统中,电机有最大加速度限制,驱动器有最大速度限制。梯形曲线刚好把这两个约束都考虑进去了。

核心公式:

加速段时间:\( t_a = \frac{v_{max}}{a} \)

加速段位移:\( s_a = \frac{1}{2} a t_a^2 = \frac{v_{max}^2}{2a} \)

总位移:\( s_{total} = s_a + s_v + s_d \)

4.2 三段式详解

加速段

从静止开始,以恒定加速度 \( a \) 加速到 \( v_{max} \)。这段的位移公式我刚刚写了。这里有个坑——加速度不能超过电机或驱动器的最大允许值。我在一个六轴机器人项目里,就因为加速度设得太大,导致电机过流报警。后来老老实实查了 datasheet,把加速度降到额定值的80%,问题就解决了。

匀速段

速度保持 \( v_{max} \) 不变。这段的位移取决于总位移减去加减速段的位移。如果总位移太小,可能根本没有匀速段——这就是所谓的「三角形速度曲线」,我们后面会讲。

减速段

与加速段对称,从 \( v_{max} \) 减速到0。减速度通常也取 \( a \)。注意,如果减速段有负载变化(比如垂直运动的升降台),减速度可能需要单独调整。

4.3 参数计算——手把手教你算

假设我们已知:总位移 \( S \),最大速度 \( v_{max} \),加速度 \( a \)。

第一步:判断是否有匀速段

先算加速段和减速段所需的最小位移:

s_min = v_max^2 / a   // 加速+减速的总位移

如果 \( S \geq s_min \),有匀速段。否则,没有匀速段,需要重新计算最大速度。

第二步:有匀速段的情况

t_a = v_max / a
t_d = v_max / a
s_a = 0.5 * a * t_a^2
s_d = 0.5 * a * t_d^2
s_v = S - s_a - s_d
t_v = s_v / v_max
总时间 T = t_a + t_v + t_d

第三步:没有匀速段的情况

这时实际能达到的最大速度 \( v_{peak} < v_{max} \)。

v_peak = sqrt(a * S)   // 加速到一半就减速
t_a = v_peak / a
t_d = v_peak / a
总时间 T = 2 * t_a

我的小技巧:实际编程时,我习惯先判断有没有匀速段,再分情况计算。这样代码逻辑清晰,不容易出错。另外,记得加一个保护——如果 \( S \) 或 \( a \) 为0,直接返回错误。

4.4 梯形曲线的优缺点

优点 缺点
实现简单,计算量小 加速度在拐点处突变,产生冲击
参数物理意义明确 不适合高精度、低抖动的场景
适合大多数工业应用 加减速段对称时不够灵活

我曾经在一个高速分拣机器人上用过梯形曲线。分拣周期只有0.8秒,梯形曲线算出来加减速时间占了大半,匀速段几乎没了。后来换成了S形曲线,抖动小了很多。但如果是传送带这种对冲击不敏感的场景,梯形曲线完全够用。

4.5 避坑指南

我曾经踩过的坑:

  • 忘记考虑电机最大加速度——导致过流或丢步
  • 减速段和加速段用同一个加速度——垂直运动时负载方向不同,减速度应该更大
  • 总位移太小时强行用梯形——其实应该用三角形曲线
  • 浮点数精度问题——在嵌入式系统里,建议用定点数或double

4.6 代码示例(Python)

def trapezoidal_profile(S, v_max, a):
    """
    梯形速度规划
    :param S: 总位移
    :param v_max: 最大速度
    :param a: 加速度(假设加减速对称)
    :return: 各段时间和位移
    """
    if S <= 0 or a <= 0:
        raise ValueError("位移和加速度必须为正")
    
    # 判断是否有匀速段
    s_min = v_max**2 / a
    if S >= s_min:
        # 有匀速段
        t_a = v_max / a
        t_d = v_max / a
        s_a = 0.5 * a * t_a**2
        s_d = 0.5 * a * t_d**2
        s_v = S - s_a - s_d
        t_v = s_v / v_max
        return {
            't_a': t_a, 't_v': t_v, 't_d': t_d,
            's_a': s_a, 's_v': s_v, 's_d': s_d,
            'total_time': t_a + t_v + t_d
        }
    else:
        # 无匀速段,三角形曲线
        v_peak = (a * S) ** 0.5
        t_a = v_peak / a
        t_d = v_peak / a
        s_a = 0.5 * a * t_a**2
        s_d = 0.5 * a * t_d**2
        return {
            't_a': t_a, 't_v': 0, 't_d': t_d,
            's_a': s_a, 's_v': 0, 's_d': s_d,
            'v_peak': v_peak,
            'total_time': t_a + t_d
        }

4.7 知识体系图

下面这张图帮你理清梯形速度规划的核心逻辑:

梯形速度规划知识体系 梯形速度曲线 加速段 (t_a, s_a) 匀速段 (t_v, s_v) 减速段 (t_d, s_d) 参数计算:判断有无匀速段 → 分情况计算 t, s, v 有匀速段:t_a = v_max / a 无匀速段:v_peak = sqrt(a * S) 核心逻辑:三段式结构 + 参数计算 + 边界条件判断

嗯,梯形速度规划就讲到这里。它虽然简单,但却是很多复杂轨迹规划的基础。我个人建议,初学者先把梯形曲线吃透,再去碰S形曲线、多项式曲线。地基打牢了,后面才稳。

可可精品资料库