车头明明在辅路上,定位却显示在主路上,中间隔着一道绿化带。这是我做自动驾驶定位模块这几年,听到的最高频吐槽。我自己第一次上车测试时就撞见了:在高架下方的匝道切换处,隔音屏把卫星信号反射得一塌糊涂,轨迹在两条道路之间来回跳。跑测试之前,每个子系统的精度指标看起来都达标,真上了路才知道,高精定位和普通导航定位之间,隔着一条鸿沟。
这篇文章想从一个做过几年量产前定位开发的角度,把“高精定位+高精地图”这套体系摊开讲透:它们分别解决什么问题、每个传感器在里面扮演什么角色、为什么必须组合在一起用、真实道路上最容易在哪里崩,以及工程落地时文档里绝不会写但你一定会遇到的坑。标题里最后的那个“0”,我把它理解成“从零开始讲清楚”——正好适合刚转入智能驾驶的工程师、做产品定义的朋友,以及所有好奇“车是怎么知道自己在哪条道上的”人。
1. 别搞混了:导航定位和高精定位是两套逻辑
1.1 精度差一个数量级,决策逻辑就完全不同
普通手机导航能用的定位,精度大概在5到10米,再经过地图匹配,在城市道路里能大致判断你在哪条路上,但分不出你正处在同向三条车道里的哪一条。高速上10米误差意味着什么?意味着你可能被画到对向车道、相邻匝道,或者干脆画进绿化带里。人开车时对这种偏差无所谓,肉眼一看就知道自己在哪里。但智能驾驶系统没有“肉眼”,它所有的决策都建立在一个空间前提上:我在哪、我周边有什么、我接下来有哪几条路可走。
智能驾驶对定位的要求,横向精度通常要做到10到20厘米,航向角误差在0.1度左右,而且要能稳定输出50到100Hz的位置、速度、加速度。这个精度需求比导航定位高了一到两个数量级,实现手段自然也不是同一种。三者完全不是一个技术路线:
| 能力维度 | 普通导航定位 | 高级辅助驾驶定位 | 自动驾驶定位 |
|---|---|---|---|
| 典型横向精度 | 5~10米 | 0.5~1米 | 10~20厘米 |
| 车道级判断 | 基本做不到 | 弱,依赖启发式规则 | 必须能做到 |
| 输出频率 | 1~10Hz | 10~20Hz | 50~100Hz |
| 失效容忍度 | 重新规划路线就行 | 提示驾驶员接管 | 功能降级甚至安全停车 |
很多做导航出身的朋友刚转过来时,习惯拿“定位点是否在路上”来评判精度,这在高精定位里是不够的。做L2级辅助驾驶,可能一两米精度勉强够用;一旦涉及到自动变道、自动进出匝道、自动泊车这种需要控制的场景,差半个车道就是完全不同的行为。我见过不止一次,因为定位横向误差偏大,车辆在高速上反复压车道线,坐在旁边的安全员头皮都发麻。
1.2 定位不是“给个坐标”,而是给决策一个前提
我常跟新人说一句话:高精定位真正的产出不是一个坐标点,而是“车道级空间语义”。系统需要知道的不是“车在路口前50米”,而是“车在第三车道、时速60、距停止线37米、车头朝向偏右0.3度”。后面每一项都会被下游拿去算:能不能变道、以什么速度进弯、什么时候开始刹车、感知到的那个前方障碍物到底在不在我的轨迹上。
举个例子,车辆经过高架桥下时,桥面和桥下地面道路平行,垂直距离只有几米。导航定位在这个场景里很难分辨车在桥上还是桥下。对自动驾驶而言,这个问题是致命的——别说变道决策做不了,连目标关联都会错乱:明明是对向来车,定位误差把它映射到同一车道上,碰撞风险判断就全错了。所以高精定位不是“GPS再准一点”的问题,而是“如何让机器在物理世界里拥有可信的空间坐标”这一整套工程问题。
这里要区分两个概念:绝对定位和相对定位。绝对定位要回答“车在地球坐标系的哪个点”,相对定位要回答“车相对于最近几个时刻在哪、速度多少、航向多少”。两者缺一不可。绝对定位保证你不偏航,相对定位保证你预测和控制的连续性。后面要讲的传感器组合,本质上就是围绕这两个维度互相补位。
2. 高精定位的传感器全家桶:谁也别想单扛
2.1 GNSS和RTK:厘米级的底子,但天生怕遮挡
所有定位方案里,卫星定位是坐标系的地基。全球导航卫星系统(GNSS)接收机接收导航卫星信号,解算出经纬度和高程。单点定位精度在米级,要往厘米级走,就得靠差分技术。目前量产方案里最常见的是实时动态差分定位,也就是RTK:地面接收机同时接收卫星信号和来自基准站的改正信息,利用载波相位观测值做解算,稳定固定后横向精度可以到2到10厘米。
RTK听起来很美好,但有几个前提。第一,你需要一条稳定可靠的差分数据链路,无论走网络还是电台,这个链路断了精度就掉回米级。第二,基准站和移动站之间距离越远,误差越大,一般几十公里内效果较好。第三,也是最关键的:载波相位整周模糊度的固定对信号质量非常敏感。车辆在城市里移动时,高楼、天桥、隔音屏、隧道、林荫道都会遮挡或反射信号,一旦整周模糊度解不出来,定位就退化为“浮点解”,精度掉到几十厘米甚至一米以上。
我实际测试中遇过的情况是:在开阔的城市快速路上,RTK固定率能到95%以上;到了商业区楼宇之间,固定率可能直接跌到60%。你不可能指望一套卫星定位单打独斗。这也是为什么行业里几乎不会讨论“只靠GNSS做高精定位”的方案——它只负责提供一个总体可信的绝对基准,而且这个基准随时可能劣化。
2.2 IMU和轮速计:没有卫星也敢走的“短时记忆”
惯性测量单元(IMU)负责感知加速度和角速度,通过对时间积分,可以推算速度和位置增量。它的特点是完全自主,不依赖外部信号,短时间内的输出非常平滑;但积分会累积漂移,陀螺零偏、加速度计零偏都会随时间把误差放大。单纯靠IMU推算,几秒内还能接受,一两分钟后位置就不知道漂到哪去了。
轮速计则是利用车辆本身的车轮转速和转向角,按照车辆运动学模型做航位推算。乘用车有阿克曼转向几何,可以用自行车模型近似描述:后轴中心点的速度由轮速折算,转向角决定转弯半径。这个方法在低速、小侧滑的场景下精度很不错,而且不需要任何传感器标定以外的额外布设。但遇到急加减速、湿滑路面、前轮转向角饱和时,模型误差就会暴涨。
这两类传感器在定位系统里的定位很明确:它们是GNSS失效窗口期的“短时记忆”。进隧道、进地库、被高楼遮挡的那十几秒到几分钟,GNSS不可用,但车辆不能因此就不知道自己在哪里。IMU加轮速计的航位推算可以在短时间内把定位输出维持在可用的状态,等待重新捕获卫星信号。而等到GNSS恢复、精度重新固定之后,又可以反过来对标定IMU的漂移项。
2.3 视觉和激光雷达定位:用环境特征重新“找回自己”
光靠GNSS和惯导,你只能知道自己“大概在哪儿”,但不知道自己在车道内的准确横向位置。这时候就需要环境感知传感器来提供“空间锚点”。高精定位里最常用的两个手段:一个是视觉定位,一个是激光雷达点云定位。
视觉定位的基本思路,是把摄像头看到的车道线、路沿、停止线、标志牌、建筑物边缘等特征,与预先构建的高精地图里的特征做匹配,反向解算车辆的位置和姿态。车道线匹配是最直观的,因为车道线在地图里是矢量化存储的,而且横向位置信噪比高。实景里还有大量其他几何线索可以利用:护栏、灯杆、路缘石的轮廓。视觉定位的瓶颈在于光照多变、逆光、雨雾天气和纹理稀疏场景都会让特征提取质量下降。
激光雷达点云定位的思路更直接:把当前扫描到的三维点云,与预先采集的高精地图点云做配准,最经典的方法是正态分布变换(NDT),类似两片点云的对齐。这种方法几乎不受光照影响,在夜间和无纹理场景也有良好表现,但它的前提是地图里有足够新鲜、足够密度的点云数据。如果地图是几个月前采的,而现场多了施工围挡、绿化带变化,匹配就会出问题,需要配合滤波和异常值处理。加上激光雷达本身成本高,很多量产方案会选择“视觉打主力,激光做验证或特定场景增强”。
2.4 多传感器融合:为什么是卡尔曼滤波和因子图的天下
把上面这些传感器放在一起,就面临一个问题:谁来裁决它们之间的矛盾?传统方案里,松耦合的GNSS/INS组合导航用得最多,以INS为主,GNSS观测进来做校正,用一个扩展卡尔曼滤波器维护位置、速度、姿态和IMU零偏的状态估计。卡尔曼滤波的本质,就是利用系统运动模型先预测一步,再用新的观测去修正,权重由协方差决定。这个思路对实时性要求高的车载系统非常友好。
但现在的趋势是把视觉、激光雷达配准、地图约束也拉进状态估计里,形成一个更复杂的约束网络。这个时候因子图更合适:每个传感器观测构成一个因子,状态节点的更新通过非线性最小二乘求解。它天生就能处理多个不同来源的约束,而且可以开滑动窗口做平滑,效果比纯滤波器好。代价是计算量更大,需要工程上做定时触发、增量求解这些优化。
融合的目标不是让某一个传感器“表现最好”,而是让整个系统的定位不确定度最小。一个简单的体会是:滤波器的调参很大程度是在权衡“相信谁”。比如GNSS固定解时,相信它没问题;一旦信号连续异常,观测噪声协方差就要放大,否则一个多径误差就能把整条轨迹拉歪。这种噪声特性和置信度建模的经验,往往比算法本身更值钱,因为算法大家都差不多,差别就在谁对传感器质量退化更敏感、谁更能稳定识别异常观测。
3. 高精地图不是“更精细的导航图”
3.1 地图里到底存了什么东西
很多外行以为高精地图就是把普通导航地图做得更精细一点,比如把道路画得更宽、把车道线画得更清楚。实际上两者的数据组织和用途完全不同。导航地图服务的是“从A到B”的路网拓扑,精度是米级的,它不知道某条车道在某个位置的宽度是3.25米还是3.5米,也不知道这条车道是实线还是虚线。高精地图服务的则是“车辆在车道内的精确运动控制”,它存的是一套分层的、厘米级语义模型。
我习惯把高精地图拆成这几层看:
| 图层 | 内容 | 用途 |
|---|---|---|
| 几何底层 | 道路三维点云、路面边界、护栏、结构物 | 激光点云定位、验证 |
| 车道模型层 | 车道中心线、宽度、车道边界类型、车道连接关系 | 规划横向控制、变道决策 |
| 交通规则层 | 限速值、停止线、导向箭头、信号灯位置 | 行为决策、纵向控制 |
| 静态物体层 | 灯杆、路牌、井盖、隔离墩等路侧设施 | 视觉/点云特征匹配 |
| 动态信息 | 封闭施工、临时改道等时效性信息 | 路径重规划 |
最核心的是车道模型层。这里存的不只是线,还包括每条车道的几何形状、曲率、坡度,以及车道与车道之间的连接关系。规划模块拿它做“前瞻”:定位给出当前位姿,地图提供前方几百米内的曲率和限速,控制模块就可以提前规划出平滑的转向曲线。这一点跟人开车很像——你不会到弯道跟前才打方向,而是提前看到弯道的曲率变化,提前减速入弯。
3.2 地图生产与更新:新鲜度才是老大难
高精地图的生产成本很高。标准的流程是用装有激光雷达、多路相机、高精度GNSS/INS系统的采集车,沿着道路跑一遍,然后对采集数据进行自动解算和人工标注。车道线、箭头、护栏、信号灯这些元素,需要人工在三维点云和影像上一笔一笔标出来,再经过多重质检。一条高速、一个工业园,都要这样跑一遍。所以地图的覆盖范围始终是资源问题,而不是技术问题。
更麻烦的是新鲜度。道路是活的:今天车道线重划了,明天路口加了个护栏,后天施工围挡占了条车道。地图一旦过期,定位匹配和决策都会出问题。行业里通常的做法是两条腿走路:一是周期性复采,主要针对重点区域和高速;二是众包更新,用量产车搭载的前视摄像头,实时检测车道线、路牌等元素的变化,把“疑似变更”发回云端,由云端判断是否需要派采集车或者远程更新。我见过一个很现实的例子:某条路因为临时施工改了三条道的线形,众包车跑了几百趟都报异常,云端合并判定后,新图版本才在当天夜间推给所有车辆。这个链路里,算法只是其中一环,真正难的是异常识别的准确率和版本管理的可靠度。
地图更新还有一个工程细节:热更新不能打断用户正在进行的驾驶任务。车辆如果正跑在一条旧版地图的路段上,云端推送了新版本,系统必须等完成当前驾驶任务或者到达安全停车点再切图。否则,同一路段新旧两版地图的车道模型不一致,规划结果会突变,车辆可能在行驶中突然抖动方向。这类问题在实车上非常惊悚,我很早就学会了把地图版本切换做成显式的状态机,避免异步问题。
3.3 地图怎么用:从粗匹配到车道级锚定
高精地图的使用流程,可以理解为一个“先粗后精”的过程。第一步是借助GNSS/INS输出的粗略位置,在当前地图数据库中检索出附近可能的路段,这个叫“地图初选”或者“粗匹配”。第二步,把传感器观测到的车道线、护栏、点云等特征,与粗匹配出的车道模型做配准,通过几何约束把定位精确到车道级。第三步,利用车道模型的拓扑关系做“地图约束”,比如你的车不可能瞬间横跨三条车道,滤波器会把这个约束作为侧向速度的硬限制,从而抑制发散。
地图在这里还有一个看似不起眼但极其重要的功能:航向约束。GNSS在城市里水平位置可能飘,但卫星给出的航向在大致方向上不会错;而地图可以告诉你某条车道的走向。两者一结合,就能把航向修正到跟车道方向一致。我踩过的一个坑是,地图里的车道中心线如果被人工标注得不够顺滑,在曲率较大的地方会出现微小的折角,把它作为航向约束参与滤波后,定位输出会跟着出现周期性的微小抖动。后来我们在地图入库前会对车道线做样条平滑,并且把平滑残差作为一项质量指标卡掉不合格的图层。这种问题不跑实车根本发现不了。
4. 真实道路上的崩溃现场:定位失效与降级
4.1 隧道、地下车库和城市峡谷
高精定位方案最怕的,其实是“GNSS消失加环境特征稀疏”的组合。这在地下车库里非常典型:卫星信号完全被建筑遮挡,可用卫星数可能降到0;同时地下车库的车道线老旧、墙柱纹理重复,视觉匹配容易走岔。更麻烦的是坡道,车辆上下坡时悬架俯仰,IMU的零偏变化剧烈,航位推算误差会在几秒内放大。
隧道的情况类似,但长度一般有限。我经历过一条2.8公里的城市隧道,进去前RTK固定解,进去后5秒内掉出固定解,航位推算撑着走了一公里后误差已经到几十厘米。好在隧道内的路面有清晰车道线、道钉等特征,纯视觉定位能接管一段时间。但如果隧道内光线过暗或者车道新旧不一,视觉也会失效。所以工程上有一种补充手段,是在隧道内布设路侧信标或者利用无线信号做指纹定位。这听起来有些复古,但对长隧道来说是保命的底牌。
城市峡谷指的是高楼密集的街区。这里的问题不是信号消失,而是多路径效应。高楼的玻璃幕墙会把卫星信号反射到接收机里,导致载波相位观测值出现非视距误差。RTK算法很难区分一个观测量到底是从卫星直达还是反射来的,于是可能给出一个精度很高但位置完全不对的“假固定解”。这种错误比“精度差”更危险,因为系统完全不会察觉。这也是为什么我一直强调,任何定位方案都要保留独立的冗余校验手段,比如用视觉匹配结果跟GNSS结果做交叉验证,当偏差超过阈值时主动降低GNSS的置信度。
4.2 天气、光照和物理遮挡的连锁反应
天气对定位的影响,其实是一套连锁反应而不是单一因素。大雨和浓雾会降低摄像头的有效视距,车道线识别距离从上百米掉到二三十米,视觉定位的作用范围大幅缩小。激光雷达在雨雾里也会因为前方水汽和微粒产生大量噪声点,点云配准的稳定性和精度都会下降。而GNSS本身在电离层活跃期或者汛期水汽变化大时,载波相位解算也会变差。三种手段同时降级时,系统只能退回到IMU和轮速计的航位推算,这几乎是最后一道防线。
还有一类场景容易被忽略:逆光。黄昏时分车辆正对太阳行驶,摄像头有可能整幅画面过曝,车道线全部“消失”在强光里。我实测过,某些镜头在逆光且路面是黑沥青的情况下,视觉定位的有效特征数量会降到正常情况的两成。这类场景靠算法有时救不回来,工程上的应对是镜头镀膜、HDR曝光策略优化,以及在功能设计上降低对单一视觉定位的依赖。说到底,高精定位系统的可用性边界,不是看某个指标的最优值,而是看各种环境互相叠加时仍然能保住多少性能。
4.3 降级策略:从精度降级到安全接管
定位失效不应该是一个“全有或全无”的事件,而应该是一条完整的功能安全通道。我在量产项目里通常会把定位健康度分成几档:
- 定位可用:RTK固定解,或融合定位误差模型表明精度达到厘米级,所有功能开放。
- 定位受限:RTK退化为浮点解,或者视觉匹配置信度下降,自动变道、自动进出匝道等高风险功能关闭,但车道保持仍可用。
- 定位降级:只能依赖航位推算和地图约束,横向精度可能超过50厘米,系统要求驾驶员注意力保持,并准备接管。
- 定位丢失:无法确定车道级位置,系统触发最小风险操纵,例如减速并在当前车道内停车,同时呼叫驾驶员接管。
这里有一个安全逻辑很关键:系统不能假装自己知道自己在哪儿。如果精度已经超出可接受范围,还硬撑着继续自动控制,才是最危险的。降级策略要和整车的决策规划模块对接,自动变道请求在降级时要被冻结,导航路径提示要明确告诉驾驶员“系统定位能力下降”。做这套降级架构时,我最大的体会是,与其拼命让定位在所有场景下都“准”,不如老老实实让系统在“不准”的时候显式地表现出怂。这是对所有安全员最负责任的做法。
5. 工程落地时最容易踩的几个深坑
5.1 标定:外参差1度,百米外偏1.7米
传感器标定是定位系统里最枯燥但最要命的一环。IMU要标零偏和比例因子,摄像头要标内参和畸变,雷达要标到车体坐标系的外参。外参是传感器坐标系到车体坐标系的旋转和平移,它直接决定融合结果的正确性。
一个简单的三角学事实:航向角外参误差0.5度,在50米距离上就带来约0.44米的横向偏差,在100米时接近0.87米。如果相机或雷达的外参标定偏了1度,100米外就是1.7米——这已经跨越了半条车道。很多定位误差的根因,最后查出来不是算法问题,而是外参没标准。尤其是摄像头外参会受温度影响——支架热胀冷缩、车体震动导致轻微位移,装车后隔几个月重新标定,误差变化足以影响车道级定位。
工程上的经验是:标定不是一次性动作,而是持续性的。出厂前做精标定,生产线下线做快标定,售后和用户使用过程中还要靠自标定算法在线修正。自标定的思路,是利用GNSS/INS的高精度航向输出,反过来估计雷达、摄像头的安装角偏差。这相当于系统自己给自己校正坐标轴。第一次做这个功能时,我完全没料到它对数月后的定位稳定性帮助这么大——很多用户反馈的漂移问题,最终都是靠自标定自动消化掉的。
5.2 时间同步:多传感器数据必须对齐到同一个时刻
多传感器融合里,一个常被低估的坑是时间同步。摄像头用的是滚动快门,图像顶部和底部的曝光时刻不同;IMU以几百赫兹输出,但数据包到处理器时有随机延迟;激光雷达一个扫描周期内,点云里的每个点采集时刻也不一样。这些时间戳如果不严格对齐,就相当于用半秒前的位置和现在的感知数据做融合,误差可想而知。
工程上通常用硬件同步脉冲(比如PTP或专门的同步信号)把各传感器的采样时刻对齐到统一的时基,再在软件里做时间戳插值。这里最隐蔽的问题是不同链路时延的不一致:IMU数据可能经过FPGA直接给到处理单元,延迟是固定的;摄像头的数据要经过ISP和编解码,延迟可能是IMU的几十倍而且抖动。如果不做延迟补偿,系统会引入一个“随时间漂移”的偏差。我自己调试时最烦的就是这种非固定延迟,排查起来非常费劲。后来学到的最稳妥做法,是在系统集成测试里专门加一个“时间对齐验证用例”,人为计算各传感器在同一物理事件(比如急刹车)上的时间戳差,超出阈值直接判失败。
5.3 “真值”从哪来:没有靠谱的真值,就没有靠谱的评价
定位系统最微妙的地方在于,你很难知道“正确答案”到底是什么。算法输出的坐标和真值之间差了多远,这个本身就依赖于如何获得真值。行业里的标准做法是用高精度测量级的组合导航设备做参考系统,再配合后处理动态差分(PPK)技术,把测量车走过的轨迹回算到厘米级。但这套设备很贵,而且它在隧道、地下车库同样会失效,所谓真值在这些场景里其实也是估计值。
所以做定位评价时,我看的不只是一条曲线的误差,而是三个层次:
- 统计指标:横向/纵向误差的RMS、50%分位数、95%分位数,以及航向误差分布;
- 事件指标:车道命中率、车道切换次数、定位结果跳变次数、固定率;
- 安全指标:在哪些路段、哪些工况下定位降级,降级是否被正确触发和上报。
不要只盯着平均误差看。平均误差好看,不代表系统行为稳定。我见过某个方案在开阔道路误差中位数5厘米,但在一个特定高架桥下连续跳变,每次跳0.8米,下游规划模块跟着每周跳一次。如果只看误差统计,这个问题会被完全淹没;只有把位置跳变事件单独统计出来,才能暴露这个偶发问题。测试路线的设计也很有讲究,必须刻意覆盖隧道、高架下、林荫路、施工改道区这些“高难度”场景,否则测试通过率高得不真实,一到开放道路就崩。
还有一个我吃了不少亏才换来的教训:真值设备本身的参考坐标和车载定位输出的坐标可能来自不同的坐标系定义基准,比如不同的椭球、投影方式甚至高程基准。两者直接做差会多出莫名其妙的大常量。必须先做一个“基座对齐”的校准,确认参考坐标系一致再谈误差,否则你会在一个根本不存在的系统误差上浪费好几周。
6. 最后的一点个人体会
高精定位和地图这套东西,纸上谈兵很容易,真正难的是在恶劣物理环境下维持稳定。我做过的项目里,算法迭代带来的提升永远不如“老老实实把标定、时间同步、真值评价、降级逻辑做扎实”带来的提升大。很多团队愿意花几个月去试最新的融合算法,却连一套像样的在线自标定都不愿意做,最后实车测试天天被外参漂移坑。反过来,把基础工程做到位的团队,即使用很传统的滤波器,也能在大多数场景下跑得又稳又安全。
如果你是刚要起步做这块的工程师,我的建议很朴素:先买一套能出真值的参考设备,把评价体系建起来;然后花时间跟车,亲手跑几趟隧道、地库和高架桥下;最后再去啃滤波和因子图的推导。顺序搞反了,学再多理论也会在第一个雨夜测试里怀疑人生。
这个领域接下来的扩展方向,在我看来主要是两个:一个是地图数据和实时感知之间的闭环更紧密,让车辆不仅能“用地图”,还能“维护地图”;另一个是定位结果与规控的联合优化,把“知道自己在哪”和“决定怎么走”真正做成一个整体。高精定位这门课,从拿到真值、跑出第一条稳定轨迹那天才算真正开始。