使用ROS開啟Gazebo

前言

Silas
10 min readApr 29, 2021

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來確認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,並載入空的世界

empty_world.launch

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
這圖片示意用,請將package命名為robot_gazebo

建立後請先回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>

目前手邊沒有可以做示範的機器人模型,之後找到會再補充上來

--

--

Silas
Silas

No responses yet