火星上的机器人(AI生成图像)
一、说明
ROS2是机器人的朋友,一个他们所依赖的平台,用于沟通、协调和控制,帮助他们实现目标。ROS2以DDS为核心,帮助机器人探索新世界、新任务、新可能性,是一个方便、便利的平台。从海龟到无人机,以及介于两者之间的一切,ROS2帮助机器人工作、学习和梦想,它是一个强大的工具。
二、ROS2和ROS1的区别
ROS2(机器人操作系统 2)是开源软件库和工具的集合,为开发和运行机器人应用程序提供了灵活的框架。它旨在成为在复杂、动态环境中运行的机器人的主要开发平台,并被设计为用于构建机器人应用程序的开放、可扩展和可互操作的框架。
ROS2 是 ROS(机器人操作系统)的后续版本,ROS 由机器人研究所 Willow Garage 于 2007 年创建。ROS 的创建是为了提供开发机器人应用程序的通用框架,此后它作为一个平台越来越受欢迎用于在研究和工业中构建机器人。ROS2 扩展了 ROS 的优势,同时引入了新的特性和功能,以满足机器人社区不断变化的需求。ROS 和 ROS2 之间的一些主要区别如下:
通信基础设施:
ROS2 使用基于数据分发服务 (DDS)的新通信基础设施,与基于TCP/UDP 协议的 ROS1 基础设施相比,它提高了性能、可扩展性和安全性。
模块化架构:
与ROS1的整体架构相比,ROS2具有更加模块化的架构,具有不同层的中间件,这使得更容易定制和扩展。
操作系统和语言支持:
与ROS1相比,ROS2支持多种编程语言和操作系统,包括Windows、Mac OS和实时操作系统。
测试、调试和部署:
它包括用于测试、调试和部署机器人应用程序的新功能和工具,例如对持续集成和部署的改进支持,以及对调试和分析工具的支持。
与ROS1的兼容性:
其设计为向后兼容ROS1,允许现有的ROS1应用程序通过ros1桥轻松迁移到ROS2 。然而,ROS1和ROS2之间存在一些差异,当现有的ROS1应用程序迁移到ROS2时,可能需要对它们进行一些更改。
三、ROS 社区
ROS 社区是一个庞大而活跃的社区,由来自学术界、工业界和政府的对构建和使用机器人感兴趣的个人和组织组成。ROS社区参与ROS的开发和维护。
参考: https: //www.openrobotics.org/
ROS 社区非常注重协作和共享,有许多资源可供人们了解和参与该项目。社区还组织了许多会议、研讨会和聚会,为人们提供了与他人联系并更多地了解 ROS 的机会。
ROS 社区在 ROS 的成功中发挥了重要作用,并因其对该项目的贡献而受到广泛赞誉。👏
四、架构概述:
由于需要处理各种任务和环境,以及机器人系统中使用的传感器、执行器和其他硬件组件数量不断增加,机器人系统变得越来越复杂。因此,需要一个灵活、可扩展且可靠的通信基础设施来支持复杂的机器人应用程序的开发。
ROS2 以抽象的方式设计,更多地关注功能而不是重新发明轮子。这意味着ROS2提供了一组设计灵活、模块化的工具和库,允许开发人员快速高效地构建和部署机器人应用程序。因此,它具有各种软件层,例如rclcpp、rcl、rmw、和 DDS,为构建和运行机器人应用程序提供基础设施。这些部分旨在协同工作,为构建和运行机器人应用程序提供高级接口,同时隐藏底层技术的复杂性。
DDS(数据分发服务)是一种中间件技术,为节点之间交换数据和通信提供高性能、可扩展且安全的方式。DDS用作ROS2的通信层。
rmw(ROS Middleware)是一个中间件层,使用DDS为ROS2提供底层通信基础设施。Rmw抽象了DDS的复杂性,这意味着开发人员无需担心DDS如何工作的细节。
rcl(ROS 客户端库)是一个中间件层,为使用 rmw 构建和运行机器人应用程序提供高级接口。Rcl抽象了rmw的复杂性,这意味着开发人员无需担心rmw如何工作的细节。
rclcpp是 rcl 的 C++ 实现,它提供了一组 C++ 类和函数,用于使用 rcl 构建和运行机器人应用程序。Rclcpp 使使用 C++ 开发机器人应用程序变得更加容易,并且它提供了许多功能和工具,使开发和调试机器人应用程序变得更加容易。
五、ROS2 功能概述
计算图:
ROS 图是任何 ROS 2 系统中最重要的部分。计算图是一个由节点组成的网络,这些节点一起工作来解决问题并相互通信。计算图中的每个“节点”都是一个进行某种计算的过程,节点之间的“边”是节点之间共享数据的方式。
它是 ROS2 的重要组成部分,因为它可以让您组织和协调机器人应用程序的不同部分。通过连接计算图中的节点,您可以创建一个分布式系统,其中每个节点执行特定任务并根据需要与其他节点进行通信。
汽车软件检测图
节点:
节点是ROS系统的另一个重要部分。系统中的每个节点都有特定的工作要做,它们使用发布-订阅或请求-响应消息传递模式相互通信。一个节点可以向某个主题发送消息,对该主题感兴趣的其他节点可以订阅该主题并获取该消息。
消息:
主题称为“总线”,节点通过它们相互发送消息。消息是通过某个主题从一个节点发送到另一个节点的数据位。它们以 ROS 消息描述语言 (.msg) 编写,用于描述发送的数据的结构。消息可以包含许多不同类型的数据,从整数和浮点数等简单数据到数组和自定义消息类型等更复杂的数据。
在 ROS2 中,主题和消息的工作方式几乎与 ROS1 中相同,但它们是使用数据分发服务 (DDS) 中间件组合在一起的。rosidl生成器dds idl 工具用于将msg文件转换为DDS idl文件。该工具是 ROS2 构建系统的一部分,在构建具有消息定义的 ROS2 包时自动运行。
发布者和订阅者:向某个主题发送消息的节点称为发布者。从某个主题接收消息的节点称为订阅者。
在 ROS2 中,节点创建发布者对象并使用它向主题发送消息。节点创建订阅者对象并告诉它要订阅哪个主题,以便它可以接收消息。然后订阅者将收到发布到该主题的任何消息。
服务:
服务是节点向其他节点请求特定计算或数据并接收响应的一种方式。服务是使用请求-响应消息传递模式来实现的,其中想要请求计算或数据的节点(客户端)将请求消息发送到另一个节点(服务器),该节点执行计算或检索数据并发送响应消息返回给客户端。
回调和计时器:
计时器是一种安排回调函数在特定时间或定期执行的方法。定时器在rclcpp lib中实现,它为分布式系统中的节点提供了通用的定时器参考。
要在 ROS 中使用计时器,节点需要创建一个计时器对象并指定计时器到期时应执行的回调函数。节点还可以指定计时器的持续时间以及它应该是一次性计时器还是循环计时器。
生命周期管理:
节点的托管生命周期可以更好地控制 ROS 系统的状态。它允许roslaunch在允许任何组件开始执行其行为之前确保所有组件都已正确实例化。它提供了一种定义节点状态的机制,以便更好地控制节点的生命周期。
rclcpp_lifecycle接口提供生命周期管理规范的实现。生命周期管理规范定义了节点在其生命周期中可以经历的一组状态和转换,以及可以在节点生命周期中的特定点执行的一组操作。
ROS2设计
执行器:
许多机器人应用程序需要能够在实时限制内以可预测的方式运行。ROS 节点需要以可预测的方式进行调度,以便接收和发送通信数据、更新计时器或执行日志记录操作。ROS 2 中的执行器概念可以处理此类调度需求。
Executor是负责管理ROS系统中节点执行的组件。执行器负责调度节点的执行并确保它们接收到执行任务所需的资源。
然而,ROS2执行器没有提供对执行管理的足够控制。例如,没有机制可以强制节点内回调的特定执行顺序。执行器忽略任务链的重要性。在机器人检测到障碍物后需要采取替代路径的情况下,这种行为将成为一个问题。这就是我们所说的优先级反转。意思是,这是当高优先级任务被低优先级任务间接抢占时发生的错误。因此,我们可以得出结论,ROS2调度是公平共享调度。
在ROS2中,没有关于如何为这些执行器分配资源和分配优先级以及如何将这些执行器映射到CPU核心(如处理器亲和力)的通用指南。所以,ROS2 确实有局限性,尤其是在实时方面。
我们将在后面的文章中更深入地讨论这个问题。
节点发现:
ROS-DDS 抽象层提供分布式目录服务,使节点能够相互查找并相互通信。节点可以使用 DDS 服务来查找正在发布或订阅某些主题的其他节点并与之通信。这些节点是在幕后自动找到的。
当节点启动时,它会告诉网络上具有相同 ROS 域(您可以使用 ROS DOMAIN ID 环境变量设置)的其他节点它的存在。节点用有关其自身的信息响应此广告,以便可以建立正确的连接并且节点可以相互通信。
总之,ROS2 是一个功能强大的开源机器人平台,为构建和部署机器人应用程序提供了广泛的工具和功能。与其前身 ROS 相比,它提供了改进的可扩展性、性能以及对各种平台和语言的支持。如果您有兴趣了解有关 ROS2 的更多信息以及它如何帮助您构建和部署机器人,可以在线获取许多资源,包括 ROS2 文档、教程和社区论坛。
感谢您关注这篇 ROS2 简介帖子。在本系列文章中,我们将涵盖与 ROS2 相关的各种编程主题,包括节点、主题、服务、操作等主题。在下一篇文章中,我们将深入研究 ROS2 编程。