3、传感器选型与配置:激光雷达、深度相机、IMU、里程计
做机器人导航,传感器就是咱们的「眼睛」和「耳朵」。选错了,算法再牛也白搭。我这些年踩过的坑,十有八九都跟传感器选型有关。今天咱们就聊聊这四大金刚:激光雷达、深度相机、IMU、里程计。
3.1 激光雷达:SLAM的定海神针
激光雷达,说白了就是靠激光束扫描周围环境,直接给你返回距离数据。它不依赖光照,晚上也能干活,这是摄像头比不了的。
核心参数:
- 线数:单线(2D)还是多线(3D)。做室内导航,单线够用;室外复杂环境,至少16线起步。
- 测距范围:室内10-30米足够,室外建议50米以上。
- 角分辨率:0.1°以下算优秀,0.5°以上建图容易有锯齿。
- 扫描频率:10Hz是底线,20Hz以上动态场景更稳。
我个人习惯,室内场景首选思岚A1/A2系列,性价比高。室外的话,速腾16线或者禾赛的都不错。嗯,这里要注意:千万别买那种几十块钱的玩具雷达,数据噪声大到让你怀疑人生。
避坑指南:我曾经在项目里贪便宜买了某款低价雷达,结果建图时墙壁全是锯齿状,滤波参数调了三天都没救回来。最后换了思岚A2,一跑就稳了。
3.2 深度相机:视觉SLAM的利器
深度相机能同时给你RGB图像和深度图。它比激光雷达便宜,但受光照影响大。你想想看,大太阳底下,结构光相机基本就废了。
主流方案有三种:
| 类型 | 代表产品 | 优点 | 缺点 |
|---|---|---|---|
| 结构光 | Kinect v1、Intel RealSense D415 | 室内精度高,成本低 | 怕强光,室外基本不能用 |
| ToF | Kinect v2、Azure Kinect | 帧率高,抗干扰稍好 | 分辨率低,边缘噪声大 |
| 双目 | ZED、Intel RealSense D435i | 室内外都能用,无主动光 | 计算量大,弱纹理区域失效 |
我建议做室内导航,用RealSense D435i就够了。它带IMU,能跑VIO,性价比很高。但记住:深度相机的最佳工作距离是0.3-3米,太远太近都不行。
注意:深度相机和激光雷达不要装在同一水平面上,否则红外光会互相干扰。我见过有人把D435和A2叠在一起装,结果深度图全是条纹噪声。
3.3 IMU:短时精度高,长时飘成狗
IMU(惯性测量单元)测量加速度和角速度。它不依赖外部信号,更新频率高(200Hz以上),但积分误差会随时间累积。说白了,IMU适合做短时间内的姿态估计,长时间定位还得靠其他传感器。
选型时关注三点:
- 零偏稳定性:低于10°/h算及格,低于1°/h算优秀。
- 噪声密度:越小越好,直接影响滤波效果。
- 输出频率:至少100Hz,否则跟不上运动。
我在项目里常用的是ICM-20948,9轴IMU,价格便宜,性能够用。高端点的用ADIS16470,那玩意儿一个顶十个,但价格也感人。
小技巧:IMU一定要做标定!我曾经偷懒没标定,结果机器人原地转圈时,航向角误差每分钟漂了30度。用imu_utils包跑一遍标定,零偏值能降一个数量级。
3.4 里程计:轮式机器人的基本功
里程计就是靠轮子编码器推算位置。它简单可靠,但有两个硬伤:轮子打滑和地面不平。你想想看,在瓷砖地上洒点水,轮子一滑,里程计数据直接废了。
配置里程计要注意:
- 编码器分辨率:每转脉冲数(PPR)越高越好,建议1000以上。
- 轮距校准:左右轮实际距离和理论值往往有偏差,需要跑直线校准。
- 运动模型:差速轮用两轮模型,全向轮用三/四轮模型。
ROS2里里程计发布很简单,但要注意坐标系:odom是全局坐标系,base_footprint是机器人本体坐标系。别搞反了,否则定位会乱跳。
# 里程计发布示例(Python)
from nav_msgs.msg import Odometry
from geometry_msgs.msg import Twist
odom_msg = Odometry()
odom_msg.header.frame_id = 'odom'
odom_msg.child_frame_id = 'base_footprint'
# 填充位置和姿态
odom_msg.pose.pose.position.x = x
odom_msg.pose.pose.position.y = y
odom_msg.pose.pose.orientation.z = sin(yaw/2)
odom_msg.pose.pose.orientation.w = cos(yaw/2)
# 发布
odom_pub.publish(odom_msg)
3.5 传感器融合:1+1>2
单个传感器都有短板,融合才是王道。最经典的组合是:
- 激光雷达 + 里程计:室内导航标配,里程计提供短时平滑,激光雷达修正累积误差。
- 激光雷达 + IMU:适合颠簸路面,IMU补偿运动畸变。
- 深度相机 + IMU:视觉惯性里程计(VIO),无激光雷达时的替代方案。
在Nav2里,传感器融合通常用robot_localization包。它支持扩展卡尔曼滤波(EKF)和无迹卡尔曼滤波(UKF)。我个人习惯用EKF,配置简单,效果够用。
核心配置:
- 设置
frequency为30Hz,和IMU输出频率匹配 - 开启
two_d_mode,只融合x、y、yaw - 给不同传感器设置合理的噪声协方差
嗯,这里要提醒一句:传感器融合不是越多越好。我见过有人把三个IMU、两个里程计、一个激光雷达全怼进去,结果滤波器发散得一塌糊涂。少而精,才是正道。
这张图把咱们今天聊的内容串起来了。四个传感器各有侧重,融合之后才能给Nav2提供稳定可靠的定位数据。选型时别贪多,根据你的场景和预算,挑两到三个核心传感器就够了。
最后说一句:传感器买回来别急着上车。先单独测试,看看数据质量。我习惯用rviz2实时查看激光点云和深度图,一眼就能看出有没有问题。数据干净了,后面的SLAM和导航才能顺风顺水。