第2章 · 传感器基础
激光雷达、IMU、轮式里程计 —— 这三样东西,是SLAM的“眼睛”和“小脑”。
我做了这么多年机器人,发现很多调参问题其实都出在对传感器原理的理解上。今天咱们就把它们彻底聊透。
🔦 激光雷达:单线 / 多线 / 固态
激光雷达,说白了就是“用光测距”。发射一束激光,等它反射回来,算时间差或者相位差,就知道前方障碍物有多远。我最早接触激光雷达是在2016年,那时候一个单线雷达要好几千,现在国产的已经卷到几百块了。
单线激光雷达:只扫描一个平面,常用于室内扫地机、AGV。优点是便宜、数据量小;缺点嘛,只能知道一个高度上的障碍物。你想想看,如果桌子腿很细,单线雷达可能扫不到,机器人就直接撞上去了。
多线激光雷达:比如16线、32线、64线。它同时发射多束激光,覆盖一个垂直视场角。我在做园区无人车时用过Velodyne 16线,点云密度大,能识别出路沿、行人轮廓。但价格和算力消耗也上去了。
固态激光雷达:没有旋转部件,靠光学相控阵或微振镜扫描。体积小、寿命长,是未来的趋势。不过目前视场角还偏窄,我测试过一款固态雷达,水平FOV只有90°,做SLAM时需要多颗组合。
家用机器人:单线(成本敏感)
园区物流:16线(性价比高)
自动驾驶:32线以上或固态+补盲
注意:帧率和角分辨率直接影响SLAM精度。我习惯先看角分辨率,再看测距噪声。
我曾经在项目里选了一款号称30米测距的雷达,结果在室外强光下只能测15米。后来才明白,标称测距通常是在室内无干扰下测的。选型时一定要看“抗环境光”参数。
🧭 IMU:加速度计 + 陀螺仪
IMU就是惯性测量单元。加速度计测“比力”,陀螺仪测角速度。两者融合可以得到姿态和位置。但IMU有个毛病——零偏和噪声会随时间累积。你想想看,手机里的IMU放桌上不动,积分出来的速度却越来越大,这就是漂移。
在SLAM里,IMU主要用来做两件事:
- 短时间位姿推算(激光或视觉帧间匹配的初始值)
- 预积分(多传感器融合中的关键技巧)
我习惯在ROS里用 imu_tools 包先做静态标定,把零偏去掉。否则你后面做LIO-SAM会发现地图都是歪的。
消费级IMU(如MPU6050)温漂很大,开机前几分钟数据不可用。工业级(如ADIS16470)就好很多。如果你做高精度建图,别省IMU的钱。
下面是一个简单的IMU数据读取示例(ROS节点):
// 伪代码 —— 实际开发中常用
void imuCallback(const sensor_msgs::Imu::ConstPtr& msg) {
// 获取加速度 (m/s^2)
double ax = msg->linear_acceleration.x;
double ay = msg->linear_acceleration.y;
double az = msg->linear_acceleration.z;
// 获取角速度 (rad/s)
double gx = msg->angular_velocity.x;
double gy = msg->angular_velocity.y;
double gz = msg->angular_velocity.z;
// 记得先减去零偏!
ax -= bias_ax;
// ...
}
⚙️ 轮式里程计(编码器)
轮式里程计靠编码器脉冲数推算位移。增量式编码器输出AB相脉冲,通过计数和方向判断,就能算出轮子转了多少圈。再结合轮距、轮径,就能得到机器人的位移和转角。
公式很简单:
- 左轮位移 = 左轮脉冲数 / 分辨率 × π × 轮径
- 右轮位移 = 右轮脉冲数 / 分辨率 × π × 轮径
- 机器人转角 = (右轮位移 - 左轮位移) / 轮距
但实际中坑很多。比如轮子打滑、地面不平、轮胎磨损,都会导致里程计误差。我在做仓储机器人时,发现地毯上里程计误差能到20%。后来加了IMU辅助,才压到5%以内。
| 类型 | 分辨率 (PPR) | 接口 | 适用场景 |
|---|---|---|---|
| 增量式光电 | 500~5000 | ABZ | 室内轮式机器人 |
| 磁性编码器 | 256~2048 | SPI/I2C | 低成本、小型底盘 |
| 值编码器 | 12~18位 | SSI/CAN | 高精度、关节模组 |
我曾经用“直线往返+旋转90°”的方法标定轮距和轮径。写一个简单的ROS节点,让机器人走2米直线,然后原地转360°,对比实际角度和编码器角度,迭代修正参数。效果立竿见影。
最后说一句,传感器融合才是王道。激光雷达提供观测,IMU提供高频姿态,轮式里程计提供短时位移。三者互补,SLAM才能又稳又准。