< >
Home » ROS2与Gazebo11入门教程 » ROS2与Gazebo11入门教程-模型插件

ROS2与Gazebo11入门教程-模型插件

说明:

  • 介绍如何编写模型插件

前提条件

  • 已经学习完了概述/ HelloWorld插件教程。

  • 如果您是从上一节教程继续学习过来的,请确保为本节教程正确添加下面几个#include行。

代码

  • 可以在gazebo/examples/plugins/model_push资源中找到插件源代码

  • 插件允许对模型及其底层元素(链接、关节、碰撞对象)的物理属性进行完全访问。以下插件会将一个线速度应用于其父级模型

$ cd ~/gazebo_plugin_tutorial
$ gedit http://model_push.cc
  • 该插件源代码如下:
#include <functional>
#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
{
public: void Load(physics::ModelPtr _parent, sdf::ElementPtr /*_sdf*/)
{
// Store the pointer to the model
this->model = _parent;

// Listen to the update event. This event is broadcast every
// simulation iteration.
this->updateConnection = event::Events::ConnectWorldUpdateBegin(
std::bind(&ModelPush::OnUpdate, this));
}

// Called by the world update start event
public: void OnUpdate()
{
// Apply a small linear velocity to the model.
this->model->SetLinearVel(ignition::math::Vector3d(.3, 0, 0));
}

// Pointer to the model
private: physics::ModelPtr model;

// Pointer to the update event connection
private: event::ConnectionPtr updateConnection;
};

// Register this plugin with the simulator
GZ_REGISTER_MODEL_PLUGIN(ModelPush)
}

编译插件

  • 假设读者已经完成了Hello WorldPlugin教程,那么所有要做的就是将以下两行添加到〜/gazebo_plugin_tutorial/CMakeLists.txt文件中:
add_library(model_push SHARED http://model_push.cc)
target_link_libraries(model_push ${GAZEBO_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
$ 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>
  • 在模型元素代码块的末尾使用下面这行代码来指定将插件附加到模型的钩子程序上:

  • 注:不要复制下面这行。该行仅用于参考目的。

<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选项会以暂停状态启动Gazebo服务器。

  • 在另一个终端中启动客户端GUI,命令为:

$ gzclient
  • 单击客户端GUI中的“播放(play)”按钮以取消暂停状态(即启动仿真),这样就应该会看到方盒在移动。

参考:

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros2与gazebo11入门教程