一.ROS
1.ROS介绍
机器人操作系统(ROS)并非传统意义上的操作系统,而是一个专为机器人软件开发设计的灵活框架。它由斯坦福大学人工智能实验室在2007年发起,后由Open Source Robotics Foundation维护,现由Open Robotics管理。ROS提供了一套标准的软件架构,旨在促进代码复用、模块化编程以及不同团队间的工作协同,极大地加速了机器人技术的发展与应用。
其实它并不是一个真正的操作系统,其底层的任务调度、编译、寻址等任务还是由Linux操作系统完成,也就是说ROS实际上是运行在Linux上的次级操作系统。但是ROS提供了操作系统应用的各种服务(如:硬件抽象、底层设备控制、常用函数实现、进程间消息传递、软件包管理等),也提供了用于获取、编译、跨平台运行代码的工具和函数。ROS主要采用松耦合点对点进程网络通信,目前主要还是支持Ubuntu系统,windows和Mac OS目前支持的还不好,所以推荐在Ubuntu系统上安装使用ROS。
2.ROS的概念
ROS的核心思想就是将机器人的软件功能做成一个个节点,节点之间通过互相发送消息进行沟通。这些节点可以部署在同一台主机上,也可以部署在不同主机上,甚至还可以部署在互联网上。ROS网络通信机制中的主节点(master)负责对网络中各个节点之间的通信过程进行管理调度,同时提供一个用于配置网络中全局参数的服务。
ROS是松耦合软件框架,利用分布式通信机制实现节点间的进程通信。ROS的软件代码以松耦合方式组织,开发过程灵活,管理维护方便。
主节点
主节点(master)负责节点到节点的连接和消息通信,类似于名称服务器(Name Server) 。
roscore 是它的运行命令,当您运行主节点时,可以注册每个节点的名字,并根据需要获取信息。没有主节点,就不能在节点之间建立访问和消息交流(如话题和服务)
节点
节点(node)是指在 ROS 中运行的最小处理器单元。可以把它看作一个可执行程序。在ROS 中,建议为一个目的创建一个节点,建议设计时注重可重用性。例如,在移动机器人的情况下,为了驱动机器人,将每个程序细分化。也就是说,
使用传感器驱动、传感器数据转换、 障碍物判断、电机驱动、编码器输入和导航等多个细分节点。
功能包
功能包(package)是构成 ROS 的基本单元。ROS 应用程序是以功能包为单位开发的。功能包包括至少一个以上的节点或拥有用于运行其他功能包的节点的配置文件。它还包含功能 包所需的所有文件,如用于运行各种进程的 ROS 依赖库、数据集和配置文件等。
消息
节点之间通过消息(message)来发送和接收数据。消息是诸如 integer, floatingpoint 和 boolean 等类型的变量。用户还可以使用诸如消息里包括消息的简单数据结构或列举消息的消息数组的结构。使用消息的通信方法包括 TCPROS, UDPROS 等,
根据情况使用单向消息发送/接收方式的话题(topic)和双向消息请求(request) /响应(response)方式的服务(service) 。
话题
话题(topic)就是“故事" 。在发布者(publisher)节点关于故事向主节点注册之后,它以消息形式发布关于该故事的广告。希望接收该故事的订阅者(subscriber)节点获得在主节 点中以这个话题注册的那个发布者节点的信息。基于这个信息,订阅者节点直接连接
到发布者节点,用话题发送和接收消息。
发布与发布者
发布(publish)是指以与话题的内容对应的消息的形式发送数据。为了执行发布,发布者(publisher)节点在主节点上注册自己的话题等多种信息,并向希望订阅的订阅者节点发送消息。发布者在节点中声明自己是执行发布的个体。单个节点可以成为多个发布者。
订阅与订阅者
订阅是指以与话题内容对应的消息的形式接收数据。为了执行订阅,订阅者节点在主节 点上注册自己的话题等多种信息,并从主节点接收那些发布此节点要订阅的话题的发布者节
点的信息。基于这个信息,订阅者节点直接联系发布者节点来接收消息。订阅者在节点中声 明自己执行订阅的个体。单个节点可以成为多个订阅者。
3.ROS的架构
OS层
ROS并不是一个传统意义上的操作系统,无法像Windows、Linux一样直接运行在计算机硬件之上。ROS1主要构建于Linux系统之上,ROS2带来了改变,支持构建的系统包括Linux、Windows、Mac、RTOS,甚至没有操作系统的裸机。
中间层
Linux是一个通用系统,并没有针对机器人开发提供特殊的中间件,ROS在中间层做了大量的工作,其中最为重要的就是基于TCPROS/UDPROS的通信系统,这是基于TCP/UDP网络所做的再次封装。通信系统使用发布/订阅、客户端/服务器等模型,实现多种通信机制的数据传输。
除了TCPROS/UDPROS的通信机制外,ROS还提供一种进程内的通信方法——Nodelet,可以为多进程通信提供一种更优化的数据传输方式,适合对数据传输实时性方面有较高要求的应用。
ROS1的通讯系统基于TCPROS/UDPROS,而ROS2的通讯系统基于DDS。DDS是一种分布式实时系统中数据发布/订阅的标准解决方案。ROS2内部提供了DDS的抽象层实现,用户不需要关注底层DDS的提供厂家。
在ROS1的架构中Nodelet和TCPROS/UDPROS是并列的层次,为同一个进程中的多个节点提供一种更优化的数据传输方式。ROS2中也保留了这种数据传输方式,只不过换了一个名字,叫做“Intra-process”,同样也是独立于DDS。
在通信机制之上,ROS提供了大量机器人开发相关的库,如数据类型定义、坐标变换、运动控制等,可以提供给应用层使用。
应用层
ROS1强依赖于ROS Master(通过远程过程调用提供登记列表和对其他计算图表的查找功能,帮助ROS节点之间相互查找、建立连接,同时还为系统提供参数服务器,管理全局参数),一旦Master宕机,整个系统会面临崩溃的处境。但是从右边ROS2的架构中可以发现,之前让人耿耿于怀的Master终于消失了,节点之间使用一种称为“Discovery”的发现机制来获取彼此的信息。
ROS社区内共享了大量的机器人应用功能包,这些功能包内的模块以节点为单位运行,以ROS标准的输入输出作为接口,开发者不需要关注模块的内部实现机制,只需要了解接口规则即可实现复用,极大地提高了开发效率。
从系统实现的角度,ROS也可以分为三个层次:文件系统(程序文件的组织和构建)、计算图(从计算图的角度来看,ROS系统软件的功能模块以节点为单位独立运行,可以分布于多个相同或不同的主机中,在系统运行时通过端到端的拓扑结构进行连接)和开源社区。
4.ROS 的工作过程
ROS可以形象的描述为一个工厂的运行机制,创建好一个工作空间(workspace)就像一个工厂,工厂里又有好多个生产车间,每个功能包(pkg)看作是一个生产车间,每个生产车间又有好多工人在配合,每个节点(node)看作是一个工人,节点是又是可执行程序的最小单位,工人们之间相互沟通通过消息(mesage)来完成。
话题(topic)
话题是单向的,一般用于连续发送数据的传感器,建立一次联系后,一个发布者可以向多个订阅者发送信息,同样,一个订阅者也可以订阅多个发布者的消息。
服务(service)
服务是同步双向的通信机制,服务器只有在有请求的时候才响应,客户端在发出请求后才接受响应。当服务的请求和响应完成时,两个连接点自动断开。
动作(action)
动作的通讯方式与服务有类似的情况,不同的是服务器收到请求后直至完成响应所需时间较长,中途需要反馈给客户端目前完成的情况,报告当前的现状。
由以上三种通讯方式完成ROS节点间的信息交流,但是发布者,订阅者,服务服务器,服务客户端,动作服务器,动作客户端分布在不同的节点中。这些节点需要一个让它们建立联系的主节点构建通信的桥梁。分布在外面的不同节点,
向主节点注册自己的信息,以便其它节点访问,同时向主节点获取那些访问自己节点的信息。获取后节点和节点间就可以通讯,不再需要主节点。
5.ROS中话题与服务的区别
话题和服务是 ROS 中使用最多的通信方法,它们之间有很多不同之处:
话题是 ROS 中基于发布者/订阅者模型的异步通信,发布者与订阅者双方解耦,常用于不断更新,含有较少逻辑处理的数据通信;
服务是 ROS 中基于客户端。服务器模型的同步通信,适用于逻辑性强的数据交换;
6.ROS的优缺点
ROS为我们开发机器人带来了许多方便,然而它也确实存在一些问题:
优点
提供框架、工具和功能
方便移植
庞大的用户群体
免费开源
缺点
通信实时性能有限
系统稳定性尚不满足工业级要求
安全性上没有防护措施
二.ROS2
1.ROS2介绍
自ROS诞生的十几年来,不管是机器人相关软件、硬件还是ROS社区都发生了天翻地覆的变化,加之原本的ROS存在一些设计上的先天性缺陷,在各种内外因素叠加下,导致老ROS在许多应用场景下都已经显得力不从心了。此背景下,
官方于2017正式推出了新一代机器人操作系统——ROS2(区别于老ROS,即ROS1),ROS2基于全新的设计框架,保留了ROS1的优点并改进其缺陷,以适应新时代的新需求。
ROS2是全新一代机器人操作系统,不只是功能增强的ROS1。
2.ROS2的发行版本
ROS最初是基于Ubuntu系统开发的,ROS的发行版本名称也和Ubuntu采用了同样的规则,即版本名称由两个相同首字母的英文单词组成,版本首字母按字母表递增顺序选取,以下列表为ROS2各不同发布版本的简单说明。
3.ROS2的主要学习资源:
官网:www.ros.org
源码:github.com
Wiki:wiki.ros.org
问答:answers.ros.org
4.ROS2架构
由于ROS的架构比较复杂,为了后面容易理解遇到的各种概念,这里先讨论一下ROS的系统架构,好让大家对ROS中的各种概念有全面性把控。按照官方的说法,可以分别从计算图 、 文件系统和开源社区视角来理解ROS架构。
4.1从计算图视角理解ROS架构
ROS2中可执行程序的基本单位叫 节点 (node),节点之间通过消息机制进行通信,这样就组成了一张网状图,也叫计算图,如下图所示。
节点是可执行程序,通常也叫进程。
ROS功能包中创建的每个可执行程序在被启动加载到系统进程中后,就是一个ROS节点,如上图中的节点1、节点2、节点3等。
节点之间通过收发消息进行通信,消息收发机制分为 话题 (topic)、 服务 (service)和 动作 (action)三种,如图1-3中的节点2与节点3、节点2与节点5采用话题通信,节点2与节点4采用服务通信,节点1与节点2采用动作通信。计算图中的节点、话题、服务、动作都要有唯一名称作为标识。
ROS利用节点将代码和功能解耦,提高了系统的容错性和可维护性。所以最好让每个节点都具有特定的单一功能,而不是创建一个包罗万象的庞大节点。如果用C++编写节点,需要用到ROS提供的roscpp库;如果用Python编写节点,需要用到ROS提供的rospy库。
主节点负责各个节点之间通信过程的调度管理。因此主节点必须要最先启动,可以通过roscore命令启动。
消息是构成计算图的关键,包括消息机制和消息类型两部分:消息机制有话题、服务和动作三种,每种消息机制中传递的数据都具有特定的数据类型(即消息类型);消息类型可分为话题消息类型、服务消息类型和动作消息类型;
数据包 (rosbag)是ROS中专门用来保存和回放话题中数据的文件,可以将一些难以收集的传感器数据用数据包录制下来,然后反复回放来进行算法性能调试。
参数服务器能够为整个ROS网络中的节点提供便于修改的参数。参数可以认为是节点中可供外部修改的全局变量,有静态参数和动态参数。静态参数一般用于在节点启动时设置节点工作模式;动态参数可以用于在节点运行时动态配置节点或改变节点工作状态,比如电机控制节点里的PID控制参数。
4.2从文件系统视角理解ROS架构
ROS程序的不同组件要放在不同的文件夹中,这些文件夹根据不同的功能对文件进行组织,这就是ROS的文件系统结构,如下图所示。
5.ROS2与ROS的区别
(1)系统架构与通信机制
ROS:
使用自定义的中间件(如roscore)。
基于发布-订阅模型、服务调用和参数服务器等通信机制。
依赖于一个中央化的ROS Master节点来管理节点之间的通信,这可能导致单点故障问题。
主要使用XML-RPC通信协议。
ROS2:
引入了DDS(Data Distribution Service)作为通信中间件,如eProsima Fast RTPS和Cyclone DDS是常用的实现。
去除了ROS Master节点,采用分布式通信框架,每个节点可以直接通过DDS进行通信,提高了系统的灵活性和可靠性。
支持多种通信协议,如UDP、TCP和共享内存等,用户可以根据需要选择合适的通信方式。
(2)操作系统支持
ROS:主要支持Ubuntu和其他Linux发行版。
ROS2:不仅支持Ubuntu和其他Linux发行版,还增加了对Windows和macOS等操作系统的支持,提供了更广泛的平台兼容性。
(3)编程语言支持
ROS:主要使用C++和Python进行开发。
ROS2:提供了对多种编程语言的支持,包括C++、Python、Java等,开发者可以根据自己的偏好和需求选择合适的编程语言进行开发。
(4)实时性能
ROS:在实时性能方面有一定的限制,特别是在高实时要求的机器人应用中可能无法满足需求。节点间的数据传递通过内存复制,可能导致大量的系统资源浪费在通讯上。
ROS2:在实时性能方面做出了改进,支持更复杂的实时任务。通过优化通信机制和资源利用,提高了系统的整体性能。
(5)安全性和稳定性
ROS:在处理大规模系统和复杂通信拓扑时可能存在一些问题,安全性和稳定性方面相对较弱。
ROS2:在处理复杂拓扑和大规模系统时更稳定可靠。引入了更多的安全机制,可以对通信进行加密和认证,提高了系统的安全性。
(6)其他:
模块化设计:ROS2的架构更加模块化,便于定制和扩展。
原生支持多机器人系统: ROS2的设计考虑了多机器人协作的需求,更容易构建分布式机器人系统。
6.ROS2的未来展望
随着ROS2的不断发展,我们可以期待以下方面的进步:
更强大的实时性能,支持更复杂的控制系统。
更完善的安全机制,适应工业和商业应用的需求。
与人工智能和机器学习技术的深度集成。
更广泛的硬件支持,包括嵌入式系统和专用硬件加速器。
更丰富的仿真工具,支持虚拟现实和增强现实技术。
这些发展将进一步扩大ROS2的应用范围,推动机器人技术的创新和进步。