2、T型速度曲线:数学模型、加速/匀速/减速三段式结构、参数计算与边界条件
T型速度曲线,说白了就是运动控制里最基础、最直观的速度规划方式。名字里的「T」不是字母T,而是速度曲线形状像个梯形——先匀加速、再匀速、最后匀减速。我刚开始做运动控制时,第一个手写的速度规划就是它。
别看它简单,很多工业场景至今还在用。为什么?因为它的加速度恒定,电机力矩需求稳定,控制逻辑清晰。你想想看,一个没有抖动、没有冲击的启停过程,在很多设备上已经够用了。
2.1 数学模型:三段式结构
T型曲线由三个阶段组成:加速段、匀速段、减速段。每一段都对应一个简单的运动学方程。
我习惯用以下符号体系:
- v₀ — 起始速度(通常为0)
- v_max — 目标最大速度
- a — 加速度(正值)
- d — 减速度(正值,减速时取负方向)
- t₁ — 加速段时间
- t₂ — 匀速段时间
- t₃ — 减速段时间
- S — 总位移
三段的速度公式如下:
加速段 (0 ≤ t ≤ t₁):
v(t) = v₀ + a·t
s(t) = v₀·t + ½·a·t²
匀速段 (t₁ < t ≤ t₁+t₂):
v(t) = v_max
s(t) = v₀·t₁ + ½·a·t₁² + v_max·(t - t₁)
减速段 (t₁+t₂ < t ≤ t₁+t₂+t₃):
v(t) = v_max - d·(t - t₁ - t₂)
s(t) = 前两段位移 + v_max·t₃ - ½·d·t₃²
嗯,这里要注意:减速段的加速度是 -d,所以速度线性下降。如果起始速度和终止速度都是0,那加速段和减速段在时间上是对称的——前提是加速度和减速度相等。
核心要点:T型曲线的本质是「加速度分段恒定」。每一段内,加加速度(Jerk)为无穷大。这就是抖动的根源——我们后面会专门讲怎么优化它。
2.2 参数计算:已知条件怎么算时间?
实际项目中,我们通常知道的是:总位移S、最大速度v_max、加速度a、减速度d。需要计算的是三段各自的时间。
我遇到过很多新手,上来就假设一定能跑到v_max。其实不一定。如果位移太短,可能刚加速就要减速,根本到不了最大速度。这就是边界条件问题。
先看能跑到v_max的情况:
加速段时间: t₁ = v_max / a
减速段时间: t₃ = v_max / d
加速段位移: S₁ = ½·a·t₁²
减速段位移: S₃ = ½·d·t₃²
匀速段位移: S₂ = S - S₁ - S₃
匀速段时间: t₂ = S₂ / v_max
如果S₂算出来是负数,说明位移不够,跑不到v_max。这时候需要重新计算。
我的经验:写代码时一定要先判断「是否可达最大速度」。我早期一个项目里忘了这个判断,结果电机在短距离运动时速度曲线出现负的匀速段时间,直接报错。从那以后,我每次写T型规划都先算这个。
2.3 边界条件:跑不到最大速度怎么办?
当位移S不足以让系统加速到v_max再减速到0时,曲线退化为三角形——只有加速和减速,没有匀速段。
这时候需要求解一个关键问题:实际能达到的最高速度v_peak是多少?
假设起始和终止速度都是0,加速和减速对称(a = d),那么:
v_peak = √(a · S)
t₁ = t₃ = v_peak / a
总时间 T = 2 · v_peak / a
如果a ≠ d,情况稍微复杂一点。我记得有一次做龙门架同步控制,两个轴的加减速度不一样,必须分别计算:
v_peak = √( (2·a·d·S) / (a + d) )
t₁ = v_peak / a
t₃ = v_peak / d
这个公式怎么来的?其实很简单:加速段位移 + 减速段位移 = 总位移,代入各自的位移公式,联立解出v_peak。
避坑指南:我曾经在计算非对称T型曲线时,直接用了对称公式,结果电机在减速段末端速度没降到0,冲出去了一小段。后来排查发现是v_peak算错了。记住:加减速度不等时,峰值速度不是简单的√(a·S),必须用上面的公式。
2.4 完整参数计算流程
我一般把T型曲线的参数计算写成下面这个流程。你可以直接拿去做代码实现:
- 输入:S, v_max, a, d, v₀, v_end(通常v₀=v_end=0)
- 计算理论加速/减速时间:t₁_raw = (v_max - v₀)/a, t₃_raw = (v_max - v_end)/d
- 计算理论加速/减速位移:S₁ = ½·(v₀+v_max)·t₁_raw, S₃ = ½·(v_max+v_end)·t₃_raw
- 判断:如果S₁ + S₃ ≤ S,说明能跑到v_max → 进入三段式
- 否则:进入三角形模式,计算v_peak
- 输出:t₁, t₂, t₃, v_peak
下面这张图展示了完整的决策逻辑:
2.5 参数对比:三段式 vs 三角形
为了让你更直观地理解两种模式的区别,我整理了一个对比表:
| 对比项 | 三段式(有匀速段) | 三角形(无匀速段) |
|---|---|---|
| 适用场景 | 位移足够大,能跑到v_max | 位移短,跑不到v_max |
| 峰值速度 | v_max(用户设定) | v_peak(由S,a,d决定) |
| 匀速段时间t₂ | > 0 | = 0 |
| 总时间 | t₁ + t₂ + t₃ | t₁ + t₃ |
| 计算复杂度 | 低(直接公式) | 中(需解方程) |
2.6 实际项目中的注意事项
最后,分享几个我在项目中踩过的坑:
- 加减速度不相等时,峰值速度不是简单的对称点。我见过有人直接用v_peak = √(a·S),结果减速段末端速度没归零。一定要用非对称公式。
- 起始速度不为0的情况。比如电机已经在低速运行,需要加速到高速再减速。这时候加速段和减速段的公式要带上v₀和v_end,不能直接套用从0开始的公式。
- 浮点数精度问题。在嵌入式平台上,float的精度有限。如果S很小(比如0.001mm),计算v_peak时可能出现开方后为0的情况。我建议用double,或者加一个最小位移阈值。
- 实时性要求高时,预计算。如果运动参数在运行中不变,可以把t₁、t₂、t₃提前算好存起来,运行时只查表插值。我在一个高速贴片机项目里就是这么做的,节省了不少CPU周期。
一个小技巧:调试T型曲线时,我习惯先打印出三段的时间和位移,看看加起来是否等于总位移。如果误差超过1%,说明某个参数算错了。这个习惯帮我抓出过好几次bug。