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文件来用
posted @ 2020-03-12 16:24  临界稳定  阅读(1035)  评论(0编辑  收藏  举报