一、轨迹平滑概述:为什么需要轨迹平滑?
各位同学好,我是老张。在自动驾驶这个行当摸爬滚打了七八年,今天咱们来聊聊轨迹平滑这个话题。
说实话,我刚入行那会儿,觉得只要能规划出一条从A到B的路径就完事了。直到有一次,我负责的车辆在园区测试时,方向盘疯狂抖动,乘客差点晕车——嗯,从那以后,我再也不敢忽视轨迹平滑了。
1.1 为什么需要轨迹平滑?
你想想看,自动驾驶车辆在路上跑,它要面对的是真实物理世界。如果轨迹不平滑,会出现什么问题?
- 乘坐体验差:急转弯、猛加速,乘客会晕车。我有个朋友坐过某款早期测试车,下来就说「这车比我老婆开车还猛」。
- 车辆执行困难:底层控制器跟不上。轨迹上出现尖点,方向盘根本转不过来。
- 安全性下降:不平滑的轨迹可能导致轮胎打滑,尤其在湿滑路面上。
- 能耗增加:频繁加减速,电耗油耗都上去了。
核心观点:轨迹平滑不是锦上添花,而是自动驾驶落地的必要条件。不平滑的轨迹,说白了就是一张废纸。
1.2 平滑性评价指标
怎么判断一条轨迹够不够平滑?业内主要看三个指标:曲率、连续性、jerk。我一个个说。
1.2.1 曲率(Curvature)
曲率描述的是曲线弯曲的程度。数学上,曲率 κ = 1/R,R 是曲率半径。
举个例子:高速公路弯道,曲率小;停车场掉头,曲率大。
在轨迹规划中,我们关心的是:
- 曲率是否连续变化
- 曲率最大值是否在车辆转向能力范围内
- 曲率变化率是否过大
我的经验:我在做某高速项目时,发现曲率突变会导致方向盘急转。后来我们加了一个曲率约束,把最大曲率限制在 0.1 m⁻¹ 以内,问题就解决了。
1.2.2 连续性(Continuity)
连续性分几个等级:
| 等级 | 含义 | 实际表现 |
|---|---|---|
| C0 | 位置连续 | 轨迹没有断点 |
| C1 | 速度连续 | 没有速度突变 |
| C2 | 加速度连续 | 没有冲击感 |
| C3 | jerk连续 | 乘坐体验极佳 |
我个人习惯,至少保证 C2 连续性。C0 和 C1 的轨迹,乘客会感觉「一顿一顿」的。
避坑指南:我曾经在项目中只保证了 C1 连续性,结果测试时发现车辆在弯道出口会突然加速。后来查原因,是加速度不连续导致的。所以,至少做到 C2。
1.2.3 Jerk(加加速度)
Jerk 是加速度的变化率,单位是 m/s³。说白了,就是「加速度的加速度」。
为什么 jerk 重要?
- 人耳的前庭系统对 jerk 很敏感
- 高 jerk 会让乘客感到突兀
- 车辆执行器(电机、转向机)对 jerk 有限制
业内一般把 jerk 控制在 2-5 m/s³ 以内。我见过一些激进的做法,jerk 到 10 m/s³,那感觉就像被人从背后踹了一脚。
1.3 知识体系总览
下面这张图,是我自己总结的轨迹平滑知识体系。你看一眼,心里就有数了。
1.4 一个简单的例子
咱们用代码感受一下。下面是一个简单的轨迹平滑前后对比:
// 不平滑的轨迹点(有尖角)
Point[] rawPath = {
(0, 0), (1, 1), (2, 0), (3, -1), (4, 0)
};
// 平滑后的轨迹点(使用三次样条插值)
Point[] smoothPath = SplineInterpolate(rawPath, 0.1);
// 计算曲率
for (int i = 1; i < smoothPath.Length - 1; i++) {
float curvature = CalculateCurvature(
smoothPath[i-1],
smoothPath[i],
smoothPath[i+1]
);
Console.WriteLine($"点{i}的曲率: {curvature:F3}");
}
你看,原始路径在 (2,0) 处有个尖角,曲率无穷大。平滑后,曲率就变得连续可接受了。
小技巧:实际项目中,我一般先用三次样条做初步平滑,再用优化方法微调。这样既保证效率,又保证质量。
1.5 本章小结
好了,这一章咱们聊了:
- 轨迹平滑为什么重要——说白了,不平滑的轨迹没法用
- 三个核心评价指标:曲率、连续性、jerk
- 每个指标的含义和工程意义
记住一句话:好的轨迹,是让乘客感觉不到它在规划。
下一章,咱们会深入讲样条曲线插值,那是实现平滑的经典方法。到时候我会分享一些踩过的坑,保证让你少走弯路。