传感器基础(上):3D激光雷达与IMU的工作原理
各位同学,欢迎来到《点云与IMU融合定位实战教程》的第一章。我是你们的老朋友,一个在SLAM和机器人定位领域摸爬滚打了十来年的工程师。今天咱们不聊虚的,直接切入正题——传感器。
做融合定位,说白了就是让机器人知道“我在哪”。而“我在哪”这个问题的答案,全靠传感器喂数据。你想想看,如果传感器数据都是错的,后面算法再牛也白搭。所以,这一章我们得把激光雷达和IMU这两个核心传感器的底裤扒干净。
本章核心脉络:机械式 vs 固态激光雷达 → 点云数据格式(PCD/BIN)→ IMU加速度计与陀螺仪 → IMU测量模型与噪声特性
1. 3D激光雷达工作原理
激光雷达,英文叫LiDAR,全称是Light Detection And Ranging。说白了,它就是通过发射激光束,测量激光从发射到反射回来的时间差,从而算出目标物体的距离。这个原理跟雷达一样,只不过雷达用电磁波,激光雷达用光波。
我个人习惯把激光雷达分成两大类:机械式和固态。这两种在工程实践中差异巨大,选型时一定要搞清楚。
1.1 机械式激光雷达
机械式激光雷达,顾名思义,就是有机械旋转部件的。它通过一个电机带动激光发射器和接收器旋转,实现360°的水平扫描。垂直方向则通过多线束(比如16线、32线、64线)来覆盖不同的俯仰角。
我记得2016年刚入行时,用的就是Velodyne的HDL-64E。那家伙个头大、价格贵,但数据质量是真的好。机械式雷达的优点是视场角大(水平360°),点云密度高。缺点也很明显——有机械磨损,寿命有限,而且怕震动。
避坑指南:我曾经在一个AGV项目里,把机械式雷达直接装在车顶,结果车子过减速带时震动太大,导致雷达内部的光学对准偏移,点云出现了系统性偏差。后来我学乖了,机械式雷达一定要加装减震支架。
1.2 固态激光雷达
固态激光雷达没有机械旋转部件。它通过光学相控阵(OPA)或微机电系统(MEMS)来实现光束的偏转扫描。说白了,就是用电子方式控制激光束的方向,而不是靠电机转。
固态雷达的优势是体积小、重量轻、寿命长、抗震动。但缺点也很要命——视场角通常比较小(水平120°左右),而且容易受到环境光干扰。目前市面上主流的固态雷达,比如Livox的Horizon系列,在低速机器人上用得比较多。
嗯,这里要注意:固态雷达的点云分布不均匀,中心区域密度高,边缘密度低。做特征提取时,一定要考虑这个特性,否则容易在边缘区域丢失特征。
2. 点云数据格式
激光雷达采集到的原始数据,就是一堆三维空间中的点。每个点通常包含(x, y, z)坐标,以及强度值(intensity)。这些数据需要以某种格式存储和传输。工程中最常见的两种格式是PCD和BIN。
2.1 PCD格式
PCD是Point Cloud Data的缩写,是PCL库(Point Cloud Library)的标准格式。它的特点是可读性强,文件头部包含点云的基本信息,比如点数、字段类型、宽度高度等。
# .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.0 2.0 3.0 100
2.0 3.0 4.0 200
...
我个人习惯在调试阶段用PCD格式,因为可以直接用文本编辑器打开看,方便排查问题。但PCD的缺点是文件体积大,尤其是用ASCII格式存储时,一个100万点的点云文件可能上百MB。
2.2 BIN格式
BIN格式就是二进制格式。它没有头部信息,直接存储原始数据。每个点通常用4个float(x, y, z, intensity)表示,共16字节。KITTI数据集用的就是这种格式。
// 读取BIN格式点云的C++代码示例
std::ifstream file("pointcloud.bin", std::ios::binary);
std::vector<float> buffer(4 * num_points);
file.read(reinterpret_cast<char*>(buffer.data()), buffer.size() * sizeof(float));
// 解析为点云
pcl::PointCloud<pcl::PointXYZI> cloud;
for (size_t i = 0; i < num_points; ++i) {
pcl::PointXYZI point;
point.x = buffer[i * 4];
point.y = buffer[i * 4 + 1];
point.z = buffer[i * 4 + 2];
point.intensity = buffer[i * 4 + 3];
cloud.push_back(point);
}
注意事项:BIN格式没有头部信息,读取时必须提前知道点云的点数和字段顺序。我曾经在接手一个项目时,对方给的BIN文件没有说明字段顺序,我默认是(x,y,z,intensity),结果读出来点云全飞了。后来才发现他们存的是(x,y,z,ring,intensity)。所以,用BIN格式一定要约定好协议。
3. IMU工作原理
IMU,全称Inertial Measurement Unit,惯性测量单元。它内部集成了加速度计和陀螺仪,分别测量物体的线加速度和角速度。IMU的采样频率通常很高(100Hz-1000Hz),但它的致命弱点是——有漂移。
3.1 加速度计
加速度计测量的是物体在三个轴上的线加速度。注意,它测量的是“比力”,也就是物体受到的合力减去重力。所以,当IMU静止时,加速度计读到的不是0,而是重力加速度g(约9.8 m/s²)。
为什么会这样?因为加速度计的敏感质量受到重力作用,会产生一个等效的加速度。这个特性在做姿态解算时非常有用——我们可以通过加速度计在水平方向的分量来估计俯仰角和横滚角。
3.2 陀螺仪
陀螺仪测量的是物体绕三个轴的角速度。它基于科里奥利力原理,通过检测振动质量块在旋转时产生的位移来测量角速度。
陀螺仪的数据相对干净,但它的漂移问题比加速度计更严重。你想想看,角速度积分得到角度,哪怕只有0.01 rad/s的零偏,积分10秒后就有0.1 rad的误差,约5.7°。这个误差会随时间累积,越来越大。
个人经验:我在做无人机室内定位时,发现陀螺仪的零偏会随温度变化。开机前5分钟和运行30分钟后的零偏能差好几倍。所以,我建议在IMU初始化时做一段静态采集,实时估计零偏,并在运行中持续更新。
4. IMU测量模型与噪声特性
IMU的测量模型,说白了就是描述“真实值”和“测量值”之间关系的数学表达式。我们通常用以下模型来描述:
加速度计模型:
a_meas = a_true + b_a + n_a + s_a * a_true + ...
陀螺仪模型:
ω_meas = ω_true + b_g + n_g + s_g * ω_true + ...
其中:
- b_a, b_g:零偏(bias),随时间缓慢变化
- n_a, n_g:白噪声(white noise),高频随机波动
- s_a, s_g:尺度因子(scale factor),通常很小,可以忽略
在实际工程中,我们最关心的是零偏和白噪声。零偏会导致积分后的位置和姿态产生二次项误差,白噪声则产生一次项误差。
4.1 Allan方差分析
如何量化IMU的噪声特性?业界标准方法是Allan方差分析。它通过计算不同时间尺度上的方差,来分离出白噪声、零偏不稳定性、随机游走等噪声成分。
| 噪声类型 | Allan方差斜率 | 物理含义 |
|---|---|---|
| 角度/速度随机游走 | -1/2 | 白噪声积分后的结果 |
| 零偏不稳定性 | 0 | 零偏随时间缓慢变化的幅度 |
| 速率随机游走 | +1/2 | 零偏的长期漂移 |
| 量化噪声 | -1 | AD转换的量化误差 |
嗯,这里要注意:Allan方差分析需要采集长时间的静态数据(通常1-2小时),然后对数据进行分段处理。我建议在IMU选型阶段,一定要让供应商提供Allan方差曲线,或者自己动手测一下。
核心结论:IMU的噪声特性决定了它在融合定位中的权重。噪声大的IMU,在滤波器中会被赋予更低的置信度;噪声小的IMU,则可以在短时间内提供高精度的相对位姿估计。
本章小结
好了,这一章我们聊了激光雷达和IMU的工作原理。机械式雷达适合大范围、高精度的场景,固态雷达适合小型化、抗震动的场景。点云格式方面,PCD适合调试,BIN适合量产。IMU方面,加速度计和陀螺仪各有各的脾气,零偏和白噪声是我们要重点对付的敌人。
下一章,我们会深入传感器标定和同步的内容。到时候我会分享一些实战中的标定技巧,保证让你少走弯路。
可可精品资料库