< >
Home » ROS2与Gazebo11入门教程 » ROS2与Gazebo11入门教程-话题订阅(Topics subscription)

ROS2与Gazebo11入门教程-话题订阅(Topics subscription)

说明

  • 介绍如何使用Gazebo的消息传递基础设施——传输库(Transport Library)

概述

  • Gazebo在TCP/IP套接字上进行通信,该套接字允许独立程序与Gazebo进行交互。

  • Gazebo使用Boost ASIO来管理通信层,并使用Google Protobufs作为消息传递和序列化库。消息是通过发布者(pubilshers)在称为话题(topics)的命名信道上发送的。

  • 话题的另一端是订阅者(subscribers),订阅者在消息到达时会接收回调函数。

  • 总之,要发送消息,必须使用一个发布者在一个命名话题上发布消息,而要接收消息,则必须使用一个订阅者订阅某个命名话题。

  • 通过TCP/IP套接字与Gazebo通信的最简单方法就是链接到Gazebo的各个库,并使用这些库提供的函数。

  • Gazebo的消息传输系统(库)API文档请参阅此页面,而其消息API文档则请参阅这个页面。

  • 可以使用以下命令来发现一个运行系统上正在使用的所有话题的列表(首先确保Gazebo正在运行):

gz topic -l

示例

  • 本示例会订阅一条WorldStatistics消息,并假定您可以链接到Gazebo。

  • 首先,如果您是从debians安装的Gazebo,请确保已安装Gazebo开发文件。如果您从源代码安装了Gazebo,则可以忽略此步骤。请用您拥有的Gazebo任何版本号替换掉下面这条命令中的X。

sudo apt-get install libgazeboX-dev
  • 下载http://listener.cc和CMakeLists.txt文件,并将它们放入主目录下一个名为listener的文件夹中,然后编译示例软件包:
mkdir ~/listener
cd ~/listener
wget https://github.com/osrf/gazebo/raw/master/examples/stand_alone/listener/listener.cc
wget https://github.com/osrf/gazebo/raw/master/examples/stand_alone/listener/CMakeLists.txt
mkdir build
cd build
cmake ..
make
  • 当Gazebo正在运行时,运行侦听者(licenser)程序,命令为:
cd ~/listener/build
./listener
  • 输出应该会如下所示:
sim_time {
sec: 1104
nsec: 855000000
}
pause_time {
sec: 0
nsec: 0
}
real_time {
sec: 1108
nsec: 263362269
}
paused: false
iterations: 1104855
sim_time {
sec: 1105
nsec: 55000000
}
pause_time {
sec: 0
nsec: 0
}
real_time {
sec: 1108
nsec: 464165998
}
paused: false
iterations: 1105055
  • 代码说明

首先加载gazebo并运行其传输系统:

gazebo::setupClient(_argc, _argv);
  • 接着创建一个节点,该节点会提供创建发布者和订阅者的函数:
gazebo::transport::NodePtr node(new gazebo::transport::Node());
node->Init();
  • 然后创建一个订阅者,该订阅者会订阅“world_stats”话题。Gazebo会在该话题上发布状态流消息:
gazebo::transport::SubscriberPtr sub = node->Subscribe("~/world_stats", cb);
  • 需要创建一个回调函数,该函数会将消息打印到控制台,在上一行代码中该回调函数名为cb。
void cb(ConstWorldStatisticsPtr &_msg)

{

std::cout << _msg->DebugString();

}
  • 此时,必须在消息进入时创建一个等待循环,或进行其他处理。 本示例中只是简单的等待循环。
while (true)
gazebo::common::Time::MSleep(10);
  • 一旦完成所有任务后,就终止传输系统。
gazebo::shutdown();

参考:

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

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


标签: ros2与gazebo11入门教程