二、话题通信原理,代码实现
文章目录
- 1、通信原理
- 0、talker注册
- 1、listener注册
- 2、ROS Master实现信息匹配
- 3、Listener向Talker发送连接请求
- 4、Talker确认请求
- 5、建立连接
- 6、Talker向Listener发送信息
- 2、代码实现
- 1、C++版
- 2、Python版
1、通信原理
整个通信过程分为六步,0-4步采用RPC协议,5-6步采用TCP协议。此外,第一步和第二步不分先后,但由于talker注册需要花费时间,可能导致订阅者无法接收到前几条消息,可通过设置延迟进行解决。
0、talker注册
talker通过RPC协议向master注册节点信息:
- 话题名:bar
- RPC地址:1234
1、listener注册
listener通过RPC协议向master注册自身信息:
- 需要订阅的话题名:bar
2、ROS Master实现信息匹配
ROS Master根据注册表进行信息匹配,并通过RPC协议向listener发送talker的RPC地址
3、Listener向Talker发送连接请求
listener根据master提供的RPC地址,向talker发送连接请求:
- 订阅的话题名称
- 消息类型
- 通信协议(TCP/UDP)
4、Talker确认请求
talker接收到连接请求连接后,通过RPC协议向listener确认连接:
- TCP地址
5、建立连接
listener根据第四不的TCP地址建立连接,此时,如果ROS Master关闭,二者仍然可以建立连接
6、Talker向Listener发送信息
2、代码实现
1、C++版
- 创建工作空间并编译
mkdir -p workspace/src //创建工作空间cd workspace //进入工作空间catkin_make //编译,生成devel和build文件夹
- 创建ROS包并添加依赖
cd src catkin_creat_pkg 功能包名 roscpp rospy std_msgs
- C++源码实现
//1.包含头文件 #include "ros/ros.h" #include "std_msgs/String.h"//用于定义传递信息类型 #include <sstream>int main(int argc, char *argv[]){setlocale(LC_ALL,"");//防止乱码//2.节点初始化//前两个参数用来传递信息,后面哪个为节点名称,在rqt_graph标识唯一ros::init(argc,argv,"talker");//3.创建节点句柄ros::NodeHandle nh;//4.创建发布对象//第一个参数为发布的话题,第二个参数为最大保存的消息数,超出时,最早进入的消息会被删除ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);//5.组织被发布的数据std_msgs::String msg;//创建要发布的数据std::string msg_front = "hello 您好!";int count = 0;ros::Rate r(1);//设置数据发布速率while(ros::ok()){std::stringstream ss;ss << msg_front << count;msg.data = ss.str();pub.publish(msg);//发布消息ROS_INFO("发送的消息:%s",msg.data.c_str());r.sleep();count++;ros::spinOnce();}return 0; }
//1.包含头文件 #include "ros/ros.h" #include "std_msgs/String.h"void doMsg(const std_msgs::String::ConstPtr&msg_p){ROS_INFO("我听见:%s",msg_p->data.c_str()); }int main(int argc, char *argv[]){setlocale(LC_ALL,"");//2.初始化节点ros::init(argc,argv,"listener");//3.创建ROS句柄ros::NodeHandle nh;//4.实例化订阅对象,包括话题名称,消息长度,回调函数ros::Subscriber sub = nh.subscribe<std_msgs::String>("chatter",10,doMsg);//5.处理订阅的消息//6.设置循环调用回调函数ros::spin();return 0; }
- 配置文件并编译
add_executable(Hello_pub src/Hello_pub.cpp ) add_executable(Hello_sub src/Hello_sub.cpp )target_link_libraries(Hello_pub ${catkin_LIBRARIES} ) target_link_libraries(Hello_sub ${catkin_LIBRARIES} )
- 编译并运行
cd 工作空间 catkin_make roscore cd 工作空间 source ./devel/setup.bash rosrun 包名 节点名
2、Python版
- 创建sripts文件夹
- 代码实现
#! /usr/bin/env python#1.导包 import rospy from std_msgs.msg import String #定义数据类型的包if __name__ == "__main__":#2.初始化ROS节点rospy.init_node("talker_p")#节点名称唯一,否则会报错#3.实例化发布者对象pub = rospy.Publisher("chatter_p",String,queue_size=10)#4.组织发布数据msg = String()msg_font = "hello python"count = 0#设置循环频率rate = rospy.Rate(10)while not rospy.is_shutdown():msg.data = msg_font + str(count)pub.publish(msg)rate.sleep()rospy.loginfo("data:%s",msg.data)count += 1
#! /usr/bin/env python#1.导包import rospyfrom std_msgs.msg import Stringdef doMsg(msg):rospy.loginfo("我听见:%s",msg.data)if __name__ == "__main__":#2.初始化ROS节点rospy.init_node("listener_p")#3.实例化订阅者sub = rospy.Subscriber("chatter",String,doMsg,queue_size=10)#4.处理订阅的消息#5.设置循环调用回调函数rospy.spin()
- 配置Cmakelists.txt文件
catkin_install_python(PROGRAMS scripts/talker_p.py scripts/listener_p.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} )
- 运行代码
cd 工作空间 catkin_make roscore source devel/setup.bash rosrun 包名 .py
二、话题通信原理,代码实现相关推荐
- 【ROS话题通信】发布者和订阅者
前言 本文记录ROS话题通信的学习过程,便于后续复习.首先明确,ROS中的话题通信,在ROS通信中非常重要,实现了分布式发布接收消息,也是实现了不同编程语言间的解耦,下面记录下自己学习过程中的相关代码 ...
- 【ROS入门-4】嘴对嘴讲解ROS的核心概念——ROS话题通信机制
文章目录 前言 ROS系列文章 ROS的通信机制 话题(topic) 发布者 订阅者 消息(Message) 用C++来写话题通信的代码 发布者 订阅者 使用rqt_graph 源码附录 引用说明 参 ...
- Android10.0 Binder通信原理(二)-Binder入门篇
摘要:本节主要来讲解Android10.0 Binder的设计原理,如何设计一个Binder通信 阅读本文大约需要花费15分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分 ...
- 深入浅出通信原理连载41-70(Python代码版)
目录 深入浅出通信原理Python代码版 码元(Symbol)详解 BPSK旋转向量理解 PSK=映射+调制 调制解调与傅里叶级数展开 矩形波的复傅立叶级数 离散谱推广到连续谱 各种有用的频谱指标 深 ...
- MATLAB/Simulink 通信原理及仿真学习(二)
文章目录 MATLAB/Simulink 通信原理及仿真学习(二) simulink仿真 常用的Simulink库 1. 信号源模块库 2. 数序运算模块 3. 信号输出模块库 4.仿真搭建 5.搭建 ...
- cubemx stm32 陶晶驰 串口屏 基于YXY通信原理的串口屏驱动代码
陶晶驰串口屏 资料 陶晶驰串口屏是本质是一个MCU,屏幕是MCU的模块,一般是一块TFT屏幕.在串口屏厂商提供的软件上面编写界面,然后通过串口直接烧到串口屏的MCU上,然后在屏幕上展示出来. 串口屏资 ...
- 通信使用matlab三元码实验报告,Matlab仿真DSBSC信号与双极性不归零码通信原理实验报告二实验...
Matlab仿真DSBSC信号与双极性不归零码通信原理实验报告二实验 Matlab 仿真 DSB-SC 信号与双极性不归零码通信原理实验报告二实验题目:Matlab 仿真 DSB-SC 信号与双极性不 ...
- 【通信原理】实验二 角度调制实验
目录 实验二 角度调制实验 一.实验目的 二.实验原理: 1.角度调制 (1)角度调制 (1)频率调制(FM): (2)相位调制(PM) (3)单音调制FM与PM (4)非相干解调 2.MATLAB中 ...
- python 通信系统仿真_深入浅出通信原理连载22-40(Python代码版)
深入浅出通信原理Python代码版 深入浅出通信原理是陈爱军的心血之作,于通信人家园连载,此处仅作python代码笔记训练所用 陈老师的连载从多项式乘法讲起,一步一步引出卷积.傅立叶级数展开.旋转向量 ...
最新文章
- 虚拟化中的SR-IOV
- 使用OpenMP实现多线程,不仅是用在循环处理上
- 怎样在 Markdown 中使程序代码带上行号
- 问到ConcurrentHashMap不要再提Segment了
- Spring MVC和Thymeleaf:如何从模板访问数据
- android 提供的方法,Android编程之创建自己的内容提供器实现方法
- Mac开发必备工具(二)—— iTerm 2
- 壁纸控、视觉控少不了高图网解决图片需求问题
- JMS学习(java)
- 路由器 android 打印机,谷歌关闭云打印服务,安卓和Chrome办公用户要慌了
- 有关Ajax实现的两种方法
- 新主播如何在直播行业混得好
- 《古代汉语》王力笔记整理版
- SpringBoot整合EasyExcel实现Excel表格的导出功能
- 23位子网掩码是多少_24位子网掩码,多少个IP地址
- pc计算机shift,电脑上的shift键怎么读?shift表示什么意思?
- flea-common使用之通用策略模式实现
- 阿里云盘 Mac客户端(附mac/win版)v2.1.6中文内测版
- 深圳小汽车车牌竞拍价格预测
- UnityEditor之VisualElement的样式uss的背景颜色和字体设置