關于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 中添加圖示元件:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPn5UeZR1T0sGROFDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLhVTOkhDOhZzY0YDOiVjMhFWZiRDO5EjZwQzNmRGMxU2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
二、雷射雷達仿真
通過 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,添加雷達資訊顯示插件
三、攝像頭資訊仿真以及顯示
通過 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 中添加攝像頭元件。
四、 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,添加攝像頭元件檢視資料
五、補充:kinect 點雲資料顯示
在kinect中也可以以點雲的方式顯示感覺周圍環境,在 rviz 中操作如下:
問題:在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,重新顯示。