Gazebo Plugins教程

  • Overview of Gazebo plugins

Gazebo插件通过标准C++类直接控制Gazebo模型, 其具有以下优点

可以控制gazebo中几乎各个方面;

容易共享;

能够在运行的系统中插入移除;

Gazebo插件共有六种:

1.World:控制世界特性,如物理引擎、环境光等

2.Model:用于控制关节和模型状态

3.Sensor:用于获取传感器数据和控制传感器

4.System

5.Visual

6.GUI

Plugin简单例程---Hello WorldPlugin!

安装Gazebo开发文件

sudo apt-get install libgazebo#-dev   //#为gazebo版本号,6、7 .etc

创建Plugin文件夹

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

输入如下代码:

#include <gazebo/gazebo.hh>  
/* 包含gazebo基本功能,
不包括gazebo/physics/physics.hh, gazebo/rendering/rendering.hh, 和 gazebo/sensors/sensors.hh */

namespace gazebo  //所有插件都需要在gazebo名空间中编写
{

/* 所有插件类的创建需要继承一种plugin类型,下面是继承WorldPlugin */
  class WorldPluginTutorial : public WorldPlugin  
  {
    public: WorldPluginTutorial() : WorldPlugin()//默认构造函数
            {
              printf("Hello World!\n");//只要创建该类类型就会打印
            }
/* 唯一另一个必须的函数是Load(),其中_sdf接收一个包含sdf文件中指定的参数和属性 */
    public: void Load(physics::WorldPtr _world, sdf::ElementPtr _sdf)
            {
            }
  };
/* 使用GZ_REGISTER_WORLD_PLUGIN macro函数将插件注册,函数的需要的参数仅为插件类名
macro函数还包括GZ_REGISTER_MODEL_PLUGIN, GZ_REGISTER_SENSOR_PLUGIN, GZ_REGISTER_GUI_PLUGIN,
 GZ_REGISTER_SYSTEM_PLUGIN and GZ_REGISTER_VISUAL_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})

编译CMakeLists

mkdir ~/gazebo_plugin_tutorial/build
cd ~/gazebo_plugin_tutorial/build

cmake ../
make

编译后即可生成如下图所示共享库文件

将库路径添加到GAZEBO_PLUGIN_PATH

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

使用插件

只要作为共享库编译插件,就可以将其添加到SDF文件的world或model中。gazebo会分析sdf文件,定位插件,加载插件代码。为了让gazebo找到插件,可以填写插件绝对路径或将插件路径添加到GAZEBO_PLUGIN_PATH环境变量中。

创建world文件

gedit ~/gazebo_plugin_tutorial/hello.world

在world文件中添加plugin插件

<?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

  • Model plugins

本插件会向当前模型施加一个线速度。记得测试之前先把上一个教程的代码删除,重新编写合适的CMakeLists进行编译

$ cd ~/gazebo_plugin_tutorial
$ gedit model_push.cc

插件代码

#include <functional>   ///STL 定义运算函数(代替运算符)
#include <gazebo/gazebo.hh>
#include <gazebo/physics/physics.hh>
#include <gazebo/common/common.hh>
#include <ignition/math/Vector3.hh>

namespace gazebo
{
  class ModelPush : public ModelPlugin
  {
    /* typedef boost::shared_ptr<Model> ModelPtr Model类型的共享指针
        sdf::ElementPtr指向sdf,即将.world文件中的参数属性导入进来*/
    public: void Load(physics::ModelPtr _parent, sdf::ElementPtr /*_sdf*/)
    {
      /* Store the pointer to the model
         让ModelPush中的model指向当前模型*/
      this->model = _parent;
 
      /* Listen to the update event. This event is broadcast every
         simulation iteration循环.
         typedef boost::shared_ptr<Connection> ConnectionPtr
         static ConnectionPtr ConnectWorldUpdateBegin(T _subscriber) */
      this->updateConnection = event::Events::ConnectWorldUpdateBegin(
          std::bind(&ModelPush::OnUpdate, this));//std::bind在functional中
    }
 
    // Called by the world update start event
    public: void OnUpdate()
    {
      // Apply a small linear velocity to the model.
      // void SetLinearVel(const math::Vector3 & _vel) 	
      //model是指向physics中的Model类的智能指针,因此要在API中model class中找SetLinearVel
      this->model->SetLinearVel(ignition::math::Vector3d(.3, 0, 0));
    }
 
    // Pointer to the model
    private: physics::ModelPtr model;
 
    /* Pointer to the update event connection
       typedef boost::shared_ptr<Connection> ConnectionPtr*/
    private: event::ConnectionPtr updateConnection;
  };
 
  // 注册插件
  GZ_REGISTER_MODEL_PLUGIN(ModelPush)
}

编译插件,改写~/gazebo_plugin_tutorial/CMakeLists.txt后保存

add_library(model_push SHARED model_push.cc)
target_link_libraries(model_push ${GAZEBO_LIBRARIES})

编译

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

 运行插件,在.world环境文件中添加插件

~/gazebo_plugin_tutorial/model_push.world

$ cd ~/gazebo_plugin_tutorial
$ gedit model_push.world

 环境文件内容如下:

<?xml version="1.0"?> 
<sdf version="1.4">
  <world name="default">

    <!-- Ground Plane -->
    <include>
      <uri>model://ground_plane</uri>
    </include>

    <include>
      <uri>model://sun</uri>
    </include>

    <model name="box">
      <pose>0 0 0.5 0 0 0</pose>
      <link name="link">
        <collision name="collision">
          <geometry>
            <box>
              <size>1 1 1</size>
            </box>
          </geometry>
        </collision>

        <visual name="visual">
          <geometry>
            <box>
              <size>1 1 1</size>
            </box>
          </geometry>
        </visual>
      </link>

      <plugin name="model_push" filename="libmodel_push.so"/>
    </model>        
  </world>
</sdf>

 将库文件添加到环境变量中

$ export GAZEBO_PLUGIN_PATH=$HOME/gazebo_plugin_tutorial/build:$GAZEBO_PLUGIN_PATH

运行环境

$ cd ~/gazebo_plugin_tutorial/
$ gzserver -u model_push.world

打开图形界面并点击Play

$ gzclient

可以看到箱子会被一个力向前推

 

  • World plugins

 

 

 

 

  • Programmatic World Control

 

 

 

  • System Plugin

 

 

 

 

  • 13
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值