使用roslaunch启动Gazebo、world文件和URDF模型

1 使用roslaunch打开世界模型

这个 roslaunch工具是启动ROS节点和在ROS中启动机器人的标准方法。开始一个空的Gazebo world 和rosrun命令类似,只需运行

roslaunch gazebo_ros empty_world.launch

1.1 roslaunch Arguments:

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)

1.2 例子: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

1.3 启动其他演示世界

其他演示世界已经包含在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包含以下内容:

<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>

在这个启动文件中,我们继承了empty_world.launch的大部分必要功能。我们唯一需要更改的参数是world_name参数,替换empty.world的world文件mud.world文件。其他参数只需设置为其默认值。

1.4 world文件

继续我们的mud_world.launch文件,现在我们将查看mud.world文件。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>

请参阅下面的部分以查看您计算机上的完整世界文件。

在这个世界文件片段中,您可以看到三个模型被引用。这三个模型将在您当地的Gazebo模型数据库中搜索。如果没有找到,他们会自动从Gazebo的在线数据库中提取出来。

你可以学习更多的世界文件在Build A World教程.

在计算机上查找世界文件

世界文件位于/worlds你的gazebo资源路径的目录。此路径的位置取决于您如何安装gazebo和您所在的系统类型。要查找Gazebo资源的位置,请使用以下命令:

env | grep GAZEBO_RESOURCE_PATH

典型的路径可能是/usr/local/share/gazebo-1.9,添加 /world到路径的末尾,你应该有一个包含Gazebo使用的世界文件的目录,包括mud.world文件。

2 创建您自己的gazebo ROS包

在继续讨论如何在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。这些文件夹和文件中的大多数应该是不言而喻的。

2.1 创建自定义世界文件

您可以创建自定义.world您自己的ROS包中特定于您的机器人和软件包的文件。在这个小教程中,我们将创建一个有地面、太阳和加油站的空世界。以下是我们推荐的惯例。一定要用bot的名称替换MYROBOT,或者如果没有要测试的robot,只需将其替换为类似“test”的内容:

  • 创建一个ROS包惯例为MYROBOT_gazebo
  • 在这个包中,创建一个launch文件夹
  • 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 MYROBOT_gazebo)/worlds/MYROBOT.world"/>
        <!-- more default parameters can be changed here -->
      </include>
    </launch>

  • 在同一个包中,创建一个worlds文件夹,并创建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>

  • 现在您应该可以使用以下命令将您的自定义世界(带有加油站)启动到Gazebo中:
    . ~/catkin_ws/devel/setup.bash
    roslaunch MYROBOT_gazebo MYROBOT.launch

    您将看到以下世界模型(用鼠标滚轮缩小):

 在本教程的其余部分,你的MYROBOT_gazebo empty world世界需要运行。

2.2 在Gazebo中编辑世界文件

您可以将其他模型插入到robot的world文件中并使用File->Save作为命令将您编辑的世界导出回您的ROS包。

3 使用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

3.1 "ROS Service Call" Robot 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

3.1.1 与Baxter的URDF示例

如果你还没有一个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,加入以下段</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" />

启动此文件时,您将看到与使用时相同的结果rosrun 。

3.1.2 XACRO PR2示例

如果您的URDF不是XML格式而是XACRO格式,您可以对启动文件进行类似的修改。您可以通过安装以下软件包来运行此PR2示例:

 ROS Jade:

sudo apt-get install ros-jade-pr2-common

然后将其添加到本教程前面创建的启动文件中:

<!-- 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" />

启动此文件后,您将看到加油站中的PR2,如图所示:

 

 注意:在本文中,由于gazebo API的变化,控制台输出仍有许多错误和警告需要从PR2的URDF中修复。

 3.2 "Model Database" Robot Spawn Method

第二种将机器人产生到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:

  • /home/user/catkin_workspace/src-这被视为 Gazebo Model Database的位置
  • /MYROBOT_description-此目录被视为单个Gazebo模型文件夹
  • model.config-这是Gazebo在其数据库中查找此模型所需的配置文件
  • MYROBOT.urdf-这是你的机器人描述文件,也被Rviz使用,MoveIt等
  • /meshes-把你的.stl或.dae文件放这里面,就像普通的URDF一样model.config

model.config

每个模型都必须有一个model.config在模型根目录中,它包含模型的配置文件。基本上把这个复制到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不同,不需要用于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。包含以下内容:
<?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_description</uri>
    </include>
  </world>
</sdf>

 您现在可以使用Gazebo和Gazebo命令启动您的Gazebo:

roslaunch MYROBOT_gazebo MYROBOT.launch

这种方法的缺点是MYROBOT_description和MYROBOT_gazebo在计算机之间不太便利,在能够使用这些ROS包之前,你在任何新系统上首先必须设置GAZEBO_MODEL_PATH使用这些ROS。

4 从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}是一些用户可能不需要在这里立即知道和需要。

另外,如果你有一些关于如何从ROS端调试这些路径的信息也会很有用,例如,你可以使用这些信息rospack plugins --attrib="gazebo_media_path" gazebo_ros检查将由gazebo接收的媒体路径。

  • 12
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值