2. 数据流异常排查
大家好,我是你们的老朋友。今天咱们聊聊数据流异常排查。说实话,这活儿看着不起眼,但我在项目里栽过的跟头,十有八九都跟数据流有关。传感器数据一乱,后面的规划控制全白干。你想想看,车都开歪了,算法再牛也没用。
这一章,我带你走一遍传感器输入、预处理、坐标变换这三个环节。咱们把那些坑一个个挖出来,再填上。
1. 传感器输入:源头不干净,后面全白费
传感器是自动驾驶的「眼睛」。眼睛花了,脑子再好也白搭。我遇到过最离谱的一次,是激光雷达的线束断了一根,点云图直接缺了个扇形。排查了三天,最后发现是线缆被老鼠咬断了。
1.1 常见问题清单
- 数据丢帧:传感器偶尔不输出数据,或者输出延迟。原因可能是接口松动、带宽不足、或者传感器本身过热保护。
- 时间戳错乱:不同传感器的时间戳不同步。比如相机是UTC时间,激光雷达是本地时间,差了几十毫秒。这在高速场景下,误差能差出好几米。
- 异常值/野点:传感器受到干扰,输出明显不合理的数据。比如激光雷达打到玻璃上,反射强度异常;或者相机拍到强光,像素值直接饱和。
- 数据格式不匹配:传感器输出的数据格式,跟算法期望的不一致。比如有的激光雷达输出的是极坐标,算法却等着笛卡尔坐标。
1.2 我的排查套路
我个人习惯,先做三件事:
- 看波形:把传感器原始数据画出来。丢帧的话,波形上会有明显的「断点」。时间戳错乱的话,波形会「跳变」。
- 看统计量:算一下均值、方差、最大值、最小值。如果某个值突然超出物理极限(比如激光雷达测距突然变成1000米),那肯定有问题。
- 看日志:传感器一般都有自检日志。看看有没有报错码。比如「温度过高」、「通信超时」之类的。
重要:传感器输入环节,一定要做「数据完整性校验」。我建议在代码里加一个简单的检查:如果连续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 我的调试方法
我个人习惯,每次做坐标变换,都先做「可视化验证」。具体来说:
- 把传感器原始数据画出来,比如激光雷达的点云。
- 做坐标变换后,再画一遍。
- 对比两幅图,看看形状对不对,位置对不对。
如果变换后的点云,形状扭曲了,那肯定是旋转矩阵有问题。如果位置偏了,那肯定是平移向量有问题。
警告:坐标变换的代码,一定要写单元测试。我见过太多人,改了外参文件,忘了改代码里的硬编码。结果车跑起来,数据全乱套了。
4. 知识体系总览
下面这张图,是我自己总结的数据流异常排查框架。你照着这个思路走,基本不会漏掉问题。
5. 实战案例:一次完整的数据流排查
我记得有一次,客户反馈说车辆在高速上突然偏离车道。我排查了三天,最后发现是数据流的问题。
第一步:看传感器输入
我先把激光雷达的点云画出来。发现点云里有一块区域,数据密度明显偏低。再一看日志,发现那个区域的激光雷达线束,温度过高,自动降频了。嗯,源头找到了。
第二步:看预处理
接着看预处理环节。发现滤波参数设得太激进,把车道线边缘的微弱信号也滤掉了。我调整了滤波器的截止频率,车道线就清晰了。
第三步:看坐标变换
最后看坐标变换。发现外参文件里,激光雷达的安装角度写错了。实际安装角度是2.5度,文件里写的是2.0度。差了0.5度,在100米外,误差就有0.87米。车能不偏吗?
三个问题都修好后,车辆就恢复正常了。所以你看,数据流排查,一步都不能少。
我的建议:每次排查完,把问题记录下来,形成「数据流问题库」。下次遇到类似问题,直接查库,能省不少时间。
好了,这一章就聊到这儿。数据流排查是个细致活,别急,慢慢来。你只要把传感器输入、预处理、坐标变换这三个环节盯紧了,大部分问题都能提前发现。