2. 数据流异常排查

大家好,我是你们的老朋友。今天咱们聊聊数据流异常排查。说实话,这活儿看着不起眼,但我在项目里栽过的跟头,十有八九都跟数据流有关。传感器数据一乱,后面的规划控制全白干。你想想看,车都开歪了,算法再牛也没用。

这一章,我带你走一遍传感器输入、预处理、坐标变换这三个环节。咱们把那些坑一个个挖出来,再填上。

1. 传感器输入:源头不干净,后面全白费

传感器是自动驾驶的「眼睛」。眼睛花了,脑子再好也白搭。我遇到过最离谱的一次,是激光雷达的线束断了一根,点云图直接缺了个扇形。排查了三天,最后发现是线缆被老鼠咬断了。

1.1 常见问题清单

  • 数据丢帧:传感器偶尔不输出数据,或者输出延迟。原因可能是接口松动、带宽不足、或者传感器本身过热保护。
  • 时间戳错乱:不同传感器的时间戳不同步。比如相机是UTC时间,激光雷达是本地时间,差了几十毫秒。这在高速场景下,误差能差出好几米。
  • 异常值/野点:传感器受到干扰,输出明显不合理的数据。比如激光雷达打到玻璃上,反射强度异常;或者相机拍到强光,像素值直接饱和。
  • 数据格式不匹配:传感器输出的数据格式,跟算法期望的不一致。比如有的激光雷达输出的是极坐标,算法却等着笛卡尔坐标。

1.2 我的排查套路

我个人习惯,先做三件事:

  1. 看波形:把传感器原始数据画出来。丢帧的话,波形上会有明显的「断点」。时间戳错乱的话,波形会「跳变」。
  2. 看统计量:算一下均值、方差、最大值、最小值。如果某个值突然超出物理极限(比如激光雷达测距突然变成1000米),那肯定有问题。
  3. 看日志:传感器一般都有自检日志。看看有没有报错码。比如「温度过高」、「通信超时」之类的。

重要:传感器输入环节,一定要做「数据完整性校验」。我建议在代码里加一个简单的检查:如果连续3帧数据都异常,直接触发报警,而不是让算法继续往下跑。

2. 预处理:数据清洗,别让脏数据混进去

预处理环节,说白了就是「洗菜」。传感器拿到的原始数据,就像刚从地里拔出来的萝卜,带着泥。你得洗干净了才能下锅。

2.1 常见问题

  • 滤波过度:为了去掉噪声,把有用的信号也滤掉了。比如用均值滤波,把车道线的边缘给模糊了。
  • 插值错误:数据丢帧时,用插值补数据。但插值方法不对,补出来的数据跟真实情况差很远。比如用线性插值补弯道的数据,补出来是直的。
  • 坐标转换精度丢失:从传感器坐标系转到车体坐标系时,用了单精度浮点数。精度不够,导致位置误差累积。
  • 数据对齐失败:不同频率的传感器数据,对齐时没处理好。比如激光雷达10Hz,相机30Hz,对齐时用了最近邻插值,结果时间差太大。

2.2 避坑指南

我曾经在预处理环节吃过一个大亏。当时做车道线检测,用了中值滤波去噪。结果车道线边缘被磨平了,导致后面的拟合算法一直报错。后来换成高斯滤波,效果就好了。

所以我的建议是:

  • 滤波前先看频谱:搞清楚噪声的频率范围,再选滤波器。别瞎用。
  • 插值要谨慎:能不用插值就不用。实在要用,优先选样条插值或者多项式插值,别用线性插值。
  • 数据对齐用时间戳:别用帧号对齐。帧号可能丢帧,时间戳更可靠。

小技巧:预处理环节,我习惯把每一步的结果都保存下来。比如滤波前后的数据、插值前后的数据。这样出了问题,可以回放排查,不用从头再跑一遍。

3. 坐标变换:坐标系搞错,车就开歪了

坐标变换是数据流里最容易出问题的地方。我见过最经典的错误,是把激光雷达的坐标系跟车体坐标系搞反了。结果车明明在直行,算法以为它在转弯,直接打了方向盘。

3.1 坐标系定义要统一

自动驾驶里常用的坐标系有:

坐标系 原点 X轴 Y轴 Z轴
传感器坐标系 传感器中心 传感器前方 传感器左侧 传感器上方
车体坐标系 车辆后轴中心 车辆前方 车辆左侧 车辆上方
世界坐标系 地图原点 东向 北向 天向

你想想看,如果传感器坐标系里,X轴是「前方」,车体坐标系里X轴也是「前方」,但传感器安装时歪了5度,那转换矩阵里就得把这个5度算进去。很多人忘了这一步。

3.2 常见错误

  • 旋转顺序搞错:欧拉角的旋转顺序不同,结果完全不同。比如先绕X轴转,再绕Y轴转,跟先绕Y轴再绕X轴,结果不一样。我建议统一用ZYX顺序。
  • 平移向量符号反了:传感器在车体前方,平移向量应该是正的。但有人写成了负的,结果数据全跑到车后面去了。
  • 四元数归一化忘了:用四元数做旋转时,如果没归一化,旋转矩阵就不正交,数据会变形。
  • 外参标定不准:传感器安装位置变了,但外参没更新。比如车撞了一下,激光雷达歪了,但标定文件还是旧的。

3.3 我的调试方法

我个人习惯,每次做坐标变换,都先做「可视化验证」。具体来说:

  1. 把传感器原始数据画出来,比如激光雷达的点云。
  2. 做坐标变换后,再画一遍。
  3. 对比两幅图,看看形状对不对,位置对不对。

如果变换后的点云,形状扭曲了,那肯定是旋转矩阵有问题。如果位置偏了,那肯定是平移向量有问题。

警告:坐标变换的代码,一定要写单元测试。我见过太多人,改了外参文件,忘了改代码里的硬编码。结果车跑起来,数据全乱套了。

4. 知识体系总览

下面这张图,是我自己总结的数据流异常排查框架。你照着这个思路走,基本不会漏掉问题。

数据流异常排查框架 传感器输入 丢帧 / 时间戳错乱 / 野点 预处理 滤波过度 / 插值错误 / 对齐失败 坐标变换 旋转顺序 / 平移符号 / 外参 排查方法:可视化验证 + 统计量分析 + 日志检查 数据完整性校验 滤波参数调优 坐标变换单元测试 核心原则:源头验证 → 过程监控 → 结果校验

5. 实战案例:一次完整的数据流排查

我记得有一次,客户反馈说车辆在高速上突然偏离车道。我排查了三天,最后发现是数据流的问题。

第一步:看传感器输入
我先把激光雷达的点云画出来。发现点云里有一块区域,数据密度明显偏低。再一看日志,发现那个区域的激光雷达线束,温度过高,自动降频了。嗯,源头找到了。

第二步:看预处理
接着看预处理环节。发现滤波参数设得太激进,把车道线边缘的微弱信号也滤掉了。我调整了滤波器的截止频率,车道线就清晰了。

第三步:看坐标变换
最后看坐标变换。发现外参文件里,激光雷达的安装角度写错了。实际安装角度是2.5度,文件里写的是2.0度。差了0.5度,在100米外,误差就有0.87米。车能不偏吗?

三个问题都修好后,车辆就恢复正常了。所以你看,数据流排查,一步都不能少。

我的建议:每次排查完,把问题记录下来,形成「数据流问题库」。下次遇到类似问题,直接查库,能省不少时间。

好了,这一章就聊到这儿。数据流排查是个细致活,别急,慢慢来。你只要把传感器输入、预处理、坐标变换这三个环节盯紧了,大部分问题都能提前发现。