7.2 编写插件-模型插件

预备知识

概述/HelloWorld插件教程

注意:如果你要继续上一篇教程,请确保在下面列出的本教程中包含了适当的包含行。

代码

来源:gazebo/examples/plugins/model_push

(https://bitbucket.org/osrf/gazebo/src/gazebo_2.2/examples/plugins/model_push)

插件允许完全访问模型及其基本元素(链接、节点、碰撞对象)的物理属性。下面的插件将对其父模型应用一个线性速度。

$ cd ~/gazebo_plugin_tutorial

$ geditmodel_push.cc

插件代码:

#include<boost/bind.hpp>
#include<gazebo/gazebo.hh>
#include<gazebo/physics/physics.hh>
#include<gazebo/common/common.hh>
#include<stdio.h>
 
namespacegazebo
{
  class ModelPush : public ModelPlugin
  {
    public: void Load(physics::ModelPtr_parent, sdf::ElementPtr /*_sdf*/)
    {
      // Store the pointer to the model
      this->model = _parent;
 
      // Listen to the update event. This eventis broadcast every
      // simulation iteration.
      this->updateConnection =event::Events::ConnectWorldUpdateBegin(
          boost::bind(&ModelPush::OnUpdate,this, _1));
    }
 
    // Called by the world update start event
    public: void OnUpdate(constcommon::UpdateInfo & /*_info*/)
    {
      // Apply a small linear velocity to themodel.
     this->model->SetLinearVel(math::Vector3(.03, 0, 0));
    }
 
    // Pointer to the model
    private: physics::ModelPtr model;
 
    // Pointer to the update event connection
    private: event::ConnectionPtrupdateConnection;
  };
 
  // Register this plugin with the simulator
  GZ_REGISTER_MODEL_PLUGIN(ModelPush)
}

编译插件

假设读者已经阅读了Hello world插件教程,那么需要做的就是向

~/gazebo_plugin_tutorial/CMakeLists.txt中添加以下几行

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

编译这段代码将导致一个共享库,~/gazebo_plugin_tutorial/build/libmodel_push.so。因此,这可以插入到Gazebo模仿真中。

$ cd~/gazebo_plugin_tutorial/build

$ cmake ../

$ make

运行插件

这个插件在世界文件examples/plugins/model_push/model_push.world中使用

$ cd~/gazebo_plugin_tutorial

$ geditmodel_push.world

 

<?xmlversion="1.0"?>
<sdfversion="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">
        <collisionname="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>

插件被指定附加到模型元素块的末尾:

不要复制,以下是参考目的

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

将您的库路径添加到GAZEBO_PLUGIN_PATH

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

开始仿真,运行

$ cd ~/gazebo_plugin_tutorial/

$ gzserver -u model_push.world

-u选项在一个暂停状态启动服务器。

在另一个单独的终端中,启动gui

$ gzclient

单击gui中的play按钮,以取消模拟,您将看到该框的移动。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值