GAZEBO學習筆記(1)


之前跟着教程弄了一輛小車,基本都是在GUI上操作,還比較簡單。但在過程中有一步是將一個plugin文件插入到小車上,實現了小車自動追蹤前方的物體,今天就來學習一下怎么弄這個plugin。

http://gazebosim.org/tutorials?tut=plugins_hello_world&cat=write_plugin

Plugin文件簡單來說就是為了實現gazebo里模型的某些功能的,換句話說,光拼出小車還沒用,那只是畫個圖,功能性的東西還要用plugin來實現。

Gazebo里的以下六種模型都可以被附加上plugin:

  1. World
  2. Model
  3. Sensor
  4. System
  5. Visual
  6. 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文件來用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM