一、轨迹平滑概述:为什么需要轨迹平滑?

各位同学好,我是老张。在自动驾驶这个行当摸爬滚打了七八年,今天咱们来聊聊轨迹平滑这个话题。

说实话,我刚入行那会儿,觉得只要能规划出一条从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 知识体系总览

下面这张图,是我自己总结的轨迹平滑知识体系。你看一眼,心里就有数了。

轨迹平滑 为什么需要? 乘坐体验差 车辆执行困难 安全性下降 能耗增加 评价指标 曲率(Curvature) 连续性(C0/C1/C2/C3) Jerk(加加速度) 实现方法 样条曲线插值 优化求解 滤波平滑 图:轨迹平滑知识体系总览

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
  • 每个指标的含义和工程意义

记住一句话:好的轨迹,是让乘客感觉不到它在规划。

下一章,咱们会深入讲样条曲线插值,那是实现平滑的经典方法。到时候我会分享一些踩过的坑,保证让你少走弯路。

可可精品资料库