路径表示方法:从离散点到连续曲线的进化之路

做无人车路径规划,第一个要面对的问题就是:路径怎么表示?

说白了,就是怎么把一条路「说清楚」给车听。我刚开始做这个方向时,以为路径就是一堆点连起来就完事了。结果第一次实车测试,车开起来一顿一顿的,像新手司机在练科目二。嗯,这里面的门道可不少。

路径点序列:最朴素的表达方式

路径点序列,就是一组离散的坐标点。比如:

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²(位置+朝向+曲率) 高速换道、泊车路径
七次 特殊工况(很少用)
小技巧: 多项式拟合时,别用全局拟合。把路径分段拟合,每段用不同的多项式,效果比一条多项式硬拟合好得多。

样条曲线:分段多项式的艺术

样条曲线,说白了就是把路径分成很多小段,每段用一个低阶多项式,然后在连接处保证平滑。

最常用的是三次样条(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) # 二阶导数(曲率相关)
核心要点: 样条曲线的边界条件很重要。我建议用「自然边界」(natural boundary),即两端二阶导数为零。如果路径是闭环的,用「周期边界」。

贝塞尔曲线:设计师的宠儿

贝塞尔曲线最早是汽车设计师用的。为什么?因为它有很好的几何直观性。

一条三次贝塞尔曲线由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₁,曲线就往那个方向弯。

我个人觉得,贝塞尔曲线在路径规划中最适合做局部路径调整。比如避障时,只需要调整几个控制点,就能生成一条平滑的绕障路径。

贝塞尔曲线的特点:

  • 凸包性质:曲线一定在控制点围成的凸包内
  • 端点性质:曲线经过起点和终点
  • 切线性质:起点和终点处的切线方向由相邻控制点决定
注意: 高阶贝塞尔曲线(超过5阶)容易产生振荡。我建议用分段三次贝塞尔曲线,每段只负责一小段路径。

路径平滑度评价:怎么才算「好」路径?

路径好不好,不能光靠感觉。得有量化指标。我总结了几个核心评价维度:

  1. 曲率连续性:曲率不能突变。突变意味着方向盘要猛打
  2. 曲率变化率:曲率的变化速度。变化太快,车会感觉「晃」
  3. 最大曲率:不能超过车辆的最小转弯半径
  4. 路径长度:在满足约束的前提下,越短越好

常用的平滑度评价函数:

J = w₁∫κ²ds + w₂∫(dκ/ds)²ds + w₃∫(d²κ/ds²)²ds

其中 κ 是曲率,s 是弧长。w₁、w₂、w₃ 是权重系数。

我在实际项目中,w₂ 的权重设得最大。为什么?因为曲率变化率直接影响乘坐舒适性。乘客晕不晕车,就看这个指标。

经验值: 对于乘用车,最大曲率建议不超过 0.1 m⁻¹(对应转弯半径10米),曲率变化率不超过 0.05 m⁻²。这是我做了几十次实车测试总结出来的。

知识体系总览

下面这张图,是我梳理的路径表示方法知识体系。你可以把它当作一个快速索引:

路径表示方法知识体系 路径表示方法 路径点序列 多项式曲线 样条曲线 贝塞尔曲线 离散点集 简单直观 需插值使用 三次/五次多项式 连续可导 适合结构化道路 分段多项式 C²连续 通用性强 控制点驱动 凸包性质 适合局部调整 路径平滑度评价指标 曲率连续性 曲率变化率 最大曲率 路径长度

这张图把路径表示方法分成了四大类,底部是平滑度评价指标。我个人建议你把它打印出来贴在工位上,做路径规划时看一眼,思路会清晰很多。

最后说一句:没有最好的表示方法,只有最适合的。路径点序列简单但粗糙,多项式曲线数学优雅但全局性差,样条曲线通用性强但计算稍复杂,贝塞尔曲线直观但高阶不稳定。选哪种,取决于你的场景和需求。

专注资料整理