梯形速度规划:从入门到实战
大家好,我是老张。今天咱们聊聊梯形速度规划。
说实话,梯形速度曲线是运动控制里最基础、最常用的规划方式。我入行那会儿,第一个项目就是给一台三轴龙门机器人做速度规划,用的就是梯形曲线。那时候不懂什么S形、多项式,梯形曲线帮我解决了大问题。
梯形速度曲线,说白了就是让速度先匀加速、再匀速、最后匀减速。你想想看,这就像开车——先踩油门加速,到了巡航速度就稳住,快到目的地了再踩刹车。简单直观,容易理解。
梯形速度曲线的数学模型
我们先看数学表达。梯形曲线有三个阶段:
- 加速阶段:速度从0线性增加到目标速度Vmax
- 匀速阶段:保持Vmax运行
- 减速阶段:速度从Vmax线性减到0
对应的位移公式是这样的:
加速阶段:s(t) = 0.5 * a * t²,0 ≤ t ≤ ta
匀速阶段:s(t) = s_acc + Vmax * (t - ta),ta ≤ t ≤ ta + tc
减速阶段:s(t) = s_acc + s_const + Vmax * (t - ta - tc) - 0.5 * d * (t - ta - tc)²,ta + tc ≤ t ≤ T
其中a是加速度,d是减速度,ta是加速时间,tc是匀速时间,T是总时间。
嗯,这里要注意:加速度和减速度可以不一样。我在项目中遇到过,有些负载在加速和减速时表现完全不同,这时候就得分别设置。
加速/匀速/减速阶段计算
实际应用中,我们最关心的是:给定总位移S和最大速度Vmax,怎么算出各阶段的时间?
我习惯分两种情况讨论:
情况一:能跑到最大速度
如果位移足够大,就能完整跑完三个阶段。计算步骤:
- 先算加速距离:s_acc = Vmax² / (2 * a)
- 再算减速距离:s_dec = Vmax² / (2 * d)
- 匀速距离:s_const = S - s_acc - s_dec
- 匀速时间:tc = s_const / Vmax
- 总时间:T = Vmax/a + tc + Vmax/d
情况二:跑不到最大速度
位移不够大时,还没加速到Vmax就得开始减速了。这时候是三角形速度曲线。计算稍微复杂点:
- 先假设最大速度Vpeak,满足:Vpeak²/(2a) + Vpeak²/(2d) = S
- 解出Vpeak = sqrt(2 * S * a * d / (a + d))
- 加速时间:ta = Vpeak / a
- 减速时间:td = Vpeak / d
核心要点:判断能不能跑到Vmax,就看S是否大于Vmax²/(2a) + Vmax²/(2d)。小于的话,就是三角形曲线。
代码实现示例
下面是我常用的梯形规划函数,C语言风格,移植性很好:
typedef struct {
float accel; // 加速度
float decel; // 减速度
float max_vel; // 最大速度
float total_dist; // 总位移
float t_acc; // 加速时间
float t_const; // 匀速时间
float t_dec; // 减速时间
float total_time; // 总时间
} TrapezoidProfile;
void Trapezoid_Plan(TrapezoidProfile *profile) {
float s_acc = profile->max_vel * profile->max_vel / (2 * profile->accel);
float s_dec = profile->max_vel * profile->max_vel / (2 * profile->decel);
if (profile->total_dist >= s_acc + s_dec) {
// 能跑到最大速度
profile->t_acc = profile->max_vel / profile->accel;
profile->t_dec = profile->max_vel / profile->decel;
profile->t_const = (profile->total_dist - s_acc - s_dec) / profile->max_vel;
} else {
// 三角形曲线
float v_peak = sqrt(2 * profile->total_dist * profile->accel * profile->decel
/ (profile->accel + profile->decel));
profile->t_acc = v_peak / profile->accel;
profile->t_dec = v_peak / profile->decel;
profile->t_const = 0;
}
profile->total_time = profile->t_acc + profile->t_const + profile->t_dec;
}
个人经验:实际项目中,我习惯在规划前加一个判断——如果位移小于某个阈值(比如1mm),直接走点对点运动,不做速度规划。这样可以避免频繁启停带来的抖动。
梯形规划的局限性分析
梯形曲线最大的问题是什么?冲击大。
为什么会这样?因为加速度在阶段切换点处是突变的。你想想看:
- 启动瞬间:加速度从0跳变到a
- 加速结束:加速度从a跳变到0
- 减速开始:加速度从0跳变到-d
- 停止瞬间:加速度从-d跳变到0
每次跳变都对应一个冲击(Jerk = 加速度变化率)。冲击大的后果:
- 机械振动:龙门机器人结构刚性有限,冲击会激发共振
- 定位精度下降:振动导致末端抖动,影响最终定位
- 电机过载:频繁的大冲击电流会缩短驱动器寿命
- 噪音大:机械撞击声,听着就不舒服
避坑指南:我曾经在一个高速贴片机项目里用了梯形规划,结果机器跑起来整个机架都在抖。后来换成S形曲线,抖动问题才解决。所以,如果你的应用对振动敏感(比如精密装配、高精度定位),梯形曲线可能不是最佳选择。
什么时候该用梯形规划?
虽然梯形曲线有冲击问题,但它也有优势:
| 优势 | 劣势 |
|---|---|
| 计算简单,实时性好 | 加速度突变,冲击大 |
| 参数少,调试方便 | 容易激发机械共振 |
| 速度利用率高 | 不适合高精度场景 |
| 适合大行程、低负载 | 噪音相对较大 |
我个人建议:
- 大行程搬运(比如1米以上),负载轻,用梯形没问题
- 精密定位、高速高加速度场景,考虑S形或多项式曲线
- 如果必须用梯形,可以适当降低加速度,或者加滤波
梯形速度规划知识体系
下面这张图总结了梯形速度规划的核心内容:
梯形速度规划是入门必备,但绝不是终点。我建议初学者先吃透梯形,理解加速、匀速、减速的物理含义,然后再去学更高级的规划方法。基础打牢了,后面学什么都快。
好了,梯形速度规划就聊到这儿。记住:简单不等于没用,梯形曲线在工业现场依然有大量应用。关键是要知道它的优缺点,选对场景。
公众号:蓝海资料掘金营,微信deep3321