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话题(八)相关推荐

  1. 王二是如何看到李四的《艳娘传奇》的,快来了解一下ROS2的话题机制吧!

    你好,我是小鱼,最近疫情有些严重,大家一定要注重好个人防护. 你还记得ROS镇的故事吗?(ROS2子承父位.ROS镇长安详晚年!祈祷郑州平安!)后来ROS2镇长来了之后,王二订报的方式也发生了改变,让 ...

  2. ROS2学习(八).ROS概念 - ROS 2接口(Ros2 interface)

    ROS 2接口 背景 消息描述规范 Fields*字段* Fields type*字段类型* Fields name*字段名称* Fields default value*字段默认值* Constan ...

  3. ROS2教程 04 话题Topic

    一.ROS2 话题Topic 示意图 ROS2的Topic可以是一对一,一对多,多对一,多对多,同一个话题Topic可以被不同的节点Node订阅与发布 二.与ros1区别 topic下有多种命令,以下 ...

  4. ROS2入门教程—理解话题(Topic)

    ROS2入门教程-理解话题(Topic) 1 启动小海龟仿真器 2 rqt_graph 3 ros2 topic list 4 ros2 topic echo 5 ros2 topic info 6 ...

  5. ROS2 基础概念 话题

    ROS2 基础概念 话题 1. Topics 2. rqt_graph 3. 话题 4. 话题类型 5. 话题发布 6. 话题频率 1. Topics 话题是节点交换消息的总线 节点可以向任意数量的话 ...

  6. 古月居ros课件_【古月居】ROS2探索总结系列

    ROS2探索总结(一)--ROS成长记 http://www.guyuehome.com/772 ROS2探索总结(二)--走近ROS2.0时代 http://www.guyuehome.com/80 ...

  7. ROS2学习(十一).ROS概念 - 命令行工具的使用

    命令行工具 概述 用法 样例 其他说明 实现 概述 ROS 2包含有一系列的命令行工具用以对ROS 2系统观测. 用法 命令ros2是所有命令的入口,它具有各种子命令,用于观察并处理节点.主题.服务等 ...

  8. ROS2—小海龟仿真器基础使用

    小海龟(Turtlesim)是ROS2中一个非常重要的入门级例程,通过海龟仿真,我们可以了解到很多ROS2的底层原理,涉及节点.话题.服务等核心概念. 1.安装海龟仿真器 Linux: sudo ap ...

  9. ROS2教程(入门级):记录和回播数据

    目标: 记录从话题发布出来的数据,以便我们可以随时回放和检查它. 背景知识 ros2 bag是一个用来记录你的系统中的话题所发布的数据的命令行工具.它可以收集任意多个话题所发布的数据,并且将数据保存在 ...

最新文章

  1. 我花了三个小时写了一道题的六千字题解....(POJ 2888 Magic Bracelet)
  2. 如何使用Exchange邮件组仲裁
  3. [导入]XML for Analysis(XMLA)开发详解-(3)各版本的SQL Server及Windows下配置XMLA over HTTP访问SASS(OLAP)的文档合集...
  4. 关于在html中正常,在aspx中乱码的问题
  5. 苏宁大战京东,这个618消费者终于薅到了真羊毛?
  6. 问题 B: 数塔问题
  7. IntelliJ IDEA for Mac在MacOS模式下的选择快捷键(Select Shortcut)
  8. mysql与oracle链接超时_数据库连接超时问题(求解)
  9. python二多分支例题_Python分支语句练习题
  10. 着迷英语900句_开明的系统管理员如何让我着迷于Linux
  11. 自用_C/C++报错记录汇总
  12. .net 连接ORACLE 数据库字符串
  13. iOS App图标和启动画面尺寸http://www.jianshu.com/p/adpKye
  14. python删除重复文件
  15. matlab中Folder是什么意思,matlab – @folder和文件夹
  16. 【公开课】【阿里在线技术峰会】魏鹏:基于Java容器的多应用部署技术实践
  17. input输入框添加键盘事件
  18. Win10删除Xbox
  19. Android 加密之文件加密(FBE)
  20. python出租车数据_1-出租车数据的基础处理,由gps生成OD(pandas).ipynb

热门文章

  1. excel如何把多张表合并成一个表_EXCEL如何把多个表格合并成一个表格
  2. bilibili视频下载神器[无广告]
  3. Echarts常用图组件
  4. 车载相关测试工具之CANalyzer
  5. 2022考研笔记-政治(马原-科学社会主义理论)
  6. Oracle的SQL中常用时间相关缩写对应表总结
  7. c#学习记录之Indexof()
  8. S7-200 SMART PLC和V20变频器绕线机控制应用
  9. 创建GIT项目,并初始化上传项目代码
  10. 《嵌入式系统 - RT-Thread开发笔记》 第三部分 RT-Thread 移植与设备驱动开发 - 第1章 RT-Thread 开发环境搭建(RT-Thread Studio)