官网教程:http://gazebosim.org/tutorials?tut=plugins_hello_world&cat=write_plugin
本次内容涉及五个方面:plugin的基本介绍与简单实现、模型的plugin、world plugin、Programma world control 和 System Plugin
##plugin的意义在于提供一种手段帮助我们控制模型、传感器、仿真物理环境、仿真过程的控制。

《一》plugin的基本介绍与简单实
基本介绍:
(1)嵌入仿真环境的由功能性代码编译成的共享库。
(2)功能性代码是利用C++编写的,一般是类的形式。
使用plugin的情况:
you want to programmatically alter a simulation
Ex: move models, respond to events, insert new models given a set of preconditions

you want a fast interface to gazebo, without the overhead of the transport layer
Ex: No serialization and deserialization of messages.

you have some code that could benefit others and want to share it

(3)plugin的类型
World、Model、Sensor、System、Visual、GUI
World:Use a World plugin to control world properties, such as the physics engine, ambient lighting, etc.
Model:Use a Model plugin to control joints, and state of a model.
Sensor:Use a Sensor Plugin to acquire sensot information and control sensor properties

简单实现:
(1)确保你的Ubuntu系统有gazebo的开发所需要的包
采用以下命令安装匹配版本的包(其中7要换成你安装的版本):

sudo apt-get install libgazebo7-dev 

(2)创建一个文件夹来保存文件,创建一个文件夹命名为gazebo_plugin_tutorial和一个C++ 文件hello_world.cc
参考的命令行:

 mkdir ~/gazebo_plugin_tutorial
 cd ~/gazebo_plugin_tutorial
 gedit hello_world.cc

(3)文件的编辑,编写C++ 文件

#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)
}

代码解释:
头文件:include <gazebo/gazebo.hh>包含基本的gazebo功能但是不包含physics、rendering、sensors。所以一般情况下都会包含以下文件:

include <gazebo/gazebo.hh> 
include <gazebo/physics/physics.hh> 
include <gazebo/rendering/rendering.hh> 
include <gazebo/sensors/sensors.hh>

命名空间(namespace)
所有plugin都要在gazebo的命名空间中

类:一般每个plugin都会定义一个类,且必须继承一个父类,gazebo有六个父类:WorldPlugin、SensorPlugin、GuiPlugin、SystemPlugin、VisualPlugin、ModernPlugin
`
函数:每个plugin必须有Load函数,参数中 _world就是你的world环境的指针,_sdf就是SDF模型文件的指针,到时访问模型元素或者变量是都需要利用这些指针去引用。据我的理解,环境和模型分别就是一个大类。

类的登记、注册:
护额将我们定义好的类告知gazebo,采用以下6种代码,根据继承的父类进行选择:

GZ_REGISTER_WORLD_PLUGIN(你的类名)
 GZ_REGISTER_MODEL_PLUGIN(你的类名)
 GZ_REGISTER_SENSOR_PLUGIN(你的类名)
 GZ_REGISTER_GUI_PLUGIN(你的类名)
 GZ_REGISTER_SYSTEM_PLUGIN(你的类名)
 GZ_REGISTER_VISUAL_PLUGIN(你的类名)

(4)C++ 文件的编译
对于plugin ,我们的目标是将其编译成共享库的形式,以便在其他文件直接调用。在Linux系统中采用make工具。
第一步:编写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 hello_world.cc)
target_link_libraries(hello_world ${GAZEBO_LIBRARIES})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GAZEBO_CXX_FLAGS}")

代码解释:我们的目标是将C++ 文件链接成共享库的形式,由于C++ 文件中包含了gazebo的库文件,所以我们需要将gazebo的库包含、链接之后才可以正常生成所需的文件。
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)是规定Cmake编译器的最低版本。
find_package(gazebo REQUIRED):找到gazebo的库文件
include_directories( G A Z E B O I N C L U D E D I R S ) : 包 含 C + + 文 件 中 g a z e b o 的 相 关 头 文 件 l i n k d i r e c t o r i e s ({GAZEBO_LIBRARY_DIRS}):指定要链接的库文件的路径。
list(APPEND CMAKE_CXX_FLAGS “${GAZEBO_CXX_FLAGS}”):在编译过程显示一些信息
add_library(hello_world SHARED hello_world.cc):将C++文件链接成共享库
target_link_libraries(hello_world ${GAZEBO_LIBRARIES}):将目标文件与库文件进行链接
add_library(hello_world SHARED hello_world.cc)中指定生成的共享文件的名称为hello_world,所以在编译完成后共享文件就是libhello_world.so

编译过程:典型过程:创建build文件夹、j进入build文件夹cmake …和make,有时安装依赖包,还需sudo make install
命令参考:

 mkdir ~/gazebo_plugin_tutorial/build
 cd ~/gazebo_plugin_tutorial/build
 cmake ../
 make

将生成的库添加到环境变量:打开 ~/.bashr文件,添加以下内容:

 export GAZEBO_PLUGIN_PATH=${GAZEBO_PLUGIN_PATH}:~/gazebo_plugin_tutorial/build

(5)plugin的使用第一步:创建一个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 ~/gazebo_plugin_tutorial/hello.world --verbose

实现效果:

在这里插入图片描述verbose:输出日志