4. 梯形速度规划:梯形速度曲线原理、加速段/匀速段/减速段计算、S形速度曲线简介、实际项目中的选型考量
速度规划,说白了就是告诉电机「你该怎么跑」。在运动控制里,梯形速度曲线是最经典、最基础、也最常用的一种。我入行那会儿,第一个独立调试的项目用的就是梯形速度规划。当时觉得这东西太简单了,不就是加速、匀速、减速三段嘛。结果真上了设备,发现坑比想象的多。
今天咱们就把梯形速度曲线彻底讲透。从原理到计算,再到实际选型,我会把我在项目里踩过的坑、总结的经验都摊开来说。
4.1 梯形速度曲线的原理
梯形速度曲线,顾名思义,速度随时间变化的形状像个梯形。它由三段组成:加速段、匀速段、减速段。
你想想看,一个电机从静止开始,先以恒定加速度加速到目标速度,然后保持这个速度匀速跑一段,最后以恒定减速度减速到零。整个过程的速度曲线就是梯形。
核心参数:
- Vmax:最大速度(目标速度)
- Acc:加速度
- Dec:减速度
- Total Distance:总位移
这里有个关键点:加速度和减速度可以不一样。我在做一台高速贴片机时,就发现加速段电机负载轻,可以加得快;但减速段带着大惯量负载,必须减得慢,否则会过冲。所以实际项目中,Acc 和 Dec 往往是独立设置的。
下面这张图,把梯形速度规划的完整流程画出来了。你可以看到,从输入参数到最终输出位置指令,每一步都有明确的逻辑。
4.2 三段计算:加速段、匀速段、减速段
好,咱们来算一算。假设总位移为 S,最大速度为 Vmax,加速度为 Acc,减速度为 Dec。
4.2.1 加速段
加速时间:t_acc = Vmax / Acc
加速段位移:S_acc = 0.5 * Acc * t_acc² = Vmax² / (2 * Acc)
4.2.2 减速段
减速时间:t_dec = Vmax / Dec
减速段位移:S_dec = 0.5 * Dec * t_dec² = Vmax² / (2 * Dec)
4.2.3 匀速段
匀速段位移:S_const = S - S_acc - S_dec
匀速段时间:t_const = S_const / Vmax
注意:如果 S_const < 0,说明总位移太短,根本跑不到 Vmax。这时候就要退化成两段式:加速到某个中间速度后直接减速。我曾经在一个点对点搬运项目里遇到过这种情况,当时没检查 S_const 的正负,结果算出来负的时间,电机直接报错。从那以后,我每次写梯形规划代码,第一件事就是判断 S_const 是否大于等于零。
4.2.4 两段式(三角形速度曲线)
当无法达到 Vmax 时,实际能达到的最高速度 V_peak 需要重新计算:
V_peak = sqrt(2 * S * (Acc * Dec) / (Acc + Dec))
然后加速时间:t_acc = V_peak / Acc
减速时间:t_dec = V_peak / Dec
总时间:t_total = t_acc + t_dec
我的经验:两段式在短距离频繁启停的场景下非常常见。比如我做过的一个小型分拣机器人,每次移动距离只有 50mm,Vmax 设到 1m/s 根本跑不起来,实际 V_peak 只有 0.3m/s 左右。这时候用两段式反而更平滑,效率也更高。
4.3 梯形规划的代码实现
下面是一个简单的梯形速度规划函数。它接受目标位置、最大速度、加速度、减速度,返回每个插补周期的位置指令。
def trapezoidal_plan(target_pos, Vmax, Acc, Dec, dt):
"""
梯形速度规划
target_pos: 目标位置(相对位移)
Vmax: 最大速度
Acc: 加速度
Dec: 减速度
dt: 插补周期
返回: 位置列表
"""
# 1. 计算加速/减速段位移
S_acc = Vmax**2 / (2 * Acc)
S_dec = Vmax**2 / (2 * Dec)
S_const = target_pos - S_acc - S_dec
# 2. 判断是否达到Vmax
if S_const >= 0:
# 三段式
t_acc = Vmax / Acc
t_dec = Vmax / Dec
t_const = S_const / Vmax
t_total = t_acc + t_const + t_dec
else:
# 两段式
V_peak = math.sqrt(2 * target_pos * (Acc * Dec) / (Acc + Dec))
t_acc = V_peak / Acc
t_dec = V_peak / Dec
t_total = t_acc + t_dec
# 3. 生成位置序列(此处省略插补细节)
# 实际项目中需要按dt离散化,并分段计算位置
return pos_list
关键点:实际项目中,梯形规划通常不是一次性算完所有位置,而是在每个插补周期(比如 1ms)实时计算当前应处的位置。这样做的好处是:可以随时响应急停、速度变更等外部指令。
4.4 S形速度曲线简介
梯形速度曲线虽然简单,但它有一个硬伤:加速度在切换点处突变。加速段结束时,加速度从 Acc 瞬间降到 0;减速段开始时,加速度从 0 瞬间跳到 -Dec。这种突变会产生冲击力,也就是我们常说的「急动度(Jerk)」。
S形速度曲线就是为了解决这个问题而生的。它把加速度的变化也做了平滑处理,让加速度本身也按照梯形或正弦曲线变化。
| 特性 | 梯形速度曲线 | S形速度曲线 |
|---|---|---|
| 加速度变化 | 阶跃突变 | 连续平滑 |
| 急动度(Jerk) | 无穷大(理论) | 有限值 |
| 运动平滑性 | 一般 | 优秀 |
| 计算复杂度 | 低 | 高 |
| 适用场景 | 普通搬运、点对点 | 精密加工、高速高精度 |
我记得有一次做晶圆搬运项目,客户要求启停时振动小于 0.1g。梯形规划一跑,加速度突变直接导致末端抖动超标。换成 S 形曲线后,振动降到了 0.05g 以下。嗯,这就是 S 形曲线的价值所在。
4.5 实际项目中的选型考量
梯形还是 S 形?这不是一个非黑即白的问题。我根据多年项目经验,总结了几个选型原则:
- 普通搬运、码垛、传送带:梯形速度曲线完全够用。计算简单,调试方便,维护成本低。
- 高速高精度、精密装配、晶圆搬运:必须上 S 形曲线。梯形曲线的加速度突变会激发机械共振,影响定位精度。
- 短距离频繁启停:梯形曲线往往跑不成三段,两段式(三角形)更实用。S 形曲线在这种场景下计算量太大,收益不明显。
- 大惯量负载:建议用 S 形曲线,或者至少把梯形曲线的减速度设得比加速度小很多。我曾经有个项目,减速段加速度设得和加速段一样,结果负载过冲了 5mm,差点撞坏夹具。
避坑指南:千万不要在梯形规划里把加速度设得太大。我曾经为了赶节拍,把加速度调到电机额定值的 90%。结果运行了两个月,减速机就出现了明显的齿隙磨损。后来我学乖了,加速度一般只用到额定值的 60%-70%,给机械系统留点余量。
另外,选型时还要考虑控制器的算力。梯形规划几乎不占 CPU,但 S 形曲线在高速插补时,如果每个周期都要算七段甚至九段曲线,对低端控制器是个不小的负担。我见过有人用 STM32F103 跑 S 形规划,结果插补周期从 1ms 拖到了 3ms,位置精度反而下降了。
最后说一句:没有最好的规划,只有最合适的规划。梯形速度曲线虽然简单,但用好了,能解决 80% 的运动控制问题。剩下的 20%,再考虑 S 形曲线或者其他更高级的规划方法。