无图时代的NOA也会“瞎”——车道线脑补如何拯救城市领航?
作者 | 山丘
出品 | 焉知汽车
在自动驾驶领域,现实场景存在较高的复杂性。如遮挡情况下,前车、施工锥桶、落叶遮挡车道线(约30%城区场景存在遮挡)。磨损时,老旧道路标线模糊或缺失(尤其雨天/逆光时)。传感器局限情况下,摄像头视角有限,激光雷达对平面标线不敏感。“车道线脑补”(Lane Completion/Inpainting)是一个既形象又关键的术语,指的是当车道线因遮挡、磨损或传感器局限导致信息缺失时,系统通过算法推理并补全缺失部分的能力。车道线是路径规划的基础,缺失会导致车辆“迷路”或压线风险。它本质上是一种基于上下文理解的预测技术,这种技术说起来并不复杂,但是要做好却是摆在很多开发者面前的难题。这里我们将基于实际的场景进行详细解析。
道线脑补的场景困境主要表现为:当前帧车道线感知点数较少(如 < 5个),导致无法稳定拟合当前车道线。
感知受遮挡、光照、路口车道线消失等影响,BEV或前视模型输出不连续。地图存在精度问题,或某些城市道路未覆盖精细拓扑。此时,通过使用历史时刻的感知车道线或轨迹点,作为当前车道线拟合的参考,引导轨迹构建、车道选择、通行区域判断。
车道线脑补的核心思想是轨迹与车道线“时序融合与延拓”。你可以将当前车道线视为一个动态时间序列,如果前方缺失,就用历史轨迹(即过去几帧的车道线)延展(extrapolate)出未来方向。
如上过程的实现步骤详解如下:
首先,记录历史车道线结构(缓存),每帧保存 BEV 感知输出的车道线中点坐标(或中心线)。
保持时间滑窗缓存,如:
自动驾驶中常见三种坐标系分类如下:
自动驾驶感知系统中,每一帧的车道线(或BEV语义)是以当前帧车辆自车坐标系为参考。不同帧的感知点、车道线是在不同“自车坐标系”下表示。若我们想将历史帧的车道线叠加或拟合,需要将历史帧车道点变换到当前帧的自车坐标系下。这里可以定义一个从历史帧 t−k到当前帧 t 的坐标变换矩阵 Tt−k→t,通过如下变换矩阵将历史道线对齐至当前坐标系:
其中,Tt−k→t为从 t-k 帧到当前帧的车身坐标变换(来自里程计 / IMU / 步进式轨迹积分),即这个矩阵把“t-k帧下的某个点”转为“当前帧(t帧)下对应位置”。我们通常使用 SE(2) 或 SE(3) 中的位姿变换矩阵。对于 2D 平面(BEV),可使用 3×3 齐次变换矩阵:
其中,θ:车辆在 t 与 t-k 帧之间的偏航角变化;Δx,Δy:车辆 t-k 到 t 帧的平移量(可以是轮速里程计、IMU积分或GNSS测得);输入点需以齐次形式: pt−k=[x,y,1]T。
那么,如何获取 Tt−k→t呢?这里我们讲一种通过 odometry / SLAM / IMU 获取相对变换的方式来获取:
很多系统(如Apollo、Autoware、ROS、LIO-SAM等)都提供帧间位姿差 Δx,Δy,Δθ或完整的 TF tree 坐标变换矩阵。可以直接用如下代码段来获取该数值:
tf::Transform relative_tf = tf_buffer.lookupTransform("base_link@t", "base_link@t-k", ros::Time(0));
将其转换为 Eigen 或 NumPy 矩阵形式使用。
当然,这里需要注意,如果使用里程计或IMU这类输入端来实现变换矩阵,可能由于位姿误差积累,转角大时精度下降,定位精度不够高等因素导致出现计算出来的T矩阵精度逐渐下降。这时候我们可以通过设定一定的短时间窗口(如≤1s)历史点,避免里程计误差积累。也可以使用四元数或3D位姿避免gimbal lock(建议用SE(3)),并尽量融合IMU+GNSS的RTK位姿系统来做不断的误差校正。
车道线融合或拟合过程中,有了历史多帧对齐后的车道线点,使用它拟合一条曲线(如 B样条 / 三次样条 / 多项式),或者也可以用贝塞尔曲线、样条段生成平滑的未来延展。
假设当前帧为 t,你持有从当前帧往回数的 K 帧历史车道线点集(含当前帧)。意思是你将历史第 t−k帧中的车道点 Lt−k,变换到当前帧坐标系,然后与其他帧做点集融合(并集),最终得到统一的点集用于曲线拟合。
有人可能要问,为什么这里需要各点做并集交互呢?这个问题非常关键,涉及到车道线融合或拟合过程中,为什么要将历史帧的车道线点集从 t=0 到 t=K 做“并集”,也就是为什么车道点需要跨时序整合,再做统一拟合。
首先,“时间融合”是为了拟合“空间连续”结构。虽然这些点来自不同时间,但它们在道路上的物理空间是连续的。通过车体坐标变换(Transform)将所有点变换到当前坐标系后,它们就处于同一参考空间。这就能让拟合器认为这些点是在一条连续的曲线上。从 t=0到 t=K多帧做点集融合,其实相当于一种轨迹历史结构的时序滤波器。 你获得的是比单帧更鲁棒、误差更小的轨迹结构。
1. 弥补感知不稳定的问题
在城市环境中,车道线经常被遮挡、光照干扰,导致某一帧感知出的点非常稀疏,甚至丢失。但可以相信“历史帧中有完整点的可能更大”。将历史帧的数据进行融合,可以提高整体点密度,提升拟合鲁棒性。比如,当前帧检测到了3个前车道点。t-1帧有5个点,t-2帧也有3个点,合并后你可以拥有 11 个可用于拟合的点,比仅用当前帧要丰富得多。
2. 构造更长的拟合范围(延展未来)
当前帧的感知范围有限(比如只看到10米远),无法预测未来10~20米的车道方向。但车辆之前已经从该道路上行驶过,历史车道线自然包含了更长的结构延展。将历史点对齐并融合后,可以从已知历史轨迹延展出未来拟合轨迹。
3. 提升拟合曲线的平滑度与连续性
B样条、三次样条等拟合方法依赖足够密的点才能构造出曲率连续、无震荡的曲线。使用多帧点融合能显著降低局部过拟合、断裂问题。特别在交叉口或红绿灯区域,地图和感知都会变得模糊,历史结构是对抗感知不确定性的关键补强。
如下图表示整个从历史点延展到当前点变换拟合的整个过程,即Transform的计算过程。两个 T 阵可以看成是在对当时的相机外参矩阵进行标定。每一帧(历史帧 t−k、当前帧 t)都有自己的相机外参(或者说自车坐标系到世界坐标系的变换矩阵)。所以 Tt−k 就是那一刻的车体在世界坐标系下的位置和朝向,等价于 camera-to-world 外参。
红绿灯场景补线逻辑为感知车道线只到路口边界,之后中断,利用历史道线延展一段“虚拟车道中心线”,与红绿灯方向做角度对齐(与红灯箭头方向匹配),构成未来轨迹规划的引导线或cost约束项。
轨迹延展策略(Future Projection)可以使用当前车速/航向角加上拟合曲线的延展方向,构建前方10~20米的车道参考中心线,用于轨迹规划器(或轨迹采样器)约束自车路径生成。
如上图所示,需要基于当前航向角和速度构建前向线性延展,最终基于构建未来L米的轨迹参考线,轨迹曲线拟合曲线的切线方向构建平滑拼接到已有曲线的尾端。具体的操作方法如下:
1.速度 + 航向角延展(直线或低阶曲线)
根据当前状态延展出直线段(或低阶曲线)作为参考轨迹,延展轨迹表达式如下:
即用速度方向沿着当前航向角正向投射,若考虑加速度,还可以扩展为二阶曲线:
这在较低速直行区域效果较好,适合起点是拟合曲线终点。如果遇到有带有一定转弯半径的车道场景,就有可能出现误拟合的情况,甚至拟合的轨迹超出未来行驶车道,此时需要结合车辆当前的航向角进行车辆未来轨迹综合判定。这正是自动驾驶在“前方道线缺失”但又“隐约知道前方是弯道”的时候,要做的“曲率脑补”策略。
实际上,上述问题的本质是需要拟合一个有弯曲趋势(曲率)的延展轨迹。上述方法原本延展的是直线(或二阶曲线),不考虑前方路径的弯道趋势。这里需要加入感知模块对“即将转弯”的语义判断(如红绿灯转向提示、导航规划路径等)。
• 用圆弧(常曲率)进行脑补
若能提前识别出前方存在右转(或左转)趋势,或者存在一定的车道曲率半径R,就可以构造一个带弯道形态的拟合曲线段,作为未来参考中心线。
如上解法概述为可以构造圆弧 or 曲率变率可控的样条段,这里可以用圆弧(常曲率)进行脑补。若已知或感知出前方车道有一个近似固定的转弯半径 R,可以延展出一段圆弧(constant curvature arc), 延展圆弧的轨迹表达式为:
其中,R为车道拟合的曲率半径,正负代表左转/右转。这种做法假设车辆以常速在圆弧上运动,延展出的就是一段带有弯道趋势的“脑补”轨迹。
• 曲率插值 + Bezier / B样条段平滑拟合
如果估算了当前曲率为κ0=0(直行),但预计前方曲率逐渐变化到某一值 κ1=1/R,那么可以使用曲率变率可控的样条拟合策略:
• 二次螺旋(clothoid)拟合
根据历史轨迹预测前方曲率趋势,构建动态曲率模型κ(s)。基于此参考线动态生成轨迹采样组,并做优化(如最小加速度 jerk)。具体可根据实际道路形状做相应的如下优化措施:当需要曲率从 0→1/R平滑变化,可以构建一段二次螺旋轨迹(clothoid),其满足曲率是弧长的线性函数:κ(s)=κ0+a⋅s;可直接集成进采样轨迹生成器(如 Lattice planner)。曲线公式简化如下:
可以使用 Fresnel 积分数值计算,整体弧长按照每一小段进行积分计算获得。
请先 登录 后再发表评论~