4、梯形速度规划:梯形速度曲线的数学模型、加速/匀速/减速阶段计算
梯形速度曲线,说白了就是运动控制里最经典、最常用的速度规划方式。你想想看,一个电机从静止加速到目标速度,跑一段匀速,再减速停下来——整个过程的速度-时间图像就像一个梯形,所以叫梯形速度曲线。
我个人习惯把这种规划叫做「三段式」:加速段、匀速段、减速段。简单、直观、计算量小,非常适合点位运动(Point-to-Point Motion)。
4.1 梯形速度曲线的数学模型
先看一个典型的梯形速度曲线长什么样。横轴是时间 t,纵轴是速度 v。
图中 t₀ 到 t₁ 是加速段,t₁ 到 t₂ 是匀速段,t₂ 到 t₃ 是减速段。整个运动的总时间就是 t₃ - t₀。
核心参数就这几个:
- v_max:最大速度(目标速度)
- a:加速度(加速段和减速段通常取相同值)
- s_total:总位移
- t_acc:加速时间
- t_dec:减速时间
- t_const:匀速时间
关键公式:
加速段位移:s_acc = ½ · a · t_acc²
匀速段位移:s_const = v_max · t_const
减速段位移:s_dec = ½ · a · t_dec²
总位移:s_total = s_acc + s_const + s_dec
4.2 加速阶段计算
加速阶段从速度 0 开始,以恒定加速度 a 加速到 v_max。这个阶段的时间 t_acc 怎么算?
很简单:
t_acc = v_max / a
加速段的位移:
s_acc = 0.5 * a * t_acc² = 0.5 * v_max² / a
我在项目中遇到过一个问题:有些工程师直接拿 v_max 和 a 算 t_acc,结果发现总位移不够,梯形变成了三角形。嗯,这里要注意——如果总位移太小,可能根本跑不到 v_max 就得开始减速了。
避坑指南:我曾经在一个贴片机项目里,因为没检查总位移是否足够,导致加速还没完成就开始减速,速度曲线变成了三角形。后来我养成了一个习惯:先判断能不能达到 v_max,再决定用梯形还是三角形规划。
4.3 匀速阶段计算
匀速阶段相对简单。如果总位移足够大,加速到 v_max 后,会以 v_max 匀速跑一段。
匀速时间怎么算?
s_const = s_total - s_acc - s_dec
t_const = s_const / v_max
这里有个隐含条件:s_const 必须大于等于 0。如果算出来是负数,说明总位移不够,跑不到 v_max,这时候就要用三角形速度曲线了。
你想想看,如果 s_const 是负数,意味着什么?意味着你还没加速到 v_max 就得开始减速了。这种情况在实际工程中很常见,尤其是短距离运动。
4.4 减速阶段计算
减速阶段和加速阶段是对称的。假设减速加速度也是 a(通常如此),那么:
t_dec = v_max / a
s_dec = 0.5 * a * t_dec² = 0.5 * v_max² / a
减速段从 t₂ 时刻开始,到 t₃ 时刻结束。速度从 v_max 线性下降到 0。
减速段的实时速度:
v(t) = v_max - a * (t - t₂) (t₂ ≤ t ≤ t₃)
减速段的实时位置:
s(t) = s(t₂) + v_max * (t - t₂) - 0.5 * a * (t - t₂)²
注意:减速段的终点位置必须精确等于目标位置。如果计算有误差,电机要么过冲,要么不到位。我见过一个案例,因为浮点精度问题,减速段终点差了 0.01mm,结果在精密装配中直接导致零件压坏。
4.5 完整计算流程
把三个阶段串起来,完整的梯形速度规划计算流程如下:
- 输入参数:总位移 s_total、最大速度 v_max、加速度 a
- 计算加速/减速时间:t_acc = t_dec = v_max / a
- 计算加速/减速位移:s_acc = s_dec = 0.5 * v_max² / a
- 判断是否达到 v_max:
- 如果 s_acc + s_dec ≤ s_total:可以到达 v_max,有匀速段
- 如果 s_acc + s_dec > s_total:无法到达 v_max,使用三角形规划
- 计算匀速段:s_const = s_total - s_acc - s_dec,t_const = s_const / v_max
- 输出时间节点:t₀=0, t₁=t_acc, t₂=t_acc+t_const, t₃=t_acc+t_const+t_dec
下面是一个简单的 Python 实现:
def trapezoidal_profile(s_total, v_max, a):
# 计算加速/减速参数
t_acc = v_max / a
s_acc = 0.5 * a * t_acc**2
s_dec = s_acc
# 判断是否可达 v_max
if s_acc + s_dec <= s_total:
# 梯形规划
s_const = s_total - s_acc - s_dec
t_const = s_const / v_max
t_total = 2 * t_acc + t_const
return {
'type': 'trapezoidal',
't0': 0, 't1': t_acc, 't2': t_acc + t_const, 't3': t_total,
'v_max': v_max, 'a': a
}
else:
# 三角形规划(达不到 v_max)
t_acc_tri = (s_total / a) ** 0.5
v_peak = a * t_acc_tri
return {
'type': 'triangular',
't0': 0, 't1': t_acc_tri, 't2': 2 * t_acc_tri,
'v_peak': v_peak, 'a': a
}
个人经验:我建议在实际项目中,把梯形规划封装成一个独立的函数,输入输出接口标准化。这样不管是伺服电机、步进电机还是直线电机,都能复用同一套逻辑。我在做多轴联动时,每个轴都调同一个规划函数,省了不少事。
4.6 梯形规划的优缺点
| 优点 | 缺点 |
|---|---|
| 计算简单,实时性好 | 加速度突变,有冲击 |
| 参数直观,容易调试 | 加减速段连接处有 jerk 无限大 |
| 适合点位运动 | 高速时振动较大 |
| 代码实现容易 | 不适合对平滑度要求高的场景 |
说白了,梯形规划就是「够用就好」的典型代表。如果你的应用对运动平滑度要求不高,比如传送带、简单的搬运、点胶机等,梯形规划完全够用。但如果是高精度加工、激光切割、3D打印这些对轨迹平滑度有要求的场景,我建议你考虑 S 形速度规划。
嗯,关于梯形速度规划,核心内容就这些。记住三个关键点:加速段、匀速段、减速段的计算逻辑,以及判断是否可达 v_max 的条件。下次遇到需要做速度规划的项目,先拿梯形规划试试,简单可靠,不容易出错。
公众号:蓝海资料掘金营,微信deep3321