4、速度规划与控制:梯形速度曲线、S形速度曲线、加加速度(Jerk)约束、前瞻控制
速度规划,说白了就是让电机按照我们想要的方式跑起来。你想想看,如果直接给电机一个阶跃速度指令,那冲击力有多大?轻则抖动,重则丢步甚至损坏机械结构。我在项目中见过不少新手,上来就写个速度跳变,结果机器一启动就咣当一下,整个工作台都在抖。
这一章,我们来聊聊速度规划的几种经典方法。我个人习惯把它们分成三个层次:梯形曲线入门、S形曲线进阶、加加速度约束是精细活,而前瞻控制则是把这些串起来的灵魂。
4.1 梯形速度曲线
梯形曲线是最简单的速度规划方式。它由三个阶段组成:匀加速、匀速、匀减速。形状像个梯形,所以叫这个名字。
为什么它简单?因为加速度是常数,计算量极小。在早期的嵌入式系统里,CPU资源紧张,梯形曲线几乎是唯一的选择。
核心公式:
- 加速段:v(t) = v₀ + a·t
- 匀速段:v(t) = v_max
- 减速段:v(t) = v_max - a·t
但梯形曲线有个硬伤——加速度突变。在加速开始和结束的时刻,加速度从0瞬间跳到a,或者从a瞬间跳回0。这种突变会产生冲击力,也就是我们常说的“急动”。
注意:梯形曲线不适合高精度、高速度的场合。比如数控机床、机器人关节,用梯形曲线很容易引起机械共振。我曾经在一个激光切割项目里试过,结果切割边缘全是锯齿纹,后来换成S形曲线才解决。
4.2 S形速度曲线
S形曲线解决了梯形曲线的加速度突变问题。它的加速度不是常数,而是线性变化的。也就是说,加速度本身也有一个“加速”和“减速”的过程。
S形曲线通常分为七个阶段:
- 加加速度段(加速度从0增加到a_max)
- 匀加速段(加速度保持a_max)
- 减加速度段(加速度从a_max减小到0)
- 匀速段(速度保持v_max)
- 加减速度段(加速度从0减小到-a_max)
- 匀减速段(加速度保持-a_max)
- 减减速度段(加速度从-a_max增加到0)
你看,这七个阶段里,加速度的变化是连续的,没有突变。所以S形曲线的运动更平滑,冲击更小。
我的经验:在实际项目中,我一般不会用完整的七段S形曲线。如果行程很短,可能连匀速段都没有,那就变成五段甚至三段。关键是保证加速度连续变化,而不是非要凑齐七个阶段。
下面是一个简单的S形曲线速度规划代码示例:
// S形曲线速度规划 - 简化版
typedef struct {
float v0; // 起始速度
float v_max; // 最大速度
float v_end; // 结束速度
float a_max; // 最大加速度
float j_max; // 最大加加速度
float t_acc; // 加速段时间
float t_dec; // 减速段时间
float t_const; // 匀速段时间
} SCurveProfile;
void SCurvePlan(SCurveProfile *profile, float total_distance) {
// 计算加速段和减速段所需时间
float t_acc = (profile->v_max - profile->v0) / profile->a_max;
float t_dec = (profile->v_max - profile->v_end) / profile->a_max;
// 计算加速段和减速段走过的距离
float s_acc = (profile->v0 + profile->v_max) * t_acc / 2.0f;
float s_dec = (profile->v_max + profile->v_end) * t_dec / 2.0f;
// 剩余距离为匀速段
float s_const = total_distance - s_acc - s_dec;
if (s_const > 0) {
// 有匀速段
profile->t_const = s_const / profile->v_max;
} else {
// 没有匀速段,需要重新计算最大速度
// 这里省略详细计算...
}
profile->t_acc = t_acc;
profile->t_dec = t_dec;
}
4.3 加加速度(Jerk)约束
加加速度,英文叫Jerk,是加速度的变化率。单位是m/s³。你想想看,加速度的变化如果太剧烈,电机和机械结构会承受很大的冲击力。
为什么要约束Jerk?
- 保护机械结构:过大的Jerk会导致齿轮撞击、皮带打滑、丝杠磨损。
- 减少振动:Jerk越小,运动越平滑,振动越小。
- 提高定位精度:振动小了,到位后的稳定时间就短,整体效率反而更高。
Jerk约束的核心思想:在速度规划的每个阶段,都要保证加速度的变化率不超过设定的最大值。说白了,就是让加速度慢慢变,而不是突然变。
我记得有一次调试一个高速贴片机,速度已经很快了,但贴装精度总是不达标。后来用示波器抓了一下加速度曲线,发现Jerk值高得吓人。把Jerk限制到原来的三分之一后,精度一下子就上来了。嗯,这里要注意,Jerk太小也不行,否则加减速时间太长,影响生产效率。
4.4 前瞻控制
前瞻控制,英文叫Look-ahead。它解决的是这样一个问题:当运动路径上有多个拐点或速度变化点时,如何提前规划速度,避免在拐点处急刹车或过冲。
你可以把前瞻控制想象成一个“预判系统”。它提前读取未来N个路径点,计算每个点的允许速度,然后反向规划出一条平滑的速度曲线。
我的习惯:前瞻窗口的长度很关键。窗口太短,预判不足,容易在拐点处急停;窗口太长,计算量大,实时性差。一般我取10-20个路径点作为前瞻窗口,具体要看CPU性能和路径复杂度。
前瞻控制的基本流程:
- 读取未来N个路径点
- 计算每个路径点的曲率或转角
- 根据曲率计算该点的最大允许速度
- 从最后一个点反向规划速度,确保每个点都能以允许速度通过
- 正向执行速度规划
下面是一个前瞻控制的流程图:
避坑指南:我曾经在一个五轴联动项目里,前瞻窗口设得太小,结果在连续小线段路径上频繁加减速,效率反而比不用前瞻还低。后来把窗口加大到30个点,同时加入了路径平滑预处理,效果才出来。所以前瞻不是万能的,它需要和路径预处理配合使用。
4.5 三种速度规划的对比
| 特性 | 梯形曲线 | S形曲线 | 加加速度约束 |
|---|---|---|---|
| 加速度连续性 | 不连续(有突变) | 连续 | 连续且可控 |
| 计算复杂度 | 低 | 中 | 高 |
| 运动平滑度 | 差 | 好 | 最好 |
| 适用场合 | 低精度、低成本 | 通用工业控制 | 高精度、高速 |
| 对机械冲击 | 大 | 小 | 极小 |
实际项目中怎么选?我个人建议:如果只是简单的点位运动,梯形曲线够用;如果对运动平滑度有要求,上S形曲线;如果做的是高端设备,比如半导体设备、精密加工,那必须上Jerk约束加前瞻控制。
好了,这一章的内容就到这里。速度规划是运动控制的基石,看似简单,但里面的门道不少。梯形曲线是入门,S形曲线是进阶,Jerk约束是精细活,前瞻控制则是把这些串起来的灵魂。你在实际项目中多试试,慢慢就能找到感觉。