4. 梯形速度规划:从数学到实战
梯形速度曲线,这名字听着挺学术,其实说白了就是「加速-匀速-减速」三段式。我刚开始做运动控制那会儿,第一个接触的就是它。为什么?因为它简单、直观、好调。
你想想看,一个电机从静止启动,直接给最大速度会怎样?轻则抖动,重则丢步。梯形规划就是给速度加个「缓启动」和「缓停止」的过程。嗯,咱们今天就把它的数学模型、计算方法、还有坑,一次性说透。
4.1 梯形速度曲线的数学模型
先看一个典型的梯形速度曲线长什么样:
图中很清晰:三段直线,斜率代表加速度。加速段斜率正,减速段斜率负,匀速段斜率为零。数学上,速度 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 优缺点分析
| 优点 | 缺点 |
|---|---|
|
|
我的经验:梯形规划最适合步进电机开环控制。我做过一个贴片机项目,用梯形规划跑了两年,没出过问题。但如果是伺服电机带负载,尤其是大惯量负载,梯形规划的冲击感会很明显。
避坑指南:我曾经在减速段没处理好,导致电机过冲。原因是减速开始时间算晚了,速度还没降到零就到目标位置了。解决办法是:在减速段每步都算一下「剩余距离」,如果剩余距离小于当前速度对应的刹车距离,就强制进入减速。
4.4 什么时候该用梯形规划?
说白了,梯形规划适合「够用就行」的场景:
- 对启停冲击不敏感:比如传送带、简单的XY平台
- 计算资源有限:8位单片机、低端DSP
- 调试周期短:原型验证、快速打样
- 速度变化不频繁:点对点运动,不是连续轨迹
反过来,如果要求平滑、无抖动、高精度,那就得上S形曲线或者多项式规划了。这个咱们后面章节会细讲。
最后说一句:梯形规划虽然简单,但它是理解所有速度规划的基础。你把它吃透了,后面学S形、Jerk控制都会轻松很多。我当年就是先啃透梯形,再一步步往上走的。
公众号:蓝海资料掘金营,微信deep3321