GAZEBO学习笔记(1)
之前跟着教程弄了一辆小车,基本都是在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文件来用