2. 加速度平滑的数学基础:加速度、加加速度(Jerk)的定义与关系
做纵向控制这些年,我越来越觉得——加速度平滑这件事,本质上就是个数学问题。
你想想看,一辆车能不能开得舒服,乘客会不会晕车,电机或者发动机的寿命长不长,这些问题的根子,其实都藏在几个简单的数学定义里。今天我们就来把这块地基打牢。
2.1 从位置到加速度:一次、二次、三次导数
我们先从最基础的开始。一辆车在路上跑,它的运动状态可以用三个量来描述:
- 位置 s(t) —— 车在哪?
- 速度 v(t) —— 车跑多快?
- 加速度 a(t) —— 车加速还是减速?
它们之间的关系,说白了就是导数:
v(t) = ds/dt
a(t) = dv/dt = d²s/dt²
嗯,这里要注意:加速度是速度的变化率。这个大家应该都熟。
但真正决定乘坐舒适性的,不是加速度本身,而是加速度的变化有多快。这就引出了我们今天的主角——加加速度(Jerk)。
加加速度(Jerk)的定义:
j(t) = da/dt = d²v/dt² = d³s/dt³
单位:m/s³
说白了,Jerk 就是加速度的变化率。你踩油门的时候,如果脚抖了一下,加速度就会忽大忽小,Jerk 就大了。乘客就会觉得「这司机怎么开车的?」
2.2 为什么 Jerk 这么重要?
我在项目中遇到过一件事,印象特别深。有一次我们做一款电动车的纵向控制标定,车在低速跟车时总是有那种「一窜一窜」的感觉。查来查去,发现加速度的峰值并不大,但 Jerk 的峰值很高——每次加速指令变化时,加速度变化太猛了。
这让我意识到一个关键点:人感知的不是加速度的大小,而是加速度的变化快慢。
来看一个简单的对比:
| 指标 | 场景A(急加速) | 场景B(平缓加速) |
|---|---|---|
| 目标加速度 | 2.0 m/s² | 2.0 m/s² |
| 达到时间 | 0.2 s | 1.0 s |
| 平均 Jerk | 10 m/s³ | 2 m/s³ |
| 乘坐感受 | 被踹了一脚 | 被推着走 |
看到了吗?同样的加速度,不同的 Jerk,感受天差地别。
我的经验:在工程实践中,我一般把 Jerk 的限值设在 2~5 m/s³ 之间。舒适模式下取 2,运动模式下取 5。超过 8 m/s³ 的话,乘客基本就要骂人了。
2.3 加速度与 Jerk 的数学关系
我们再用数学语言把关系理一理。假设加速度从 0 开始,以恒定 Jerk 增加到目标值 a_target:
a(t) = j * t (0 ≤ t ≤ T)
v(t) = v₀ + ½ * j * t²
s(t) = s₀ + v₀*t + ⅙ * j * t³
这里 j 是常数 Jerk,T 是加速时间。你会发现:
- 加速度是时间的一次函数(线性增长)
- 速度是时间的二次函数(抛物线)
- 位置是时间的三次函数(S形曲线)
这就是为什么很多纵向控制算法里,会用三次多项式来规划轨迹——因为它天然保证了 Jerk 是常数,加速度是平滑的。
注意:千万不要以为 Jerk 越小越好。Jerk 太小,意味着加速过程拖得太长,响应速度就慢了。在紧急避障场景下,过小的 Jerk 可能导致车辆来不及反应。我见过有人把 Jerk 限到 1 m/s³,结果 AEB 测试直接挂掉。
2.4 知识体系总览
为了让你更直观地理解这一章的核心逻辑,我画了一张图:
2.5 实际应用中的 Jerk 控制
讲完了理论,我们来看看实际怎么用。在纵向控制算法里,我一般会做这么几件事:
- 设定 Jerk 上限 —— 根据车辆动力学和舒适性要求,给 Jerk 设一个硬限幅。比如舒适模式 3 m/s³,运动模式 6 m/s³。
- 加速度变化率滤波 —— 对加速度指令做一阶低通滤波,本质上就是在限制 Jerk。时间常数 τ 越大,Jerk 越小。
- 前馈+反馈中的 Jerk 补偿 —— 在 PID 控制器里,如果微分项太强,会导致 Jerk 过大。我习惯在 D 项上加一个限幅器。
一个简单的 Jerk 限幅实现(伪代码):
// 输入:期望加速度 a_des,当前加速度 a_cur,控制周期 dt
// 输出:限幅后的加速度 a_out
float max_jerk = 3.0; // m/s³
float delta_a = a_des - a_cur;
float max_delta = max_jerk * dt;
if (delta_a > max_delta)
delta_a = max_delta;
else if (delta_a < -max_delta)
delta_a = -max_delta;
a_out = a_cur + delta_a;
这段代码我用了不知道多少次了。简单、有效、不容易出 bug。你想想看,如果没有这个限幅,加速度指令直接从 0 跳到 2 m/s²,Jerk 瞬间无穷大——乘客不骂你才怪。
避坑指南:我曾经在一个项目中,把 Jerk 限幅放在 PID 控制器之后,结果发现控制器输出一直在震荡。后来才意识到,限幅应该放在控制器内部,作为控制量变化率的约束,而不是事后截断。顺序搞反了,效果天差地别。
2.6 小结
这一章我们聊了三个核心点:
- 加速度是速度的导数,Jerk 是加速度的导数 —— 这个关系链是纵向控制的数学根基。
- Jerk 决定了乘坐舒适性 —— 同样的加速度变化量,变化时间越短,Jerk 越大,人越不舒服。
- 工程上要对 Jerk 做显式约束 —— 无论是通过限幅、滤波还是轨迹规划,都要保证 Jerk 在合理范围内。
嗯,基础打牢了,后面我们才能聊更深入的东西。下一章我们会看看,这些数学概念在具体的控制算法里是怎么落地的。
公众号:蓝海资料掘金营,微信deep3321