天天看點

URDF、Gazebo與Rviz綜合應用(05)

關于URDF(Xacro)、Rviz 和 Gazebo 三者的關系,前面已有闡述: URDF 用于建立機器人模型、Rviz 可以顯示機器人感覺到的環境資訊,Gazebo 用于仿真,可以模拟外界環境,以及機器人的一些傳感器,如何在 Gazebo 中運作這些傳感器,并顯示這些傳感器的資料(機器人的視角)呢?本節主要介紹的重點就是将三者結合:通過 Gazebo 模拟機器人的傳感器,然後在 Rviz 中顯示這些傳感器感覺到的資料。主要内容包括:

運動控制以及裡程計資訊顯示

雷達資訊仿真以及顯示

攝像頭資訊仿真以及顯示

kinect 資訊仿真以及顯示
           

**

一、機器人運動控制以及裡程計資訊顯示

**

gazebo 中已經可以正常顯示機器人模型了,那麼如何像在 rviz 中一樣控制機器人運動呢?在此,需要涉及到ros中的元件: ros_control。

1.ros_control 簡介

場景:同一套 ROS 程式,如何部署在不同的機器人系統上,比如:開發階段為了提高效率是在仿真平台上測試的,部署時又有不同的實體機器人平台,不同平台的實作是有差異的,如何保證 ROS 程式的可移植性?ROS 内置的解決方式是 ros_control。

ros_control:是一組軟體包,它包含了控制器接口,控制器管理器,傳輸和硬體接口。ros_control 是一套機器人控制的中間件,是一套規範,不同的機器人平台隻要按照這套規範實作,那麼就可以保證 與ROS 程式相容,通過這套規範,實作了一種可插拔的架構設計,大大提高了程式設計的效率與靈活性。

gazebo 已經實作了 ros_control 的相關接口,如果需要在 gazebo 中控制機器人運動,直接調用相關接口即可

2.運動控制實作流程(Gazebo)

承上,運動控制基本流程:

已經建立完畢的機器人模型,編寫一個單獨的 xacro 檔案,為機器人模型添加傳動裝置以及控制器

将此檔案內建進xacro檔案

啟動 Gazebo 并釋出 /cmd_vel 消息控制機器人運動
           

2.1 為 joint 添加傳動裝置以及控制器

兩輪差速配置:

<robot name="my_car_move" xmlns:xacro="http://wiki.ros.org/xacro">

    <!-- 傳動實作:用于連接配接控制器與關節 -->
    <xacro:macro name="joint_trans" params="joint_name">
        <!-- Transmission is important to link the joints and the controller -->
        <transmission name="${joint_name}_trans">
            <type>transmission_interface/SimpleTransmission</type>
            <joint name="${joint_name}">
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
            </joint>
            <actuator name="${joint_name}_motor">
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
                <mechanicalReduction>1</mechanicalReduction>
            </actuator>
        </transmission>
    </xacro:macro>

    <!-- 每一個驅動輪都需要配置傳動裝置 -->
    <xacro:joint_trans joint_name="left_wheel2base_link" />
    <xacro:joint_trans joint_name="right_wheel2base_link" />

    <!-- 控制器 -->
    <gazebo>
        <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so">
            <rosDebugLevel>Debug</rosDebugLevel>
            <publishWheelTF>true</publishWheelTF>
            <robotNamespace>/</robotNamespace>
            <publishTf>1</publishTf>
            <publishWheelJointState>true</publishWheelJointState>
            <alwaysOn>true</alwaysOn>
            <updateRate>100.0</updateRate>
            <legacyMode>true</legacyMode>
            <leftJoint>left_wheel2base_link</leftJoint> <!-- 左輪 -->
            <rightJoint>right_wheel2base_link</rightJoint> <!-- 右輪 -->
            <wheelSeparation>${base_link_radius * 2}</wheelSeparation> <!-- 車輪間距 -->
            <wheelDiameter>${wheel_radius * 2}</wheelDiameter> <!-- 車輪直徑 -->
            <broadcastTF>1</broadcastTF>
            <wheelTorque>30</wheelTorque>
            <wheelAcceleration>1.8</wheelAcceleration>
            <commandTopic>cmd_vel</commandTopic> <!-- 運動控制話題 -->
            <odometryFrame>odom</odometryFrame> 
            <odometryTopic>odom</odometryTopic> <!-- 裡程計話題 -->
            <robotBaseFrame>base_footprint</robotBaseFrame> <!-- 根坐标系 -->
        </plugin>
    </gazebo>

</robot>
           

2.2 xacro檔案內建

最後還需要将上述 xacro 檔案內建進總的機器人模型檔案,代碼示例如下:

<!-- 組合小車底盤與攝像頭 -->
<robot name="my_car_camera" xmlns:xacro="http://wiki.ros.org/xacro">
    <xacro:include filename="my_head.urdf.xacro" />
    <xacro:include filename="my_base.urdf.xacro" />
    <xacro:include filename="my_camera.urdf.xacro" />
    <xacro:include filename="my_laser.urdf.xacro" />
    <xacro:include filename="move.urdf.xacro" />
</robot>
           

目前核心: 包含 控制器以及傳動配置的 xacro 檔案

<xacro:include filename="move.urdf.xacro" />
           

2.3 啟動 gazebo并控制機器人運動

launch檔案:

<launch>
    <!-- 啟動 rviz -->
    <node pkg="rviz" type="rviz" name="rviz" />

    <!-- 關節以及機器人狀态釋出節點 -->
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />

</launch>
           

3.2 添加元件

執行 launch 檔案後,在 Rviz 中添加圖示元件:

URDF、Gazebo與Rviz綜合應用(05)

二、雷射雷達仿真

通過 Gazebo 模拟雷射雷達傳感器,并在 Rviz 中顯示雷射資料。

實作流程:

雷達仿真基本流程:

已經建立完畢的機器人模型,編寫一個單獨的 xacro 檔案,為機器人模型添加雷達配置;
将此檔案內建進xacro檔案;
啟動 Gazebo,使用 Rviz 顯示雷達資訊。
           

1.Gazebo 仿真雷達

1.1 建立 Xacro 檔案,配置雷達傳感器資訊

<robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">

  <!-- 雷達 -->
  <gazebo reference="laser">
    <sensor type="ray" name="rplidar">
      <pose>0 0 0 0 0 0</pose>
      <visualize>true</visualize>
      <update_rate>5.5</update_rate>
      <ray>
        <scan>
          <horizontal>
            <samples>360</samples>
            <resolution>1</resolution>
            <min_angle>-3</min_angle>
            <max_angle>3</max_angle>
          </horizontal>
        </scan>
        <range>
          <min>0.10</min>
          <max>30.0</max>
          <resolution>0.01</resolution>
        </range>
        <noise>
          <type>gaussian</type>
          <mean>0.0</mean>
          <stddev>0.01</stddev>
        </noise>
      </ray>
      <plugin name="gazebo_rplidar" filename="libgazebo_ros_laser.so">
        <topicName>/scan</topicName>
        <frameName>laser</frameName>
      </plugin>
    </sensor>
  </gazebo>

</robot>
           

1.2 xacro 檔案內建

将步驟1的 Xacro 檔案內建進總的機器人模型檔案,代碼示例如下:

<!-- 組合小車底盤與傳感器 -->
<robot name="my_car_camera" xmlns:xacro="http://wiki.ros.org/xacro">
    <xacro:include filename="my_head.urdf.xacro" />
    <xacro:include filename="my_base.urdf.xacro" />
    <xacro:include filename="my_camera.urdf.xacro" />
    <xacro:include filename="my_laser.urdf.xacro" />
    <xacro:include filename="move.urdf.xacro" />
    <!-- 雷達仿真的 xacro 檔案 -->
    <xacro:include filename="my_sensors_laser.urdf.xacro" />
</robot>
           

1.3啟動仿真環境

編寫launch檔案,啟動gazebo,此處略…

2.Rviz 顯示雷達資料

先啟動 rviz,添加雷達資訊顯示插件

URDF、Gazebo與Rviz綜合應用(05)

三、攝像頭資訊仿真以及顯示

通過 Gazebo 模拟攝像頭傳感器,并在 Rviz 中顯示攝像頭資料。

實作流程:

攝像頭仿真基本流程:

已經建立完畢的機器人模型,編寫一個單獨的 xacro 檔案,為機器人模型添加攝像頭配置;

将此檔案內建進xacro檔案;

啟動 Gazebo,使用 Rviz 顯示攝像頭資訊。
           

1.Gazebo 仿真攝像頭

1.1 建立 Xacro 檔案,配置攝像頭傳感器資訊

<robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">
  <!-- 被引用的link -->
  <gazebo reference="camera">
    <!-- 類型設定為 camara -->
    <sensor type="camera" name="camera_node">
      <update_rate>30.0</update_rate> <!-- 更新頻率 -->
      <!-- 攝像頭基本資訊設定 -->
      <camera name="head">
        <horizontal_fov>1.3962634</horizontal_fov>
        <image>
          <width>1280</width>
          <height>720</height>
          <format>R8G8B8</format>
        </image>
        <clip>
          <near>0.02</near>
          <far>300</far>
        </clip>
        <noise>
          <type>gaussian</type>
          <mean>0.0</mean>
          <stddev>0.007</stddev>
        </noise>
      </camera>
      <!-- 核心插件 -->
      <plugin name="gazebo_camera" filename="libgazebo_ros_camera.so">
        <alwaysOn>true</alwaysOn>
        <updateRate>0.0</updateRate>
        <cameraName>/camera</cameraName>
        <imageTopicName>image_raw</imageTopicName>
        <cameraInfoTopicName>camera_info</cameraInfoTopicName>
        <frameName>camera</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>
           

1.2 xacro 檔案內建

将步驟1的 Xacro 檔案內建進總的機器人模型檔案,代碼示例如下:

<!-- 組合小車底盤與傳感器 -->
<robot name="my_car_camera" xmlns:xacro="http://wiki.ros.org/xacro">
    <xacro:include filename="my_head.urdf.xacro" />
    <xacro:include filename="my_base.urdf.xacro" />
    <xacro:include filename="my_camera.urdf.xacro" />
    <xacro:include filename="my_laser.urdf.xacro" />
    <xacro:include filename="move.urdf.xacro" />
    <!-- 攝像頭仿真的 xacro 檔案 -->
    <xacro:include filename="my_sensors_camara.urdf.xacro" />
</robot>
           

1.3啟動仿真環境

編寫launch檔案,啟動gazebo,此處略…

2.Rviz 顯示攝像頭資料

執行 gazebo 并啟動 Rviz,在 Rviz 中添加攝像頭元件。

URDF、Gazebo與Rviz綜合應用(05)
URDF、Gazebo與Rviz綜合應用(05)

四、 kinect資訊仿真以及顯示

通過 Gazebo 模拟kinect攝像頭,并在 Rviz 中顯示kinect攝像頭資料。

實作流程:

kinect攝像頭仿真基本流程:

已經建立完畢的機器人模型,編寫一個單獨的 xacro 檔案,為機器人模型添加kinect攝像頭配置;

将此檔案內建進xacro檔案;

啟動 Gazebo,使用 Rviz 顯示kinect攝像頭資訊。
           

1.Gazebo仿真Kinect

1.1 建立 Xacro 檔案,配置 kinetic傳感器資訊

<robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">
    <gazebo reference="kinect link名稱">  
      <sensor type="depth" name="camera">
        <always_on>true</always_on>
        <update_rate>20.0</update_rate>
        <camera>
          <horizontal_fov>${60.0*PI/180.0}</horizontal_fov>
          <image>
            <format>R8G8B8</format>
            <width>640</width>
            <height>480</height>
          </image>
          <clip>
            <near>0.05</near>
            <far>8.0</far>
          </clip>
        </camera>
        <plugin name="kinect_camera_controller" filename="libgazebo_ros_openni_kinect.so">
          <cameraName>camera</cameraName>
          <alwaysOn>true</alwaysOn>
          <updateRate>10</updateRate>
          <imageTopicName>rgb/image_raw</imageTopicName>
          <depthImageTopicName>depth/image_raw</depthImageTopicName>
          <pointCloudTopicName>depth/points</pointCloudTopicName>
          <cameraInfoTopicName>rgb/camera_info</cameraInfoTopicName>
          <depthImageCameraInfoTopicName>depth/camera_info</depthImageCameraInfoTopicName>
          <frameName>kinect link名稱</frameName>
          <baseline>0.1</baseline>
          <distortion_k1>0.0</distortion_k1>
          <distortion_k2>0.0</distortion_k2>
          <distortion_k3>0.0</distortion_k3>
          <distortion_t1>0.0</distortion_t1>
          <distortion_t2>0.0</distortion_t2>
          <pointCloudCutoff>0.4</pointCloudCutoff>
        </plugin>
      </sensor>
    </gazebo>

</robot>

           

1.2 xacro 檔案內建

将步驟1的 Xacro 檔案內建進總的機器人模型檔案,代碼示例如下:

<!-- 組合小車底盤與傳感器 -->
<robot name="my_car_camera" xmlns:xacro="http://wiki.ros.org/xacro">
    <xacro:include filename="my_head.urdf.xacro" />
    <xacro:include filename="my_base.urdf.xacro" />
    <xacro:include filename="my_camera.urdf.xacro" />
    <xacro:include filename="my_laser.urdf.xacro" />
    <xacro:include filename="move.urdf.xacro" />
    <!-- kinect仿真的 xacro 檔案 -->
    <xacro:include filename="my_sensors_kinect.urdf.xacro" />
</robot>
           

1.3啟動仿真環境

編寫launch檔案,啟動gazebo,此處略…

2 Rviz 顯示 Kinect 資料

啟動 rviz,添加攝像頭元件檢視資料

URDF、Gazebo與Rviz綜合應用(05)
URDF、Gazebo與Rviz綜合應用(05)

五、補充:kinect 點雲資料顯示

在kinect中也可以以點雲的方式顯示感覺周圍環境,在 rviz 中操作如下:

URDF、Gazebo與Rviz綜合應用(05)

問題:在rviz中顯示時錯位。

原因:在kinect中圖像資料與點雲資料使用了兩套坐标系統,且兩套坐标系統位姿并不一緻。

解決:

1.在插件中為kinect設定坐标系,修改配置檔案的标簽内容:

<frameName>support_depth</frameName>
           

2.釋出新設定的坐标系到kinect連杆的坐标變換關系,在啟動rviz的launch中,添加:

<node pkg="tf2_ros" type="static_transform_publisher" name="static_transform_publisher" args="0 0 0 -1.57 0 -1.57 /support /support_depth" />
           

3.啟動rviz,重新顯示。

URDF、Gazebo與Rviz綜合應用(05)