4、传感器仿真:激光雷达(Laser Scan)仿真配置、IMU仿真配置、深度相机仿真配置

传感器,说白了就是机器人的眼睛和耳朵。

在Gazebo里做仿真,如果传感器参数配得不对,那后面建图、导航全是白搭。我见过太多新手,花大把时间调算法,最后发现是激光雷达的扫描范围设错了——嗯,这种坑我自己也踩过。

今天咱们就把三种最常用的传感器:激光雷达、IMU、深度相机,一个一个说清楚。

4.1 激光雷达(Laser Scan)仿真配置

激光雷达是建图的核心传感器。它通过发射激光束,测量周围物体的距离。在Gazebo里,我们通常用 ray 插件来模拟。

我个人习惯,先搞清楚真实雷达的参数,再往仿真里填。比如我手头有个RPLIDAR A1,扫描范围是360度,最大距离12米,角度分辨率1度。那仿真里就得这么配:

<gazebo reference="laser_link">
  <sensor type="ray" name="laser_sensor">
    <pose>0 0 0.1 0 0 0</pose>
    <visualize>true</visualize>
    <update_rate>10</update_rate>
    <ray>
      <scan>
        <horizontal>
          <samples>360</samples>
          <resolution>1</resolution>
          <min_angle>-3.14159</min_angle>
          <max_angle>3.14159</max_angle>
        </horizontal>
      </scan>
      <range>
        <min>0.15</min>
        <max>12.0</max>
        <resolution>0.01</resolution>
      </range>
      <noise>
        <type>gaussian</type>
        <mean>0.0</mean>
        <stddev>0.01</stddev>
      </noise>
    </ray>
    <plugin name="laser_controller" filename="libgazebo_ros_ray_sensor.so">
      <topicName>/scan</topicName>
      <frameName>laser_frame</frameName>
    </plugin>
  </sensor>
</gazebo>

关键参数解读:

  • samples:一帧扫描的点数。360个点对应1度分辨率。
  • min_angle / max_angle:扫描范围,单位是弧度。±π就是360度。
  • min / max:有效测距范围。小于min或大于max的数据会被丢弃。
  • noise:加噪声。真实雷达都有误差,不加噪声的仿真太理想化。

我的经验: 如果你做的是室内建图,把最大距离设成10-15米就够了。设太大反而容易扫到仿真边界,产生奇怪的数据。

4.2 IMU仿真配置

IMU提供角速度和线加速度。它不直接用于建图,但在融合定位里特别重要。你想想看,激光雷达在快速旋转时,如果没有IMU补偿,点云会变形得一塌糊涂。

Gazebo里IMU的配置相对简单。我用的是 gazebo_ros_imu_sensor 插件:

<gazebo reference="imu_link">
  <sensor type="imu" name="imu_sensor">
    <pose>0 0 0 0 0 0</pose>
    <update_rate>200</update_rate>
    <imu>
      <angular_velocity>
        <noise type="gaussian">
          <mean>0.0</mean>
          <stddev>0.0002</stddev>
          <bias_mean>0.00001</bias_mean>
          <bias_stddev>0.00002</bias_stddev>
        </noise>
      </angular_velocity>
      <linear_acceleration>
        <noise type="gaussian">
          <mean>0.0</mean>
          <stddev>0.017</stddev>
          <bias_mean>0.001</bias_mean>
          <bias_stddev>0.001</bias_stddev>
        </noise>
      </linear_acceleration>
    </imu>
    <plugin name="imu_controller" filename="libgazebo_ros_imu_sensor.so">
      <topicName>/imu/data</topicName>
      <frameName>imu_frame</frameName>
    </plugin>
  </sensor>
</gazebo>

注意: IMU的更新率要设高一些。真实IMU通常是100-400Hz。设成10Hz的话,融合效果会非常差。我曾经在这个问题上折腾了两天,最后发现是更新率太低。

这里有个细节:bias_mean 和 bias_stddev 模拟的是IMU的零偏。真实IMU用久了会漂移,仿真里加上这个,你的算法才会更鲁棒。

4.3 深度相机仿真配置

深度相机(比如Kinect、RealSense)能同时提供RGB图像和深度图。在Gazebo里,我们用 depth 类型的传感器。

配置深度相机时,我建议把RGB相机和深度相机分开配,然后用一个插件把它们合并发布。这样更灵活:

<gazebo reference="camera_link">
  <sensor type="depth" name="depth_camera">
    <pose>0 0 0 0 0 0</pose>
    <update_rate>30</update_rate>
    <camera>
      <horizontal_fov>1.047</horizontal_fov>
      <image>
        <width>640</width>
        <height>480</height>
        <format>R8G8B8</format>
      </image>
      <clip>
        <near>0.1</near>
        <far>10.0</far>
      </clip>
    </camera>
    <plugin name="depth_camera_controller" filename="libgazebo_ros_openni_kinect.so">
      <topicName>/camera/depth</topicName>
      <frameName>camera_depth_frame</frameName>
      <pointCloudTopicName>/camera/depth/points</pointCloudTopicName>
      <pointCloudCutoff>0.5</pointCloudCutoff>
    </plugin>
  </sensor>
</gazebo>

参数说明:

  • horizontal_fov:水平视场角。1.047弧度约60度,比较常见。
  • near / far:深度测量的最近和最远距离。太近会溢出,太远噪声大。
  • pointCloudCutoff:点云裁剪距离。小于这个值的点会被过滤掉。

深度相机有个常见问题:边缘区域的深度值不准。为什么呢?因为深度是靠红外结构光或ToF计算的,边缘处光线反射弱。仿真里虽然没这个问题,但我建议你还是加上一些边缘噪声,这样更贴近真实情况。

4.4 三种传感器的对比与选型建议

为了让你看得更清楚,我把三种传感器的核心参数整理成了表格:

传感器类型 核心输出 典型更新率 主要用途 仿真插件
激光雷达 距离/角度点云 5-40 Hz 建图、定位 libgazebo_ros_ray_sensor.so
IMU 角速度/加速度 100-400 Hz 融合定位、姿态估计 libgazebo_ros_imu_sensor.so
深度相机 RGB图/深度图/点云 15-30 Hz 视觉建图、避障 libgazebo_ros_openni_kinect.so

选型建议: 如果你只做2D建图,一个激光雷达就够了。要做3D建图,最好激光雷达+IMU搭配。深度相机适合室内近距离场景,远距离还是激光雷达靠谱。

4.5 本章知识体系

下面这张图,是我梳理的传感器仿真配置的核心逻辑。你看一眼,心里就有数了:

传感器仿真配置知识体系 传感器仿真配置 激光雷达 (Laser Scan) 扫描范围/角度 测距范围/分辨率 噪声模型 IMU (惯性测量单元) 角速度噪声 加速度噪声 零偏设置 深度相机 RGB图像参数 深度图参数 点云输出 核心原则:参数贴近真实 + 合理噪声 + 正确坐标系

说白了,传感器仿真就三件事:参数配准、噪声加对、坐标系搞对。这三件事做好了,你的仿真环境就跟真实世界八九不离十了。

好了,这一章的内容就到这儿。下一章咱们开始动手搭建一个完整的机器人模型,把今天配的传感器都装上去。


可可精品资料库