预备知识
概述/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按钮,以取消模拟,您将看到该框的移动。