< >
Home » ROS2与Gazebo11入门教程 » ROS2与Gazebo11入门教程-编写插件

ROS2与Gazebo11入门教程-编写插件

说明:

  • 介绍如何创建和加载用于各种用途的插件

Gazebo插件概述

  • 插件是一个代码块,可以被编译成共享库并插入到仿真中。通过标准C ++类,插件可以直接访问Gazebo的所有功能。

  • 插件之所以很有用,是因为它们:

    • 让开发人员可以控制Gazebo的几乎所有方面
    • 是易于共享的独立程序
    • 可以插入到正在运行的系统中,也可以从正在运行的系统中删除
  • Gazebo的早期版本使用了控制器。控制器的行为与插件的行为几乎相同,但是控制器是静态地编译到Gazebo中的。插件更加灵活,并且可以让用户自行挑选和选择要包含在仿真中的功能。

  • 在下列情况中,应该使用插件:

  • 需要以编程方式更改仿真

  • 示例:对模型进行移动,对事件作出响应,根据给定的先决条件插入新的模型

  • 需要一个连接到Gazebo且没有传输层开销的快速接口

  • 示例:无消息的序列化和反序列化。

  • 有一些能让他人受益并希望共享的代码

插件类型

  • 当前有6种类型的插件:

    • 仿真世界插件
    • 模型插件
    • 传感器插件
    • 系统插件
    • 视觉插件
    • 图形用户界面插件
  • 每类插件都由Gazebo的不同组件进行管理。例如,模型插件会附加到Gazebo中的某个具体模型并控制该模型。同样地,仿真世界插件会附加到某个仿真世界,而传感器插件会附加到某个具体的传感器。系统插件是在命令行上指定的,且在Gazebo启动期间会首先加载。系统插件使用户可以控制Gazebo的启动过程。

  • 应根据所需功能来选择插件类型。使用仿真世界插件来控制仿真世界属性,例如物理引擎,环境照明等。使用模型插件来控制模型的关节和状态。使用传感器插件来获取传感器信息并控制传感器属性。

Hello World插件

  • 插件的设计初衷在于简化。一个骨架仿真世界插件仅包含一个具有几个成员函数的类。

  • 首先,如果您是从debians安装的Gazebo,请确保已安装了Gazebo开发文件。如果您从源代码安装的Gazebo,则可以忽略此步。如果您的gazebo版本不是6,则请使用您拥有的任何版本号替换6(下面的命令是以Gazebo 11版本为例)。

sudo apt-get install libgazebo11-dev
  • 然后为新的插件新建一个目录和一个.cc文件,命令为:
$ mkdir ~/gazebo_plugin_tutorial
$ cd ~/gazebo_plugin_tutorial
$ gedit http://hello_world.cc
  • 将以下代码复制到http://hello_world.cc文件中:
#include <gazebo/gazebo.hh>

namespace gazebo
{
class WorldPluginTutorial : public WorldPlugin
{
public: WorldPluginTutorial() : WorldPlugin()
{
printf("Hello World!\n");
}

public: void Load(physics::WorldPtr _world, sdf::ElementPtr _sdf)
{
}
};
GZ_REGISTER_WORLD_PLUGIN(WorldPluginTutorial)
}
  • 上述代码也可以在Gazebo资源examples/plugins/hello_world/ hello_world.cc中找到,另外还有一个相应的CMakeLists.txt文件

代码说明

#include <gazebo/gazebo.hh>

namespace gazebo
{
文件gazebo/gazebo.hh包含一系列Gazebo的基本核心功能。它不包含gazebo/physics/physics.hh,gazebo/rendering/rendering.hh或gazebo/sensors/sensors.hh,因为这几个文件是否被包含应视具体情况而定。所有插件都必须位于gazebo命名空间中。

class WorldPluginTutorial : public WorldPlugin
{
public: WorldPluginTutorial() : WorldPlugin()
{
printf("Hello World!\n");
}
  • 每个插件都必须继承于某个插件类型,本例中为WorldPlugin类。
public: void Load(physics::WorldPtr _world, sdf::ElementPtr _sdf)
{
}
  • 其他唯一的必需函数是Load函数,该函数接收一个SDF元素,该元素包含了在已加载的SDF文件中指定的元素和属性。
GZ_REGISTER_WORLD_PLUGIN(WorldPluginTutorial)
  • 最后,必须使用GZ_REGISTER_WORLD_PLUGIN宏在仿真器中注册该插件。该宏的唯一参数是插件类的名称。每种插件类型都有与之匹配的注册宏,分别为:
GZ_REGISTER_MODEL_PLUGIN,GZ_REGISTER_SENSOR_PLUGIN,GZ_REGISTER_GUI_PLUGIN,GZ_REGISTER_SYSTEM_PLUGIN和GZ_REGISTER_VISUAL_PLUGIN。

编译插件

  • 请确保已经正确安装了Gazebo。

  • 为编译上面这个插件,需要在~/gazebo_plugin_tutorial目录中新建一个CMakeLists.txt文件,命令为:

$ gedit ~/gazebo_plugin_tutorial/CMakeLists.txt
  • 将以下代码复制到CMakeLists.txt文件中:
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

find_package(gazebo REQUIRED)
include_directories(${GAZEBO_INCLUDE_DIRS})
link_directories(${GAZEBO_LIBRARY_DIRS})
list(APPEND CMAKE_CXX_FLAGS "${GAZEBO_CXX_FLAGS}")

add_library(hello_world SHARED http://hello_world.cc)
target_link_libraries(hello_world ${GAZEBO_LIBRARIES})
  • Gazebo6的新功能:现在,gazebo所有下游软件在编译是都需要有c ++ 11标志。这可以通过下面一行代码来完成:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GAZEBO_CXX_FLAGS}")
  • 新建build目录并进入该目录,命令如下:
$ mkdir ~/gazebo_plugin_tutorial/build
$ cd ~/gazebo_plugin_tutorial/build
  • 对插件代码进行编译:
$ cmake ../
$ make
  • 编译将会生成一个共享库〜/gazebo_plugin_tutorial/build/ libhello_world.so,可以将其插入到Gazebo仿真中。

  • 最后,将该库路径添加到GAZEBO_PLUGIN_PATH环境变量中:

$ export GAZEBO_PLUGIN_PATH=${GAZEBO_PLUGIN_PATH}:~/gazebo_plugin_tutorial/build
  • 这只会更改当前shell的路径。如果要为打开的每个新终端使用该插件,请将上面一行添加到〜/.bashrc文件中

使用插件

  • 将插件编译为共享库后(参见上文),就可以在SDF文件中将其附加到某个仿真世界或模型(有关更多信息,请参见SDF文档)。 在启动时,Gazebo会解析SDF文件,找到该插件并加载其代码。 很重要的一点就是Gazebo能够找到插件。要么指定插件的完整路径,要么就是插件位于GAZEBO_PLUGIN_PATH环境变量的一个路径中。

  • 创建一个世界文件,并将下面的代码复制到该世界文件中。该示例世界文件也可以在examples/plugins/hello_world/hello.world中找到。

$ gedit ~/gazebo_plugin_tutorial/hello.world
<?xml version="1.0"?>
<sdf version="1.4">
<world name="default">
<plugin name="hello_world" filename="libhello_world.so"/>
</world>
</sdf>
  • 现在用gzserver打开该世界文件:
$ gzserver ~/gazebo_plugin_tutorial/hello.world --verbose
  • 这样就应该会看到如下所示的输出:
Gazebo multi-robot simulator, version 11.3.0
Copyright (C) 2012 Open Source Robotics Foundation.
Released under the Apache 2 License.
http://gazebosim.org

[Msg] Waiting for master.
[Msg] Connected to gazebo master @ http://127.0.0.1:11345
[Msg] Publicized address: 192.168.1.136
[Msg] Loading world file [/home/wangjg/gazebo_plugin_tutorial/hello.world]
Hello World!

参考:

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros2与gazebo11入门教程