文章目录

  • 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++版

  1. 创建工作空间并编译

     mkdir -p workspace/src //创建工作空间cd workspace  //进入工作空间catkin_make  //编译,生成devel和build文件夹
    
  2. 创建ROS包并添加依赖
    cd src
    catkin_creat_pkg 功能包名 roscpp rospy std_msgs
    
  3. 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;
    }
    
  4. 配置文件并编译
    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}
    )
    
  5. 编译并运行
    cd 工作空间
    catkin_make
    roscore
    cd 工作空间
    source ./devel/setup.bash
    rosrun 包名 节点名
    

2、Python版

  1. 创建sripts文件夹
  2. 代码实现
    #! /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()
    
  3. 配置Cmakelists.txt文件
    catkin_install_python(PROGRAMS
    scripts/talker_p.py
    scripts/listener_p.py
    DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
    )
    
  4. 运行代码
    cd 工作空间
    catkin_make
    roscore
    source devel/setup.bash
    rosrun 包名 .py
    

二、话题通信原理,代码实现相关推荐

  1. 【ROS话题通信】发布者和订阅者

    前言 本文记录ROS话题通信的学习过程,便于后续复习.首先明确,ROS中的话题通信,在ROS通信中非常重要,实现了分布式发布接收消息,也是实现了不同编程语言间的解耦,下面记录下自己学习过程中的相关代码 ...

  2. 【ROS入门-4】嘴对嘴讲解ROS的核心概念——ROS话题通信机制

    文章目录 前言 ROS系列文章 ROS的通信机制 话题(topic) 发布者 订阅者 消息(Message) 用C++来写话题通信的代码 发布者 订阅者 使用rqt_graph 源码附录 引用说明 参 ...

  3. Android10.0 Binder通信原理(二)-Binder入门篇

    摘要:本节主要来讲解Android10.0 Binder的设计原理,如何设计一个Binder通信 阅读本文大约需要花费15分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分 ...

  4. 深入浅出通信原理连载41-70(Python代码版)

    目录 深入浅出通信原理Python代码版 码元(Symbol)详解 BPSK旋转向量理解 PSK=映射+调制 调制解调与傅里叶级数展开 矩形波的复傅立叶级数 离散谱推广到连续谱 各种有用的频谱指标 深 ...

  5. MATLAB/Simulink 通信原理及仿真学习(二)

    文章目录 MATLAB/Simulink 通信原理及仿真学习(二) simulink仿真 常用的Simulink库 1. 信号源模块库 2. 数序运算模块 3. 信号输出模块库 4.仿真搭建 5.搭建 ...

  6. cubemx stm32 陶晶驰 串口屏 基于YXY通信原理的串口屏驱动代码

    陶晶驰串口屏 资料 陶晶驰串口屏是本质是一个MCU,屏幕是MCU的模块,一般是一块TFT屏幕.在串口屏厂商提供的软件上面编写界面,然后通过串口直接烧到串口屏的MCU上,然后在屏幕上展示出来. 串口屏资 ...

  7. 通信使用matlab三元码实验报告,Matlab仿真DSBSC信号与双极性不归零码通信原理实验报告二实验...

    Matlab仿真DSBSC信号与双极性不归零码通信原理实验报告二实验 Matlab 仿真 DSB-SC 信号与双极性不归零码通信原理实验报告二实验题目:Matlab 仿真 DSB-SC 信号与双极性不 ...

  8. 【通信原理】实验二 角度调制实验

    目录 实验二 角度调制实验 一.实验目的 二.实验原理: 1.角度调制 (1)角度调制 (1)频率调制(FM): (2)相位调制(PM) (3)单音调制FM与PM (4)非相干解调 2.MATLAB中 ...

  9. python 通信系统仿真_深入浅出通信原理连载22-40(Python代码版)

    深入浅出通信原理Python代码版 深入浅出通信原理是陈爱军的心血之作,于通信人家园连载,此处仅作python代码笔记训练所用 陈老师的连载从多项式乘法讲起,一步一步引出卷积.傅立叶级数展开.旋转向量 ...

最新文章

  1. 虚拟化中的SR-IOV
  2. 使用OpenMP实现多线程,不仅是用在循环处理上
  3. 怎样在 Markdown 中使程序代码带上行号
  4. 问到ConcurrentHashMap不要再提Segment了
  5. Spring MVC和Thymeleaf:如何从模板访问数据
  6. android 提供的方法,Android编程之创建自己的内容提供器实现方法
  7. Mac开发必备工具(二)—— iTerm 2
  8. 壁纸控、视觉控少不了高图网解决图片需求问题
  9. JMS学习(java)
  10. 路由器 android 打印机,谷歌关闭云打印服务,安卓和Chrome办公用户要慌了
  11. 有关Ajax实现的两种方法
  12. 新主播如何在直播行业混得好
  13. 《古代汉语》王力笔记整理版
  14. SpringBoot整合EasyExcel实现Excel表格的导出功能
  15. 23位子网掩码是多少_24位子网掩码,多少个IP地址
  16. pc计算机shift,电脑上的shift键怎么读?shift表示什么意思?
  17. flea-common使用之通用策略模式实现
  18. 阿里云盘 Mac客户端(附mac/win版)v2.1.6中文内测版
  19. 深圳小汽车车牌竞拍价格预测
  20. UnityEditor之VisualElement的样式uss的背景颜色和字体设置

热门文章

  1. java抽象方法声明_java抽象类和抽象方法
  2. android 模拟返回键
  3. 2021 icpc 沈阳 J-Luggage Lock
  4. 金蝶首席用户体验官对“用户体验”的思考
  5. 要报销的发票如何批量下载打印
  6. 计算机平面设计必学英语,平面设计师常用的11款英文字体打包
  7. corelDRAW视频教程
  8. 马士兵教你如何面试(记录原话)
  9. python手记(四):pillow(四) ImageDraw模块 图片绘制(图片上自定义绘制)
  10. 速达软件二次开发-百威要货单和速达采购订单对接