啟動Gazebo庞瘸,打開world模型以及向仿真環(huán)境中插入機器人模型的方法有很多.在這個教程中,我們將使用rosrun和roslaunch來實現(xiàn).這里包括將URDF文件存儲在ROS包中港准,并保留相對于ROS工作區(qū)的各種資源路徑朽寞。
一.使用roslaunch打開world模型
roslaunch是一個啟動ROS節(jié)點并插入機器人模型的標準方法.要建立一個空的world模型眼五,我們只需要運行
roslaunch gazebo_ros empty_world.launch
1.roslaunch參數(shù)
你可以更改launch文件中的參數(shù)來改變Gazebo的啟動行為:
paused:在暫停狀態(tài)下啟動Gazebo(默認為false).
use_sim_time:告訴ROS節(jié)點要求獲取ROS話題/clock發(fā)布的時間信息(默認為true).
gui:啟動Gazebo中的用戶界面窗口(默認為true).
headless recording:啟動Gazebo狀態(tài)日志記錄(默認為false).
debug:使用gdb以調(diào)試模式啟動gzserver(默認為false).
verbose:用--verbose運行g(shù)zserver和gzclient,并將錯誤和警告打印到終端(默認為false).
2.roslaunch命令示例
通常情況下使用默認值就可以了,這里只是一個例子:
roslaunch gazebo_ros empty_world.launch paused:=true use_sim_time:=false gui:=true throttled:=false recording:=false debug:=true verbose:=true
3.運行其他demo worlds
其他的demo worlds已經(jīng)包含在gazebo_ros中了,它包括:
roslaunch gazebo_ros willowgarage_world.launch
roslaunch gazebo_ros mud_world.launch
roslaunch gazebo_ros shapes_world.launch
roslaunch gazebo_ros rubble_world.launch
mud_world.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="worlds/mud.world"/> <!-- Note: the world_name is with respect to GAZEBO_RESOURCE_PATH environmental variable -->
? ? <arg name="paused" value="false"/>
? ? <arg name="use_sim_time" value="true"/>
? ? <arg name="gui" value="true"/>
? ? <arg name="recording" value="false"/>
? ? <arg name="debug" value="false"/>
? </include>
</launch>
在這個launch文件中俱恶,我們繼承了大多數(shù)empty_world.launch中的內(nèi)容.只改變了world_name參數(shù),用mud.world代替了empty.world.其他的參數(shù)使用默認的就好了.
4.world文件
繼續(xù)查看mud_world.launch文件范舀,我們現(xiàn)在看mud.world文件的內(nèi)容.mud.world開頭的一部分代碼如下所示:
<sdf version="1.4">
? ? <world name="default">
? ? ? <include>
? ? ? ? <uri>model://sun</uri>
? ? ? </include>
? ? ? <include>
? ? ? ? <uri>model://ground_plane</uri>
? ? ? </include>
? ? ? <include>
? ? ? ? <uri>model://double_pendulum_with_base</uri>
? ? ? ? <name>pendulum_thick_mud</name>
? ? ? ? <pose>-2.0 0 0 0 0 0</pose>
? ? ? </include>
? ? ? ...
? ? </world>
? </sdf>
在這個world文件片段中我們可以看到三個模型.這三個模型都是從本地的Gazebo Model Database中搜尋的.如果沒有找到合是,那么Gazebo會自動的從網(wǎng)上的數(shù)據(jù)庫中搜索.
5.如何在你的計算機中找到world文件
world文件位于Gazebo資源路徑的/worlds文件夾中.這個路徑取決于你是如何安裝Gazebo以及你的系統(tǒng)類型的.想要找到你的Gazebo資源路徑,你可以運行如下命令:
env | grep GAZEBO_RESOURCE_PATH
一個典型的路徑是/usr/local/share/gazebo-1.9.在這個路徑后面加上/worlds就可以了.
二.創(chuàng)建你自己的Gazebo ROS包
在繼續(xù)插入機器人之前尿背,我們將首先討論使在ROS下使用Gazebo的文件層次結(jié)構(gòu)標準端仰,以便我們可以做出以后的假設(shè)。
現(xiàn)在田藐,我們假設(shè)你的工作空間為catkin_ws.它的路徑可能是:
/home/user/catkin_ws/src
關(guān)于機器人模型和描述的一切都在/MYROBOT_description包中,Gazebo中用到的所有的world文件和launch文件都在/MYROBOT_gazebo中.實際情況下用你機器人的名字的小寫字母來代替'MYROBOT'.你的文件夾目錄應(yīng)該如下所示:
../catkin_ws/src
? ? /MYROBOT_description
? ? ? ? package.xml
? ? ? ? CMakeLists.txt
? ? ? ? /urdf
? ? ? ? ? ? MYROBOT.urdf
? ? ? ? /meshes
? ? ? ? ? ? mesh1.dae
? ? ? ? ? ? mesh2.dae
? ? ? ? ? ? ...
? ? ? ? /materials
? ? ? ? /cad
? ? /MYROBOT_gazebo
? ? ? ? /launch
? ? ? ? ? ? MYROBOT.launch
? ? ? ? /worlds
? ? ? ? ? ? MYROBOT.world
? ? ? ? /models
? ? ? ? ? ? world_object1.dae
? ? ? ? ? ? world_object2.stl
? ? ? ? ? ? world_object3.urdf
? ? ? ? /materials
? ? ? ? /plugins
·創(chuàng)建一個自定義的world文件
你可根據(jù)自己的機器人和功能包創(chuàng)建自己的.world文件.這里我們將創(chuàng)建一個擁有地面吱七,太陽和加油站的世界.下面是我們推薦的步驟.記得用你自己的機器人的名字代替MYROBOT 汽久,如果你沒有機器人的話可以直接用'test'代替:
1.創(chuàng)建一個ROS功能包名為MYROBOT_gazebo
2.在個包中,創(chuàng)建一個launch文件夾.
3.在launch文件夾中創(chuàng)建一個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 MYROBOT_gazebo)/worlds/MYROBOT.world"/>
? ? <!-- more default parameters can be changed here -->
? </include>
</launch>
4.同樣在這個功能包中景醇,創(chuàng)建一個worlds文件夾,并創(chuàng)建一個MYROBOT.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>
5.通過如下命令你可以在Gazebo中啟動你的自定義world文件
. ~/catkin_ws/devel/setup.bash
roslaunch MYROBOT_gazebo MYROBOT.launch
結(jié)果如下所示
·在Gazebo中編輯world文件
你可以插入額外的模型到你的世界中并通過File->Save保存.結(jié)果會返回到你的ROS功能包中.
三.使用roslaunch插入URDF機器人
有兩種方法:
一個是:通過ROS服務(wù)
第一種方法可以讓您的機器人的ROS包在計算機和存儲庫檢查之間更加便攜三痰。它允許你保持機器人相對于ROS包路徑的位置,但也要求你寫一個ROS服務(wù)程序.
另一個是:通過模型庫
這種方法允許你的.world文件中包含你的機器人窜管,這樣看起來更整潔方便但是需要設(shè)定環(huán)境變量來將你的機器人添加到Gazebo的模型庫.
我們會使用兩種方法.但總的來說我們更推薦第一種方法.
1."ROS服務(wù)"
這個方法使用了一個叫做spawn_model的python程序來要求gazebo_ros節(jié)點向Gazebo中添加URDF.spawn_model程序存儲在gazebo_ros包中.你可以通過如下命令調(diào)用這個程序:
rosrun gazebo_ros spawn_model -file `rospack find MYROBOT_description`/urdf/MYROBOT.urdf -urdf -x 0 -y 0 -z 1 -model MYROBOT
要看所有的spawn_model中的可變參數(shù)散劫,運行:rosrun gazebo_ros spawn_model -h
1.1使用Baxter的URDF示例
如果你沒有URDF文件來測試,你可以從Rethink Robotics的baxter_common中下載baxter_description包.通過運行如下命令將這個包放在你的工作空間下:
git clone https://github.com/RethinkRobotics/baxter_common.git
現(xiàn)在你應(yīng)該有一個叫做baxter.urdf的URDF文件在路徑baxter_description/urdf/下幕帆,運行
rosrun gazebo_ros spawn_model -file `rospack find baxter_description`/urdf/baxter.urdf -urdf -z 1 -model baxter
結(jié)果如下:
接下來將它繼集成到ROS啟動文件中获搏,打開MYROBOT_gazebo/launch/YOUROBOT.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" />
然后啟動這個文件,你會得到一樣的結(jié)果.
1.2使用PR2的XACRO示例
如果你的URDF不是XML形式而是XACRO形式.你可以對launch文件進行類似的修改.通過安裝這個包你可以運行這個PR2示例.
對于ROS Jade版本:
sudo apt-get install ros-jade-pr2-common
然后添加如下內(nèi)容到先前的launch文件中:
<!-- Convert an xacro and put on parameter server -->
<param name="robot_description" command="$(find xacro)/xacro.py $(find pr2_description)/robots/pr2.urdf.xacro" />
<!-- Spawn a robot into Gazebo -->
<node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-param robot_description -urdf -model pr2" />
運行這個文件得到如下結(jié)果:
注意:由于Gazebo API的變化失乾,這個方法仍會產(chǎn)生許多的錯誤和警告.
2."模型庫"
這種方法允許你的.world文件中包含你的機器人常熙,這樣看起來更整潔方便但是需要設(shè)定環(huán)境變量來將你的機器人添加到Gazebo的模型庫.因為ROS與Gazebo是相互分離的所以需要這個環(huán)境變量;URDF包不能直接在.world文件中使用碱茁,以為Gazebo不會搜索ROS包.
要想成功的使用這個方法裸卫,你必須要新建一個包含有你的機器人你的模型庫.這不是將URDF加載到Gazebo中的最簡潔方法,但是不必在計算機上保留兩個機器人URDF副本.如果你對如下的說明感到困惑纽竣,那么你需要回頭看看Gazebo Model Database.
我們假設(shè)你的ROS工作空間已經(jīng)按照之前的說明建好了.那么唯一的區(qū)別就是在MYROBOT_description中添加了一個model.config文件墓贿,目錄結(jié)構(gòu)如下:
../catkin_ws/src
? ? /MYROBOT_description
? ? ? ? package.xml
? ? ? ? CMakeLists.txt
? ? ? ? model.config
? ? ? ? /urdf
? ? ? ? ? ? MYROBOT.urdf
? ? ? ? /meshes
? ? ? ? ? ? mesh1.dae
? ? ? ? ? ? mesh2.dae
? ? ? ? ? ? ...
? ? ? ? /materials
? ? ? ? /plugins
? ? ? ? /cad
這個目錄結(jié)構(gòu)很是個用來做Gazebo的模型庫,各個文件夾/文件的意義如下:
·/home/user/catkin_workspace/src:這是Gazebo模型庫的存儲位置.
·/MYROBOT_description:這個目錄存儲Gazebo模型
·model.config:Gazebo要在模型庫中找到模型所需的配置文件.
·MYROBOT.urdf:描述你的機器人的文件,也可以在Rviz募壕,MoveIt!等中使用.
·/meshes:將你的.stl或者.dae文件放在這里调炬,就像你普通的URDFs文件一樣.
2.1model.config
在每一個模型的源文件夾中都有一個model.config文件,它包含了這個模型的元信息.將如下代碼復(fù)制到你的model.config文件中舱馅,用你自己的文件名代替MYROBOT.urdf
<?xml version="1.0"?>
? <model>
? ? <name>MYROBOT</name>
? ? <version>1.0</version>
? ? <sdf>urdf/MYROBOT.urdf</sdf>
? ? <author>
? ? ? <name>My name</name>
? ? ? <email>name@email.address</email>
? ? </author>
? ? <description>
? ? ? A description of the model
? ? </description>
? </model>
不像SDF缰泡,當(dāng)標簽用于URDF時,標簽不需要任何版本.
2.2環(huán)境變量
最后代嗤,你需要給你的?.bashrc 文件添加環(huán)境變量來告訴Gazebo上哪找模型庫.使用你自己的編輯器編輯"~/.bashrc".檢查你是否已經(jīng)定義了一個GAZEBO_MODEL_PATH.如果有棘钞,則用一個分號加上它,否則新添一個.假設(shè)你的工作空間在~/catkin_ws/.那么你的路徑應(yīng)該是:
export GAZEBO_MODEL_PATH=/home/user/catkin_ws/src/
2.3在Gazebo中查看--手動
現(xiàn)在我們打開Gazebo查看是否已經(jīng)成功配置.
gazebo
點擊"Insert".你將會看到數(shù)個不同的模型庫干毅,包括線上數(shù)據(jù)庫.找到你機器人相應(yīng)的模型庫宜猜,打開它的子菜單,選中你的機器人并放置.
2.4在Gazebo中查看--通過roslaunch
使用模型庫的方法的優(yōu)點是你能夠在world中添加你的機器人硝逢,而不用使用ROS包的路徑.我們將使用?"Creating a world file"中相同的設(shè)置姨拥,只修改其中的world文件:
·在MYROBOT_description/launch文件夾中,編輯MYROBOT.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>
? ? <include>
? ? ? <uri>model://MYROBOT</uri>
? ? </include>
? </world>
</sdf>
·現(xiàn)在運行l(wèi)aunch文件應(yīng)該可以同時看到世界和機器人:
roslaunch MYROBOT_gazebo MYROBOT.launch
這個方法的缺點是MYROBOT_description和MYROBOT_gazebo之間并不能簡單的交互.在任何新的系統(tǒng)上你都要先設(shè)置GAZEBO_MODEL_PATH.
四.通過package.xml輸出模型的路徑
<run_depend>gazebo_ros</run_depend>
<export>
? <gazebo_ros gazebo_model_path="${prefix}/models"/>
? <gazebo_ros gazebo_media_path="${prefix}/models"/>
</export>
其中'${prefix}`新用戶不能立即理解叫乌,但在這里是必要的.