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 知识体系图
下面这张图帮你理清梯形速度规划的核心逻辑:
嗯,梯形速度规划就讲到这里。它虽然简单,但却是很多复杂轨迹规划的基础。我个人建议,初学者先把梯形曲线吃透,再去碰S形曲线、多项式曲线。地基打牢了,后面才稳。
可可精品资料库