3、速度约束的数学建模:速度边界、加速度边界、加加速度边界的数学表达,约束不等式
好,咱们进入正题。上一节我们聊了为什么要做速度约束,这一节我们来点硬核的——怎么用数学把速度约束写出来。
我个人习惯,做任何运动规划之前,先把约束条件列清楚。你想想看,如果连边界都不知道在哪,规划出来的轨迹肯定是不敢用的。我在项目里见过太多人,上来就写优化函数,结果跑出来的轨迹加速度超限,电机直接报警。嗯,这就是典型的「忘了加约束」。
3.1 速度边界:最直观的约束
速度边界,说白了就是「跑多快」。每个轴都有它的物理极限,比如电机最大转速、丝杠最大线速度。数学上写起来很简单:
v_min ≤ v(t) ≤ v_max
这里 v(t) 是时刻 t 的速度。v_min 和 v_max 是上下限。
但要注意一点:v_min 不一定是负的。如果系统不允许反向运动,v_min 就是 0。我在做 AGV 小车的时候,就遇到过这种情况——小车只能前进不能后退,那速度下限就得设成 0,而不是负值。
3.2 加速度边界:舒适性与安全性的关键
加速度约束,控制的是「变化快慢」。加速度太大,人会感到不适,机械结构也会承受冲击。数学表达:
a_min ≤ a(t) ≤ a_max
其中 a(t) = dv/dt,是速度对时间的导数。
这里有个坑:加速度边界通常不对称。加速能力和减速能力往往不一样。比如电梯,加速时 1 m/s²,减速时 1.5 m/s²。为什么?因为减速有紧急制动的需求。我在做机器人手臂时,加速设 2 m/s²,减速设 3 m/s²,这样既保证效率,又保证安全。
3.3 加加速度边界:平滑度的终极保障
加加速度(Jerk),是加速度的变化率。它决定了轨迹的「柔顺度」。数学表达:
j_min ≤ j(t) ≤ j_max
其中 j(t) = da/dt = d²v/dt²。
为什么要约束加加速度?你想想看,如果加速度突然变化,电机就会产生冲击,机械结构会振动。我在做高精度定位平台时,加加速度限制在 500 m/s³ 以内,这样平台启停时几乎没有抖动。
加加速度约束还有一个隐藏作用:限制轨迹的「急转弯」。速度方向变化太快,加加速度就会很大。所以约束加加速度,本质上也是在约束轨迹的曲率变化率。
3.4 约束不等式:统一表达
把上面三个约束写在一起,就是完整的约束不等式组:
v_min ≤ v(t) ≤ v_max
a_min ≤ a(t) ≤ a_max
j_min ≤ j(t) ≤ j_max
但实际应用中,这些约束不是独立的。比如,速度很大时,加速度就不能太大,否则会超出电机力矩极限。所以更严谨的写法是:
|v(t)| ≤ V_max
|a(t)| ≤ A_max(v(t))
|j(t)| ≤ J_max(a(t))
这里 A_max(v) 和 J_max(a) 是随状态变化的边界函数。我在做无人机轨迹规划时,就遇到过这种情况——高速飞行时,加速度极限会下降,因为气动阻力变大了。
1. 这个约束是硬约束还是软约束?(硬约束必须满足,软约束可以适当放宽)
2. 约束之间有没有耦合关系?(比如速度和加速度的耦合)
3. 约束的边界值是否随时间变化?(比如电池电量下降,加速度极限会降低)
3.5 知识体系总览
下面这张图,把速度约束的数学建模逻辑串起来了。我建议你多看几遍,理解每个约束的层级关系。
3.6 实际项目中的避坑指南
讲完理论,我分享几个实际经验:
- 约束不要设得太紧:我曾经把加速度边界设成电机标称值的 95%,结果调试时频繁触发限位保护。后来改成 80%,问题就解决了。留余量不是怂,是工程智慧。
- 注意约束的时序:速度、加速度、加加速度是逐层导数的关系。约束加加速度时,一定要先保证加速度约束满足,否则加加速度约束没有意义。
- 离散化带来的误差:连续时间的约束,在离散化后可能会被「漏掉」。比如采样周期 10ms,加速度变化可能发生在采样点之间。我一般会在约束不等式里加一个安全系数,比如 0.9 倍。
- 多轴系统的耦合约束:如果多个轴共用同一个驱动器,那么总功率有限,各轴的加速度不能同时达到最大值。这时候需要加一个「合力约束」:sqrt(a_x² + a_y²) ≤ A_total_max。
| 约束类型 | 物理意义 | 数学形式 | 典型单位 | 典型数值(工业机器人) |
|---|---|---|---|---|
| 速度边界 | 最大运动速度 | v_min ≤ v ≤ v_max | m/s | ±2 m/s |
| 加速度边界 | 最大加速/减速能力 | a_min ≤ a ≤ a_max | m/s² | ±5 m/s² |
| 加加速度边界 | 最大冲击程度 | j_min ≤ j ≤ j_max | m/s³ | ±50 m/s³ |
好了,这一节的内容就到这里。速度约束的数学建模,说白了就是三句话:速度不能超限,加速度不能超限,加加速度不能超限。但实际写代码时,要把这三句话变成可计算的约束不等式,并且处理好它们之间的耦合关系。
下一节我们会聊怎么把这些约束放到轨迹优化里,到时候我会展示具体的代码实现。嗯,先消化一下今天的内容吧。