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!
参考:
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号