ROS2——topic话题(八)
ROS2机器人操作系统
文章目录
- ROS2机器人操作系统
- 前言
- 一、topic话题
- 1.通信模型
- 2.发布订阅模型
- 3.多对多通信
- 4.异步通信
- 5.消息结构
- 二、话题实例
- 1.Hello World话题通信
- 发布者代码解析
- 订阅者代码解析
- 2.话题命令行操作
- 总结
前言
节点实现了机器人各种各样的功能,但这些功能并不是独立的,之间会有千丝万缕的联系,其中最重要的一种联系方式就是话题,它是节点间传递数据的桥梁。
一、topic话题
1.通信模型
以两个机器人节点为例。A节点的功能是驱动相机这个硬件设备,获取得到相机拍摄的图像信息,B节点的功能是视频监控,将相机拍摄到的图像实时显示给用户查看。此时从节点A到节点B传递图像数据的方式,在ROS中,我们就称之为话题,它作为一个桥梁,实现了节点之间某一个方向上的数据传输。
2.发布订阅模型
从话题本身的实现角度来看,使用了基于DDS的发布/订阅模型,什么叫发布和订阅呢?
话题数据传输的特性是从一个节点到另外一个节点,发送数据的对象称之为发布者,接收数据的对象称之为订阅者,每一个话题都需要有一个名字,传输的数据也需要有固定的数据类型。
怎么说呢,发布和订阅的关系就类似于,我创建了一个发布者,我把消息发布了出去,你什么订阅我不管,我反正是把消息发送到了一个频道,你订阅了变可以查看我发布的消息,同样也可以很多个人订阅。你没有订阅当然是看不到的
3.多对多通信
大家再仔细想下这些可以订阅的东西,是不是并不是唯一的,我们每个人可以订阅很多公众号、报纸、杂志,这些公众号、报纸、杂志也可以被很多人订阅,没错,ROS里的话题也是一样,发布者和订阅者的数量并不是唯一的,可以称之为是多对多的通信模型。
因为话题是多对多的模型,发布控制指令的摇杆可以有一个,也可以有2个、3个,订阅控制指令的机器人可以有1个,也可以有2个、3个,大家可以想象一下这个画面,似乎还是挺魔性的,如果存在多个发送指令的节点,建议大家要注意区分优先级,不然机器人可能不知道该听谁的了。
4.异步通信
话题通信还有一个特性,那就是异步,这个词可能有同学是第一次听说?所谓异步,只要是指发布者发出数据后,并不知道订阅者什么时候可以收到,这就叫做异步。
异步的特性也让话题更适合用于一些周期发布的数据,比如传感器的数据,运动控制的指令等等,如果某些逻辑性较强的指令,比如修改某一个参数,用话题传输就不太合适了。
5.消息结构
最后,既然是数据传输,发布者和订阅者就得统一数据的描述格式,不能一个说英文,一个理解成了中文。在ROS中,话题通信数据的描述格式称之为消息,对应编程语言中数据结构的概念。比如这里的一个图像数据,就会包含图像的长宽像素值、每个像素的RGB等等,在ROS中都有标准定义。
消息是ROS中的一种接口定义方式,与编程语言无关,我们也可以通过.msg后缀的文件自行定义,有了这样的接口,各种节点就像积木块一样,通过各种各样的接口进行拼接,组成复杂的机器人系统。
二、话题实例
1.Hello World话题通信
启动第一个终端,运行话题的发布者节点:
ros2 run learning_topic topic_helloworld_pub
启动第二个终端,运行话题的订阅者节点:
ros2 run learning_topic topic_helloworld_sub
发布者代码解析
import rclpy # ROS2 Python接口库
from rclpy.node import Node # ROS2 节点类
from std_msgs.msg import String # **字符串消息类型**"""
创建一个发布者节点
"""
class PublisherNode(Node):def __init__(self, name):super().__init__(name) # ROS2节点父类初始化self.pub = self.create_publisher(String, "chatter", 10) # **创建发布者对象(消息类型、话题名、队列长度)**self.timer = self.create_timer(0.5, self.timer_callback) # 创建一个定时器(单位为秒的周期,定时执行的回调函数)def timer_callback(self): # 创建定时器周期执行的回调函数msg = String() # **创建一个String类型的消息对象**msg.data = 'Hello World' # **填充消息对象中的消息数据**self.pub.publish(msg) # 发布话题消息self.get_logger().info('Publishing: "%s"' % msg.data) # 输出日志信息,提示已经完成话题发布def main(args=None): # ROS2节点主入口main函数rclpy.init(args=args) # ROS2 Python接口初始化node = PublisherNode("topic_helloworld_pub") # 创建ROS2节点对象并进行初始化rclpy.spin(node) # 循环等待ROS2退出node.destroy_node() # 销毁节点对象rclpy.shutdown() # 关闭ROS2 Python接口
完成代码的编写后需要设置功能包的编译选项,让系统知道Python程序的入口,打开功能包的setup.py文件,加入如下入口点的配置:
entry_points={'console_scripts': ['topic_helloworld_pub = learning_topic.topic_helloworld_pub:main',],},
流程总结
对以上程序进行分析,如果我们想要实现一个发布者,流程如下:
编程接口初始化
创建节点并初始化
创建发布者对象
创建并填充话题消息
发布话题消息
销毁节点并关闭接口
订阅者代码解析
import rclpy # ROS2 Python接口库
from rclpy.node import Node # ROS2 节点类
from std_msgs.msg import String # ROS2标准定义的String消息"""
创建一个订阅者节点
"""
class SubscriberNode(Node):def __init__(self, name):super().__init__(name) # ROS2节点父类初始化self.sub = self.create_subscription(\String, "chatter", self.listener_callback, 10) # 创建订阅者对象(消息类型、话题名、订阅者回调函数、队列长度)def listener_callback(self, msg): # 创建回调函数,执行收到话题消息后对数据的处理self.get_logger().info('I heard: "%s"' % msg.data) # 输出日志信息,提示订阅收到的话题消息def main(args=None): # ROS2节点主入口main函数rclpy.init(args=args) # ROS2 Python接口初始化node = SubscriberNode("topic_helloworld_sub") # 创建ROS2节点对象并进行初始化rclpy.spin(node) # 循环等待ROS2退出node.destroy_node() # 销毁节点对象rclpy.shutdown() # 关闭ROS2 Python接口
完成代码的编写后需要设置功能包的编译选项,让系统知道Python程序的入口,打开功能包的setup.py文件,加入如下入口点的配置:
entry_points={'console_scripts': ['topic_helloworld_pub = learning_topic.topic_helloworld_pub:main','topic_helloworld_sub = learning_topic.topic_helloworld_sub:main',],},
流程总结
对以上程序进行分析,如果我们想要实现一个订阅者,流程如下:
编程接口初始化
创建节点并初始化
创建订阅者对象
回调函数处理话题数据
销毁节点并关闭接口
同样也可以用机器视觉来解释,这里就不过多赘述了,可以去看古月的视频。
2.话题命令行操作
ros2 topic list # 查看话题列表
ros2 topic info <topic_name> # 查看话题信息
ros2 topic hz <topic_name> # 查看话题发布频率
ros2 topic bw <topic_name> # 查看话题传输带宽
ros2 topic echo <topic_name> # 查看话题数据
ros2 topic pub <topic_name> <msg_type> <msg_data> # 发布话题消息
总结
话题通信的特性是单向传输、异步通信,适合周期性的数据传递,对于一个复杂的机器人系统来讲,这种特性肯定无法满足所有数据传输的需求.
ROS2——topic话题(八)相关推荐
- 王二是如何看到李四的《艳娘传奇》的,快来了解一下ROS2的话题机制吧!
你好,我是小鱼,最近疫情有些严重,大家一定要注重好个人防护. 你还记得ROS镇的故事吗?(ROS2子承父位.ROS镇长安详晚年!祈祷郑州平安!)后来ROS2镇长来了之后,王二订报的方式也发生了改变,让 ...
- ROS2学习(八).ROS概念 - ROS 2接口(Ros2 interface)
ROS 2接口 背景 消息描述规范 Fields*字段* Fields type*字段类型* Fields name*字段名称* Fields default value*字段默认值* Constan ...
- ROS2教程 04 话题Topic
一.ROS2 话题Topic 示意图 ROS2的Topic可以是一对一,一对多,多对一,多对多,同一个话题Topic可以被不同的节点Node订阅与发布 二.与ros1区别 topic下有多种命令,以下 ...
- ROS2入门教程—理解话题(Topic)
ROS2入门教程-理解话题(Topic) 1 启动小海龟仿真器 2 rqt_graph 3 ros2 topic list 4 ros2 topic echo 5 ros2 topic info 6 ...
- ROS2 基础概念 话题
ROS2 基础概念 话题 1. Topics 2. rqt_graph 3. 话题 4. 话题类型 5. 话题发布 6. 话题频率 1. Topics 话题是节点交换消息的总线 节点可以向任意数量的话 ...
- 古月居ros课件_【古月居】ROS2探索总结系列
ROS2探索总结(一)--ROS成长记 http://www.guyuehome.com/772 ROS2探索总结(二)--走近ROS2.0时代 http://www.guyuehome.com/80 ...
- ROS2学习(十一).ROS概念 - 命令行工具的使用
命令行工具 概述 用法 样例 其他说明 实现 概述 ROS 2包含有一系列的命令行工具用以对ROS 2系统观测. 用法 命令ros2是所有命令的入口,它具有各种子命令,用于观察并处理节点.主题.服务等 ...
- ROS2—小海龟仿真器基础使用
小海龟(Turtlesim)是ROS2中一个非常重要的入门级例程,通过海龟仿真,我们可以了解到很多ROS2的底层原理,涉及节点.话题.服务等核心概念. 1.安装海龟仿真器 Linux: sudo ap ...
- ROS2教程(入门级):记录和回播数据
目标: 记录从话题发布出来的数据,以便我们可以随时回放和检查它. 背景知识 ros2 bag是一个用来记录你的系统中的话题所发布的数据的命令行工具.它可以收集任意多个话题所发布的数据,并且将数据保存在 ...
最新文章
- 我花了三个小时写了一道题的六千字题解....(POJ 2888 Magic Bracelet)
- 如何使用Exchange邮件组仲裁
- [导入]XML for Analysis(XMLA)开发详解-(3)各版本的SQL Server及Windows下配置XMLA over HTTP访问SASS(OLAP)的文档合集...
- 关于在html中正常,在aspx中乱码的问题
- 苏宁大战京东,这个618消费者终于薅到了真羊毛?
- 问题 B: 数塔问题
- IntelliJ IDEA for Mac在MacOS模式下的选择快捷键(Select Shortcut)
- mysql与oracle链接超时_数据库连接超时问题(求解)
- python二多分支例题_Python分支语句练习题
- 着迷英语900句_开明的系统管理员如何让我着迷于Linux
- 自用_C/C++报错记录汇总
- .net 连接ORACLE 数据库字符串
- iOS App图标和启动画面尺寸http://www.jianshu.com/p/adpKye
- python删除重复文件
- matlab中Folder是什么意思,matlab – @folder和文件夹
- 【公开课】【阿里在线技术峰会】魏鹏:基于Java容器的多应用部署技术实践
- input输入框添加键盘事件
- Win10删除Xbox
- Android 加密之文件加密(FBE)
- python出租车数据_1-出租车数据的基础处理,由gps生成OD(pandas).ipynb
热门文章
- excel如何把多张表合并成一个表_EXCEL如何把多个表格合并成一个表格
- bilibili视频下载神器[无广告]
- Echarts常用图组件
- 车载相关测试工具之CANalyzer
- 2022考研笔记-政治(马原-科学社会主义理论)
- Oracle的SQL中常用时间相关缩写对应表总结
- c#学习记录之Indexof()
- S7-200 SMART PLC和V20变频器绕线机控制应用
- 创建GIT项目,并初始化上传项目代码
- 《嵌入式系统 - RT-Thread开发笔记》 第三部分 RT-Thread 移植与设备驱动开发 - 第1章 RT-Thread 开发环境搭建(RT-Thread Studio)