1. 速度规划基础:运动控制中的速度曲线
做运动控制这些年,我越来越觉得速度规划就像给机器「铺路」。路铺得平不平,直接决定了机器跑得稳不稳、停得准不准。今天咱们就从最基础的速度曲线说起。
1.1 什么是速度曲线?
说白了,速度曲线就是描述「速度随时间怎么变化」的一条线。你想想看,电机从静止加速到目标速度,再减速到零,这个过程画出来就是一条速度曲线。
我刚开始做项目时,觉得只要给个速度指令就行了。结果机器一跑,要么抖得像筛子,要么到位后过冲一大截。后来才明白——速度曲线没选对,后面全是坑。
核心概念:速度曲线 = 位置对时间的一阶导数。它决定了运动过程的平滑度、效率和冲击力。
1.2 T型曲线 vs S型曲线
实际工程中最常用的就两种:T型和S型。咱们直接对比着看。
| 对比项 | T型曲线 | S型曲线 |
|---|---|---|
| 加速度变化 | 阶跃突变 | 连续渐变 |
| 加加速度(Jerk) | 无穷大(冲击) | 有限值(可控) |
| 运动时间 | 最短 | 稍长(约10%~20%) |
| 机械冲击 | 大 | 小 |
| 适用场景 | 低速、低精度、刚性好的系统 | 高速、高精度、柔性系统 |
我记得有一次做高速贴片机项目,用的T型曲线。速度一上去,整个机架都在抖。后来换成S型曲线,抖动直接降了60%。选型选对了,事半功倍。
1.3 加加速度(Jerk)的物理意义
加加速度,英文叫Jerk,是加速度对时间的导数。单位是 m/s³。
为什么要关心Jerk?因为加速度突变会产生冲击力。你想想看,加速度从0瞬间跳到某个值,相当于力突然施加到机械结构上。这个冲击力会激发机械共振,造成抖动和定位误差。
我的经验:在半导体设备中,Jerk值通常限制在 100~500 m/s³ 之间。超过这个范围,晶圆很容易出现微裂纹。
我曾经遇到一个案例:一台精密点胶机,点胶位置总是偏移。排查了所有硬件都没问题,最后发现是Jerk太大,导致胶头到位前有微小反弹。把Jerk从 800 降到 200 m/s³,问题立刻解决。
1.4 三种曲线的速度-时间图
下面这张图直观展示了T型、S型以及带Jerk限制的曲线在速度-时间平面上的区别。
从图上能清楚看到:T型曲线在加速起点和终点有「尖角」,这就是加速度突变的位置。S型曲线把尖角磨圆了,但加速时间变长。Jerk限制型则是在S型基础上进一步控制加速度的变化率。
1.5 实际工程中的选择策略
那到底该用哪种?我个人习惯按这个优先级来选:
- 先看机械刚性:刚性好的(比如铸铁机架),T型也能用。刚性差的(比如铝型材搭建),必须上S型或Jerk限制型。
- 再看精度要求:定位精度在 0.1mm 以上的,建议用S型。0.01mm 级别的,必须用Jerk限制型。
- 最后看节拍:如果时间允许,尽量用S型。时间紧张时,可以适当放宽Jerk限制,但不要完全用T型。
避坑指南:我曾经在一个项目中,为了赶节拍把Jerk设得很大。结果机器跑起来后,螺丝都松了。后来花了三天重新拧紧所有螺丝,还换了两个损坏的导轨。教训就是——Jerk不是越大越好,要找到机械能承受的极限。
1.6 速度规划的核心流程
下面这张流程图展示了速度规划从需求到实现的完整链路。
这个流程我用了很多年。每次做新项目,都按这个步骤走一遍。特别是第4步仿真验证,千万别跳过。我见过太多人直接上机调试,结果把机械搞坏了才回头做仿真。
1.7 一个简单的代码示例
下面是一个T型速度规划的Python实现,帮你理解核心逻辑:
def t_curve_profile(v_max, a_max, total_distance):
"""
T型速度曲线规划
参数:
v_max: 最大速度 (m/s)
a_max: 最大加速度 (m/s²)
total_distance: 总位移 (m)
返回:
加速时间、匀速时间、减速时间
"""
# 加速到最大速度所需距离
acc_distance = v_max**2 / (2 * a_max)
# 如果加速距离超过总距离的一半,说明无法达到最大速度
if 2 * acc_distance > total_distance:
# 三角形速度曲线(没有匀速段)
v_peak = (a_max * total_distance) ** 0.5
t_acc = v_peak / a_max
t_const = 0
t_dec = t_acc
else:
# 梯形速度曲线(有匀速段)
t_acc = v_max / a_max
t_dec = t_acc
const_distance = total_distance - 2 * acc_distance
t_const = const_distance / v_max
return t_acc, t_const, t_dec
# 示例:总位移0.5m,最大速度0.3m/s,加速度0.5m/s²
t1, t2, t3 = t_curve_profile(0.3, 0.5, 0.5)
print(f"加速时间: {t1:.2f}s, 匀速时间: {t2:.2f}s, 减速时间: {t3:.2f}s")
这段代码虽然简单,但包含了速度规划的核心思想:先判断能不能达到最大速度,再决定用梯形还是三角形。实际工程中,还要考虑Jerk限制、位置补偿、前馈控制等,但基础逻辑是一样的。
小技巧:调试时先把Jerk设得保守一点(比如 100 m/s³),等机械运行稳定了,再逐步增大。每次增加 50 m/s³,观察抖动情况。找到临界点后,再往回退 20% 作为安全余量。