道路边界表示方法:离散点集、样条曲线、分段线性函数、栅格地图

做路径规划这么多年,我越来越觉得——道路边界怎么表示,直接决定了你的规划算法能跑多快、多稳。说白了,边界就是车不能碰的“墙”。但怎么描述这堵墙,学问可大了。

今天咱们就把四种主流表示方法掰开揉碎讲清楚。每种方法我都踩过坑,也总结了一些实战经验。

一、离散点集——最朴素,也最直接

离散点集,就是拿一堆坐标点来描述边界。比如激光雷达扫一圈,回来就是一堆(x, y)点。

优点很明显:

  • 数据来源直接,传感器输出啥就是啥
  • 存储简单,一个数组搞定
  • 处理速度快,不需要额外计算

缺点也扎心:

  • 点与点之间是“盲区”,你不知道中间有没有障碍
  • 点太密,计算量大;点太稀,容易漏掉关键信息
  • 做碰撞检测时,得遍历所有点,效率堪忧
我的经验: 我在做矿区无人驾驶时,激光雷达扫出来的边界点动不动就上万个。直接拿来做路径规划?卡死你。我当时的做法是先降采样,再用RANSAC剔除离群点,最后保留关键轮廓点。嗯,这样效率就上来了。

二、样条曲线——平滑,但小心过拟合

样条曲线,尤其是三次样条,是我个人比较喜欢的一种方式。它用分段低次多项式把离散点连成一条光滑曲线。

为什么用三次?因为二阶连续,曲率变化平缓,车跑起来舒服。

// 三次样条插值示例(伪代码)
// 输入:离散点集 P[0..n-1]
// 输出:分段多项式系数 a[i], b[i], c[i], d[i]

for i = 0 to n-2:
    h[i] = P[i+1].x - P[i].x

// 解三对角方程组求二阶导数
solveTridiagonal(h, &M)

for i = 0 to n-2:
    a[i] = P[i].y
    b[i] = (P[i+1].y - P[i].y)/h[i] - h[i]*(2*M[i] + M[i+1])/6
    c[i] = M[i]/2
    d[i] = (M[i+1] - M[i])/(6*h[i])

优点:

  • 曲线光滑,适合做轨迹参考
  • 可以精确控制曲率,对车辆动力学友好
  • 插值精度高,点之间不会出现突变

缺点:

  • 计算量比离散点大
  • 如果控制点选得不好,容易出现过拟合——曲线扭来扭去
  • 实时更新边界时,需要重新计算所有系数
避坑指南: 我曾经在一个项目中,用样条曲线拟合弯道边界,结果控制点间距不均匀,曲线在弯道内侧“鼓包”了。后来我改用带约束的样条——强制曲率不超过某个阈值,问题就解决了。

三、分段线性函数——简单粗暴,够用就好

分段线性函数,说白了就是用折线近似曲线。每两个相邻点之间用直线连起来。

你可能会问:这不就是离散点集吗?区别在于——分段线性函数把点之间的连接关系也定义清楚了,形成一个完整的“边界轮廓”。

优点:

  • 碰撞检测极快——判断点在直线哪一侧就行
  • 内存占用小,只存端点坐标
  • 实现简单,调试方便

缺点:

  • 转折点处曲率不连续,车经过时会有“顿挫感”
  • 对弯道描述不够精细,需要很多段才能逼近真实边界
适用场景: 结构化道路(高速公路、城市道路)的边界描述。因为这些道路本身弯道半径大,分段线性函数完全够用。我在做高速自动驾驶项目时,就用的这种方法,效果很好。

四、栅格地图——把世界切成小方块

栅格地图,就是把环境划分成一个个小格子。每个格子标记为“可通行”或“不可通行”。

这是我最常用的方法之一,尤其是在复杂场景下。

栅格分辨率 优点 缺点 推荐场景
0.1m × 0.1m 精度高,细节丰富 内存大,计算慢 低速、精细操作
0.5m × 0.5m 平衡了精度和效率 可能漏掉小障碍 城市道路
1m × 1m 速度快,内存小 边界粗糙 高速公路

优点:

  • 统一表示所有障碍物,包括动态障碍
  • 路径搜索算法(A*、Dijkstra)直接在上面跑
  • 更新方便,传感器数据直接往里填

缺点:

  • 分辨率选择是个难题——高了慢,低了不准
  • 边界不光滑,规划出来的路径可能“锯齿状”
  • 大场景下内存爆炸
我的建议: 别死磕一种方法。我现在的做法是——栅格地图做全局规划,样条曲线做局部轨迹优化。两者结合,既保证了全局可达性,又保证了局部平滑性。

知识体系总览

下面这张图,帮你理清四种方法的关系和适用场景:

道路边界表示方法对比 离散点集 原始传感器数据 存储简单 点间有盲区 碰撞检测慢 样条曲线 光滑连续 曲率可控 计算量大 易过拟合 分段线性 碰撞检测快 内存占用小 曲率不连续 弯道需多段 栅格地图 统一表示 搜索算法友好 分辨率难选 大场景内存大 如何选择? • 高速结构化道路 → 分段线性函数(简单高效) • 复杂城市道路 → 栅格地图 + 样条曲线(全局+局部) • 矿区/越野场景 → 离散点集(直接使用传感器数据) • 需要精确曲率控制 → 样条曲线(适合轨迹跟踪) ▼

你想想看,实际项目中很少只用一种方法。我做过一个园区物流项目,白天用栅格地图做全局路径,晚上光线不好时切换成离散点集+样条曲线。说白了,工具是死的,人是活的。

最后提醒一句:不管用哪种方法,边界表示的精度一定要和传感器精度匹配。你用厘米级精度的边界,配个米级精度的GPS,那就是白费功夫。

核心总结: 离散点集是原料,样条曲线是精加工,分段线性是实用派,栅格地图是万金油。选哪种,看你的场景、算力和传感器。

可可精品资料库