roslaunch
打开世界模型这个 roslaunch工具是启动ROS节点和在ROS中启动机器人的标准方法。开始一个空的Gazebo world 和rosrun
命令类似,只需运行
roslaunch gazebo_ros empty_world.launch
paused:
以暂停状态启动gazebo(默认为false)
use_sim_time
告诉ROS节点请求时间以获取Gazebo发布的模拟时间,在ROS主题/时钟上发布(默认为true)
gui
启动Gazebo的用户界面窗口(默认为true)
headless(deprecated)recording(previously called headless)
启用露台状态日志记录
debug
使用gdb在调试模式下启动gzserver(Gazebo服务器)(默认为false)
verbose
使用--verbose运行gzserver和gzclient,将错误和警告打印到
终端(默认为false)
server_required
当gzserver(Gazebo服务器)退出时终止启动脚本(默认为false)
gui_required
当gzclient(用户界面窗口)退出时终止启动脚本(默认为false)
roslaunch
命令通常,这些参数的默认值就是您所需要的,但仅举个例子:
roslaunch gazebo_ros empty_world.launch paused:=true use_sim_time:=false gui:=true throttled:=false recording:=false debug:=true verbose:=true gui_required:=true
其他演示世界已经包含在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
启动一个简单的关节机构。启动文件mud_world.launch包含以下内容:
在这个启动文件中,我们继承了empty_world.launch的大部分必要功能。我们唯一需要更改的参数是world_name
参数,替换empty.world的world文件mud.world
文件。其他参数只需设置为其默认值。
继续我们的mud_world.launch
文件,现在我们将查看mud.world文件。mud.world的前几个组成部分如下所示:
model://sun
model://ground_plane
model://double_pendulum_with_base
pendulum_thick_mud
-2.0 0 0 0 0 0
...
请参阅下面的部分以查看您计算机上的完整世界文件。
在这个世界文件片段中,您可以看到三个模型被引用。这三个模型将在您当地的Gazebo模型数据库中搜索。如果没有找到,他们会自动从Gazebo的在线数据库中提取出来。
你可以学习更多的世界文件在Build A World教程.
在计算机上查找世界文件
世界文件位于/worlds
你的gazebo资源路径的目录。此路径的位置取决于您如何安装gazebo和您所在的系统类型。要查找Gazebo资源的位置,请使用以下命令:
env | grep GAZEBO_RESOURCE_PATH
典型的路径可能是/usr/local/share/gazebo-1.9,
添加 /world
到路径的末尾,你应该有一个包含Gazebo使用的世界文件的目录,包括mud.world
文件。
在继续讨论如何在Gazebo中生成机器人之前,我们将首先回顾一下在Gazebo中使用ros的文件层次标准,以便我们可以在以后进行假设。
现在,我们假设您的catkin工作区命名为catkin_ws
,不过你可以随意命名。因此,您的catkin工作区可能位于计算机上的以下位置:
/home/user/catkin_ws/src
根据ROS标准,所有关于你的机器人型号和描述都在一个名为/MYROBOT_description,
所有与Gazebo一起使用的world文件和launch文件都位于一个名为/MYROBOT_gazebo。请将“MYROBOT”替换为小写的bot名称。对于这两个包,您的层次结构应该如下所示:
../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
记住命令catkin_create_pkg
用于创建新包,但如果需要,也可以很容易地将其应用于rosbuild。这些文件夹和文件中的大多数应该是不言而喻的。
您可以创建自定义.world
您自己的ROS包中特定于您的机器人和软件包的文件。在这个小教程中,我们将创建一个有地面、太阳和加油站的空世界。以下是我们推荐的惯例。一定要用bot的名称替换MYROBOT,或者如果没有要测试的robot,只需将其替换为类似“test”的内容:
launch
文件夹launch
文件夹创建一个YOUROBOT.launch包含以下内容的文件(默认参数除外)
worlds
文件夹,并创建MYROBOT.world包含以下内容:
model://ground_plane
model://sun
model://gas_station
gas_station
-2.0 7.0 0 0 0 0
. ~/catkin_ws/devel/setup.bash
roslaunch MYROBOT_gazebo MYROBOT.launch
您将看到以下世界模型(用鼠标滚轮缩小):
在本教程的其余部分,你的MYROBOT_gazebo empty world世界需要运行。
您可以将其他模型插入到robot的world文件中并使用File->Save
作为命令将您编辑的世界导出回您的ROS包。
roslaunch
制造URDF机器人有两种方法可以启动你的基于URDF的机器人进入gazebo使用roslaunch
:
ROS服务调用生成方法(ROS Service Call Spawn Method)
第一种方法让机器人的ROS包在计算机和存储库检查之间更具可移植性。它允许您保持机器人相对于ROS包路径的位置,但也要求您使用一个小(python)脚本进行ROS服务调用。
模型数据库方法(Model Database Method)
第二种方法允许您在
.world
文件,看起来更干净、更方便,但需要您通过设置环境变量将机器人添加到Gazebo模型数据库中。
我们将讨论这两种方法。总的来说,我们推荐的方法是使用ROS Service Call Spawn Method
此方法使用一个名为spawn_model
向发出服务调用请求gazebo_ros ROS节点(在rostopic命名空间中简称为gazebo)将自定义的URDF添加到gazebo中。这个spawn_model
脚本位于gazebo_ros包。可以按以下方式使用此脚本:
rosrun gazebo_ros spawn_model -file `rospack find MYROBOT_description`/urdf/MYROBOT.urdf -urdf -x 0 -y 0 -z 1 -model MYROBOT
查看所有可用参数spawn_model
包括namespaces、trimesh特性、关节位置和RPY方向
运行:
rosrun gazebo_ros spawn_model -h
如果你还没有一个URDF测试,作为一个例子,你可以下载baxter_description包从 Rethink Robotics的巴克斯特公用baxter_common巴克斯特公用b报告。运行以下命令将此包放入您的catkin工作区:
git clone https://github.com/RethinkRobotics/baxter_common.git
现在应该有一个名为baxter.urdf
位于 baxter_description/urdf/内,您可以运行:
rosrun gazebo_ros spawn_model -file `rospack find baxter_description`/urdf/baxter.urdf -urdf -z 1 -model baxter
然后您将看到类似于:
要将其直接集成到ROS启动文件中,请重新打开该文件MYROBOT_gazebo/launch/YOUROBOT.launch,加入以下段
在标签之前:
启动此文件时,您将看到与使用时相同的结果rosrun
。
如果您的URDF不是XML格式而是XACRO格式,您可以对启动文件进行类似的修改。您可以通过安装以下软件包来运行此PR2示例:
ROS Jade:
sudo apt-get install ros-jade-pr2-common
然后将其添加到本教程前面创建的启动文件中:
启动此文件后,您将看到加油站中的PR2,如图所示:
注意:在本文中,由于gazebo API的变化,控制台输出仍有许多错误和警告需要从PR2的URDF中修复。
第二种将机器人产生到GAZEBO的方法允许您将您的机器人包含在.world
文件,看起来更干净、更方便,但也需要您通过设置环境变量将机器人添加到Gazebo模型数据库中。此环境变量是必需的,因为ROS依赖性与gazebo分离;不能在.world
内部直接使用URDF包路径,
因为Gazebo没有ROS包的概念。
要完成此方法,必须创建一个新的模型数据库,其中只包含您的单个机器人。这不是将你的URDF加载到gazebo的最干净的方法,但它实现了这样一个目标:不必在计算机上保留两个URDF机器人副本。如果以下说明令人困惑,请返回到凉亭模型数据库Gazebo Model Database凉亭模型数据库,了解为什么需要这些步骤的文档。
我们将假设您的ROS工作区文件层次结构是按照上述部分所述设置的。唯一不同的是现在model.config
文件已添加到 MYROBOT_description
包装如下:
../catkin_ws/src
/MYROBOT_description
package.xml
CMakeLists.txt
model.config
/urdf
MYROBOT.urdf
/meshes
mesh1.dae
mesh2.dae
...
/materials
/plugins
/cad
通过以下文件夹/文件,该层次结构特别适合用作 Gazebo model database:
model.config
每个模型都必须有一个model.config在模型根目录中,它包含模型的配置文件。基本上把这个复制到model.config,替换MYROBOT.urdf:
MYROBOT
1.0
urdf/MYROBOT.urdf
My name
[email protected]
A description of the model
与sdf不同,不需要用于URDFs时的标记。更多信息请参见Gazebo模型数据库文档。
环境变量
最后,您需要将一个环境变量添加到 你的.bashrc 文件中。告诉Gazebo在哪里查找模型数据库。使用您选择的编辑器编辑“~/.bashrc”。检查你是否已经有GAZEBO_MODEL_PATH
定义。如果已经有一个,请使用分号附加到它,否则添加新的导出。假设你的 Catkin工作区在~/catkin_ws/,您的路径应该类似于:
export GAZEBO_MODEL_PATH=/home/user/catkin_ws/src/
在gazebo上观看-手动
现在,通过启动Gazebo来测试新Gazebo模型数据库是否配置正确:
gazebo
然后单击左边的“Insert”选项卡。您可能会看到几个不同的下拉列表,它们表示系统上可用的不同模型数据库,包括联机数据库。找到与您的机器人对应的数据库,打开子菜单,单击机器人的名称,然后使用鼠标在gazebo中选择一个位置放置机器人。
gazebo上观看-roslaunch
使用模型数据库
模型数据库方法的优点是,现在您可以直接在world文件中包含robot,而无需使用ROS包路径。我们将使用“Creating a world file”一节中的相同设置,但要修改世界文件:
MYROBOT_description/launch
文件夹,编辑MYROBOT.world。包含以下内容:
model://ground_plane
model://sun
model://gas_station
gas_station
-2.0 7.0 0 0 0 0
model://MYROBOT_description
您现在可以使用Gazebo和Gazebo命令启动您的Gazebo:
roslaunch MYROBOT_gazebo MYROBOT.launch
这种方法的缺点是MYROBOT_description
和MYROBOT_gazebo在计算机之间不太便利,在能够使用这些ROS包之前,你在任何新系统上首先必须设置GAZEBO_MODEL_PATH
使用这些ROS。
gazebo_ros
${prefix}是一些用户可能不需要在这里立即知道和需要。
另外,如果你有一些关于如何从ROS端调试这些路径的信息也会很有用,例如,你可以使用这些信息rospack plugins --attrib="gazebo_media_path" gazebo_ros,
检查将由gazebo接收的媒体路径。