4、T型曲线:T型速度曲线原理、数学模型、优缺点分析
说到电子凸轮的速度规划,T型曲线绝对是最基础、最直观的一种。我刚开始做运动控制那会儿,第一个接触的就是它。说白了,T型速度曲线就是让电机先匀加速、再匀速、最后匀减速,速度-时间图像看起来像个梯形,所以叫T型曲线。
你想想看,一个运动轴从A点跑到B点,最自然的想法是什么?先加速到目标速度,保持一会儿,再减速停下来。这就是T型曲线的核心思路。虽然现在有S型、多项式等更平滑的曲线,但T型曲线在简单场景下依然很实用。
核心要点:T型速度曲线由三段组成——加速段、匀速段、减速段。三段的时间可以相等,也可以不等,取决于实际需求。
4.1 数学模型
我们先建立数学模型。假设总位移为 S,最大速度为 Vmax,加速度为 Aacc,减速度为 Adec。注意,加速和减速的绝对值可以不同,但实际项目中我习惯设成一样,方便调试。
整个运动过程分为三个阶段:
- 加速段:速度从 0 线性增加到 Vmax,时间 t1 = Vmax / Aacc
- 匀速段:速度保持 Vmax,时间 t2 = (S - Sacc - Sdec) / Vmax
- 减速段:速度从 Vmax 线性减小到 0,时间 t3 = Vmax / Adec
其中,加速段位移 Sacc = ½ · Aacc · t1²,减速段位移 Sdec = ½ · Adec · t3²。
这里有个关键点:如果 S 太小,可能还没加速到 Vmax 就得开始减速了。这种情况叫「三角形速度曲线」,是T型曲线的一个特例。我在做贴片机项目时就遇到过,行程太短,Vmax 根本达不到,最后只能用三角形曲线。
个人经验:实际编程时,先判断能否达到 Vmax。如果 S < Sacc + Sdec,就按三角形曲线处理,峰值速度会低于设定值。
4.2 位置与速度的数学表达式
用分段函数描述更清楚。设总时间 T = t1 + t2 + t3,任意时刻 t 的速度和位置为:
// 加速段:0 ≤ t < t₁
v(t) = A_acc · t
s(t) = ½ · A_acc · t²
// 匀速段:t₁ ≤ t < t₁ + t₂
v(t) = V_max
s(t) = S_acc + V_max · (t - t₁)
// 减速段:t₁ + t₂ ≤ t ≤ T
v(t) = V_max - A_dec · (t - t₁ - t₂)
s(t) = S_acc + S_const + V_max · (t - t₁ - t₂) - ½ · A_dec · (t - t₁ - t₂)²
嗯,这里要注意,减速段的位置公式里 Sconst 是匀速段的位移。写代码时最好用累加方式,避免浮点误差累积。我早期用分段公式直接算,结果在段切换点总有微小跳变,后来改成增量式更新就稳了。
4.3 优缺点分析
任何曲线都有两面性,T型曲线也不例外。咱们客观分析一下。
| 维度 | 优点 | 缺点 |
|---|---|---|
| 计算复杂度 | 极低,加减乘除就能搞定 | 无 |
| 加速度连续性 | 加速度恒定,电机力矩利用率高 | 加速度在段切换点突变,产生冲击 |
| 运动平滑性 | 匀速段速度稳定,适合加工 | 加加速度(Jerk)无穷大,有振动风险 |
| 实现难度 | 代码简单,调试容易 | 不适合高速高精度场景 |
| 适用场景 | 低速、大惯量、对冲击不敏感的设备 | 精密定位、高速取放、人机交互 |
说白了,T型曲线最大的问题就是加速度突变。在加速段结束的瞬间,加速度从 Aacc 直接跳到 0,加加速度(Jerk)理论上无穷大。这会导致什么?机械振动、噪音、甚至螺丝松动。
避坑指南:我曾经在一个高速分拣项目里用了T型曲线,结果运行半小时后联轴器就松了。后来换成S型曲线,问题才解决。如果你的设备对振动敏感,或者运行速度超过 0.5 m/s,建议慎用T型曲线。
4.4 什么时候该用T型曲线?
虽然T型曲线有缺点,但别一棍子打死。我总结了几种适合的场景:
- 大惯量设备:比如重型转台、大型龙门架,本身惯性大,加速度突变的影响被系统阻尼吸收
- 低速运动:速度低于 0.2 m/s 时,冲击能量小,T型曲线完全够用
- 简单点位运动:从A到B,中间没有复杂的路径约束
- 资源受限的控制器:老式PLC或低端运动控制器,算力有限,T型曲线最省资源
反过来,如果设备要求高速、高精度、低振动,比如半导体设备、精密装配、医疗仪器,那就别省事了,直接上S型曲线或更高阶曲线。
4.5 T型曲线知识体系
下面这张图帮你理清T型曲线的核心逻辑:
4.6 一个简单的实现示例
最后给一段C语言风格的伪代码,展示T型曲线的核心计算逻辑。实际项目中我会加上限位保护、急停处理等,这里只展示骨架。
// T型曲线规划函数
// 输入:总位移 S,最大速度 Vmax,加速度 A
// 输出:每个插补周期的目标位置
void T_Curve_Plan(float S, float Vmax, float A) {
float t_acc = Vmax / A; // 加速时间
float S_acc = 0.5f * A * t_acc * t_acc; // 加速位移
float S_dec = S_acc; // 假设加减速对称
float S_const = S - S_acc - S_dec; // 匀速位移
// 判断是否达到 Vmax
if (S_const < 0) {
// 三角形曲线:达不到 Vmax
float t_tri = sqrtf(S / A);
float V_peak = A * t_tri;
// 按三角形曲线生成位置...
} else {
float t_const = S_const / Vmax;
float T_total = t_acc + t_const + t_acc;
// 按T型曲线分段生成位置...
}
}
个人习惯:我一般把加减速时间设为相同值,这样代码简单,调试也方便。如果设备对减速有特殊要求(比如急停),再单独设置减速度。
好了,T型曲线就讲到这里。它虽然简单,但理解透了,后面学S型曲线、多项式曲线就会轻松很多。毕竟,复杂的东西往往是从简单的基础上长出来的。