要在 Gazebo 中使用这些传感器,你需要为每个传感器添加 Gazebo 插件。Gazebo 插件允许你在仿真环境中模拟传感器的行为。以下是如何为 GNSS、IMU 和 LiDAR 传感器添加 Gazebo 插件的步骤。

1. 修改 GNSS 传感器定义(gnss_sensor.xacro

在 gnss_sensor.xacro 文件中添加 Gazebo 插件:

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">

  <!-- GNSS Sensor -->
  <xacro:macro name="gnss_sensor" params="parent xyz rpy">
    <link name="gnss_link">
      <visual>
        <geometry>
          <box size="0.05 0.05 0.02"/>
        </geometry>
        <material name="green">
          <color rgba="0 1 0 1"/>
        </material>
      </visual>
      <collision>
        <geometry>
          <box size="0.05 0.05 0.02"/>
        </geometry>
      </collision>
      <inertial>
        <mass value="0.1"/>
        <inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
      </inertial>
    </link>
    <joint name="gnss_joint" type="fixed">
      <parent link="${parent}"/>
      <child link="gnss_link"/>
      <origin xyz="${xyz}" rpy="${rpy}"/>
    </joint>
    <gazebo reference="gnss_link">
      <sensor type="gps" name="gnss_sensor">
        <pose>0 0 0 0 0 0</pose>
        <plugin name="gnss_plugin" filename="libgazebo_ros_gps.so">
          <update_rate>10.0</update_rate>
          <gaussian_noise>0.01</gaussian_noise>
        </plugin>
      </sensor>
    </gazebo>
  </xacro:macro>

</robot>

        在这个配置中,GNSS 传感器(GPS 传感器)使用了 libgazebo_ros_gps.so 插件,但没有指定 topicName。默认情况下,如果没有指定 topicName,Gazebo 可能不会发布任何话题,或者会使用默认的话题名称。

2. 修改 IMU 传感器定义(imu_sensor.xacro

在 imu_sensor.xacro 文件中添加 Gazebo 插件:

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">

  <!-- IMU Sensor -->
  <xacro:macro name="imu_sensor" params="parent xyz rpy">
    <link name="imu_link">
      <visual>
        <geometry>
          <box size="0.05 0.05 0.02"/>
        </geometry>
        <material name="yellow">
          <color rgba="1 1 0 1"/>
        </material>
      </visual>
      <collision>
        <geometry>
          <box size="0.05 0.05 0.02"/>
        </geometry>
      </collision>
      <inertial>
        <mass value="0.1"/>
        <inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/>
      </inertial>
    </link>
    <joint name="imu_joint" type="fixed">
      <parent link="${parent}"/>
      <child link="imu_link"/>
      <origin xyz="${xyz}" rpy="${rpy}"/>
    </joint>
    <gazebo reference="imu_link">
      <sensor type="imu" name="imu_sensor">
        <pose>0 0 0 0 0 0</pose>
        <plugin name="imu_plugin" filename="libgazebo_ros_imu_sensor.so">
          <update_rate>100.0</update_rate>
          <gaussian_noise>0.01</gaussian_noise>
        </plugin>
      </sensor>
    </gazebo>
  </xacro:macro>

</robot>

3. 修改 LiDAR 传感器定义(lidar_sensor.xacro

在 lidar_sensor.xacro 文件中添加 Gazebo 插件:

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">

  <!-- LiDAR Sensor -->
  <xacro:macro name="lidar_sensor" params="parent xyz rpy">
    <link name="lidar_link">
      <visual>
        <geometry>
          <cylinder radius="0.05" length="0.1"/>
        </geometry>
        <material name="gray">
          <color rgba="0.5 0.5 0.5 1"/>
        </material>
      </visual>
      <collision>
        <geometry>
          <cylinder radius="0.05" length="0.1"/>
        </geometry>
      </collision>
      <inertial>
        <mass value="0.5"/>
        <inertia ixx="0.01" ixy="0" ixz="0" iyy="0.01" iyz="0" izz="0.01"/>
      </inertial>
    </link>
    <joint name="lidar_joint" type="fixed">
      <parent link="${parent}"/>
      <child link="lidar_link"/>
      <origin xyz="${xyz}" rpy="${rpy}"/>
    </joint>
    <gazebo reference="lidar_link">
      <sensor type="ray" name="lidar_sensor">
        <pose>0 0 0 0 0 0</pose>
        <visualize>true</visualize>
        <update_rate>10.0</update_rate>
        <ray>
          <scan>
            <horizontal>
              <samples>360</samples>
              <resolution>1</resolution>
              <min_angle>-1.5707</min_angle>
              <max_angle>1.5707</max_angle>
            </horizontal>
          </scan>
          <range>
            <min>0.1</min>
            <max>10.0</max>
            <resolution>0.01</resolution>
          </range>
        </ray>
        <plugin name="lidar_plugin" filename="libgazebo_ros_gpu_laser.so">
          <topicName>/lidar_scan</topicName>
          <frameName>lidar_link</frameName>
        </plugin>
      </sensor>
    </gazebo>
  </xacro:macro>

</robot>

        在这个配置中,激光雷达传感器使用了 libgazebo_ros_gpu_laser.so 插件,并且明确指定了 topicName 为 /lidar_scan,以及 frameName 为 lidar_link。这意味着激光雷达传感器会发布 /lidar_scan 话题,供其他节点订阅和使用。

如果你想让 GNSS 传感器也发布话题,可以按照以下方式修改配置:

<gazebo reference="gnss_link">
  <sensor type="gps" name="gnss_sensor">
    <pose>0 0 0 0 0 0</pose>
    <plugin name="gnss_plugin" filename="libgazebo_ros_gps.so">
      <update_rate>10.0</update_rate>
      <gaussian_noise>0.01</gaussian_noise>
      <topicName>/gnss_data</topicName> <!-- 添加话题名称 -->
      <frameName>gnss_link</frameName>  <!-- 添加帧名称 -->
    </plugin>
  </sensor>
</gazebo>

在这个修改后的配置中,GNSS 传感器会发布 /gnss_data 话题,并且使用 gnss_link 作为其坐标系。

        位姿(Pose)是一个在机器人学和计算机图形学中广泛使用的术语,用于描述一个物体在三维空间中的位置和方向。具体来说,姿态描述了物体相对于某个参考坐标系的变换关系。位姿通常由两个部分组成:

  1. 位置(Position):描述物体在三维空间中的具体位置,通常用一个三维向量表示,例如 (x, y, z)。

  2. 方向(Orientation):描述物体在三维空间中的朝向或姿态,通常用一个四元数(Quaternion)或三个欧拉角(Roll, Pitch, Yaw)表示。

1. 位置(Position)

位置通常用一个三维向量表示,例如:

Position=(x,y,z)Position=(x,y,z)

其中:

  • x \) 是物体在参考坐标系中的 x 坐标。
  • z \) 是物体在参考坐标系中的 z 坐标。

2. 方向 

方向可以用多种方式表示,常见的有:

a. 四元数(Quaternion)

四元数是一种紧凑且避免万向锁(Gimbal Lock)问题的表示方法。四元数通常表示为一个四维向量:

Quaternion=(qx,qy,qz,qw)Quaternion=(qx​,qy​,qz​,qw​)

其中:

  • q_x, q_y, q_z \) 是虚部的分量。

四元数的范数通常为 1,即:

qx2+qy2+qz2+qw2=1qx2​+qy2​+qz2​+qw2​=1

b. 欧拉角(Roll, Pitch, Yaw)

欧拉角是用三个角度来描述物体的方向,分别对应于绕三个坐标轴的旋转:

  • Roll(翻滚角):绕物体的 x 轴旋转的角度。
  • Pitch(俯仰角):绕物体的 y 轴旋转的角度。
  • Yaw(偏航角):绕物体的 z 轴旋转的角度。

欧拉角通常表示为一个三元组:

Euler Angles=(ϕ,θ,ψ)Euler Angles=(ϕ,θ,ψ)

其中:

  • \phi \) 是 Roll 角。
  • \psi \) 是 Yaw 角。

在机器人学和计算机图形学中,姿态通常表示为一个 4x4 的齐次变换矩阵,该矩阵包含了位置和方向的信息。齐次变换矩阵的形式如下:

[R3×3t3×101×31][R3×3​01×3​​t3×1​1​]

其中:

  • R_{3 \times 3} \) 是旋转矩阵,描述物体的方向。
  • 0_{1 \times 3} \) 是零向量。

        姿态描述了物体在三维空间中的位置和方向。它可以用来表示机器人的状态、物体的位姿、相机的视角等。通过位置和方向的组合,姿态能够准确地描述物体在空间中的具体状态。

RPY” 是“Roll-Pitch-Yaw”的缩写,它是描述物体在三维空间中姿态的一种常见方法。RPY 由三个旋转角度组成,分别表示物体绕三个坐标轴的旋转顺序和角度。具体来说:

  1. Roll(翻滚角):表示物体绕其自身的 x 轴旋转的角度。通常用符号 ϕϕ 表示。
  2. Pitch(俯仰角):表示物体绕其自身的 y 轴旋转的角度。通常用符号 θθ 表示。
  3. Yaw(偏航角):表示物体绕其自身的 z 轴旋转的角度。通常用符号 ψψ 表示。

这三个角度通常按顺序应用:先 Roll,再 Pitch,最后 Yaw。通过这三个旋转角度的组合,可以唯一地确定物体在三维空间中的方向。

RPY 与其他姿态表示方法的比较

  • 四元数(Quaternion):四元数是另一种常见的姿态表示方法,避免了万向锁问题,且旋转结果与顺序无关。但它不如 RPY 直观。
  • 旋转矩阵:旋转矩阵也是一种表示姿态的方法,可以紧凑地表示方向,但占用更多存储空间。
Logo

更多推荐