开始通信之旅-----话题通信
1. 话题通信的流程
话题通信主要涉及到三个对象
- 管理者
- 发布者
- 订阅者
其主要流程如下图
详细解释一下:1.发布者向管理者发送发布话题等相关信息,在管理者处注册
2.订阅者向管理者发布订阅话题等相关信息,在管理者处注册
(注意1和2顺序可以相反)
3.管理者将订阅者和发布者进行配对
4.配对后发布者无需通过管理者发送信息直接和订阅者进行数据传输
1.1话题通信的实现(C++)
打开虚拟机选择一个文件夹输入如下命令新建一个名为topicComm的文件夹
mkdir -p topicComm/src
进入该文件夹
cd topicComm/
创建ros工作环境
catkin_make
如下图上述步骤如下图
再输入如下代码进入VScode
code .
建立一个cpp文件请看该链接:编写第一个ros程序_visual studio code ros-CSDN博客
依据上述链接本次建立一个demo01_pub.cpp
1.1.1发布方的编写
1.首先需要导入所需包
主要用到如下两个包
#include "ros/ros.h"
#include "std_msgs/String.h" //文本类型
2.创建发布者节点
int main(int argc, char *argv[])
{//2.创建发布者节点ros::init(argc,argv,"FaBuZhe");return 0;
}
3.创建句柄
//3.创建句柄ros::NodeHandle node;
4.创建发布主题等相关信息与等待注册成功
//4.创建发布主题等相关信息node.advertise<发送数据的范型>("发送主题",队列长度);ros::Publisher pub = node.advertise<std_msgs::String>("topic",10);//等待注册成功ros::Duration(1).sleep();//延时1s
5.编写发布数据与发布
//5.编写发布数据std_msgs::String message;message.data = "hello";//6.设置发布频率ros::Rate rate(4);//4HZ每秒四次while (ros::ok())//ros::ok为只要节点存在则为真{//发布数据pub.publish(message);//依据频率延迟rate. Sleep();}
完整代码如下:
#include "ros/ros.h"
#include "std_msgs/String.h"//文本类型/*1.导入所需包2.创建发布者节点3.创建句柄4.创建发布主题等相关信息5.编写发布数据
*/int main(int argc, char *argv[])
{//2.创建发布者节点ros::init(argc,argv,"FaBuZhe");//3.创建句柄ros::NodeHandle node;//4.创建发布主题等相关信息node.advertise<发送数据的范型>("发送主题",队列长度);ros::Publisher pub = node.advertise<std_msgs::String>("topic",10);//等待注册成功ros::Duration(1).sleep();//延时1s//5.编写发布数据std_msgs::String message;message. Data = "hello";//6.设置发布频率ros::Rate rate(4);//4HZ每秒四次while (ros::ok())//ros::ok为只要节点存在则为真{//发布数据pub.publish(message);//依据频率延迟rate.sleep();}return 0;
}
然后打开下图所示文件
将下图所示取消注释
并改为如下代码
add_executable(demo01_pub src/demo01_pub.cpp)target_link_libraries(demo01_pub${catkin_LIBRARIES}
)
然后按CTRL+shift+B,点击设置
将弹出的代码中的group改为如下代码
"group":{"kind": "build","isDefault": true},
上述记得保存
后按CTRL+shift+B则会编译
若成功则如下图所示
打开终端1(注意终端路径)输入
roscore
打开终端2
输入如下指令
source ./devel/setup.bash
rosrun topicComm demo01_pub
打开终端3输入如下指令
rostopic echo topic
如果你的编写没有问题你将在终端三看到下图
如果你想停止发送请在终端2和终端3中按下ctrl + c
1.1.2订阅方的编写
0.建立一个cpp文件请看该链接:编写第一个ros程序_visual studio code ros-CSDN博客
依据上述链接本次建立一个demo02_sub.cpp
1.首先需要导入所需包
主要用到如下两个包
#include "ros/ros.h"
#include "std_msgs/String.h" //文本类型
2.创建订阅者节点
int main(int argc, char *argv[])
{//保证中文输出setlocale(LC_ALL,"");//2.创建订阅者节点ros::init(argc,argv,"DingYueZhe");return 0;
}
3.创建句柄
//3.创建句柄ros::NodeHandle node;
4.创建订阅主题等相关信息
//4.创建订阅主题等相关信息node.subscribe("订阅主题",队列长度,回调函数);ros::Subscriber sub = node.subscribe("topic",10,SubCallblack);
5.编写回调函数
注意此时回调函数中的必须用const常量且采用ConstPtr引用的方式定义传参
//5.创建回调函数
void SubCallblack(const std_msgs::String::ConstPtr& message)
{ROS_INFO("我是订阅方我收到如下消息%s",message->data.c_str());
}
6.spin()重复回调
//6.spin()重复回调ros::spin();
完整代码如下:
#include "ros/ros.h"
#include "std_msgs/String.h"//文本类型/*1.导入所需包2.创建订阅者节点3.创建句柄4.创建发布主题等相关信息5.创建回调函数6.spin()重复回调
*///5.创建回调函数
void SubCallblack(const std_msgs::String::ConstPtr& message)
{ROS_INFO("我是订阅方我收到如下消息%s",message->data.c_str());
}int main(int argc, char *argv[])
{//保证中文输出setlocale(LC_ALL,"");//2.创建订阅者节点ros::init(argc,argv,"DingYueZhe");//3.创建句柄ros::NodeHandle node;//4.创建订阅主题等相关信息node.subscribe("订阅主题",队列长度,回调函数);ros::Subscriber sub = node.subscribe("topic",10,SubCallblack);//6.spin()重复回调ros::spin();return 0;
}
然后打开下图所示文件
打开CmakeLists.list 加上如下代码
add_executable(demo02_sub src/demo02_sub.cpp)target_link_libraries(demo02_sub${catkin_LIBRARIES}
)
完成后如下图
后按CTRL+shift+B则会编译
若成功则如下图所示
此时打开两个终端都输入
source ./devel/setup.bash
并在两个终端中分别输入
rosrun topicComm demo01_pub
和
rosrun topicComm demo02_sub
如下图
如果没有错误右边会打印相关信息如下图
2.python实现
话题通信之python实现-CSDN博客