2、常见传感器类型与数据格式:摄像头(图像/视频)、激光雷达(点云)、毫米波雷达、IMU(惯性测量单元)、GPS
做传感器数据融合,第一步就是得搞清楚你手里拿的是什么数据。我见过不少新手,上来就写代码,结果发现摄像头数据是YUV格式,激光雷达是16线,毫米波雷达输出的是目标列表——完全对不上号。嗯,今天咱们就把这五种最常见的传感器,一个一个说清楚。
2.1 摄像头:图像与视频数据
摄像头可能是我们最熟悉的传感器了。但说实话,很多人对它的数据格式理解得不够深。
图像数据格式
摄像头输出的原始数据,最常见的是RAW格式,也就是拜耳阵列。每个像素只记录一种颜色(R、G或B)。我早期做项目时,直接拿RAW数据做处理,结果颜色全乱了。后来才明白,必须经过去马赛克(Demosaic)才能得到RGB图像。
常用的图像格式有:
- RGB/BGR:每个像素3个通道,每个通道8位或16位。OpenCV默认是BGR顺序,这个坑我踩过。
- YUV:亮度+色度分离。很多USB摄像头输出YUV422,压缩率比RGB高。
- JPEG:压缩格式,适合传输和存储,但做实时处理需要解码。
关键参数:分辨率(1920x1080)、帧率(30fps)、像素格式(YUYV)、位深(8bit)。
视频数据格式
视频其实就是连续的图像序列。但为了压缩,会用到编码格式:
- H.264/H.265:最常用的编码,压缩率高,但解码需要算力。
- MJPEG:每一帧独立压缩,适合做逐帧分析。
我个人习惯用OpenCV的VideoCapture来读取视频流。但要注意,不同摄像头驱动可能返回不同的格式。我曾经在树莓派上调试一个USB摄像头,折腾了两天才发现它默认输出的是MJPEG,而我一直在用YUYV的解析方式。
避坑指南:拿到摄像头后,先用v4l2-ctl --list-formats命令看看它支持哪些格式。别像我一样想当然。
2.2 激光雷达:点云数据
激光雷达输出的是点云,说白了就是一堆三维坐标点。每个点包含(x, y, z)坐标,有的还带反射强度(intensity)。
点云格式
- PCD:Point Cloud Library的格式,支持ASCII和二进制。我建议用二进制,文件小、读取快。
- PLY:多边形文件格式,可以存颜色信息。
- LAS/LAZ:测绘行业标准,支持分类信息。
- BIN:很多国产雷达直接用二进制裸数据,需要自己写解析器。
你想想看,一个32线激光雷达,每秒能产生几十万个点。如果每个点存成float32的xyz,再加上intensity,那就是16字节一个点。算下来,10秒的数据就有几百兆。所以,数据压缩和降采样是必须的。
关键参数:线数(16/32/64/128)、水平分辨率(0.1°~0.4°)、垂直视场角(-15°~+15°)、测距范围(100m~200m)。
点云坐标系
这里有个容易搞混的地方:激光雷达的坐标系。通常,x轴朝前,y轴朝左,z轴朝上。但不同厂家可能有差异。我记得有一次做标定,发现雷达和IMU的坐标系差了90度,结果融合出来的轨迹全是歪的。嗯,坐标系转换一定要先确认清楚。
// 点云数据示例(PCD格式)
# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z intensity
SIZE 4 4 4 4
TYPE F F F F
COUNT 1 1 1 1
WIDTH 1000
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 1000
DATA ascii
1.234 2.345 3.456 128
2.345 3.456 4.567 200
...
2.3 毫米波雷达:目标列表与点云
毫米波雷达和激光雷达不一样。它不直接输出三维点云,而是输出检测到的目标信息。说白了,它告诉你「前方50米处有一个物体,速度10m/s,角度2°」。
数据格式
- 目标列表:每个目标包含距离、速度、角度、信噪比等。这是最常见的输出格式。
- 点云:一些高端毫米波雷达(如TI的AWR系列)也能输出原始点云,但稀疏得多。
- CAN报文:很多车载毫米波雷达通过CAN总线输出数据,需要解析DBC文件。
我曾经调试过一个毫米波雷达,发现它输出的目标ID是循环使用的。也就是说,同一个目标在不同帧里可能ID不一样。这给目标跟踪带来了很大麻烦。后来我加了一个基于距离和速度的匹配算法,才解决了这个问题。
注意:毫米波雷达对静止目标的检测能力较弱。如果你做自动驾驶,需要结合摄像头或激光雷达来补全静止障碍物的信息。
关键参数:最大探测距离(200m)、距离分辨率(0.1m)、速度分辨率(0.1m/s)、水平视场角(±60°)。
2.4 IMU:惯性测量单元
IMU输出的是加速度和角速度。它不直接告诉你位置,而是告诉你「我现在的加速度是多少,转得有多快」。
数据格式
- 加速度计:三轴加速度(ax, ay, az),单位m/s²或g。
- 陀螺仪:三轴角速度(gx, gy, gz),单位rad/s或°/s。
- 磁力计:三轴磁场强度(mx, my, mz),单位μT。有些IMU不带磁力计。
IMU的数据频率通常很高,200Hz到1000Hz都很常见。但问题是,它漂移得厉害。你想想看,加速度积分一次得到速度,再积分一次得到位置。两次积分下来,误差会像滚雪球一样越来越大。
关键参数:采样率(400Hz)、量程(±16g/±2000°/s)、噪声密度(0.01°/s/√Hz)。
坐标系
IMU的坐标系通常是:x轴朝前,y轴朝右,z轴朝下(右手系)。但不同芯片可能有差异。我建议拿到IMU后,先做一次静态标定,确认零偏和尺度因子。
// IMU数据示例(CSV格式)
timestamp, ax, ay, az, gx, gy, gz
1623456789.123, 0.01, -0.02, 9.81, 0.001, -0.002, 0.003
1623456789.125, 0.02, -0.01, 9.80, 0.002, -0.001, 0.004
...
避坑指南:IMU数据一定要做低通滤波。我见过有人直接用原始数据做积分,结果位置误差在10秒内就超过了100米。嗯,先滤波,再积分,这是铁律。
2.5 GPS:全球定位系统
GPS输出的是经纬度和海拔。它不告诉你姿态,只告诉你位置。
数据格式
- NMEA 0183:最常用的文本协议。比如$GPGGA、$GPRMC这些语句。
- UBX:u-blox的二进制协议,解析效率更高。
- RTCM:差分GPS的协议,用于厘米级定位。
我个人习惯用NMEA协议,因为它可读性强,调试方便。但如果你需要高频率输出(比如10Hz以上),建议用UBX二进制格式。
关键参数:定位精度(2.5m CEP)、更新率(10Hz)、卫星颗数(12颗以上)、差分状态(RTK Fix/ Float)。
注意:GPS在隧道、高楼林立的城市峡谷里会失效。这时候就需要IMU来做航位推算(Dead Reckoning)。
// NMEA $GPGGA 语句示例
$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
// 含义:时间12:35:19,纬度48°07.038'北,经度11°31.000'东,定位质量1(GPS),卫星数8,水平精度0.9m,海拔545.4m
2.6 知识体系总览
说了这么多,咱们用一张图来总结一下这五种传感器的数据特点:
这张图把五种传感器的核心数据格式和关键参数都串起来了。你想想看,做数据录制的时候,是不是得先搞清楚每个传感器的输出格式?不然录下来的数据根本没法用。
我的建议:刚开始做传感器数据录制时,先花一天时间把每个传感器的原始数据打印出来看看。亲眼看到数据长什么样,比看一百篇文档都有用。
好了,这一章的内容就到这里。每种传感器的数据格式都有它的特点,也有它的坑。记住一句话:数据格式决定了你怎么解析,解析对了,后面的融合才能顺利进行。