话题通信
话题通信是发布订阅模式:一个节点发布消息,另一个节点订阅该消息
理论模型
角色
- Master (管理者):根据话题建立发布者和订阅者之间的连接
- Talker (发布者)
- Listener (订阅者)
流程
- Talker注册自身信息
- Listener注册自身信息
- Master实现信息匹配
- Listener向Talker发送请求
- Talker确认请求
- Listener与Talker建立连接
- Talker向Listener发送消息
PS:前五步使用的 RPC协议,最后两步使用的是 TCP 协议
C++实现
发布方实现
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
/*
发布方实现
1.包含头文件
2.初始化ros节点
3.创建节点句柄
4.创建发布者对象
5.编写发布逻辑并发布数据
*/
int main(int argc,char *argv[])
{
setlocale(LC_ALL, "");
//2.初始化ros节点
ros::init(argc,argv,"erGouZi");
//3.创建节点句柄
ros::NodeHandle nh;
//4.创建发布者对象
ros::Publisher pub=nh.advertise<std_msgs::String>("fang",10);
//5.编写发布逻辑并发布数据
//要求以10HZ频率发布数据,并且文本后添加编号
//先创建被发布的消息
std_msgs::String msg;
//发布频率
ros::Rate rate(10);
//设置编号
int count=0;
//编写循环,循环中发布数据
ros::Duration(3).sleep();
while(ros::ok())
{
count++;
std::stringstream ss;
ss << "hello --->" << count;
//msg.data="hello";
msg.data = ss.str();
pub.publish(msg);
//添加日志
ROS_INFO("发布的数据是:%s",ss.str().c_str());
rate.sleep();
ros::spinOnce();
}
return 0;
}
接收方实现
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
/*
订阅方实现
1.包含头文件
2.初始化ros节点
3.创建节点句柄
4.创建订阅者对象
5.处理订阅到的数据
6.spin()函数
*/
void doMsg(const std_msgs::String::ConstPtr &msg){
//通过msg获取并操作订阅到的数据
ROS_INFO("翠花订阅的数据:%s",msg->data.c_str());
}
int main(int argc,char *argv[])
{
setlocale(LC_ALL, "");
//2.初始化ros节点
ros::init(argc,argv,"cuiHua");
//3.创建节点句柄
ros::NodeHandle nh;
//4.创建订阅者对象
ros::Subscriber sub=nh.subscribe("fang",10,doMsg);
//5.处理订阅到的数据
ros::spin();
return 0;
}
Python实现
发布方实现
#! /usr/bin/env python
import rospy
from std_msgs.msg import String#发布消息的类型
"""
发布实现流程
1.导包
2.初始化 ROS 节点
3.创建发布者 对象
4.组织被发布的数据,并编写逻辑发布数据
"""
if __name__=="__main__":
#2.初始化 ROS 节点
rospy.init_node("talker_p") #传入节点名称
#3.创建发布者 对象
pub=rospy.Publisher("che",String,queue_size=10)
#4.组织被发布的数据,并编写逻辑发布数据
#创建数据
msg=String()
#指定发布频率
rate=rospy.Rate(1)
#设置技术器
count=0
#使用循环发布数据
rospy.sleep(3)
while not rospy.is_shutdown():
count+=1
msg.data="hello"+str(count)
#发布数据
pub.publish(msg)
rospy.loginfo("发布的数据:%s",msg.data)
rate.sleep()
接收方实现
#! /usr/bin/env python
import rospy
from std_msgs.msg import String#订阅消息的类型
"""
订阅实现流程
1.导包
2.初始化 ROS 节点
3.实例化 订阅者 对象
4.回调函数处理数据
5.spin()
"""
def doMsg(msg):
rospy.loginfo("我订阅的数据:%s",msg.data)
if __name__=="__main__":
#2.初始化 ROS 节点
rospy.init_node("listener_p") #传入节点名称
#3.实例化 订阅者 对象
sub=rospy.Subscriber("che",String,doMsg,queue_size=10)
#4.回调函数处理数据
#5.spin()
rospy.spin()