传感器基础:激光雷达、相机与IMU
大家好,我是你们这门课的老朋友。今天我们来聊聊传感器的那些事儿。
做地图构建,说白了就是让机器人「看懂」周围的世界。那它靠什么看?就是靠这些传感器。我个人习惯把传感器比作机器人的眼睛和耳朵——没有它们,后面再牛的算法也是白搭。
核心观点:传感器选型决定了你整个系统的上限。算法再好,也救不了烂数据。
一、激光雷达(LiDAR)原理与数据格式
激光雷达这东西,名字听着高大上,原理其实不复杂。它朝外发射一束激光,打到物体上弹回来,接收器记录时间差。光速是已知的,时间差一算,距离就出来了。这就是最经典的 TOF(飞行时间) 原理。
还有一种叫 三角测距法,靠的是激光发射点和接收器之间的几何关系来算距离。这种方案成本低,但精度和距离都不如 TOF。我在项目中遇到过用三角测距雷达做室内建图,一到阳光直射的地方就崩了——环境光干扰太严重。所以室外场景,老老实实上 TOF。
个人经验:选激光雷达时,别光看线数。视场角、帧率、测距精度、强度值分辨率,这些参数在实际融合中往往更关键。我曾经为了省预算选了16线雷达,结果建图时地面点太多,滤波调到吐。
数据格式方面,最常见的输出是 点云(Point Cloud)。每个点包含:
- xyz 坐标:三维空间位置
- intensity(强度值):反射回来的光强,可以用来区分路面和车道线
- ring(环号):多线雷达中,这条激光属于第几圈
- timestamp(时间戳):每个点的时间,用于去畸变
举个实际例子,Velodyne 的 VLP-16 输出的点云结构大概长这样:
// 伪代码示意
struct Point {
float x; // 单位:米
float y;
float z;
float intensity; // 0-255
uint16_t ring; // 0-15
double timestamp; // 微秒级
};
嗯,这里要注意:不同厂家的雷达,强度值的含义可能不一样。有的归一化到 0-1,有的是 0-255,还有的是 0-65535。做算法前一定要先看 datasheet,不然你写出来的特征提取全是错的。
二、相机原理:单目、双目与深度相机
相机这东西,大家天天用手机拍照,但做 SLAM 用的相机和手机相机有本质区别吗?有,也没有。核心原理都是 针孔模型——光线通过一个小孔,在成像平面上倒立成像。
但问题来了:单目相机拍出来的是一张 2D 图片,它天生缺少深度信息。你想想看,一张照片里,远处的人和近处的杯子,在像素上怎么区分?分不出来。这就是单目 SLAM 的尺度不确定性——你建出来的地图,不知道真实大小。
双目相机 怎么解决这个问题?它模仿人的两只眼睛。左右两个相机同时拍,同一个物体在左右图像上的位置有差异,这个差异叫 视差。视差越大,物体越近。通过三角测量,就能算出深度。
核心公式:深度 Z = (基线长度 B × 焦距 f) / 视差 d
基线越长,深度精度越高,但相机体积也越大。这是个 trade-off。
我在项目中用过双目做室外建图,最头疼的是 立体匹配 这一步。纹理稀疏的区域(比如白墙),左右图根本匹配不上,深度图全是黑洞。后来我加了个先验——用 IMU 预测的深度做引导,才勉强搞定。
深度相机(RGB-D) 就粗暴多了。它直接给你输出每个像素的深度值。主流方案有两种:
- 结构光:投射红外光斑,通过光斑变形算深度。代表产品:Kinect v1、Intel RealSense D415
- ToF:发射红外光脉冲,测飞行时间。代表产品:Kinect v2、Azure Kinect
避坑指南:我曾经在户外用 RGB-D 相机做建图,结果大太阳底下深度值全是 NaN。深度相机对强环境光非常敏感,室内神器,室外基本废掉。如果你要做室外建图,老老实实上激光雷达或者双目。
相机还有一个绕不开的话题——畸变。镜头不是完美的针孔,拍出来的图像会有径向畸变(桶形/枕形)和切向畸变。做 SLAM 之前,必须先做相机标定,拿到内参和畸变系数。我建议用 OpenCV 的棋盘格标定法,拍个二三十张不同角度的图,跑一遍就出结果。
三、IMU 与里程计
IMU 全称是惯性测量单元,里面装了一个 加速度计 和一个 陀螺仪。加速度计测线加速度,陀螺仪测角速度。把这两个数据积分,理论上就能算出位置和姿态。
但理论很丰满,现实很骨感。IMU 有个致命问题——零偏 和 噪声。你想想看,加速度计哪怕有 0.01 m/s² 的零偏,积分 10 秒后位置误差就累积到 0.5 米了。再跑一分钟,位置都不知道飘到哪去了。
所以 IMU 不能单独用,它必须和其他传感器融合。最常见的做法是 IMU 预积分——把两帧图像之间的 IMU 数据提前积好,作为约束加入到优化方程里。这样既利用了 IMU 的高频信息,又避免了长时间积分漂移。
我的习惯:做 VIO(视觉惯性里程计)时,IMU 的初始化非常关键。我一般会让机器人先静止 2-3 秒,采集一组静态数据来估计零偏。这一步做不好,后面整个系统都是歪的。
轮式里程计 就简单多了。它靠轮子上的编码器,记录轮子转了多少圈,结合轮径算出移动距离。好处是短时间精度高,没有漂移。坏处是——轮子打滑就完蛋。我在项目中遇到过机器人在地砖上急转弯,轮子空转,里程计以为走了 1 米,实际才挪了 0.3 米。后来我加了 IMU 做辅助,检测到角速度异常时就降低轮式里程计的权重。
最后说一句,传感器融合不是简单的「取平均」。你得理解每个传感器的误差特性,用卡尔曼滤波或者因子图优化,把不同来源的信息按置信度加权融合。这才是地图构建的核心功底。
| 传感器 | 优点 | 缺点 | 典型应用场景 |
|---|---|---|---|
| 激光雷达 | 精度高、不受光照影响 | 成本高、无纹理信息 | 室外建图、自动驾驶 |
| 单目相机 | 成本低、信息丰富 | 尺度不确定、弱纹理失效 | AR、室内视觉SLAM |
| 双目相机 | 可测深度、户外可用 | 计算量大、基线限制 | 室外导航、无人机 |
| 深度相机 | 直接输出深度、帧率高 | 强光失效、距离有限 | 室内建图、机器人抓取 |
| IMU | 高频、不受环境干扰 | 积分漂移、零偏不稳定 | 多传感器融合、运动估计 |
| 轮式里程计 | 短时精度高、无漂移 | 打滑失效、只能测平面 | 轮式机器人、AGV |
好了,传感器这块我们就聊到这。每种传感器都有自己的脾气,摸透了它们,你才能搭出靠谱的建图系统。