3. 道路边界感知与提取

道路边界,说白了就是车能跑的安全范围。没有它,路径规划就像蒙着眼开车。我做了这么多年规划控制,见过太多因为边界感知出问题导致的“惊魂时刻”。今天咱们就聊聊,怎么把这条路给“摸”清楚。

3.1 高精地图的边界提取:先验信息的正确打开方式

高精地图就像一张“标准答案”。但它不是实时更新的,所以我们要学会怎么用它。

核心思路:从地图数据中解析出道路的左右边界线。这些边界线通常以矢量点的形式存储。

关键点:高精地图的边界提取,本质是“坐标转换 + 曲线拟合”。

我习惯的做法是这样的:

  1. 获取当前车辆位置:从GPS/IMU拿到经纬度或UTM坐标。
  2. 地图匹配:找到车辆所在的道路段(Lane Segment)。
  3. 提取边界点集:从该道路段中取出左右边界的点序列。
  4. 曲线拟合:用三次样条或多项式拟合出平滑的边界曲线。

举个例子,从OpenDRIVE格式的地图中提取边界:

// 伪代码:从高精地图提取左边界
Lane currentLane = map.getLaneAtPosition(vehiclePos);
vector<Point> leftBoundaryPoints = currentLane.getLeftBoundaryPoints();
Spline leftBoundarySpline = fitSpline(leftBoundaryPoints);

嗯,这里要注意。地图数据里的边界点可能很稀疏,或者有噪声。我建议在拟合前先做一次滤波,去掉那些明显偏离的“野点”。

个人经验:我曾经遇到过一个场景,地图里的边界点因为采集误差,在弯道处出现了“锯齿”。直接用这些点拟合,规划出来的路径也跟着抖。后来我加了一个“角度约束滤波”,只保留曲率变化合理的点,问题就解决了。

3.2 视觉/激光雷达的实时边界检测:应对动态世界的武器

高精地图再准,也赶不上路况的变化。施工、临时路障、积雪覆盖……这些时候,就得靠传感器实时感知。

3.2.1 基于视觉的边界检测

摄像头便宜,信息丰富。但缺点也很明显——怕暗、怕逆光、怕雨雾。

常用方法:

  • 语义分割:用深度学习模型(如UNet、DeepLab)把图像中的道路、路沿、护栏等像素分类出来。
  • 边缘检测:用Canny算子提取图像中的边缘,再通过霍夫变换或聚类找到直线/曲线边界。
  • 车道线检测:专门针对车道线设计的算法,如LaneNet。

我个人更倾向于语义分割。为什么?因为它能区分“路沿”和“车道线”,这对规划来说很重要。路沿是物理边界,车不能压;车道线是规则边界,紧急时可以压一下。

# Python示例:用OpenCV做简单的边缘检测
import cv2
import numpy as np

def detect_boundary(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray, 50, 150)
    # 霍夫变换检测直线
    lines = cv2.HoughLinesP(edges, 1, np.pi/180, 100)
    return lines

避坑指南:我曾经在一条林荫道上吃过亏。阳光透过树叶洒下来,地面全是斑驳的光影。Canny边缘检测直接“炸了”,把树影当成了边界。后来我加了“阴影抑制”预处理,才稳住。记住,视觉算法对光照变化极其敏感。

3.2.2 基于激光雷达的边界检测

激光雷达(LiDAR)是“硬核”选手。它直接给你3D点云,不受光照影响。但贵,而且稀疏。

常用方法:

  • 地面分割:用RANSAC或Patchwork算法分离地面点和非地面点。
  • 障碍物聚类:对非地面点做欧式聚类,找到路沿、护栏等结构。
  • 边界拟合:从聚类结果中提取边界点,拟合出曲线。

你想想看,激光雷达的点云是三维的。但道路边界其实是个二维问题。所以,我通常会把点云投影到鸟瞰图(BEV)上处理,这样更直观,计算量也小。

// C++示例:基于PCL的地面分割
pcl::SACSegmentation<pcl::PointXYZ> seg;
seg.setOptimizeCoefficients(true);
seg.setModelType(pcl::SACMODEL_PLANE);
seg.setMethodType(pcl::SAC_RANSAC);
seg.setDistanceThreshold(0.2);
seg.setInputCloud(cloud);
seg.segment(*inliers, *coefficients);

个人经验:激光雷达的边界检测,最怕的是“低矮路沿”。有些路沿只有5-10厘米高,点云扫过去就那么几个点。我试过好几种方法,最后发现“多帧融合”最靠谱——把连续几帧的点云叠加起来,路沿就明显了。

3.3 融合策略:让1+1大于2

高精地图和实时传感器,各有各的脾气。我的做法是“地图为主,传感器为辅”。

场景 主信源 辅信源 说明
正常道路 高精地图 视觉/激光雷达 地图提供先验,传感器做校验
施工区域 激光雷达 视觉 地图失效,靠传感器重建边界
隧道/地库 激光雷达 视觉 GPS信号弱,地图定位不准
雨雾天气 高精地图 激光雷达 视觉基本废了,靠地图和雷达

说白了,就是“信地图,但不迷信地图”。当传感器检测到的边界和地图偏差超过一定阈值(比如30厘米),我会触发“边界更新”逻辑,临时用传感器数据替代地图数据。

3.4 本章知识体系

下面这张图,是我自己总结的边界感知流程。你看一眼,心里就有谱了。

道路边界感知与提取知识体系 高精地图数据 传感器数据 边界提取与拟合 地图边界(先验) 实时边界(观测) 边界融合与置信度评估 最终道路边界

这张图把整个流程串起来了。从数据源到最终输出,每一步都有它的意义。我个人觉得,最容易被忽视的是“置信度评估”这一步。很多团队只做融合,不做评估,结果地图和传感器打架时,系统就懵了。

核心总结:道路边界感知不是“选一个方法”,而是“组合一套方案”。高精地图给骨架,传感器给血肉,融合算法给灵魂。

好了,这一章的内容就到这里。边界感知是路径规划的“眼睛”,眼睛亮了,后面的路才好走。