ROS学习笔记(二):话题通信、服务通信的了解和对应节点的搭建(C++和Python)
前言
在ros这种分布式框架中,各个节点可以独立的运行,但是在实际运用的多数情况下各个节点之间都需要有一定的联系或者说是信息的共享,因此在程序的设计上,各节点之间的通信尤为重要。
官方wiki教程链接:ROS Tutorials
如下所示可让我们对ros通信机制有初步的了解,其中也包括了对应通信节点的搭建。
关于工作空间的搭建参考第一篇文章 ROS学习笔记(一):安装ROS并搭建一个自己的ROS工作空间 ,这里主要记录在程序上如何实现节点通信。
一、Topics话题通信(C++)
话题通信是指节点间以发布订阅的方式进行通信,大体流程为发布者以一定的频率不断地在某个话题上发送消息出去,然后订阅者在ros masters这个平台上通过话题名称发现发布者发送了消息,然后接收其消息进行处理。可同时存在多个订阅者关注同一个话题,也可同时存在多个发布者在同一个话题上发布消息,当然一个订阅者也可以关注多个话题,一个发布者也可以发布多个话题。
关于话题通信,官方的C++案例链接:Writing a Simple Publisher and Subscriber (C++)
0、自定义msg消息类型文件
首先在该功能包下创建msg文件夹,然后在创建一个.msg文件。即:
mkdir msg
touch msg/xx.msg
该文件的编写格式为:
类型 名称
如: int32 num_hi
然后需要进入package.xml更改配置,分别添加下面两行:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
即下图所示:
然后进入CmakeLists.txt,添加如下配置,此处代表该功能包的依赖包:
这里的add_message_files打开注释后,还要将文件改成自己的msg文件,如下所示:
如下所示打开generate_messages的注释为srv文件添加std_msgs依赖。
再打开如下的注释并加入message_runtime,此处代表了find_package中的包的依赖包。
完成配置后回到工作空间主目录再次编译,然后就会生成如下所示的C++和python的msg头文件。
需要使用自定义的msg时,以上述的num.msg为例,如下所示操作即可。
#include "topics/num.h" // 调用自定义消息类型的头文件
topics::num num; // 用于引用自定义的类型
num.num_hi = xx; // 赋值
之后把num.num_hi当成正常的变量用就行了。
1、发布者(Publisher)
pub.cpp程序:
#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc, char **argv)
{
setlocale (LC_ALL, ""); // 防止中文乱码
std_msgs::String msg; // 定义发送数据类型
int count = 1;
ros::init(argc, argv, "talker"); // 初始化ros节点
ros::NodeHandle n; // 定义节点句柄
// 定义发布者
ros::Publisher pub