< >
Home » ROS2与Gazebo11入门教程 » ROS2与Gazebo11入门教程-编程控制仿真世界

ROS2与Gazebo11入门教程-编程控制仿真世界

说明:

  • 介绍编程控制仿真世界

前提条件

  • 已经完成了前面两节教程的学习:

  • 模型插件

  • 插件101

设置

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

  • 这里继续使用前面插件教程中的gazebo_plugin_tutorial目录:

mkdir ~/gazebo_plugin_tutorial
cd ~/ gazebo_plugin_tutorial
  • 创建一个名为~/gazebo_plugin_tutorial/world_edit.world的文件:
$ gedit world_edit.world
  • 将以下内容添加到该世界文件中:
<?xml version ='1.0'?>
<sdf version ='1.4'>
<world name='default'>
<include>
<uri>model://ground_plane</uri>
</include>

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

<plugin filename="libworld_edit.so" name="world_edit"/>
</world>
</sdf>

代码

  • 创建一个名为~/gazebo_plugin_tutorial/http://world_edit.cc的文件:
$ gedit http://world_edit.cc
  • 将以下内容添加到该源代码文件http://world_edit.cc中:
#include <sdf/sdf.hh>
#include <ignition/math/Pose3.hh>
#include "gazebo/gazebo.hh"
#include "gazebo/common/Plugin.hh"
#include "gazebo/msgs/msgs.hh"
#include "gazebo/physics/physics.hh"
#include "gazebo/transport/transport.hh"

/// \example examples/plugins/http://world_edit.cc
/// This example creates a WorldPlugin, initializes the Transport system by
/// creating a new Node, and publishes messages to alter gravity.
namespace gazebo
{
class WorldEdit : public WorldPlugin
{
public: void Load(physics::WorldPtr _parent, sdf::ElementPtr _sdf)
{
// Create a new transport node
transport::NodePtr node(new transport::Node());

// Initialize the node with the world name
node->Init(_parent->Name());

// Create a publisher on the ~/physics topic
transport::PublisherPtr physicsPub =
node->Advertise<msgs::Physics>("~/physics");

msgs::Physics physicsMsg;
physicsMsg.set_type(msgs::Physics::ODE);

// Set the step time
physicsMsg.set_max_step_size(0.01);

// Change gravity
msgs::Set(physicsMsg.mutable_gravity(),
ignition::math::Vector3d(0.01, 0, 0.1));
physicsPub->Publish(physicsMsg);
}
};

// Register this plugin with the simulator
GZ_REGISTER_WORLD_PLUGIN(WorldEdit)
}

代码说明

// Create a new transport node
transport::NodePtr node(new transport::Node());

// Initialize the node with the world name
node->Init(_parent->Name());
  • 这里创建了一个新的节点指针,并对该指针进行初始化以使用世界名称。世界名称允许该节点与一个具体的仿真世界进行通信。

    // Create a publisher on the ~/physics topic
    transport::PublisherPtr physicsPub =
    node->Advertise<msgs::Physics>("~/physics");

  • 然后创建了一个发布者节点,用于在“~/physics”话题上传递物理消息。

msgs::Physics physicsMsg;
physicsMsg.set_type(msgs::Physics::ODE);

// Set the step time
physicsMsg.set_max_step_size(0.01);

// Change gravity
msgs::Set(physicsMsg.mutable_gravity(),
ignition::math::Vector3d(0.01, 0, 0.1));
physicsPub->Publish(physicsMsg);
  • 最后创建了一条物理消息,并且改变了步长时间和重力。然后将此消息将发布到“〜/physics”话题上。

构建

  • 假设读者已经阅读了插件概述教程,则所有需要做的事情就是将上面的代码另存为~/gazebo_plugin_tutorial/world_edit.cc文件并将以下两行添加到〜/gazebo_plugin_tutorial/MakeLists.txt文件中:
add_library(world_edit SHARED http://world_edit.cc)
target_link_libraries(world_edit ${GAZEBO_LIBRARIES})
  • 编译这段代码将产生一个共享库〜/gazebo_plugin_tutorial/build/ libworld_edit.so,并可以将其插入到Gazebo仿真中。
$ 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/
  • 然后在一个终端中运行仿真世界:
$ cd ~/gazebo_plugin_tutorial
$ gazebo world_edit.world
  • 这样就应该会看到一个空的仿真世界。

  • 现在,使用位于渲染窗口上方的“方盒”图标向该仿真世界中添加一个方盒。 方盒应该就会浮起并远离相机。

参考:

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

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


标签: ros2与gazebo11入门教程