
自动驾驶里有一个特别容易被低估、却能在关键时刻救命的感知任务——悬空障碍物识别。这里的“悬空障碍物”不单指正上方的物体而是泛指那些部分或全部悬在路面通行空间内、但底部不与地面直接接触的物体比如伸出来的树枝、半挂车未放下的支腿、限高杆、施工区域伸出的钢筋、前方卡车尾部悬出的货物边缘。对于乘用车、干线物流重卡和环卫自动驾驶来说这类物体的危险程度往往比地面静态障碍物更高因为激光雷达多数安装在车顶或前保位置对向下倾斜的射线覆盖很差而毫米波雷达对非金属悬空物几乎无反射。我最早接触这个课题是在某主机厂的预研项目里当时团队花了大半年时间才把悬空物的误检率压到可接受范围。这篇文章把我踩过的坑、最终落地的方案和一些可以直接拿走的工程经验整理出来按“原理-实现-实战”的顺序展开适合正在做感知算法、数据标注体系或者传感器选型的朋友参考。1. 技术原理为什么悬空障碍物让感知系统“头疼”1.1 悬空障碍物与传统地面障碍物的本质差异传统的地面障碍物路沿、锥桶、静止车辆、行人有一个共同特征它们与地面存在连续或可推断的接触面。感知算法可以利用这个先验信息做很多事地面分割时凡是接触地面的点云聚类都可以归为静态目标目标跟踪时可以利用地面约束预测目标的运动状态比如行人沿地面行走不会突然“瞬移”到空中路径规划时可以直接把目标投影到占据栅格上做膨胀处理即可。但悬空障碍物完全打破了这些假设。以半挂车支腿为例它底部距离地面大约40到60厘米但支腿本身是金属结构激光雷达打在支腿上的点云数量和强度都不理想毫米波雷达反射回来的信号却很强。这类物体跨传感器模态的特征差异极大单一传感器很难形成稳定判断。从物理上拆解悬空障碍物难识别主要有三个原因第一点云密度不均匀。激光雷达的扫描线束在垂直方向上呈固定角度分布靠近雷达水平线的区域线束密、点云多越往下地面方向或越往上天空方向线束越稀疏。悬空障碍物恰好落在中间偏下的区域也就是线束从密到疏的过渡带。一条线扫过去可能只有两三个点落在物体边缘聚类算法的稳定性会大打折扣。第二运动状态不连续。地面物体在连续帧间的位移量通常符合车辆运动模型可以用卡尔曼滤波平滑。悬空物体可能是静止的限高杆也可能是随车辆颠簸上下跳动的货物绑扎带还可能是其他车道上伸过来的物体相邻车道卡车货物运动模型很难用一个固定状态方程描述。第三语义信息与几何信息冲突。视觉算法看到一个悬空物体时它的外观语义可能是“树枝”“标牌”“货物”这些类别在常规检测数据集里往往样本稀少。几何信息上它又与地面没有接触边导致一些基于“地面点非地面点”二分法的地图构建方案会直接把它当作噪点滤除。1.2 主流技术路线对比纯视觉、纯点云与多模态融合围绕悬空障碍物识别业界经历过几轮技术路线迭代各有取舍。纯视觉方案的优势是分辨率高、颜色和纹理信息丰富能够区分“是什么”比如区分限高杆和树枝。但视觉的硬伤在下游任务里暴露得很明显单目相机没有可靠的深度信息双目视差在远处超过50米的精度会大幅下降。在高速公路上重卡从观察到悬空物到执行制动往往只有2到3秒50米外无法给出精确距离意味着决策模块拿到的只是一个“大概坐标”没办法做精确的制动曲线规划。纯点云方案的优势是毫米级精度、不受光照影响夜间和逆光环境依然稳定。但纯点云方案对点云密度极其敏感现有主流半固态激光雷达在50米以外的水平角分辨率普遍跳到0.2度甚至更低物体表面反射率不理想时点云会变得支离破碎。另一个问题是没有颜色信息无法做细粒度语义分类只能输出“未知障碍物”决策模块会格外保守频繁误触发紧急制动引发用户投诉。多模态融合是目前商业落地项目里最稳的路线。用视觉负责语义判断是什么用激光雷达负责精确测距在哪里必要时用毫米波雷达补充弱光或遮挡场景下的置信度。融合的关键不是简单把两套结果叠加而是设计一套跨模态对齐和冲突仲裁机制避免出现“视觉说是树点云说是未知物体”的分裂结论。从我实测过的组合来看最稳定的是一个小技巧以视觉结果为语义锚点以点云聚类结果为几何锚点两者IOU超过0.3时认为匹配成功。视觉只提供类别、聚类只提供位置和尺寸再交由一个轻量级的置信度仲裁网络做最后的融合决策。这套架构在雨天、夜晚和逆光环境下都能保证悬空物召回率在92%以上而且推理延迟控制在20毫秒以内。2. 工程实现悬空障碍物识别的数据链路与算法设计2.1 数据标注体系设计类别定义、复杂场景约束与质量校验很多团队在悬空物识别上栽跟头不是栽在网络结构上而是栽在数据压根没标对。悬空物的标注比地面物体困难得多因为它没有一个统一的地面接触面可以作为边界参考。我总结了一套适合悬空物的标注规范核心原则是标注的是“通行空间被侵占的投影区域”而不是“物体本身的物理轮廓”。类别定义上我会把悬空障碍物分为以下五类类别定义说明典型示例危险等级低位悬空物底部离地高度不足车辆最小离地间隙或不足当前车辆通过高度的物体半挂车支腿、未抬起的升降平台高危高位悬空物底部离地高度明显高于乘用车但可能低于重卡或公交车的物体限高杆、横跨道路的管线高危可变形悬空物形状随环境变化、无法用刚性模型描述的物体下垂树枝、藤蔓、悬挂的线缆中危动态悬空物自身运动或随载体运动导致空间位置持续变化随风摆动的旗帜、运输中晃动的货物中低危边缘突出物本体在地面目标上但边缘悬空突出的部分卡车尾部超出车身的货物、工程机械的吊臂低危但容易漏检标注工具上我推荐直接在3D点云里标注然后用2D图像进行辅助校验。但是要注意绝对不要让标注员只看着2D图像画框因为2D框无法唯一确定三维空间位置。一个悬空的树枝在2D图像里可能被框成一个几米高的竖直矩形但在3D空间里它的实际体积可能很小。标注时必须让标注员在点云中调整三维包围盒让包围盒恰好包住“会影响通行空间”的部分。至于“会被车辆撞到但视觉上不接触”的部分——比如离地2.2米的限高杆乘用车能过但重卡不能过——要单独标注一个“通过性属性”。质量控制方面除了常规的抽检和交叉复核我加了一个非常有用的指标标注一致性IoU。让不同标注员标注同一个场景计算两组3D包围盒的交并比要求平均IoU不低于0.75。如果某个场景的IoU普遍低于0.7说明这个场景的边界定义不够清晰需要回到标注规范里去补充案例。这套机制上线后直接把训练集的噪点率从8%压到了1%以内。2.2 检测模型设计从单任务到多任务头悬空物检测模型在主流框架里往往被设计成一个多任务头同时输出检测框、类别和关键点。我实测下来效果最好的是在CenterPoint类中心点检测框架上做改造但有几个关键细节需要特别注意。细节一BEV网格尺寸要匹配悬空物的物理尺寸。地面障碍物检测常用的BEV网格分辨率是0.5米或0.25米这个尺度对3米长的小轿车很友好但对悬空物来说太粗了。悬空物的典型尺寸是0.5到2米比如一根下垂的树枝、一个支腿如果网格分辨率与物体尺寸不匹配目标在BEV特征图上会变成“一个像素”检测头很难稳定回归。我建议悬空物检测任务单独使用0.1米的BEV网格分辨率或者使用一种高分辨率ROI采样策略先用粗网格定位候选区域再在候选区域内部用细网格重新提取特征。这个改动在精度上带来了约3个百分点的提升。细节二时间维度的使用方式。悬空物是静止还是运动需要跨帧判断。我在模型中引入了一个轻量的时间卷积模块将前两帧的BEV特征和当前帧拼接让网络自动学习“这个位置上的点云在过去两帧是否存在”。这么做有个很明显的好处能够抑制偶发的传感器噪点同时保留真正的动态悬空物。实测中误检率下降了28%而召回率几乎没有损失。细节三关键点回归。除了回归3D中心点和尺寸之外我额外增加了一个“悬空底线”关键点回归头。所谓悬空底线就是物体底部相对地面高度的估计值。这个值对下游规划至关重要如果悬空底线高于当前车辆的整车高度可以当作可通行处理不用触发制动如果低于整车高度哪怕物体本身很小也必须触发避让或减速。2.3 数据闭环让模型持续学到“新悬空物”悬空障碍物是典型的“长尾场景”数据。日常路测里模型能遇到的最多的悬空物是低矮树枝和限高杆但真正导致事故的往往是一些罕见类型比如某施工路段伸出的钢筋、装载机未收回的铲斗。这就意味着光靠开源的训练集和常规路测很难覆盖所有危险情况。我的建议是把数据闭环拆成三条链路链路一影子模式。在量产车上以影子模式运行悬空物检测模型但模型只输出结果不执行制动。后台系统会每天收集“模型高置信度但车端决策模块未响应”的样本以及“人工接管或司机制动”的时刻前后各10秒的传感器数据。这些样本直接进标注池标注后按类别加入训练集。链路二对抗生成场景。用一个简单的变分自编码器生成悬空物的点云扰动样本比如在原始点云上随机增删几个点、把点云在垂直方向拉伸或压缩模拟传感器在不同距离和反射率下的退化效果。这样可以低成本扩充数据量显著提升模型对点云噪声的鲁棒性。链路三危险场景数据库。团队内部维护一个危险场景库每当供应商或研发车辆反馈出现一个新类型悬空物就把它登记入库。入库要求在1周内完成标注、加入训练集并跑完一次回归测试。这个机制看起来简单但能有效防止长尾问题被遗忘。3. 实战案例三个典型场景下悬空障碍物识别的完整落地3.1 场景一高速收费站限高杆识别与通过性判断高速收费站的限高杆是悬空物里最具代表性的一个因为它同时存在“必须识别”和“不能误刹”两个矛盾的需求。重卡在接近收费站时车速通常已经降到40km/h以下限高杆的金属横梁在激光雷达里是一条细长的线状点云聚类后体积很小特征上和远处的地面标识牌相似很容易被分类器忽略。我们的方案是在模型里专门设计了限高杆检测通道。具体做法是在BEV特征图上针对高度范围在2.5到5.5米之间的点云做单独的切片提取然后在这个切片上运行一个轻量的线状目标检测器。这个检测器只输出一个参数——横梁的有效高度。当前车辆通过性判断逻辑是横梁有效高度大于当前车辆最大高度 0.3米安全余量判定可通行横梁有效高度介于车辆高度±0.3米之间判定需要减速观察横梁有效高度小于车辆高度 - 0.3米判定必须停车。有一次实车测试中我们遇到一个高度恰好卡在边界的情况前方限高杆标称4.2米车辆高度4.0米距离约80米处系统判定为“减速观察”车辆开始制动而司机完全没意识到限高杆的存在。制动完成后车辆以10km/h的速度缓慢接近最终通过。这个案例让我特别确信悬空物的关键不只是检出而是要给出和车辆参数绑定的通过性决策。3.2 场景二城市道路下垂树枝与施工区域悬空物城市道路的悬空物情况比高速复杂得多。树枝的高度不稳定会随风摇晃施工区域可能会有横跨道路的钢筋或木板老旧城区的空中线缆更是密密麻麻。这类场景最大的挑战不是检测精度而是决策置信度。有一次路测在一条林荫路上我们连着一周每天收到误触发报告车频繁在低速行驶时紧急制动。排查后发现算法把路侧垂下来的树枝投影到了车辆行驶路径上但实际树枝高度有3米以上车辆完全可以通过。问题出在融和模块的几何锚点通过聚类得到的树枝点云底部高度估计有误差视觉算法虽然识别出是树枝却没有将这个语义类别映射为“可通行”。最后解决的办法是给类别引入可通行的先验。我们将视觉类别分为三档硬式障碍物金属结构、混凝土、软式悬空物树枝、藤蔓、未知物。对于软式悬空物如果悬空底线估计值高于车辆高度1.0米以上即使聚类结果与行驶路径有重叠也强制将置信度降级为“可通行”。这个方法很粗暴但在实车上非常有用直接在一周内把误触发次数从十几次降到了零。施工区域的悬空物则走了另一条路。由于施工区域常伴有大量脚手架、围挡等密集物体点云极其杂乱聚类算法容易把不同物体粘连在一起。我采用的方案是先对施工区域做场景分割利用围挡的规则形状识别出“施工区域”语义再在区域内使用更严格的聚类阈值点间距阈值从0.2米降到0.08米并对区域内所有悬空目标统一提高决策优先级。这个“场景语义调制决策阈值”的思路在很多长尾场景里都值得推广。3.3 场景三重卡前方货物伸出与高速行驶中的动态悬空物重卡货运场景里有一种特别危险的悬空物——前车车厢里伸出的钢管、钢筋或板材它们往往超出车尾一两米却没有落地。视觉上由于超出的部分在图像中面积小且无特征检测器很容易漏检点云上由于金属管材表面反射率低点云稀疏聚类后很难和车厢本体区分开。我处理这类问题的核心思路是把注意力从前车整体转移到“车尾边界之外的物体”上。具体执行时先在视觉检测结果里找出前车目标然后在目标后缘往后方延伸一个缓冲区例如5米在这个缓冲区内单独运行一次悬空物检测。这个检测器特点是不做类别分类只输出“缓冲区是否存在悬空物”这一个二分类结果并估测其纵向位置。在模型结构上我用了一个时序差分模块把连续三帧的缓冲区特征做差突出“新出现的悬空物”部分。这是因为伸出车尾的货物在车辆前行中相对本车的纵向位置变化与我们预估的前车运动模型不一致会产生持续的差分信号。这个模块让钢质悬空物的召回率从65%跳升到了96%尤其对高速度差场景效果显著。另外动态悬空物比如掉落的货物碎片或脱落的篷布虽然频率不高但一旦发生就是极端危险场景。我的建议是给模型单独设置一个“高速突发悬空物”的输出通道该通道的检测阈值要比常规物体更低即在特征响应不算很强的情况下也判定存在目标。这样会有一定的误检率上升但在高速场景中误检的代价是刹车略微急一点漏检的代价可能是灾难性的权衡之下低阈值策略更安全。4. 常见问题与排查技巧实录4.1 点云稀疏漏检的处理这是所有人第一次做悬空物识别时都会遇到的问题。点云稀疏会导致聚类不稳定同一根树干在距离50米和距离20米处的点云数量相差可能有10倍。如果聚类算法使用固定的点数阈值距离一远目标就被滤掉了。我的排查方法分两步先把点云做强度补偿再切换到时序累加。强度补偿是对标定后的点云强度值做距离衰减修正让远处弱反射物体的点云强度更接近近处的真实值。时序累加则是把连续几帧的点云数据配准后叠加在一起如果车辆在运动就用位姿变换把不同帧的点云对齐到当前帧坐标系。两帧叠加之后稀疏点云目标的有效点数大约能翻倍聚类稳定性大幅提升。但要注意时序累加的时间不能太长超过0.3秒后动态目标自身运动导致的点云边缘模糊会引入新的误差。4.2 误报频繁把可通行的悬空物判为障碍物误报的根源基本上都出在“空间体积小但高度够”的目标上比如树枝、横幅、拱形装饰物。我在排查这类问题时会先检查悬空底线关键点的估计偏差。很多时候激光雷达的线束没有打中悬空物的真实底部边缘而是打在了更下方的位置导致底线高度估计偏低。如果估计偏差大于0.4米我就不会在模型层面继续调参而是直接给规划模块增加一个“高度缓冲区间”的二次校验逻辑当悬空物高度位于车辆可通行区间附近时规划模块不会立即触发完全制动而是先触发减速再执行更精确的近距离复测。复测时传感器与悬空物之间的距离更近点云密度更高底线高度估计会准确得多。这个逻辑能保住95%以上的误报场景。4.3 夜间与逆光场景下的识别降级夜间环境下视觉检测几乎不可用只能依赖雷达。实测下来表现最好的组合是激光雷达为主、毫米波雷达为辅激光雷达负责几何定位毫米波雷达负责在中远距离提供速度信息。因为毫米波雷达的数据稀疏、无高度维度单独识别悬空物会很困难但它在夜间识别金属材质的悬空物如限高杆、钢梁反而比激光雷达更可靠因为金属对毫米波的反射非常强烈。可以用毫米波的检测结果作为先验再反查激光雷达对应的局部区域提升检出置信度。逆光的场景则是视觉和激光都会出问题视觉可能过曝激光雷达在强阳光下会产生环境噪点噪声增大。我的经验是对相机做自动曝光和对抗眩光处理同时在模型输入前对点云做一次太阳方位相关的噪点滤波也就是根据车辆所在经纬度和时间计算太阳位置将那个方向上的高强度异常点云概率标记为噪点。这个小技巧在朝阳和夕阳工况下能降低大约15%的噪点引发误检。4.4 从仿真到实车的精度回退仿真的天气环境、点云噪声模型再完善和真实世界的差距依然不可忽视。很多团队在自己搭建的仿真器里指标很好一上车就全线崩溃。我的建议非常明确从第一天起就建立“仿真预测试 实车验证”的双轨机制。仿真阶段只用来验证模型结构和数据流是否合理最终指标必须用实车数据进行。我习惯在仿真测试中刻意加入两种退化随机裁剪点云和局部区域反射率降低这样筛掉那些对点云质量过于敏感的模型结构。5. 工具选型与调参经验分享5.1 哪些开源工具在悬空物识别上真正能打悬空物识别虽然在各个论文里都提到过但开源生态其实并不丰富。我实测下来有几个工具可以组合使用数据标注侧我推荐用某个支持3D点云连续帧标注的开源平台它的优势是能够批量复制上一帧的包围盒并在后续帧中自动跟踪这样标注员就不需要逐帧重新画框。这个功能在动态悬空物的标注中尤其关键因为人工在连续帧里追踪一个摆动树枝的包围盒几乎不可能稳定。模型训练侧可以复用一些常见的3D检测训练框架但重要的是修改它的数据加载逻辑。默认情况下数据加载器会把点云范围限制在150米以内、高度限制在-5到5米之间。悬空物的高度上限往往高于这个范围很多线杆或高杆的信号在高度超过5米后被直接截断。我建议把高度上限放宽到±15米同时将点云范围缩小到120米以保持训练显存占用不变。模型部署侧TensorRT加速是标配但悬空物检测的卷积核尺寸比较小如果直接调用默认的优化配置可能导致部分算子没有合并推理效率反而下降。我的做法是手动指定通道数和卷积核大小并使用更激进的量化精度策略在保持精度损失小于1%的前提下把端到端推理延迟做到25毫秒以内。5.2 几个值得记住的调参经验我在多次试验中沉淀了三条调参经验第一分类阈值单独调比统一调更有效。悬空物类别不同误检和漏检的代价完全不同。限高杆漏检可能导致车祸但误检的代价只是一脚急刹车树枝误检则会造成频繁刹车的乘坐不适漏检的风险反而低。因此每个子类别使用独立的置信度阈值比全局使用单一阈值更容易在项目上收敛。第二点云体素化时重视高度分辨率。以常见的VoxelNet类模型为例default分辨率通常是体素边长0.1米Z轴方向由于计算量限制通常也按0.1米处理。但悬空物的底部高度是一个需要精确到5厘米的指标0.1米的体素分辨率是不够的。我建议Z轴体素分辨率设为0.05米X、Y轴可以保持0.1米不变。总的来说就是牺牲一点平面精度去换高度方向的精度。第三协同监督信号会带来额外提升。我给网络加了一个额外的辅助监督头用来预测“悬空底线高度”的二值化结果也就是底线高度是否高于当前车辆的标定整车高度。这个二值监督比连续值回归更容易学习还能隐式地让模型中间层更多编码与高度相关的特征。实测在悬空底线高度估计这个指标上误差降低了12%。6. 写在最后的经验体会我在这个方向反复打磨了大半年很多教训都是靠实车测试一点点试出来的。如果只让我挑一个最重要的经验分享那就是悬空障碍物识别不应该被当作一个纯感知问题来解。它的难点不在于“能不能检测出目标”而在于检测结果如何与车辆自身的通过性参数实时匹配。同一个限高杆对一辆轿车是可通行的对一辆装满货物的重卡就是绝对的拦路虎。算法只有与车辆尺寸、悬架状态、当前载重这些信息联动才能真正发挥价值。另一个体会是不要迷信更复杂的网络结构。悬空物识别里真正占大头的收益往往来自数据标注的精确度、场景切分的合理性以及阈值策略的适配性模型结构带来的收益反而是容易触及天花板的。我见过不少团队花大力气堆参数结果误检率居高不下回头检查才发现是标注时的边界定义混乱导致前后训练信号不一致。数据治理的基础打好模型性能往往自然就上来了。如果你正准备上手这个方向我建议从限高杆这类刚性悬空物切入完成完整的“标注-训练-评测-实车”循环再逐步扩展到树枝、货物伸出等复杂场景这样建立起的工程直觉会非常扎实。后续如果有时间我还会整理一下悬空物识别与决策规划模块联动设计的具体代码框架到时候再和大家继续分享。