传感器与数据:相机模型(针孔、鱼眼)、IMU、激光雷达、RGB-D相机
做SLAM这么多年,我最大的感触就是:传感器选对了,项目就成功了一半。你想想看,数据质量直接决定了后端优化的天花板。今天咱们就把几种主流传感器掰开揉碎了聊一聊。
一、相机模型:针孔与鱼眼
相机是SLAM的眼睛。但不同眼睛看世界的方式不一样。
1. 针孔相机模型
这是最经典的模型。说白了就是小孔成像原理。光线穿过一个小孔,在成像平面上倒立成像。
数学上,我们用内参矩阵K来描述:
K = [fx, 0, cx;
0, fy, cy;
0, 0, 1]
其中fx、fy是焦距,cx、cy是光心偏移。我个人习惯在标定时至少拍20张不同角度的棋盘格照片,这样内参才稳。
核心公式: 世界点P = (X,Y,Z) 投影到像素坐标 (u,v) 的过程:
u = fx * X/Z + cx
v = fy * Y/Z + cy
嗯,这里要注意:针孔模型假设光线是直线传播的。但实际镜头有畸变。径向畸变和切向畸变必须校正。我在项目中遇到过因为忘记校正畸变,导致地图漂移了半米的情况——从那以后我再也不敢跳过这步。
2. 鱼眼相机模型
鱼眼相机不一样。它的视场角可以到180度甚至更大。为什么?因为它故意引入了很大的畸变,把更多光线「挤」进传感器。
鱼眼模型常用的是等距投影模型:
r = f * θ
其中r是像点到光心的距离,θ是入射光线与光轴的夹角。说白了,针孔模型是r = f * tan(θ),鱼眼是r = f * θ。这个区别很关键。
我的经验: 鱼眼相机在室内SLAM中特别好用。因为墙角、走廊这些场景,大视场角能同时看到更多特征点。但标定要更仔细,我建议用Omnidirectional Camera Calibration Toolbox,比OpenCV自带的更准。
二、IMU:惯性测量单元
IMU测量加速度和角速度。它不依赖外部环境,所以是SLAM中「最后一道防线」——当视觉失效时,IMU还能撑一会儿。
IMU的数学模型:
a_measured = a_true + b_a + n_a
ω_measured = ω_true + b_g + n_g
b_a和b_g是零偏,n_a和n_g是噪声。零偏会随时间缓慢变化,这就是所谓的「bias random walk」。
避坑指南: 我曾经在无人机SLAM项目里,IMU的零偏没初始化好,结果起飞后3秒姿态就飘了。后来我养成了习惯:上电后静止采集2秒数据,取平均作为初始零偏估计。
IMU的积分过程也很关键。从t时刻到t+Δt:
位置: p(t+Δt) = p(t) + v(t)Δt + 0.5*a(t)Δt²
速度: v(t+Δt) = v(t) + a(t)Δt
姿态: R(t+Δt) = R(t) * exp(ω(t)Δt)
这里exp是李代数上的指数映射。你想想看,如果直接用欧拉角积分,万向锁问题会让你头疼死。
三、激光雷达
激光雷达直接测量距离,精度高,但稀疏。2D激光雷达扫一个平面,3D激光雷达扫多个平面。
激光雷达的核心原理是TOF(飞行时间):
距离 = 光速 × 飞行时间 / 2
常见的激光雷达数据格式:
| 参数 | 说明 | 典型值 |
|---|---|---|
| 线数 | 扫描线的数量 | 16线、32线、64线 |
| 视场角 | 水平和垂直范围 | 水平360°,垂直±15° |
| 测距精度 | 距离测量误差 | ±2cm |
| 点云密度 | 每秒点数 | 30万~200万点/秒 |
我个人觉得,激光SLAM最大的优势是尺度确定。视觉SLAM有尺度模糊问题,激光雷达直接给距离,省心很多。但缺点也明显:在长走廊、玻璃墙等场景,激光会打飞或者穿透。
关键点: 激光雷达和IMU的联合标定非常重要。我曾经见过一个团队,激光和IMU的外参差了5度,建出来的地图整个是歪的。标定方法可以用Kalibr或者lidar_align工具包。
四、RGB-D相机
RGB-D相机同时输出彩色图和深度图。它解决了单目相机「不知道深度」的痛点。
深度获取方式主要有两种:
- 结构光法: 投射红外散斑,通过散斑变形计算深度。代表:Kinect v1、Intel RealSense D415
- TOF法: 发射红外脉冲,测量飞行时间。代表:Kinect v2、Azure Kinect
RGB-D相机的数据格式:
彩色图: 640×480 或 1280×720, 8位RGB
深度图: 640×480, 16位, 单位mm
有效距离: 0.5m ~ 5m (结构光) 或 0.5m ~ 8m (TOF)
嗯,这里有个坑:RGB-D相机的深度图在边缘区域噪声很大。我做过实验,距离超过4米后,深度误差会从±1cm飙升到±5cm。所以建议只使用有效距离内的数据。
我的习惯: 拿到RGB-D数据后,先做一步深度图滤波。用中值滤波去掉孤立噪点,再用双边滤波保持边缘。这样后续的点云生成质量会好很多。
五、传感器融合:为什么需要多传感器?
单一传感器都有短板。相机怕光照变化,IMU有漂移,激光雷达怕反射面,RGB-D相机有效距离短。所以现代SLAM系统基本都是多传感器融合。
我画了一张图,帮你理清各传感器的关系:
从这张图你能看到,不同传感器各自采集数据,然后送到融合模块。融合的方式可以是松耦合(各传感器独立估计,最后加权)或紧耦合(在优化框架里一起优化)。我个人更推荐紧耦合,精度更高,但计算量也更大。
总结一下: 没有完美的传感器,只有合适的组合。做SLAM项目时,先搞清楚你的场景需求——室内还是室外?动态还是静态?精度要求多高?然后选传感器组合。我见过太多人一上来就堆传感器,结果标定没做好,数据质量反而更差。
好了,这一章的内容就到这里。传感器是SLAM的基石,理解它们的特性和局限,比会调参数重要得多。