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
这样就应该会看到一个空的仿真世界。
现在,使用位于渲染窗口上方的“方盒”图标向该仿真世界中添加一个方盒。 方盒应该就会浮起并远离相机。
参考:
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号