
1. 从泊车场景说起AVP-Loc到底在解决什么问题自动代客泊车AVPAutomated Valet Parking这个场景说白了就是让车自己去找车位、自己停进去。听起来简单但真正落地的时候最要命的问题不是控制而是定位——车在地库里没有GPS信号周围全是水泥柱子、金属管道、反光地面视觉特征重复度极高激光雷达打出去的回波也乱七八糟。前深动科技后被小米收购并入智驾团队做的这套AVP-Loc核心就是解决“车在地库里到底在哪”这个问题。我第一次接触这个方向的时候踩过一个很典型的坑以为把SLAM那套直接搬到地库就行了。结果发现建图阶段勉强能跑但到了实际泊车阶段车需要的是厘米级的绝对定位精度而不是SLAM那种相对轨迹一致性。AVP-Loc的设计思路从一开始就区分了“建图”和“定位”两个阶段建图可以离线慢慢做定位必须在线实时跑而且要对光照变化、动态障碍物、地面反光有足够的鲁棒性。这套系统适合谁来参考如果你在做低速无人驾驶、园区物流车、地下停车场导航、或者任何GNSS拒止环境下的定位方案AVP-Loc的架构思路都值得细看。它不是一个黑盒端到端模型而是一个多传感器融合的经典工程系统里面用到了PCA做特征降维、ICP做点云配准、ESKF做状态估计、BEV做感知表征。这些技术单独拎出来都不新鲜但组合在一起解决地库定位问题有很多工程细节值得拆解。2. 整体架构拆解为什么是这套组合拳2.1 建图与定位分离的设计哲学AVP-Loc最核心的架构决策是把建图和定位彻底分开。建图阶段用离线方式跑一遍完整的地库环境生成一张高精度的先验地图定位阶段只做局部匹配和状态估计不修改地图。这个决策背后的逻辑很直接地库环境虽然复杂但结构变化很慢柱子不会今天在这明天在那地面标线也不会天天重画。既然环境是准静态的那就没必要在线维护地图离线建一张好图在线只管用就行。这样做的好处有三个。第一在线计算量大幅降低不需要跑完整的SLAM后端优化嵌入式平台也能实时。第二定位精度可控因为地图质量在离线阶段已经验证过了在线不会因为观测噪声把地图带偏。第三系统可解释性强出了问题可以分别排查是地图的问题还是定位的问题不像端到端模型那样一锅粥。但这里有个前提建图阶段必须足够细致。我见过不少团队建图时随便跑一圈就完事结果定位阶段各种漂。AVP-Loc在建图阶段会做多次闭环和全局优化确保地图的全局一致性。具体来说建图时用激光雷达和视觉融合做里程计然后通过回环检测修正累积误差最后用位姿图优化得到全局一致的点云地图和视觉特征地图。2.2 多传感器融合的层次化设计AVP-Loc的传感器配置通常是激光雷达加环视相机可能还有IMU和轮速计。这些传感器的融合不是简单加权平均而是分层次的。最底层是IMU和轮速计的航迹推算频率最高但漂移快中间层是激光雷达的点云配准精度高但频率低最上层是视觉特征匹配提供全局约束但受光照影响大。这种层次化设计的核心思想是不同传感器在不同时间尺度上提供不同性质的信息。IMU和轮速计提供高频但低精度的相对运动估计激光雷达提供中频高精度的局部几何约束视觉提供低频但全局的绝对约束。ESKFError State Kalman Filter就是把这些信息融合在一起的框架。我实际调试的时候发现ESKF的误差状态建模非常关键。如果把所有状态都放在滤波里估计计算量会爆炸但如果只估计误差状态把名义状态单独积分计算量就小很多。AVP-Loc用的就是误差状态ESKF名义状态用IMU和轮速计积分误差状态用激光和视觉观测来修正。2.3 BEV表征在定位中的角色BEVBird‘s Eye View视角在这套系统里主要用在感知和特征提取阶段。地库环境下视觉图像透视畸变严重直接做特征匹配效果很差。但把图像投影到BEV平面后车道线、车位线、地面标识都变成了规整的几何形状匹配起来就稳定多了。AVP-Loc的BEV生成通常用逆透视变换IPM做基础投影然后结合相机外参和地面假设做精细化。这里有个工程细节地库地面不一定完全水平有坡度的地方IPM会失真。所以实际系统中会用IMU的俯仰角估计来动态修正IPM的投影矩阵保证BEV图像的地面一致性。BEV特征在定位中的用法有两种一种是直接和先验BEV地图做匹配另一种是从BEV图像中提取线段、角点等几何特征然后和地图中的对应特征做关联。前者计算量大但信息丰富后者计算量小但依赖特征提取的稳定性。AVP-Loc实际用的是混合策略在粗定位阶段用BEV图像匹配在精定位阶段用几何特征匹配。3. PCA在AVP-Loc里的三个关键应用3.1 PCA做点云降维与法向量估计激光雷达点云在地库环境下有个特点地面点特别多墙面点也不少但真正有区分度的特征点比如柱子边缘、车位锁、减速带占比很低。如果直接拿原始点云做ICP配准地面点会主导优化方向导致水平方向的约束很强但垂直方向的约束很弱。PCA在这里的第一个应用就是做点云的主成分分析提取每个局部邻域的主方向。具体做法是对每个点取K近邻计算邻域协方差矩阵然后做特征值分解。特征值最大的方向就是局部表面的主方向特征值最小的方向就是法向量方向。通过分析特征值的比例关系可以判断这个点是平面点、边缘点还是角点。这个判断逻辑很实用如果三个特征值差不多大说明是角点或孤立点如果两个特征值大一个小说明是边缘点如果一个特征值大两个小说明是平面点。AVP-Loc在配准时会给边缘点和角点更高的权重给平面点更低的权重这样配准结果就不会被地面点带偏。我实测下来这个权重策略对地库场景的提升非常明显。不做PCA分析直接ICP水平漂移经常超过20厘米做了PCA加权之后水平漂移能压到5厘米以内。3.2 PCA做BEV图像的特征压缩BEV图像的分辨率通常不低比如200x200或者更大直接拿来做匹配计算量很大。PCA在这里的用法是对BEV图像块做降维提取主成分特征然后用低维特征做快速匹配。具体流程是先把先验地图的BEV图像切成很多小块每块做PCA得到一组特征向量存成特征库。在线定位时对当前BEV图像做同样的分块和PCA投影然后在特征库里找最近邻。这样匹配的计算量从像素级降到了特征级速度提升一个数量级。这里有个细节PCA的训练集必须覆盖地库的各种光照和视角变化否则特征向量泛化能力不够。AVP-Loc在建图阶段会采集多趟数据每趟的光照条件不同用这些数据一起训练PCA基向量。实际用的时候如果遇到训练集没覆盖的光照条件匹配成功率会下降但因为有激光雷达兜底整体定位不会丢。3.3 PCA做位姿空间的降维优化这个用法比较隐蔽但在工程上很实用。AVP-Loc在全局定位阶段需要在先验地图里搜索最可能的位姿。如果直接在6自由度空间里搜计算量是天文数字。PCA在这里的用法是对历史定位轨迹做分析发现地库行驶的位姿变化主要集中在几个主方向上——比如沿车道方向的平移、绕垂直轴的旋转——其他方向的自由度变化很小。基于这个观察AVP-Loc把位姿搜索空间降维到这几个主方向上搜索维度从6降到3甚至2计算量大幅降低。这个思路本质上是用数据驱动的方式发现运动先验然后把这个先验编码到搜索策略里。我一开始觉得这个做法有点“取巧”但后来想明白了工程系统不需要追求理论上的完备性只需要在特定场景下稳定工作。地库行驶本来就有很强的运动约束利用这些约束做降维是完全合理的。4. ICP配准在地库环境下的实战调优4.1 标准ICP为什么在地库容易翻车ICPIterative Closest Point配准的原理很简单找最近点、算变换、迭代。但在地库环境下标准ICP有几个致命问题。第一地面点太多最近点匹配时地面点会主导优化导致水平方向配准很准但垂直方向漂移。第二地库有很多重复结构比如一排排的柱子ICP容易匹配到错误的柱子上导致配准发散。第三初始位姿误差大的时候ICP直接陷入局部最优。我第一次跑标准ICP的时候车在直道上还行一到拐弯处就漂得离谱。后来分析发现拐弯处柱子密集最近点匹配经常把左边的柱子匹配到右边的柱子上变换矩阵算出来完全是错的。4.2 点云预处理与特征加权策略AVP-Loc对ICP的改进主要在三方面。第一是点云预处理先做地面分割把地面点单独拿出来做水平配准非地面点做完整6自由度配准。地面分割用RANSAC拟合平面然后根据点到平面的距离分类。这个步骤很关键因为地库地面通常比较平整RANSAC能稳定分割。第二是特征加权前面提到的PCA分析结果在这里用上了。边缘点和角点的权重设为平面点的3到5倍这样配准时特征点的影响力更大。权重的具体数值需要根据场景调地库场景下我一般设边缘点权重3.0角点权重5.0平面点权重1.0。第三是鲁棒核函数标准ICP用最小二乘对 outlier 很敏感。AVP-Loc用Huber核或者Tukey核对距离大的匹配对降权。Huber核的阈值一般设点云分辨率的2到3倍比如点云分辨率5厘米阈值设10到15厘米。4.3 多分辨率配准与收敛判断AVP-Loc的ICP不是单分辨率跑的而是从粗到精多分辨率。先把点云降采样到20厘米分辨率跑一轮ICP得到粗配准然后降采样到10厘米再跑一轮最后用原始分辨率跑最后一轮。这样做的原因是粗分辨率下点云稀疏最近点匹配不容易陷入局部最优能快速收敛到大致正确的位姿精分辨率下再细化保证最终精度。收敛判断也有讲究。标准ICP用变换矩阵的变化量做判断但地库环境下这个指标有时候会骗人——变换矩阵变化很小但实际位姿已经漂了。AVP-Loc用复合判断变换矩阵变化量小于阈值且匹配点对的平均距离小于阈值且匹配点对数量大于阈值三个条件同时满足才认为收敛。我踩过的坑是只用一个条件判断结果在柱子密集区域过早停止迭代配准精度不够。后来加了匹配点对数量的判断确保有足够多的有效匹配才停止精度就稳定了。5. ESKF融合框架的工程实现细节5.1 状态向量设计与噪声参数整定ESKF的状态向量设计直接决定了滤波器的性能。AVP-Loc的误差状态通常包括位置误差3维、速度误差3维、姿态误差3维、陀螺仪零偏误差3维、加速度计零偏误差3维总共15维。如果轮速计参与融合还要加轮速计标度因数误差和安装角误差。噪声参数的整定是个细活。IMU的噪声参数可以从datasheet查到但实际使用中因为温度变化和振动噪声会变大。我一般会在datasheet基础上乘一个1.5到2.0的安全系数。激光雷达的观测噪声和点云配准精度有关配准精度高的时候观测噪声设小一点配准精度低的时候设大一点。过程噪声Q矩阵的整定更麻烦。IMU的零偏随机游走噪声、速度随机游走噪声这些参数需要根据实际数据调。我的经验是先设一个保守的大值然后看滤波器的收敛情况如果收敛太慢就减小Q如果震荡就增大Q。5.2 观测更新与异常值剔除ESKF的观测更新是把激光雷达和视觉的定位结果作为观测修正误差状态。但观测值不一定可靠比如激光雷达在长廊区域可能沿走廊方向漂移视觉在暗光区域可能匹配失败。所以观测更新之前必须做异常值剔除。AVP-Loc用的方法是卡方检验计算观测残差的马氏距离如果超过卡方分布的阈值就认为这个观测是异常值不参与更新。阈值一般设95%或99%置信度对应的卡方值。这个方法很实用能挡住大部分粗差。但卡方检验有个问题如果观测系统本身有偏残差会一直很大卡方检验会把所有观测都剔除滤波器退化成纯航迹推算。所以AVP-Loc还加了观测质量评估根据点云配准的匹配点对数量、视觉匹配的内点数量等指标动态调整观测噪声。质量好的时候观测噪声设小质量差的时候设大这样即使有偏差滤波器也能部分利用观测信息。5.3 零速修正与地库特殊处理地库场景有个特殊之处车经常在车位里停着或者低速蠕行。这时候轮速计和IMU的输出都很小航迹推算的漂移反而更明显。AVP-Loc用了零速修正ZUPT来处理这个问题当检测到轮速计输出为零且IMU加速度接近重力加速度时认为车处于静止状态把速度观测设为零修正速度误差和零偏误差。零速检测的阈值需要仔细调。轮速计阈值一般设0.01米每秒IMU加速度阈值设0.1米每二次方秒。阈值太大会漏检阈值太小会误检。我实际调的时候发现地库地面有坡度的地方重力加速度在车体坐标系的分量会变化所以加速度阈值不能设太小否则上坡停车时会误判。另外地库的磁场环境很复杂钢筋结构会干扰磁力计所以AVP-Loc基本不用磁力计做航向观测航向主要靠激光雷达和视觉来修正。6. 常见问题排查与避坑指南6.1 定位漂移问题的排查思路定位漂移是AVP-Loc最常见的故障。排查的时候我一般按这个顺序来先看是全局漂移还是局部漂移。全局漂移通常是地图问题或者初始定位错误局部漂移通常是配准问题或者观测异常。全局漂移的排查检查建图阶段是否有闭环地图是否有重影。如果地图本身就有重影定位肯定漂。这时候需要重新建图确保闭环检测和位姿图优化正确执行。局部漂移的排查看漂移发生的位置是否有重复结构或者特征缺失。重复结构区域比如长走廊、成排柱子容易配准错误特征缺失区域比如空旷区域容易观测不足。针对重复结构可以增加ICP的鲁棒核阈值或者引入视觉特征做辅助约束。针对特征缺失可以降低观测更新频率更多依赖航迹推算。6.2 建图质量问题的快速诊断建图质量直接决定定位上限。我诊断建图质量一般看三个指标地图点云的重影程度、闭环误差、特征点分布均匀性。重影程度可以用点云的法向量一致性来量化如果同一平面上的点法向量方向差异大说明有重影。闭环误差可以用回环检测的残差来量化残差大说明累积误差没修正干净。特征点分布均匀性可以用网格统计把地图分成小网格统计每个网格的特征点数量如果某些网格特征点特别少定位到这些区域就容易丢。建图阶段还有个容易忽略的问题动态物体。地库里可能有其他车、行人、移动的推车这些动态物体如果被建到地图里定位时就会引入错误约束。AVP-Loc在建图阶段会用动态点剔除算法把可能是动态的点滤掉。我实际用的时候发现地库里的车虽然停着不动但如果是不同时间采集的数据车的位置可能变了所以建图最好在车少的时候做或者用多趟数据做一致性检验。6.3 计算资源受限时的降级策略AVP-Loc最终要跑在车端嵌入式平台计算资源有限。当CPU或GPU负载过高时需要有降级策略。我一般设三级降级一级降级是降低ICP的迭代次数和点云分辨率二级降级是降低BEV图像的分辨率和匹配频率三级降级是只跑ESKF航迹推算加零速修正暂停激光和视觉观测更新。降级策略的触发条件用计算耗时来判断如果单帧处理耗时超过预算的80%触发一级降级超过100%触发二级降级超过150%触发三级降级。恢复条件是耗时降到预算的60%以下持续一段时间后逐级恢复。这个策略在实际跑的时候很管用能保证系统在资源紧张时不会完全挂掉而是平滑降级。但要注意降级期间定位精度会下降所以降级策略要和泊车控制模块联动降级时控制模块要相应降低速度或者暂停泊车动作。7. 实操复现的关键步骤与参数参考7.1 建图流程的完整操作步骤如果你要复现AVP-Loc的建图流程我建议按这个步骤来。第一步数据采集开车在地库里跑至少两趟一趟顺时针一趟逆时针速度控制在5到10公里每小时确保激光雷达和相机数据完整。采集时尽量走车道中间避免贴墙太近导致点云遮挡。第二步里程计计算用激光雷达做帧间配准得到相对位姿用IMU和轮速计做航迹推算两者融合得到初始里程计。这一步的关键是时间同步激光雷达、相机、IMU的时间戳必须对齐到同一时钟源时间偏差超过5毫秒就会影响融合精度。第三步回环检测用Scan Context或者类似的全局描述子做回环检测找到所有回环对。回环检测的阈值需要根据地库大小调小地库阈值可以设严一点大地库阈值要松一点。第四步位姿图优化把里程计约束和回环约束一起做位姿图优化用g2o或者Ceres求解。优化时要注意鲁棒核函数的设置回环约束的鲁棒核阈值一般设0.5到1.0米。第五步地图生成用优化后的位姿把点云拼接到全局坐标系得到全局点云地图。同时把BEV图像和视觉特征也拼接到全局坐标系得到BEV特征地图。7.2 定位阶段的参数配置清单定位阶段的参数配置我整理了一个清单可以直接参考。ICP配准参数最大迭代次数50点云降采样分辨率0.1米Huber核阈值0.15米边缘点权重3.0角点权重5.0平面点权重1.0。ESKF参数IMU噪声密度从datasheet取值乘1.5陀螺仪零偏随机游走噪声1e-5加速度计零偏随机游走噪声1e-4激光观测噪声0.05米视觉观测噪声0.1米。BEV匹配参数图像分辨率200x200分块大小20x20PCA保留维度10匹配距离阈值0.3。零速检测参数轮速阈值0.01米每秒加速度阈值0.1米每二次方秒持续时间阈值0.5秒。这些参数是我在实际项目中调出来的不同地库可能需要微调但可以作为起点。7.3 典型场景的调试记录我记录了几个典型场景的调试过程。场景一长直走廊。问题是沿走廊方向漂移大原因是走廊两侧墙面特征重复ICP沿走廊方向约束弱。解决方法是引入视觉车道线约束同时降低ICP在走廊方向的权重。场景二柱子密集区。问题是配准容易匹配到错误柱子原因是柱子外观相似。解决方法是增加PCA角点权重同时用Scan Context做粗定位缩小ICP的搜索范围。场景三坡道区域。问题是BEV图像失真原因是IPM假设地面水平。解决方法是引入IMU俯仰角动态修正IPM投影矩阵同时降低BEV匹配在坡道区域的权重。场景四暗光区域。问题是视觉匹配失败原因是光照不足。解决方法是增加视觉匹配的曝光补偿同时提高激光雷达观测的权重保证定位不丢。8. 个人实操体会与后续扩展思路这套AVP-Loc系统我前后调了大概半年最大的体会是工程系统没有银弹每个模块都有局限性关键是让模块之间互补。PCA解决点云特征提取的问题ICP解决局部配准的问题ESKF解决多传感器融合的问题BEV解决视觉表征的问题。单独看每个模块都不完美但组合在一起就能稳定工作。另一个体会是参数调优比算法选择更重要。同样的算法参数调得好和调得差效果差距巨大。我建议新手先把每个模块单独调通再联合调试。联合调试的时候先用仿真数据或者录制数据跑离线确认逻辑正确后再上车跑在线。后续扩展的话我觉得有几个方向值得尝试。一是引入语义信息把地库的柱子、车位、车道线做语义分割然后用语义特征做匹配这样对光照和视角变化的鲁棒性会更好。二是用学习的方法做特征提取替代手工设计的PCA特征可能会在复杂场景下表现更好。三是做多车协同建图多辆车采集的数据融合在一起建图效率和覆盖度都能提升。最后分享一个小技巧地库定位调试的时候一定要把中间结果可视化出来。点云配准的对应关系、BEV匹配的响应图、ESKF的残差曲线这些可视化能帮你快速定位问题。我一开始只看最终定位结果出了问题完全不知道是哪一步错了后来把中间结果都画出来排查效率提升了好几倍。