路径表示方法:从离散点到连续曲线的进化之路
做无人车路径规划,第一个要面对的问题就是:路径怎么表示?
说白了,就是怎么把一条路「说清楚」给车听。我刚开始做这个方向时,以为路径就是一堆点连起来就完事了。结果第一次实车测试,车开起来一顿一顿的,像新手司机在练科目二。嗯,这里面的门道可不少。
路径点序列:最朴素的表达方式
路径点序列,就是一组离散的坐标点。比如:
waypoints = [
(0.0, 0.0),
(1.0, 0.5),
(2.0, 1.2),
(3.0, 2.0),
(4.0, 3.1)
]
每个点包含 (x, y) 坐标,有时还带上朝向角 θ。这是最直观的方式,也是很多初学者最先接触的。
优点很明显:简单、直观、容易存储。我在项目中用激光雷达建图时,输出的路径天然就是点序列。
缺点也很致命:
- 点太密,计算量大;点太稀,路径不平滑
- 无法直接计算曲率、切线方向
- 车在点之间怎么走?全靠插值
多项式曲线:用数学公式描述路径
多项式曲线就是用多项式函数来拟合路径。最常见的是三次多项式:
y(x) = a₀ + a₁x + a₂x² + a₃x³
为什么是三次?因为三次多项式可以保证位置和朝向的连续性。你想想看,路径不仅要位置连续,车头的方向也得连续,不然方向盘会突然猛打。
我个人的习惯是,在结构化道路(比如高速公路)上用五次多项式。为什么?因为五次多项式还能保证曲率连续,车开起来更平顺。
| 多项式阶数 | 连续阶 | 适用场景 |
|---|---|---|
| 三次 | C¹(位置+朝向) | 简单换道、低速场景 |
| 五次 | C²(位置+朝向+曲率) | 高速换道、泊车路径 |
| 七次 | C³ | 特殊工况(很少用) |
样条曲线:分段多项式的艺术
样条曲线,说白了就是把路径分成很多小段,每段用一个低阶多项式,然后在连接处保证平滑。
最常用的是三次样条(Cubic Spline)。它保证:
- 每段内是三次多项式
- 段与段之间位置连续
- 段与段之间一阶导数连续(朝向连续)
- 段与段之间二阶导数连续(曲率连续)
我在项目中做过对比:同样一组路径点,用三次样条插值出来的路径,比线性插值的跟踪误差小了将近40%。
# 三次样条插值示例
import numpy as np
from scipy.interpolate import CubicSpline
# 路径点
x = np.array([0, 1, 2, 3, 4, 5])
y = np.array([0, 0.5, 1.2, 2.0, 3.1, 4.5])
# 构建三次样条
cs = CubicSpline(x, y, bc_type='natural')
# 在密集点上求值
x_dense = np.linspace(0, 5, 100)
y_dense = cs(x_dense)
dy_dense = cs(x_dense, 1) # 一阶导数(朝向)
d2y_dense = cs(x_dense, 2) # 二阶导数(曲率相关)
贝塞尔曲线:设计师的宠儿
贝塞尔曲线最早是汽车设计师用的。为什么?因为它有很好的几何直观性。
一条三次贝塞尔曲线由4个控制点定义:
B(t) = (1-t)³P₀ + 3(1-t)²tP₁ + 3(1-t)t²P₂ + t³P₃, t∈[0,1]
控制点 P₀ 和 P₃ 是路径的起点和终点。P₁ 和 P₂ 控制曲线的形状。你拖动 P₁,曲线就往那个方向弯。
我个人觉得,贝塞尔曲线在路径规划中最适合做局部路径调整。比如避障时,只需要调整几个控制点,就能生成一条平滑的绕障路径。
贝塞尔曲线的特点:
- 凸包性质:曲线一定在控制点围成的凸包内
- 端点性质:曲线经过起点和终点
- 切线性质:起点和终点处的切线方向由相邻控制点决定
路径平滑度评价:怎么才算「好」路径?
路径好不好,不能光靠感觉。得有量化指标。我总结了几个核心评价维度:
- 曲率连续性:曲率不能突变。突变意味着方向盘要猛打
- 曲率变化率:曲率的变化速度。变化太快,车会感觉「晃」
- 最大曲率:不能超过车辆的最小转弯半径
- 路径长度:在满足约束的前提下,越短越好
常用的平滑度评价函数:
J = w₁∫κ²ds + w₂∫(dκ/ds)²ds + w₃∫(d²κ/ds²)²ds
其中 κ 是曲率,s 是弧长。w₁、w₂、w₃ 是权重系数。
我在实际项目中,w₂ 的权重设得最大。为什么?因为曲率变化率直接影响乘坐舒适性。乘客晕不晕车,就看这个指标。
知识体系总览
下面这张图,是我梳理的路径表示方法知识体系。你可以把它当作一个快速索引:
这张图把路径表示方法分成了四大类,底部是平滑度评价指标。我个人建议你把它打印出来贴在工位上,做路径规划时看一眼,思路会清晰很多。
最后说一句:没有最好的表示方法,只有最适合的。路径点序列简单但粗糙,多项式曲线数学优雅但全局性差,样条曲线通用性强但计算稍复杂,贝塞尔曲线直观但高阶不稳定。选哪种,取决于你的场景和需求。