第二节 运动控制基础:位置、速度、加速度、加加速度(Jerk)的概念与关系
各位同学,咱们今天聊点最基础的东西。别小看这些概念,我做了这么多年运动控制,发现很多问题都出在对这几个量的理解不够深。说白了,位置、速度、加速度、加加速度,就是描述一个物体怎么动的四个层次。
1. 位置(Position)—— 你在哪?
位置,就是物体在空间中的坐标。在运动控制里,我们通常用 p(t) 表示。比如电机转了多少圈,滑块走了多少毫米。
我个人习惯把位置想象成「脚印」。你每走一步,地上就留下一个脚印。这些脚印连起来,就是运动轨迹。
关键点:位置是时间的函数。我们控制运动,本质上就是控制位置随时间的变化。
2. 速度(Velocity)—— 你走多快?
速度是位置对时间的一阶导数。数学上写:
v(t) = dp(t) / dt
嗯,这里要注意:速度是有方向的。在直线运动里,正负号代表方向。我在项目中遇到过有人把速度和速率搞混,结果调试时发现电机往反方向跑,折腾了半天。
速度决定了「多久能到」。你想想看,同样的距离,速度越快,时间越短。但速度不能突变,否则机器会「咣当」一下——这就是为什么我们需要加速度。
3. 加速度(Acceleration)—— 你加速快不快?
加速度是速度对时间的一阶导数,也是位置的二阶导数:
a(t) = dv(t) / dt = d²p(t) / dt²
加速度决定了力的大小。根据牛顿第二定律 F = ma,加速度越大,需要的力越大。电机选型时,加速度是核心参数之一。
我的经验:加速度设置过大,电机容易过载;设置过小,效率太低。一般我会先按负载的 0.3g 左右试跑,再根据实际温升调整。
但加速度也不能突变。为什么?因为加速度突变意味着力突变,力突变意味着机器会抖动。这就是为什么我们需要第四个量——加加速度。
4. 加加速度(Jerk)—— 你加速的过程平不平滑?
加加速度是加速度对时间的一阶导数,也是速度的二阶导数、位置的三阶导数:
j(t) = da(t) / dt = d²v(t) / dt² = d³p(t) / dt³
加加速度这个名字有点拗口,英文叫 Jerk。说白了,它描述的是「加速度的变化率」。加加速度越大,运动越「生硬」;加加速度越小,运动越「柔和」。
避坑指南:我曾经在一个精密定位项目中,忽略了加加速度的影响。结果设备在高速启停时,末端振动幅度达到 0.5mm,完全无法满足精度要求。后来把加加速度限制在 500 mm/s³ 以内,振动才降下来。
5. 四个量的关系——一张图说清楚
下面这张 SVG 图,展示了位置、速度、加速度、加加速度之间的微分/积分关系。我建议你把它存下来,以后写代码时对照着看。
6. 为什么 S 形曲线需要 Jerk?
传统的梯形速度曲线,只有匀加速、匀速、匀减速三段。加速度在切换点处突变,Jerk 无穷大。结果就是机器「咯噔」一下。
S 形曲线在加速段和减速段加入了 Jerk 的限制。加速度从 0 开始缓慢增加,再缓慢减小到 0。整个过程平滑过渡,没有冲击。
核心思想:梯形曲线控制加速度,S 形曲线控制加加速度。S 形曲线比梯形曲线多了一个「柔化」的维度。
7. 实际项目中的经验值
我整理了一份常用参数范围,供你参考:
| 参数 | 符号 | 单位 | 典型范围 | 说明 |
|---|---|---|---|---|
| 最大速度 | v_max | mm/s | 100 ~ 1000 | 取决于电机和负载 |
| 最大加速度 | a_max | mm/s² | 500 ~ 5000 | 0.05g ~ 0.5g |
| 最大加加速度 | j_max | mm/s³ | 500 ~ 50000 | 越大越硬,越小越软 |
我的习惯:先按 j_max = a_max × 10 来设置。如果振动明显,再逐步降低 j_max。比如 a_max = 2000 mm/s²,j_max 先设 20000 mm/s³,不行再降到 10000。
8. 代码示例:计算位置、速度、加速度、加加速度
下面这段 Python 代码,演示了如何从位置数据推导出其他三个量。实际项目中,我们经常用编码器采集位置,然后计算速度和加速度。
import numpy as np
import matplotlib.pyplot as plt
# 模拟位置数据(单位:mm)
t = np.linspace(0, 2, 200) # 时间 0~2 秒
p = 10 * t**3 - 15 * t**4 + 6 * t**5 # S 形位置曲线
# 数值微分计算速度、加速度、加加速度
dt = t[1] - t[0]
v = np.gradient(p, dt)
a = np.gradient(v, dt)
j = np.gradient(a, dt)
# 打印前 5 个点的数据
print("时间(s) 位置(mm) 速度(mm/s) 加速度(mm/s²) 加加速度(mm/s³)")
for i in range(5):
print(f"{t[i]:.3f} {p[i]:.3f} {v[i]:.3f} {a[i]:.3f} {j[i]:.3f}")
运行这段代码,你会看到位置平滑变化,速度和加速度从 0 开始缓慢增加,再缓慢归零。加加速度在整个过程中是连续的——这就是 S 形曲线的精髓。
注意:数值微分对噪声很敏感。如果编码器数据有抖动,直接求导会得到毛刺很大的速度和加速度。我一般会先做低通滤波,再计算导数。
9. 小结
位置、速度、加速度、加加速度,这四个量构成了运动控制的完整描述。从位置到加加速度,每求一次导,就多一层「变化率」的信息。反过来,从加加速度积分一次得到加速度,再积分得到速度,再积分得到位置。
S 形曲线之所以比梯形曲线优秀,就是因为它控制了加加速度这个「变化率的变化率」。说白了,就是让机器运动得更温柔、更精准。
嗯,这一节就到这里。记住这四个量的关系,后面讲 S 形曲线规划时,你会觉得豁然开朗。