梯形加减速算法:原理介绍、速度曲线分析、加速度与减速度的对称性
梯形加减速,这个名字你一听就大概能猜到它的速度曲线长什么样——像个梯形。没错,这是运动控制里最基础、最常用的加减速策略。我刚开始做运动控制那会儿,第一个接触的就是它。说白了,梯形加减速就是让电机先匀加速,再匀速,最后匀减速,整个过程速度变化像爬坡、走平路、再下坡。
一、梯形加减速的原理
为什么需要加减速?你想想看,电机如果一启动就直接跑到目标速度,那冲击力有多大?轻则丢步,重则机械结构直接报废。梯形加减速的核心思想就是:让速度的变化率可控。
它的工作流程分三段:
- 加速段:以恒定加速度 a 从 0 加速到目标速度 Vmax
- 匀速段:以 Vmax 匀速运行
- 减速段:以恒定减速度 a(通常等于加速度)从 Vmax 减速到 0
这里有个关键点——加速度和减速度的对称性。我个人习惯把加速度和减速度设成一样大,这样计算简单,曲线也漂亮。但并不是所有场合都适合对称,后面我会细说。
核心公式:
加速段距离:S_acc = Vmax² / (2 × a)
减速段距离:S_dec = Vmax² / (2 × a)
匀速段距离:S_const = S_total - S_acc - S_dec
匀速段时间:T_const = S_const / Vmax
二、速度曲线分析
梯形速度曲线长什么样?我画个图给你看,你就明白了。
这张图很直观吧?红色是加速段,蓝色是匀速段,绿色是减速段。注意看,加速和减速的斜率是一样的——这就是对称性。斜率代表加速度的大小,斜率越陡,加速度越大。
为什么会这样设计?其实很简单:加速和减速的物理过程是对称的。加速时电机出力克服惯性,减速时电机出力被惯性反推。如果加速度和减速度一样,电机承受的力就是对称的,对机械结构最友好。
三、加速度与减速度的对称性
对称性这个话题,我得好好跟你聊聊。很多初学者觉得对称就是理所当然的,但实际项目中,情况往往没那么简单。
我的经验:
在大多数通用运动控制场景中,我建议保持加速度 = 减速度。这样做的好处是:
- 计算简单,代码好写
- 电机受力对称,寿命更长
- 速度曲线平滑,冲击小
但是,有些场合必须打破对称性。我记得有一次做垂直升降机构,上升时电机要克服重力,下降时重力反而帮忙。这时候如果还用对称的加减速,上升时加速太慢,下降时减速又不够。后来我把上升加速度调大,下降减速度调小,才解决了问题。
什么时候该用非对称?我列个表给你参考:
| 应用场景 | 推荐策略 | 原因 |
|---|---|---|
| 水平运动(通用) | 对称(a = d) | 受力均衡,简单可靠 |
| 垂直升降(上升重载) | 加速 > 减速 | 克服重力需要更大加速力 |
| 垂直升降(下降重载) | 减速 > 加速 | 重力辅助,需要更强减速 |
| 高速高精度定位 | 减速 > 加速 | 防止过冲,提高定位精度 |
| 柔性材料输送 | 加速 < 减速 | 避免材料拉伸或褶皱 |
避坑指南:
我曾经在一个项目中,为了追求速度,把加速度设得特别大,减速度却很小。结果电机加速时抖得厉害,减速时又滑出去老远。后来才明白,加速度受电机扭矩限制,减速度受机械惯性和制动能力限制。两个参数必须分别标定,不能拍脑袋设。
四、梯形加减速的代码实现
说了这么多理论,来点实际的。下面是我常用的梯形加减速计算函数,C语言风格,移植性很好:
// 梯形加减速参数计算
typedef struct {
float v_max; // 目标最大速度
float a; // 加速度
float d; // 减速度
float s_total; // 总位移
float s_acc; // 加速段位移
float s_dec; // 减速段位移
float s_const; // 匀速段位移
float t_acc; // 加速段时间
float t_dec; // 减速段时间
float t_const; // 匀速段时间
} TrapezoidProfile;
void CalcTrapezoidProfile(TrapezoidProfile *p) {
// 计算加速和减速所需位移
p->s_acc = (p->v_max * p->v_max) / (2.0f * p->a);
p->s_dec = (p->v_max * p->v_max) / (2.0f * p->d);
// 判断是否能达到最大速度
if (p->s_acc + p->s_dec <= p->s_total) {
// 能达到最大速度,有匀速段
p->s_const = p->s_total - p->s_acc - p->s_dec;
p->t_acc = p->v_max / p->a;
p->t_dec = p->v_max / p->d;
p->t_const = p->s_const / p->v_max;
} else {
// 达不到最大速度,三角形曲线
// 需要重新计算实际能达到的最高速度
float v_peak = sqrtf(2.0f * p->s_total *
(p->a * p->d) / (p->a + p->d));
p->s_acc = (v_peak * v_peak) / (2.0f * p->a);
p->s_dec = (v_peak * v_peak) / (2.0f * p->d);
p->s_const = 0;
p->t_acc = v_peak / p->a;
p->t_dec = v_peak / p->d;
p->t_const = 0;
}
}
这段代码我用了好多年,核心逻辑就两点:先算能不能跑到目标速度,能跑就按梯形算,跑不到就按三角形算(没有匀速段)。你注意看,我用了 sqrtf 来计算三角形模式下的峰值速度,这个公式是从能量守恒推导出来的,很实用。
五、实际应用中的注意事项
梯形加减速虽然简单,但坑也不少。我踩过的几个,分享给你:
- 加速度不能无限大:电机扭矩有限,加速度太大直接堵转。我一般留 20% 的余量。
- 减速度受制动方式影响:如果是电阻制动,减速度可以大一些;如果是回馈制动,要考虑母线电压。
- 短距离运动要小心:位移太短时,可能还没加速到目标速度就要减速了,这时候就是三角形曲线。
- 对称性不是必须的:别被「对称」两个字框住,实际项目该调就调。
一句话总结:
梯形加减速是运动控制的入门必修课。它简单、可靠、容易理解。对称性在大多数场合都适用,但遇到特殊工况,别犹豫,该打破就打破。记住,理论是死的,应用是活的。
嗯,梯形加减速就聊到这儿。下一章我们聊聊 S 形加减速,那个曲线更平滑,但计算也更复杂。到时候再细说。
公众号:蓝海资料掘金营,微信deep3321