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、两个里程计、一个激光雷达全怼进去,结果滤波器发散得一塌糊涂。少而精,才是正道。

传感器选型与配置 激光雷达 单线/多线 测距范围、角分辨率 深度相机 结构光/ToF/双目 RGB-D、VIO IMU 加速度计+陀螺仪 零偏、噪声密度 里程计 轮式编码器 分辨率、轮距校准 传感器融合 互补 互补 融合 融合

这张图把咱们今天聊的内容串起来了。四个传感器各有侧重,融合之后才能给Nav2提供稳定可靠的定位数据。选型时别贪多,根据你的场景和预算,挑两到三个核心传感器就够了。

最后说一句:传感器买回来别急着上车。先单独测试,看看数据质量。我习惯用rviz2实时查看激光点云和深度图,一眼就能看出有没有问题。数据干净了,后面的SLAM和导航才能顺风顺水。

可可精品资料库