使用ROS開啟Gazebo
Gazebo是一款具備物理引擎,可以模擬現實世界狀況的一款軟體,本身支援ROS,因此可以在ROS做機器人的現實擬真演示。
因此也可以將Gazebo寫成roslaunch來啟動,這篇主要在講的就是使用roslaunch啟動gazebo,並載入世界,載入世界完畢後放入要用來擬真的機器人
這本文開始之前先來分享一些資訊:
Gazebo官方有更加詳細的教學,若本篇有說明不清楚的請來這裡查看:Gazebo : Using roslaunch to start Gazebo, world files and URDF models
若Gazebo官網都是英文,閱讀上有問題的話,這裡有篇內容相似的中文文章,可以利用這篇:无处不在的小土 通过ROS开启Gazebo的世界
那就讓我們開始吧!
教學環境:
● Ubuntu 18.04
● ROS melodic
● gazebo9
● 默認已建立ROS工作空間 catkin_ws
1.安裝gazebo
想要使用gazebo,肯定得先安裝gazebo才能使用
如果你的電腦今天已經優先安裝好了ROS,那應該會發現ROS預設中就會自動幫你安裝Gazebo
要確認是否有安裝,請打開終端機輸入指令
gazebo
正常情況下就會啟動gazebo了
如果沒有,請安裝gazebo
sudo apt-get install ros-melodic-gazebo
2.確認gazebo_ros
Gazebo在安裝時會有一套內建名為gazebo_ros的package,能夠使用roslaunch啟動,來確認gazebo_ro安裝是否正確
gazebo_ros總共提供5個launch檔來測試
roslaunch gazebo_ros empty_world.launch
roslaunch gazebo_ros willowgarage_world.launch
roslaunch gazebo_ros mud_world.launch
roslaunch gazebo_ros shapes_world.launch
roslaunch gazebo_ros rubble_world.launch
先運行第一個來確認gazebo_ros沒有問題
roslaunch gazebo_ros empty_world.launch
終端機將會啟動gazebo,並載入空的世界
3.在工作空間中建立gazebo的package
移動至ROS的工作空間,建立gazebo的package名字叫做robot_gazebo
cd ~/catkin_ws/src
catkin_create_pkg robot_gazebo std_msgs rospy roscpp gazebo_ros gazebo_plugins
建立後請先回catkin_ws做catkin_make,確保建立的package是正確的
cd ~/catkin_ws
catkin_make
catkin_make沒問題的話就繼續下一步
4.建立launch與worlds
建立資料夾launch與worlds
cd ~/catkin_ws/src/robot_gazebo
mkdir -p launch
mkdir -p worlds
在worlds資料夾中建立世界的檔案
cd ~/catkin_ws/src/robot_gazebo/worlds
gedit robot.world
robot.world檔中的內容
<?xml version="1.0" ?>
<sdf version="1.4">
<world name="default">
<include>
<uri>model://ground_plane</uri>
</include>
<include>
<uri>model://sun</uri>
</include>
<include>
<uri>model://gas_station</uri>
<name>gas_station</name>
<pose>-2.0 7.0 0 0 0 0</pose>
</include>
</world>
</sdf>
在launch資料夾中建立.launch檔
cd ~/catkin_ws/src/robot_gazebo/launch
gedit yourobot.launch
yourobot.launch檔中的內容
<launch>
<!-- We resume the logic in empty_world.launch, changing only the name of the world to be launched -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find robot_gazebo)/worlds/robot.world"/>
<!-- more default parameters can be changed here -->
</include>
</launch>
5.啟動gazebo並載入世界
回到catkin_ws做catkin_make與source setup.bash檔
cd ~/catkin_ws
catkin_make
source devel/setup.bash
執行launch檔
roslaunch robot_gazebo .launch
就可以啟動gazebo,並發現他將加油站的地圖載入到了gazebo當中
6.將機器人(urdf檔案)放入gazebo的世界中
今天我們生成完世界之後,下一步就是要放入機器人模型,若機器人模型是urdf檔案的話,就可以用一句指令使機器人放入目前的gazebo世界
假設我在robot_gazebo當中有個資料夾名為urdf,裡面放有名叫MYROBOT.urdf的機器人模型
我今天要把它放入目前執行的世界──這個加油站,就要另外再開啟一個終端機,並執行rosrun
rosrun gazebo_ros spawn_model -file `rospack find robot_gazebo`/urdf/MYROBOT.urdf -urdf -x 0 -y 0 -z 1 -model MYROBOT
這樣就能夠將機器人放入世界了
如果你手邊目前沒有可以用來測試的模型,可以使用gazebo官方提供的 Baxter機器人模型,可以用git下載後使用
git clone https://github.com/RethinkRobotics/baxter_common.git
記得將下載的資料夾baxter_common中的baxter_description資料夾放入robot_gazebo資料夾當中,並重新catkin_make與source devel/setup.bash
執行以下指令
rosrun gazebo_ros spawn_model -file `rospack find baxter_description`/urdf/baxter.urdf -urdf -z 1 -model baxter
就能發現baxter模型被放入到世界當中了
當然也可以將這句指令製作成launch檔案,用roslaunch啟動
在robot_gazebo/launch下建立put_robot_in_world.launch
cd ~/catkin_ws/src/robot_gazebo/launch
gedit put_robot_in_world.launch
put_robot_in_world.launch內容
<launch>
<!-- Spawn a robot into Gazebo -->
<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-file $(find baxter_description)/urdf/baxter.urdf -urdf -z 1 -model baxter" />
</launch>
執行put_robot_in_world.launch,能夠達成跟rosrun一樣的效果
這樣啟動世界與放入機器人都是launch檔案了,那就可以用一個launch檔案將兩個launch檔案一口氣載入
載launch資料夾中建立一個open_world_and_put_robot.launch
cd ~/catkin_ws/src/robot_gazebo/launch
gedit open_world_and_put_robot.launch
open_world_and_put_robot.launch檔案內容
<launch>
<include file="$(find robot_gazebo)/launch/yourobot.launch" />
<include file="$(find robot_gazebo)/launch/put_robot_in_world.launch" />
</launch>
執行launch檔案就能發現開啟世界的同時,也會將機器人放入世界當中
6.1 將機器人(xacro檔案)放入gazebo的世界中
如果今天這機器人是.xacro而不是.urdf,則在放入gazebo世界中要額外加入另外一條指令
(假設機器人robot_gazebo/xacro/yourobot.urdf.xacro)
要載原本載入機器人的launch檔做修改
<launch>
<!-- Convert an xacro and put on parameter server -->
<param name="robot_description" command="$(find xacro)/xacro.py $(find robot_gazebo)/xacro/yourobot.urdf.xacro" />
<!-- Spawn a robot into Gazebo -->
<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-param robot_description -urdf -model yourobot" />
</launch>
目前手邊沒有可以做示範的機器人模型,之後找到會再補充上來