一、说明
RViz和Gazebo中RADU的模拟进展顺利。在上一篇文章中,我们学习了如何启动机器人并使用远程节点进行操作。在本文中,我们将添加两个视觉传感器。首先,一个图像摄像机,用于在机器人四处移动时查看机器人的实时馈送。其次,深度摄像头传感器,它输出点云,这是机器人周围环境的距离测量,其中颜色表示物体的距离。这两个传感器有助于2D导航和3D物体识别。
注意:技术环境是 Ubuntu 20.04、ROS2 Foxy、Gazebo11、RViz2。
二、gazebo中的视觉传感器
在上一篇文章中,我们看到了如何在gazebo模拟中添加一个插件来控制机器人。添加视觉传感器遵循相同的方法:从 Gazebo 插件文档中识别插件,检查并应用配置,然后将其添加到机器人的 URDF 模型。
URDF 模型需要扩展如下:
- 在 URDF 中定义链接和关节
- 可选:定义链接和关节
frame
- 在标签中定义 和 标签
sensor
plugin
<gazebo>
最佳做法是在单独的 XACRO 文件中为您的机器人定义任何其他传感器。这使您能够提供针对特定模拟目标量身定制的机器人的不同配置。
三、添加摄像机
让我们从相机插件开始。如文档所示,有不同类型的相机可用。我们将选择用于模拟传统相机的插件。libgazebo_ros_camera.so
四、URDF 模型
第一步是添加正确的链接和接头。相机传感器在这方面很特别:您需要为相机定义一个链接和一个接头,并为作为相机参考点的相机框架定义另一个链接和接头。这是必需的 URDF 部件。
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="radu">
<link name='rgb_cam_camera_link'>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="0.02 0.04 0.01" />
</geometry>
</visual>
</link>
<joint name="rgb_cam_camera_link_joint" type="fixed">
<origin rpy="0 0 0" xyz="0.30 0.0 0.065" />
<parent link="base_link" />
<child link="rgb_cam_camera_link" />
<axis xyz="0 0 0" />
</joint>
<link name="rgb_cam_camera_link_frame"></link>
<joint name="rgb_cam_camera_frame_joint" type="fixed">
<origin xyz="0.01 0 0" rpy="0 0 0" />
<parent link="rgb_cam_camera_link" />
<child link="rgb_cam_camera_link_frame" />
<axis xyz="0 0 0" />
</joint>
</robot>
然后,我们需要在机器人 URDF 中添加 and 标签。<sensor>
<plugin>
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="radu">
<gazebo reference="rgb_cam_camera_link_frame">
<sensor type="camera" name="rgb_camera">
<update_rate>10.0</update_rate>
<camera name="rgb_camera">
<pose>0 0 0 0 0 0</pose>
<horizontal_fov>1.3962634</horizontal_fov>
<image>
<width>640</width>
<height>480</height>
<format>YUYV</format>
</image>
<clip>
<near>0.005</near>
<far>10.0</far>
</clip>
</camera>
<plugin name="camera_controller" filename="libgazebo_ros_camera.so">
<alwaysOn>true</alwaysOn>
<updateRate>0.0</updateRate>
<cameraName>rgb_camera</cameraName>
<imageTopicName>image_raw</imageTopicName>
<cameraInfoTopicName>camera_info</cameraInfoTopicName>
<frameName>rgb_cam_camera_link_frame</frameName>
<hackBaseline>0.07</hackBaseline>
<distortionK1>0.0</distortionK1>
<distortionK2>0.0</distortionK2>
<distortionK3>0.0</distortionK3>
<distortionT1>0.0</distortionT1>
<distortionT2>0.0</distortionT2>
</plugin>
</sensor>
</gazebo>
</robot>
此声明使用了一个有用的技巧:URDF 文件可以包含多个标签,Gazebo 将解析这些标签,就像将所有声明写入一个全局标签一样。<gazebo reference="NAME">
<gazebo>
配置相机的主要属性包括以下各项:
<image>
图像的宽度、高度和格式<clip>
近属性和远属性控制图像记录的剪裁方式
对于插件,我们需要定义更新速率(表示恒定流),图像和相机信息的主题名称以及几个失真因素。0.0
五、RViz模拟
配置传感器后,我们只需启动机器人和RViz即可。在RViz内部,我们需要添加相机显示,然后将其配置为 订阅主题 。如果操作正确,您可以看到图像实时取景。/rgb_camera/image_raw
在以下屏幕截图中,您可以在右侧看到凉亭模拟,在左侧看到带有相机视图的 RViz。
六、深度摄像头
成功安装默认图像相机后,我们可以继续添加深度相机。
最初,我计划将 Gazebo 插件用于我将在机器人中使用的深度传感器:英特尔实感 D435。在我研究这个插件的过程中,我发现官方的特定插件仅适用于 ROS1。一些用户试图让这个传感器运行,如这个 ROS 答案线程中所述 - 他们成功地在 Gazebo 中启动控制器,但无法获取任何传感器数据。因此,我决定使用类似的工作插件来模拟3D点云:ROS2射线传感器。
七、URDF 模型
和以前一样,我们首先需要在机器人模型中创建正确的链接。对于深度传感器,我们只需要一个链接和一个接头。这是相关的 URDF。
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="radu">
<link name='laser_link'>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="0.02 0.04 0.01" />
</geometry>
</visual>
</link>
<joint name="laser_link_joint" type="fixed">
<origin rpy="0 0 0" xyz="0.10 0.1 0.085" />
<parent link="base_link" />
<child link="laser_link" />
<axis xyz="0 0 0" />
</joint>
</robot>
其次,我们添加一个包含 and 标签的附加标签。<gazebo reference="">
<sensor>
<plugin>
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="radu">
<gazebo reference="laser_link">
<sensor type="ray" name="head_laser_scanner">
<pose>0.0 0 0 0 0 0</pose>
<ray>
<scan>
<horizontal>
<samples>181</samples>
<resolution>1</resolution>
<min_angle>-1.57080</min_angle>
<max_angle>1.57080</max_angle>
</horizontal>
</scan>
<range>
<min>0.08</min>
<max>10</max>
<resolution>0.05</resolution>
</range>
<noise>
<type>gaussian</type>
<mean>0.0</mean>
<stddev>0.01</stddev>
</noise>
</ray>
<always_on>1</always_on>
<update_rate>30</update_rate>
<visualize>true</visualize>
<plugin name="laser_scanner" filename="libgazebo_ros_ray_sensor.so">
<ros>
<namespace>/</namespace>
<argument>~/out:=laser</argument>
</ros>
<output_type>sensor_msgs/PointCloud2</output_type>
<frame_name>laser_link</frame_name>
</plugin>
</sensor>
</gazebo>
</robot>
The sensor is of type and includes the following configuration options:ray
- The tag can include a and a tag for scanning along these definitions. Each is defined with it min and max angle, the number of samples (number of points detected), and the resolution
<scan>
<horizontal>
<vertical>
- With you define the absolute distances in which the sensor will detect its environment
<range>
- The optional tag defines how the received measurement is cleaned up in your simulation.
<noise>
根据传感器定义,配置此传感器的命名空间、主题、数据格式和参考链接。<plugin>
八、Gazebo和RViz模拟
无需修改启动文件 — 在主题 上发布的新 URDF 文件包含新的传感器和插件。但是我们会看到什么?/robot_description
在凉亭中,我们看到传感器的视觉表示:发射的光线。我注意到在我的模拟中,只有房间的墙壁,而不是物体,阻挡了传感器的光线——显然,它们具有不同的物理特征,但这对模拟来说是可以的。
在RViz中,我们可以看到传感器数据的实时模拟,并在四处走动时准确地看到房间的轮廓。启动后,我们通过按钮添加新显示器,选择 ,然后将主题配置为 和显示点的大小为 0,03m。这将如下所示。Add
PointCloud2
/laser
九、结论
使用传感器插件增强机器人仿真可提供对机器人模型的重要见解。在ROS2中,官方凉亭插件包括驱动器,IMU,GPS,相机等。本文介绍了添加传感器的基本步骤。首先,定义传感器的连杆和接头。其次,添加带有传感器和插件配置的标签。传感器在模拟工具Gazebo和RViz中的显示方式不同。在 Gazebo 中,该插件公开了可以控制和/或可视化的直接接口。在RViz中,您需要添加其他显示类型,以收听插件提供的主题,例如显示实时馈送摄像机或点云。正确配置后,您的机器人模型将显示其环境,并让您更好地控制模拟。塞巴斯蒂安