为 GNSS、IMU 和 LiDAR 传感器添加 Gazebo 插件(附位姿解释)
要在 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)是一个在机器人学和计算机图形学中广泛使用的术语,用于描述一个物体在三维空间中的位置和方向。具体来说,姿态描述了物体相对于某个参考坐标系的变换关系。位姿通常由两个部分组成:
-
位置(Position):描述物体在三维空间中的具体位置,通常用一个三维向量表示,例如 (x, y, z)。
-
方向(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×301×3t3×11]
其中:
- R_{3 \times 3} \) 是旋转矩阵,描述物体的方向。
- 0_{1 \times 3} \) 是零向量。
姿态描述了物体在三维空间中的位置和方向。它可以用来表示机器人的状态、物体的位姿、相机的视角等。通过位置和方向的组合,姿态能够准确地描述物体在空间中的具体状态。
RPY” 是“Roll-Pitch-Yaw”的缩写,它是描述物体在三维空间中姿态的一种常见方法。RPY 由三个旋转角度组成,分别表示物体绕三个坐标轴的旋转顺序和角度。具体来说:
- Roll(翻滚角):表示物体绕其自身的 x 轴旋转的角度。通常用符号 ϕϕ 表示。
- Pitch(俯仰角):表示物体绕其自身的 y 轴旋转的角度。通常用符号 θθ 表示。
- Yaw(偏航角):表示物体绕其自身的 z 轴旋转的角度。通常用符号 ψψ 表示。
这三个角度通常按顺序应用:先 Roll,再 Pitch,最后 Yaw。通过这三个旋转角度的组合,可以唯一地确定物体在三维空间中的方向。
RPY 与其他姿态表示方法的比较
- 四元数(Quaternion):四元数是另一种常见的姿态表示方法,避免了万向锁问题,且旋转结果与顺序无关。但它不如 RPY 直观。
- 旋转矩阵:旋转矩阵也是一种表示姿态的方法,可以紧凑地表示方向,但占用更多存储空间。
更多推荐




所有评论(0)