之前跟着教程弄了一輛小車,基本都是在GUI上操作,還比較簡單。但在過程中有一步是將一個plugin文件插入到小車上,實現了小車自動追蹤前方的物體,今天就來學習一下怎么弄這個plugin。
http://gazebosim.org/tutorials?tut=plugins_hello_world&cat=write_plugin
Plugin文件簡單來說就是為了實現gazebo里模型的某些功能的,換句話說,光拼出小車還沒用,那只是畫個圖,功能性的東西還要用plugin來實現。
Gazebo里的以下六種模型都可以被附加上plugin:
- World
- Model
- Sensor
- System
- Visual
- GUI
其中System plugin說是在啟動Gazebo時生效,有點類似Simulink里的PreLoadFun?
教程下面開始介紹怎么創建、編譯一個World plugin文件,並將其附加在一個world文件上,最后運行這個world文件。
World plugin文件
用C++寫的hello_world.cc文件
#include <gazebo/gazebo.hh> // 類似的頭文件還有gazebo/physics/physics.hh, gazebo/rendering/rendering.hh, gazebo/sensors/sensors.hh namespace gazebo //所有的plugin都要在gazebo命名空間中 { class WorldPluginTutorial : public WorldPlugin { // 所有的plugin都要繼承一個已有的plugin class public: WorldPluginTutorial() : WorldPlugin() { printf("Hello World!\n"); } // plugin中的函數Load public: void Load(physics::WorldPtr _world, sdf::ElementPtr _sdf) { } }; // 用一個宏函數在simulator里注冊該class,類似的函數即GZ_REGISTER_MODEL_PLUGIN, GZ_REGISTER_XXX_PLUGIN GZ_REGISTER_WORLD_PLUGIN(WorldPluginTutorial) }
編譯Plugin函數
在文件夾下新建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}")
新建build文件夾,並在build文件夾下編譯上層文件夾下的World plugin文件,將獲得名為libhello_world.so的shared library文件,可以被Gazebo添加。
當然,要先讓Gazebo能找到該文件,即將build文件夾添加到GAZEBO_PLUGIN_PATH中,參考:
$ export GAZEBO_PLUGIN_PATH=${GAZEBO_PLUGIN_PATH}:~/gazebo_plugin_tutorial/build
使用Plugin文件
即在world文件中添加libhello_world.so,這里是創建一個新的world文件,hello.world:
<?xml version="1.0"?> <sdf version="1.4"> <world name="default"> <plugin name="hello_world" filename="libhello_world.so"/> </world> </sdf>
然后就可以啟動該world文件了:
$ gzserver ~/gazebo_plugin_tutorial/hello.world --verbose
將會看到:
Gazebo multi-robot simulator, version 7.16.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.2.194 Hello World!
小結一下就是:
- world文件(或是model文件等)被啟動時,編譯好的plugin文件(so文件)將被調用(因為寫在world文件的plugin標簽里了)
- 而so文件的內容是通過C++文件cmake編譯來的,
- ?要自己寫plugin功能就要寫一個cc文件和一個cmake文件,而別人的plugin功能可以直接拿so文件來用