第三章 传感器选型与标定:让机器人“看得准”的第一步
做机器人导航这些年,我踩过最大的坑,就是传感器没选对、标定没做准。你想想看,算法再牛,如果传感器数据本身就是歪的,那后面所有工作都是白费。这一章,我就把激光雷达、深度相机的选型要点,以及内参、外参标定的实战流程,掰开了讲给你听。
核心观点:传感器选型决定系统上限,标定精度决定实际下限。选错传感器,后面调参调破天也没用;标定差1度,地图可能就歪10厘米。
3.1 激光雷达选型:2D 还是 3D?
激光雷达是导航系统的眼睛。选型时,我一般先问三个问题:室内还是室外?要建2D地图还是3D地图?预算多少?
2D 激光雷达
说白了就是单线扫描,在一个平面上测距。适合室内平地场景,比如仓储AGV、扫地机器人。优点是便宜、成熟、算力要求低。缺点是只能感知一个平面,遇到坡道或悬空障碍物就抓瞎。
我记得有一次给一个工厂做AGV,客户图便宜买了某品牌的2D雷达。结果车间地面有个3厘米的坡,雷达直接扫到地面当成障碍物,车原地打转。后来换了3D雷达才解决。
| 参数 | 2D 激光雷达 | 3D 激光雷达 |
|---|---|---|
| 扫描维度 | 单线(一个平面) | 多线 / 固态(立体空间) |
| 典型场景 | 室内平地导航 | 室外、复杂地形、3D建图 |
| 价格范围 | 几百 ~ 几千元 | 几千 ~ 数万元 |
| 算力需求 | 低 | 高 |
| 代表型号 | RPLIDAR A1/A2, YDLIDAR | Velodyne VLP-16, Livox Mid-40 |
我的选型建议:如果只做室内2D导航,用2D雷达就够了,别浪费钱。但如果你要做3D建图、室外导航,或者机器人会上下坡,直接上3D雷达。我个人的经验是——宁可多花点钱买3D,也别后期发现2D不够用再换,那成本更高。
3D 激光雷达
3D雷达分两类:机械旋转式和固态式。机械式(比如Velodyne)靠电机旋转多组激光收发器,视野360°,但体积大、有机械磨损。固态式(比如Livox)没有旋转部件,寿命长,但视场角通常小于120°。
你想想看,如果做园区无人车,机械式360°视野是刚需。但如果是室内移动底盘,固态式完全够用,还便宜不少。
3.2 深度相机选型:RGB-D 怎么挑?
深度相机(RGB-D)能同时输出彩色图和深度图。常见技术路线有两种:结构光和ToF(飞行时间)。
- 结构光(如Intel RealSense D435):投射红外散斑,通过三角测量算深度。室内精度高,但室外强光下容易失效。
- ToF(如Microsoft Kinect v2/Azure Kinect):直接测量光飞行时间。室外抗干扰能力强一些,但分辨率通常不如结构光。
我做过一个项目,需要在半室外环境用RGB-D做避障。一开始选了结构光,结果大晴天直接废了——红外散斑被太阳光淹没。后来换成ToF方案,虽然分辨率低一点,但至少能用。
注意:深度相机的有效测距范围通常只有3-10米,远不如激光雷达。如果你需要远距离感知,别指望RGB-D,老老实实上激光雷达。
3.3 传感器内参标定流程
内参标定,就是让传感器知道“自己长什么样”。激光雷达要标定测距偏移和角度偏差,相机要标定焦距、畸变系数。
激光雷达内参标定
2D雷达的内参一般出厂就标好了,但3D雷达的每个激光发射器角度和距离偏移可能不一样。我习惯用官方工具(比如Velodyne的VeloView、Livox的标定工具)做一次出厂校准。如果雷达受过撞击,一定要重新标。
步骤很简单:
- 把雷达固定好,前方放一个已知距离的平面(比如墙面)。
- 采集点云数据,提取平面点。
- 用最小二乘法拟合平面,计算每个激光点的角度和距离残差。
- 把残差写入雷达的校准文件。
相机内参标定
相机内参标定,我用的是张正友标定法。ROS里直接跑camera_calibration包就行。
# 启动相机驱动
roslaunch usb_cam usb_cam-test.launch
# 启动标定节点(棋盘格 8x6,格子边长 0.025m)
rosrun camera_calibration cameracalibrator.py \
--size 8x6 --square 0.025 \
image:=/usb_cam/image_raw camera:=/usb_cam
标定的时候,拿着棋盘格在相机前上下左右晃动,让棋盘格覆盖画面各个区域。等CALIBRATE按钮亮了,点一下,系统会自动计算内参和畸变系数。
避坑指南:棋盘格一定要打印平整,贴在硬纸板上。我曾经用普通A4纸贴墙上,结果纸面不平,标定出来的畸变系数全是错的,折腾了两天才发现是棋盘格的问题。
3.4 外参标定:激光雷达与IMU/里程计联合标定
外参标定,就是确定两个传感器之间的相对位姿(旋转和平移)。这一步做不好,多传感器融合就是空中楼阁。
为什么需要外参标定?
激光雷达和IMU装在机器人上,位置和朝向不可能完全重合。如果不标定,激光点云投影到IMU坐标系时就会歪掉。我见过一个团队,外参差了5度,建出来的地图直接扭曲成麻花。
常用标定方法
- 手动测量法:用尺子量安装位置,估算旋转角度。精度低,只适合粗标。
- 基于特征匹配:在场景中放置标定物(如棋盘格、立方体),同时被激光雷达和相机/IMU观测到,通过特征匹配解算外参。
- 基于运动约束:让机器人做特定运动(如旋转、加速),利用IMU和激光雷达的轨迹一致性来优化外参。推荐工具:
lidar_align、kalibr。
实战:使用 lidar_align 做激光雷达与IMU联合标定
lidar_align是一个开源工具,通过优化激光雷达点云与IMU预积分轨迹的一致性来标定外参。我自己的项目里用过很多次,效果不错。
# 1. 录制数据包(让机器人做8字形运动,持续2-3分钟)
rosbag record /velodyne_points /imu/data -O calibration.bag
# 2. 运行 lidar_align
roslaunch lidar_align lidar_align.launch \
bag_file:=/path/to/calibration.bag \
imu_topic:=/imu/data \
lidar_topic:=/velodyne_points
标定完成后,会输出一个变换矩阵(4x4齐次矩阵),直接写到你的ROS参数服务器里。
重要提醒:标定过程中,机器人运动要包含足够的旋转和加速激励。如果只是直线运动,IMU的偏置和尺度无法被充分观测,标定结果会不准确。我一般会让机器人走8字形,再加几个急停和旋转。
标定结果验证
标定完怎么知道准不准?我的做法是:把激光点云投影到IMU坐标系下,看静止时点云是否稳定、运动时点云是否与IMU轨迹对齐。如果点云在静止时还在漂移,说明外参没标好。
| 验证方法 | 操作 | 合格标准 |
|---|---|---|
| 静态对齐 | 机器人静止,观察点云 | 点云无明显漂移 |
| 动态对齐 | 机器人运动,对比点云与IMU轨迹 | 点云与轨迹偏差 < 5cm |
| 回环检测 | 机器人走一圈回到起点 | 点云闭合误差 < 10cm |
总结一下:传感器选型和标定,是导航系统的基础设施。选型时想清楚场景需求,别盲目追求高参数;标定时耐心细致,别图快。我见过太多项目,后面调参调得死去活来,最后发现是传感器没标好。嗯,希望你别走这些弯路。