1. 速度规划基础:S形曲线、T形曲线、梯形曲线原理与数学建模
速度规划,说白了就是让机器人怎么走才稳。你想想看,如果电机一启动就直接给最大速度,那冲击力能把机械结构震散架。我刚开始做机器人那会儿,就吃过这个亏——电机直接跳变,结果末端抖得跟筛子似的。
所以我们需要速度规划曲线。常见的就三种:T形(梯形)、S形、以及更平滑的S形变种。今天咱们就把它们的数学底子扒干净。
1.1 梯形速度曲线(T形曲线)
梯形曲线是最简单的。它由三段组成:匀加速、匀速、匀减速。名字很形象,速度-时间图就是个梯形。
数学建模:
设总位移为 \( S \),最大速度为 \( V_{max} \),加速度为 \( A \),减速度也为 \( A \)(对称情况)。
- 加速段: \( v(t) = A \cdot t \),\( 0 \le t \le t_a \)
- 匀速段: \( v(t) = V_{max} \),\( t_a \le t \le t_a + t_c \)
- 减速段: \( v(t) = V_{max} - A \cdot (t - t_a - t_c) \),\( t_a + t_c \le t \le T \)
其中加速时间 \( t_a = V_{max} / A \),减速时间相同。匀速时间 \( t_c \) 由剩余位移决定。
适用场景: 对启停冲击不敏感、成本敏感、计算资源有限的场合,比如一些简单的传送带、低精度点位运动。
1.2 S形速度曲线
S形曲线解决了梯形曲线的加速度突变问题。它在加速和减速阶段加入了“加加速度”约束,让加速度平滑变化。
数学建模(7段式S形):
完整的S形曲线分为7段:加加速度、匀加速、减加速度、匀速、加减速度、匀减速、减减速度。我们以加加速度 \( J \)(Jerk)为控制量。
| 阶段 | 加速度变化 | 速度表达式 |
|---|---|---|
| 1. 加加速度 | \( a(t) = J \cdot t \) | \( v(t) = \frac{1}{2} J t^2 \) |
| 2. 匀加速 | \( a(t) = A_{max} \) | \( v(t) = v_1 + A_{max} \cdot t \) |
| 3. 减加速度 | \( a(t) = A_{max} - J \cdot t \) | \( v(t) = v_2 + A_{max} t - \frac{1}{2} J t^2 \) |
| 4. 匀速 | \( a(t) = 0 \) | \( v(t) = V_{max} \) |
| 5. 加减速度 | \( a(t) = -J \cdot t \) | \( v(t) = V_{max} - \frac{1}{2} J t^2 \) |
| 6. 匀减速 | \( a(t) = -A_{max} \) | \( v(t) = v_5 - A_{max} \cdot t \) |
| 7. 减减速度 | \( a(t) = -A_{max} + J \cdot t \) | \( v(t) = v_6 - A_{max} t + \frac{1}{2} J t^2 \) |
嗯,这里要注意:实际工程中很少用完整的7段式,因为计算量大。我一般用5段式(去掉匀加速和匀减速段),或者直接用多项式拟合。
1.3 梯形 vs S形 对比
| 特性 | 梯形曲线 | S形曲线 |
|---|---|---|
| 加速度连续性 | 不连续(阶跃变化) | 连续 |
| 加加速度(Jerk) | 无穷大(理论) | 有限值(可控) |
| 计算复杂度 | 低(O(1)) | 中(O(n)) |
| 启停冲击 | 大 | 小 |
| 运动时间 | 短(相同参数下) | 略长(加Jerk约束) |
| 适用场景 | 低精度、低成本 | 高精度、重载、高速 |
1.4 知识体系框架图
下面这张图帮你理清三种曲线的核心逻辑和关系:
1.5 代码实现:梯形曲线规划器
光讲理论不行,咱们直接上代码。下面是一个C++实现的梯形速度规划器,输入起点、终点、最大速度和加速度,输出每个时刻的速度。
// 梯形速度规划器
// 输入:起点s0,终点s1,最大速度vmax,加速度a
// 输出:在时间t时的速度v(t)
double trapezoidalProfile(double s0, double s1, double vmax, double a, double t) {
double S = s1 - s0; // 总位移
double ta = vmax / a; // 加速时间
double Sa = 0.5 * a * ta * ta; // 加速段位移
double Sd = Sa; // 减速段位移(对称)
// 检查是否达到最大速度
if (Sa + Sd >= S) {
// 三角速度规划(未达到vmax)
double ta_tri = sqrt(S / a);
if (t <= ta_tri) {
return a * t;
} else if (t <= 2 * ta_tri) {
return a * (2 * ta_tri - t);
} else {
return 0.0;
}
} else {
// 梯形速度规划(达到vmax)
double tc = (S - Sa - Sd) / vmax; // 匀速时间
double T = 2 * ta + tc; // 总时间
if (t <= ta) {
return a * t; // 加速段
} else if (t <= ta + tc) {
return vmax; // 匀速段
} else if (t <= T) {
return a * (T - t); // 减速段
} else {
return 0.0;
}
}
}
1.6 总结一下
三种曲线各有千秋。梯形简单粗暴,适合对冲击不敏感的场合;S形平滑可控,是大多数工业机器人的首选;多项式曲线更光滑,但计算开销大,一般用在高端数控或医疗机器人上。
我个人建议:新手先从梯形曲线入手理解原理,然后尽快切换到S形曲线。因为在实际调试中,梯形曲线带来的抖动问题会让你怀疑人生。嗯,我当年就是被梯形曲线坑过之后,才老老实实研究S形的。