当前位置:   article > 正文

ROS保姆级教程(一)--Topic通讯方式实现_topic方式

topic方式

写在前面:小白在使用ROS的时候往往会出现各种各样的问题,回顾我自己的ROS学习之路,也是坎坎坷坷,各种报错让人怀疑人生。因此想写下一个系列的小教程,主要以ROS的通讯方式的实现为目的,穿插各种常见的操作,做到真正的保姆级教程,一步一步来实现,话不多说,正式开始!

关于ROS的学习我之前在这篇博客已经有所总结,ROS WiKi里的自然是最好的第一手教程,跟着wiki上的教程走一遍,基本就能学会ROS 的一些基本使用了,所以说学好英语很重要。众所周知,ROS中的通信方式有四种:主题、服务、参数服务器动作库。这个系列的博客主要用来介绍ROS中的这几种通信方式,一共四篇,先以经典的小海龟为例,然后再自己动手写一个相关的实现,主要参考古月居大佬的视频教程。

ROS的通信方式是ROS最为核心的概念,ROS系统的精髓就在于它提供的通信架构。ROS的通信方式有以下四种:

  • Topic 主题
  • Service 服务
  • Parameter Service 参数服务器
  • Actionlib 动作库

Topic

ROS中的通信方式中,topic是常用的一种。对于实时性、周期性的消息,使用topic来传输是最佳的选择。topic是一种点对点的单向通信方式,这里的“点”指的是node,也就是说node之间可以通过topic方式来传递信息。topic要经历下面几步的初始化过程:首先,publisher节点和subscriber节点都要到节点管理器进行注册,然后publisher会发布topic,subscriber在master的指挥下会订阅该topic,从而建立起sub-pub之间的通信。注意整个过程是单向的。其结构示意图如下:
在这里插入图片描述
Subscriber接收消息会进行处理,一般这个过程叫做回调(Callback)。所谓回调就是提前定义好了一个处理函数(写在代码中),当有消息来就会触发这个处理函数,函数会对消息进行处理。

上图就是ROS的topic通信方式的流程示意图。topic通信属于一种异步的通信方式。下面我们通过一个示例来了解下如何使用topic通信。

publisher的编程实现

在这里插入图片描述
上图就是一个完整的topic流程,我们今天就是要实现这个小海龟的话题通讯功能。

首先在终端新建catkin_ws并且在src中创建功能包,如下:

mkdir catkin_ws
cd catkin_ws
mkdir src
cd src
catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim
  • 1
  • 2
  • 3
  • 4
  • 5

这里解释一下catkin_create_pkg lesrning_topic roscpp rospy std_msgs geometry_msgs turtlesim的意思,这就是一个标准的创建功能包的语句,catkin_create_pkg是创建功能包,lesrning_topic是自己起的功能包的名字,后面的则是依赖项,本篇博客主要依赖的就是roscpp rospy std_msgs geometry_msgs turtlesim,具体的创建功能包的语法如下:

catkin_create_pkg [package name] [depend1] [depend2] ...
  • 1

如果没有问题,那么出现以下提示则说明功能包创建成功:
在这里插入图片描述

在功能包文件夹中,ros为我们创建了以下东西:
在这里插入图片描述

之后,我们就可以着手编写publisher了。在上图中的src中新建velocity_publisher.cpp文件,在文件中写下以下代码,这一段代码是本节的核心,主要就是要理解publisher的整个发布流程:

/**
 * 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
 */
 
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>

int main(int argc, char **argv)
{
   
	// ROS节点初始化
	ros::init(argc, argv, "velocity_publisher");

	// 创建节点句柄
	ros::NodeHandle n;

	// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
	ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);

	// 设置循环的频率
	ros::Rate loop_rate(10);

	int count = 0;
	while (ros::ok())
	{
   
	    // 初始化geometry_msgs::Twist类型的消息
		geometry_msgs::Twist vel_msg;
		vel_msg.linear.x = 0.5;
		vel_msg.angular.z 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/657179
推荐阅读
相关标签
  

闽ICP备14008679号