ROS2机器人操作系统

文章目录

  • ROS2机器人操作系统
  • 前言
  • 一、什么是DDS
    • DDS在ROS2中的应用
    • 质量服务策略QoS
  • 二、使用案例
    • 1.在命令行中配置DDS
    • 2.DDS编程示例
  • 总结

前言

ROS2中最为重大的变化——DDS,我们在前边课程中学习的话题、服务、动作,他们底层通信的具体实现过程,都是靠DDS来完成的,它相当于是ROS机器人系统中的神经网络。DDS的核心是通信,能够实现通信的模型和软件框架非常多,这里我们列出常用的四种模型。

第一种,点对点模型,许多客户端连接到一个服务端,每次通信时,通信双方必须建立一条连接。当通信节点增多时,连接数也会增多。而且每个客户端都需要知道服务器的具体地址和所提供的服务,一旦服务器地址发生变化,所有客户端都会受到影响。

第二种,Broker模型,针对点对点模型进行了优化,由Broker集中处理所有人的请求,并进一步找到真正能响应该服务的角色。这样客户端就不用关心服务器的具体地址了。不过问题也很明显,Broker作为核心,它的处理速度会影响所有节点的效率,当系统规模增长到一定程度,Broker就会成为整个系统的性能瓶颈。更麻烦是,如果Broker发生异常,可能导致整个系统都无法正常运转。之前的ROS1系统,使用的就是类似这样的架构。

第三种,广播模型,所有节点都可以在通道上广播消息,并且节点都可以收到消息。这个模型解决了服务器地址的问题,而且通信双方也不用单独建立连接,但是广播通道上的消息太多了,所有节点都必须关心每条消息,其实很多是和自己没有关系的。

第四种,就是以数据为中心的DDS模型了,这种模型与广播模型有些类似,所有节点都可以在DataBus上发布和订阅消息。但它的先进之处在于,通信中包含了很多并行的通路,每个节点可以只关心自己感兴趣的消息,忽略不感兴趣的消息,有点像是一个旋转火锅,各种好吃的都在这个DataBus传送,我们只需要拿自己想吃的就行,其他的和我们没有关系。

一、什么是DDS

DDS并不是一个新的通信方式,在ROS2之前,DDS已经广泛应用在很多领域,比如航空,国防,交通,医疗,能源等。

如在自动驾驶领域,通常会存在感知,预测,决策和定位等模块,这些模块都需要非常高速和频繁地交换数据。借助DDS,可以很好地满足它们的通信需求。

DDS的全称是Data Distribution Service,也就是数据分发服务,2004年由对象管理组织OMG发布和维护,是一套专门为实时系统设计的数据分发/订阅标准,最早应用于美国海军, 解决舰船复杂网络环境中大量软件升级的兼容性问题,现在已经成为强制标准。

DDS强调以数据为中心,可以提供丰富的服务质量策略,以保障数据进行实时、高效、灵活地分发,可满足各种分布式实时通信应用需求。

DDS在ROS2中的应用

DDS在ROS2系统中的位置至关重要,所有上层建设都建立在DDS之上。在这个ROS2的架构图中,蓝色和红色部分就是DDS。

DDS是一种通信的标准,就像4G、5G一样,既然是标准,那大家都可以按照这个标准来实现对应的功能,所以华为、高通都有很多5G的技术专利,DDS也是一样,能够按照DDS标准实现的通信系统很多,这里每一个红色模块,就是某一企业或组织实现的一种DDS系统。

既然可选用的DDS这么多,那我们该用哪一个呢?具体而言,他们肯定都符合基本标准,但还是会有性能上的差别,ROS2的原则就是尽量兼容,让用户根据使用场景选择,比如个人开发,我们选择一个开源版本的DDS就行,如果是工业应用,那可能得选择一个商业授权的版本了。

为了实现对多个DDS的兼容,ROS设计了一个Middleware中间件,也就是一个统一的标准,不管我们用那个DDS,保证上层编程使用的函数接口都是一样的。此时兼容性的问题就转移给了DDS厂商,如果他们想让自己的DDS系统进入ROS生态,就得按照ROS的接口标准,开发一个驱动,也就是这个部分。

无论如何,ROS的宗旨不变,要提高软件代码的复用性,下边DDS任你边,上边的软件没影响。

质量服务策略QoS


DDS中的基本结构是Domain,Domain将各个应用程序绑定在一起进行通信,回忆下之前我们配置树莓派和电脑通信的时候,配置的那个DOMAIN ID,就是对全局数据空间的分组定义,只有处于同一个DOMAIN小组中的节点才能互相通信。这样可以避免无用数据占用的资源。

DDS中另外一个重要特性就是质量服务策略,QoS。

QoS是一种网络传输策略,应用程序指定所需要的网络传输质量行为,QoS服务实现这种行为要求,尽可能地满足客户对通信质量的需求,可以理解为数据提供者和接收者之间的合约。

DEADLINE策略,表示通信数据必须要在每次截止时间内完成一次通信;
HISTORY策略,表示针对历史数据的一个缓存大小;
RELIABILITY策略,表示数据通信的模式,配置成BEST_EFFORT,就是尽力传输模式,网络情况不好的时候,也要保证数据流畅,此时可能会导致数据丢失,配置成RELIABLE,就是可信赖模式,可以在通信中尽量保证图像的完整性,我们可以根据应用功能场景选择合适的通信模式;
DURABILITY策略,可以配置针对晚加入的节点,也保证有一定的历史数据发送过去,可以让新节点快速适应系统。
DDS的加入,让ROS2的通信系统焕然一新,多众多样的通信配置,可以更好的满足不同场景下的机器人应用。

二、使用案例

1.在命令行中配置DDS

启动第一个终端,我们使用best_effort创建一个发布者节点,循环发布任意数据,在另外一个终端中,如果我们使用reliable模型订阅同一话题,无法实现数据通信,如果修改为同样的best_effort,才能实现数据传输。

ros2 topic pub /chatter std_msgs/msg/Int32 "data: 42" --qos-reliability best_effort
ros2 topic echo /chatter --qos-reliability reliable
ros2 topic echo /chatter --qos-reliability best_effort


如何去查看ROS2系统中每一个发布者或者订阅者的QoS策略呢,在topic命令后边跟一个"–verbose"参数就行了。

ros2 topic info /chatter --verbose

2.DDS编程示例


启动两个终端,分别运行发布者和订阅者节点:

 ros2 run learning_qos qos_helloworld_pubros2 run learning_qos qos_helloworld_sub


看效果确实差不多,不过底层通信机理上可是有所不同的。
发布者代码解析

import rclpy                     # ROS2 Python接口库
from rclpy.node import Node      # ROS2 节点类
from std_msgs.msg import String  # 字符串消息类型
from rclpy.qos import QoSProfile, QoSReliabilityPolicy, QoSHistoryPolicy # ROS2 QoS类"""
创建一个发布者节点
"""
class PublisherNode(Node):def __init__(self, name):super().__init__(name)        # ROS2节点父类初始化qos_profile = QoSProfile(     # 创建一个QoS原则# reliability=QoSReliabilityPolicy.BEST_EFFORT,reliability=QoSReliabilityPolicy.RELIABLE,history=QoSHistoryPolicy.KEEP_LAST,depth=1)self.pub = self.create_publisher(String, "chatter", qos_profile) # 创建发布者对象(消息类型、话题名、QoS原则)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("qos_helloworld_pub") # 创建ROS2节点对象并进行初始化rclpy.spin(node)                           # 循环等待ROS2退出node.destroy_node()                        # 销毁节点对象rclpy.shutdown()                           # 关闭ROS2 Python接口

订阅者代码解析

import rclpy                                     # ROS2 Python接口库
from rclpy.node   import Node                    # ROS2 节点类
from std_msgs.msg import String                  # ROS2标准定义的String消息
from rclpy.qos import QoSProfile, QoSReliabilityPolicy, QoSHistoryPolicy  # ROS2 QoS类"""
创建一个订阅者节点
"""
class SubscriberNode(Node):def __init__(self, name):super().__init__(name)         # ROS2节点父类初始化qos_profile = QoSProfile(      # 创建一个QoS原则# reliability=QoSReliabilityPolicy.BEST_EFFORT,reliability=QoSReliabilityPolicy.RELIABLE,history=QoSHistoryPolicy.KEEP_LAST,depth=1)self.sub = self.create_subscription(\String, "chatter", self.listener_callback, qos_profile) # 创建订阅者对象(消息类型、话题名、订阅者回调函数、QoS原则)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("qos_helloworld_sub")    # 创建ROS2节点对象并进行初始化rclpy.spin(node)                               # 循环等待ROS2退出node.destroy_node()                            # 销毁节点对象rclpy.shutdown()                               # 关闭ROS2 Python接口

总结

DDS本身是一个非常复杂的系统,ROS2使用的也只是冰山一角。

ROS2——DDS(十三)相关推荐

  1. ROS2/DDS/QoS/主题的记录

    比较杂乱,调试会遇到问题,并且ROS2的问题和ROS1有非常大的差异性. 一些概念: 词汇表: DDS - 数据分发服务 RTPS - 实时发布订阅 QoS - 服务质量 客户端 - 也称为客户端,是 ...

  2. ROS2 DDS通信漫谈

    0. 前言 我们都知道ROS2比ROS1好很多,就比如说: 去中心化master,ROS和ROS2中间件不同之处在于,ROS2取消了master节点.在去中心化后,各个节点之间可以通过DDS的节点相互 ...

  3. ROS2+DDS+RTPS

    安装: zhangrelay@LAPTOP-5REQ7K1L:~$ sudo apt install ros-humble-rmw-fastrtps-cpp [sudo] password for z ...

  4. ROS2之DDS问题汇集

    参考: answers.ros.org/question/403517/ros2-network-communication-does-it-even-work-reliably/ reliably? ...

  5. ROS2机器人笔记20-10-24

    最近,忙了一段时间现代控制理论和单片机理论和实践的课程,从传统的课程中看到了生机,将其结合机器人和操作系统等应用场景. 单片机使用操作系统,如contiki实现资源分配和网络节点功能,非常有趣: 现代 ...

  6. 第二代机器人操作系统课程资料汇总 Course Learning Materials for ROS2 2019.10.23

    ROS2全部课程资料专栏:https://blog.csdn.net/zhangrelay/article/category/9327597 ROS2开发最新动态资讯:https://blog.csd ...

  7. ROS2机器人笔记21-02-16

    近期在移动设备(如手机)调试ROS较多,当然相关测试工作早就开始,但是水平和时间有限,bug多. 一些案例截图如下: 还有: 当然DDS也可以直接运行于Android设备上. 核心点位是DDS,如果掌 ...

  8. 集群多机ROS通信中间件:swarm_ros_bridge

    最近写了一个无线网络环境下(比如WIFI)多机ROS通信的ROS包"swarm_ros_bridge": https://gitee.com/shu-peixuan/swarm_r ...

  9. ROS2:自动驾驶汽车的合适的框架(DDS)

    ROS2:自动驾驶汽车的合适的框架 关键字:数据分发服务 DDS 在Apex.AI,我们开发了用于自动驾驶的经过认证软件.带有DDS的ROS 2是Apex.OS®的核心组成. Apex.OS是经过认证 ...

最新文章

  1. python实现yolo目标检测_从零开始PyTorch项目:YOLO v3目标检测实现
  2. 拯救尴尬:鉴黄神器NSFW JS开源了!
  3. RabbitMQ(八):SpringBoot 整合 RabbitMQ(三种消息确认机制以及消费端限流)
  4. 网络流 增广路 回退
  5. HDU - 6126 Give out candies
  6. 如何设置Win11系统右键刷新
  7. python作业不会做怎么办_不学点编程,将来怎么给孩子辅导作业——Python新手入门教程...
  8. 春节福利:《Oracle性能优化与诊断案例精选》电子版首次公开下载
  9. Flutter进阶第10篇: 本地存储,封装本地存储类,实现最简单的状态管理
  10. hadoop工作流引擎azkaban
  11. Win10系统添加英文键盘
  12. 华为笔记本在linux下越狱苹果设备(2022.2.27更新)
  13. 普通话水平测试这软件很准靠谱吗,普通话考试小细节,你知道多少?
  14. python mlagent 安装
  15. 如何实现系统公告或系统消息
  16. kettle-增加序列
  17. 使用Python实现量化交易机器人定时启动或停止小工具
  18. Linux_鸟哥基础篇笔记_第一部分Linux的规则安装_第2章主机规划与磁盘分区
  19. CSDN账号密码泄露真相
  20. TPS51200DRCR 德州TI具有用于 DDR2、DDR3、DDR3L 和 DDR4 的 VTTREF 缓冲基准的 3A 灌电流/拉电流 DDR 终端稳压器

热门文章

  1. 10次机会 js 猜数_JS猜数字游戏实例讲解
  2. 2022-2028全球与中国监管技术(RegTech)市场现状及未来发展趋势
  3. 关于输入法中文模式下怎么输入英文标点符号
  4. 一款带 Wi-Fi 功能的产品/模组可能需要通过哪些认证?
  5. 人际沟通风格介绍一【转载】
  6. 软件构造课程自我总结
  7. CTF-MISC总结
  8. Ubuntu下解决:Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)
  9. 盖楼大作战 | 不是吧?不是吧?这么涨知识又好玩的地方你还不来?
  10. 《C++ 开发从入门到精通》——2.4 输入输出基础