15、加速度约束:加速度限制、冲击限制、电机物理约束建模
各位做运动控制的同行,今天我们来聊聊一个绕不开的话题——加速度约束。
说实话,我刚入行那会儿,觉得轨迹规划嘛,不就是算个位置、速度、加速度?后来在产线上被现实狠狠教育了一顿。有一次调试一台六轴机器人,轨迹跑得挺顺,结果电机驱动器直接报过流故障。拆开一看,电流波形尖峰高得吓人。嗯,从那以后,我再也不敢忽视加速度约束了。
这一节,咱们就把加速度约束这件事彻底讲透。包括加速度限制、冲击限制,还有电机物理约束的建模方法。
15.1 加速度限制:不只是“设个上限”
加速度限制,说白了就是告诉运动系统:你加速别太猛,减速也别太急。但实际工程中,这个“上限”怎么定,大有讲究。
15.1.1 加速度限制的物理来源
加速度限制主要来自三个方面:
- 电机最大转矩:电机能输出的力是有限的。加速度大了,转矩需求就大,超过额定转矩就会出问题。
- 机械结构强度:加速度产生的惯性力会作用在机械臂、导轨、联轴器上。力太大,结构会变形甚至损坏。
- 负载特性:负载越重,允许的加速度就越小。尤其是抓取易碎品或液体容器时,加速度必须温柔。
核心公式:
加速度限制通常表示为:|a(t)| ≤ a_max
其中 a_max 由系统最薄弱的环节决定。我个人习惯取三个来源中的最小值,再留 20% 的余量。
15.1.2 梯形速度规划中的加速度限制
梯形速度规划是最简单的运动曲线。它包含三个阶段:匀加速、匀速、匀减速。
加速度限制在这里直接决定了加速段和减速段的斜率。举个例子:
// 梯形速度规划 - 加速度限制示例
float v_max = 100.0; // 最大速度 mm/s
float a_max = 500.0; // 最大加速度 mm/s²
float total_dist = 200.0; // 总位移 mm
// 计算加速段距离
float accel_dist = (v_max * v_max) / (2 * a_max);
// 如果加速段距离超过总位移的一半,说明速度还没到最大就要减速了
if (2 * accel_dist > total_dist) {
// 三角形速度曲线,没有匀速段
float v_peak = sqrt(a_max * total_dist);
// 实际加速度不变,但峰值速度降低了
}
我在项目中遇到过一个问题:梯形规划虽然简单,但加速度在切换点处是突变的。从加速到匀速,加速度瞬间从 a_max 跳变到 0。这种突变会产生冲击力,对机械结构很不友好。
15.2 冲击限制:让运动更“丝滑”
冲击(Jerk),是加速度的变化率。单位是 m/s³ 或 mm/s³。
为什么要限制冲击?你想想看,加速度突变意味着力突变。力突变会产生振动、噪声,甚至让工件从夹具上飞出去。我见过一个案例:一台高速贴片机,因为冲击太大,贴装头每次加减速时都会抖动,导致贴片精度下降 0.1mm。后来加了冲击限制,问题就解决了。
15.2.1 冲击限制的数学表达
冲击定义为:j(t) = da(t)/dt
冲击限制表示为:|j(t)| ≤ j_max
加了冲击限制后,加速度曲线不再是方波,而是变成了梯形或S形。这就是S形速度曲线的由来。
15.2.2 S形速度规划中的冲击控制
S形曲线有七个阶段:加加速、匀加速、减加速、匀速、加减速、匀减速、减减速。
每个阶段的冲击都是常数,要么是 +j_max,要么是 -j_max,要么是 0。
// S形速度规划 - 冲击限制示例
float v_max = 100.0;
float a_max = 500.0;
float j_max = 2000.0; // 最大冲击 mm/s³
// 计算加速到最大加速度所需时间
float t_accel = a_max / j_max;
// 计算此阶段的速度增量
float v_accel = 0.5 * j_max * t_accel * t_accel;
// 如果速度还没到 v_max,加速度就已经到 a_max 了
// 那就进入匀加速阶段
// 如果速度到了 v_max,加速度还没到 a_max
// 那就直接进入减加速阶段
我的经验:冲击限制的取值,一般建议是加速度限制的 3~5 倍。比如 a_max=500,j_max 取 1500~2500。太小了运动太慢,太大了冲击抑制效果不明显。
15.3 电机物理约束建模:把理论落地
前面说的加速度和冲击限制,都是理想情况。实际电机还有自己的脾气——物理约束。
15.3.1 电机转矩-速度特性曲线
电机不是在任何速度下都能输出额定转矩的。典型的直流电机或伺服电机,转矩-速度曲线分为两个区域:
- 恒转矩区:低速时,电机可以输出额定转矩。加速度限制主要受转矩限制。
- 恒功率区:超过基速后,转矩随速度增加而下降。此时加速度限制会随速度变化。
| 速度区间 | 转矩特性 | 加速度限制 |
|---|---|---|
| 0 ≤ ω ≤ ω_base | T = T_max(常数) | a_max = T_max / (J * r) |
| ω_base < ω ≤ ω_max | T = P_max / ω | a_max = P_max / (J * r * ω) |
其中 J 是折算到电机轴上的总惯量,r 是传动比。
15.3.2 电流环与转矩响应
电机转矩由电流控制。电流环有带宽限制,不能瞬间达到目标转矩。这意味着加速度不能瞬间达到设定值。
我记得调试一个高速龙门架时,发现加速度指令给得很快,但实际电流响应有延迟。结果就是加速度曲线有“过冲”,导致末端抖动。后来我在规划中加入了电流环的等效一阶滞后模型:
// 电流环等效模型 - 一阶低通滤波
float tau_current = 0.002; // 电流环时间常数 2ms
float a_cmd = 500.0; // 加速度指令
float a_actual = 0.0; // 实际加速度
// 每个控制周期更新
a_actual += (a_cmd - a_actual) * (dt / tau_current);
这样规划出来的轨迹,电机才能真正跟得上。
15.3.3 惯量变化与自适应约束
工业机器人抓取不同工件时,末端负载的惯量是变化的。负载越重,允许的加速度越小。
我曾经做过一个码垛机器人项目,抓空托盘和抓满托盘时,末端惯量差了 5 倍。如果按最大负载设定加速度,空载时效率太低;按最小负载设定,重载时电机过载。
解决方案是:实时估算负载惯量,动态调整加速度限制。
注意:惯量估算不能太频繁,否则加速度限制频繁变化,反而导致运动不平滑。我一般建议在每次抓取/释放动作完成后更新一次。
15.4 综合约束建模流程
在实际项目中,我通常按以下步骤建立加速度约束模型:
- 收集电机参数:额定转矩、峰值转矩、基速、最大转速、电流环带宽。
- 计算机械惯量:包括电机转子惯量、减速器惯量、负载惯量(折算到电机轴)。
- 确定基础加速度限制:a_max = T_max / (J_total * r),再乘以安全系数 0.8。
- 加入速度依赖修正:在恒功率区,加速度限制随速度增加而降低。
- 加入冲击限制:j_max = (3~5) * a_max。
- 加入电流环动态:用一阶滞后模型模拟实际加速度响应。
- 验证与微调:跑一段轨迹,看实际加速度是否超过限制。如果超了,降低限制值或增加滤波。
一句话总结:加速度约束不是拍脑袋设个数字,而是要把电机特性、机械结构、负载变化、电流响应全部考虑进去。只有这样,你的轨迹规划才是真正可执行的,而不是纸上谈兵。
好了,这一节的内容就到这里。下一节我们会讲如何把这些约束应用到具体的轨迹规划算法中,包括梯形、S形、多项式曲线的约束处理。到时候我会分享一个我踩过的坑——关于S形曲线在冲击限制下的时间计算问题,挺有意思的。