机器人操作系统【02】:如何在 ROS2 中对点云数据进行建模-LMLPHP

一、说明

        RViz和Gazebo中RADU的模拟进展顺利。在上一篇文章中,我们学习了如何启动机器人并使用远程节点进行操作。在本文中,我们将添加两个视觉传感器。首先,一个图像摄像机,用于在机器人四处移动时查看机器人的实时馈送。其次,深度摄像头传感器,它输出点云,这是机器人周围环境的距离测量,其中颜色表示物体的距离。这两个传感器有助于2D导航和3D物体识别。

        注意:技术环境是 Ubuntu 20.04、ROS2 Foxy、Gazebo11、RViz2。

二、gazebo中的视觉传感器

        在上一篇文章中,我们看到了如何在gazebo模拟中添加一个插件来控制机器人。添加视觉传感器遵循相同的方法:从 Gazebo 插件文档中识别插件,检查并应用配置,然后将其添加到机器人的 URDF 模型。

URDF 模型需要扩展如下:

  • 在 URDF 中定义链接和关节
  • 可选:定义链接和关节frame
  • 在标签中定义 和 标签sensorplugin<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。

机器人操作系统【02】:如何在 ROS2 中对点云数据进行建模-LMLPHP

六、深度摄像头

        成功安装默认图像相机后,我们可以继续添加深度相机。

        最初,我计划将 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

        在凉亭中,我们看到传感器的视觉表示:发射的光线。我注意到在我的模拟中,只有房间的墙壁,而不是物体,阻挡了传感器的光线——显然,它们具有不同的物理特征,但这对模拟来说是可以的。

机器人操作系统【02】:如何在 ROS2 中对点云数据进行建模-LMLPHP

        在RViz中,我们可以看到传感器数据的实时模拟,并在四处走动时准确地看到房间的轮廓。启动后,我们通过按钮添加新显示器,选择 ,然后将主题配置为 和显示点的大小为 0,03m。这将如下所示。AddPointCloud2/laser

机器人操作系统【02】:如何在 ROS2 中对点云数据进行建模-LMLPHP

九、结论

        使用传感器插件增强机器人仿真可提供对机器人模型的重要见解。在ROS2中,官方凉亭插件包括驱动器,IMU,GPS,相机等。本文介绍了添加传感器的基本步骤。首先,定义传感器的连杆和接头。其次,添加带有传感器和插件配置的标签。传感器在模拟工具Gazebo和RViz中的显示方式不同。在 Gazebo 中,该插件公开了可以控制和/或可视化的直接接口。在RViz中,您需要添加其他显示类型,以收听插件提供的主题,例如显示实时馈送摄像机或点云。正确配置后,您的机器人模型将显示其环境,并让您更好地控制模拟。塞巴斯蒂安

·
08-22 01:07