前言
虽然众多开发者对ROS1进行了很多开发建设,对一些问题也提出了针对性的解决方案,但仍然无法解决ROS1中的根本问题。
一、ROS1存在的问题
- 多机器人系统
多机器人系统可以解决单机器人性能不足、无法应用等问题,但ROS1中并没有构建多机器人系统的标准方法。 - 跨平台
ROS1基于Linux系统,在其它系统上无法应用或者功能有限,这就对机器人开发者和开发工具提出了较高要求,局限性较大。 - 实时性
很多场景下的机器人对实时性要求较高,而ROS1缺少实时性方面的设计。 - 网络连接
ROS1中的分布式机制需要良好的网络才能保证数据的完整性,而且网络不具备数据加密、安全防护等功能,网络中的任意主机都可以获得节点发布或接受的消息数据。 - 产品化
ROS1稳定性欠佳,ROS Master、节点等重要环节在很多情况下会莫名宕机。
二、什么是ROS2
2017年,ROS2的第一个正式版本Ardent Apalone发布,ROS2不是ROS1的更新,而是整体架构的颠覆,综合性能也得到了较大增强。
1、ROS2的设计目标
- 支持多机器人系统
增加多机器人系统的支持,提升多机器人之间通信的网络性能。 - 铲除原型和产品之间的鸿沟
不仅针对科研领域,还关注机器人研究到应用之间的过渡,可以让更多机器人直接搭载ROS2系统走向市场。 - 支持微控制器
不仅可以运行在X86和ARM上,还可以支持MCU等嵌入式微控制器,比如常见的ARM-M4、M7内核。 - 支持实时控制
提高控制的时效性和整体机器人的性能。 - 支持跨平台
ROS2不仅能运行在Linux上,还能运行在win、macOS、RTOS等系统上。
2、ROS2的系统架构
ROS2重新设计了系统架构,两代ROS之间架构的变化如下:
- OS层
OS层,在ROS2中可以构建在linux上,也可以构建在其它系统上,甚至是没有操作系统的裸机。 - 中间层
ROS1的通信系统基于TCPROS/UDPROS,而ROS2的通信系统基于DDS。DDS是一种分布式实时系统中数据发布/订阅的标准解决方案。 - 应用层
ROS1依赖于ROS Master,而在ROS2中,节点之间使用一种称为“Discovery”的发现机制来帮助彼此建立连接。
3、ROS2的关键中间件-DDS
DDS,数据分发服务,2004年发布,是一种专门为实时系统设计的数据分发/订阅标准。其技术关键是以数据为核心的发布/订阅模型,即DCPS模型,这种模型创建了一个“全局数据空间”的概念,所有独立的应用都可以访问。
4、ROS2中的通信模型
ROS2中通信模型,加入了很多DDS的通信机制,如下:
关键概念如下:
- 参与者
在DDS中,每一个发布者或订阅者都被称为参与者,对应于一个使用DDS的用户,可以使用某种定义好的数据类型来读/写全局数据空间。 - 发布者
负责发布数据,支持多种数据类型的发布,可以与多个数据写入器相连,发布一种或多种主题的消息。 - 订阅者
负责订阅数据,支持多种数据类型的订阅,可以与多个数据读取器相连,订阅一种或多种主题的消息。 - 数据写入器
上层应用向发布者更新数据的对象,每个数据写入器对应一个主题,类似ROS1中的消息发布者。 - 数据读取器
上层应用从订阅者读取数据的对象,每个数据读取器对应一个主题,类似ROS1中的消息订阅者。 - 话题
与ROS1类似,需要定义一个名称和一种数据结构,但ROS2中的每个话题都是一个实例,可以存储该话题中的历史消息数据。 - 质量服务原则
简称QoS Policy,这是ROS2新增的,用于控制各方面与底层的通信机制,主要从时间限制、可靠性、持续性、历史记录等方面满足用户针对不同场景的数据需求。
5、ROS2的编译系统
ROS1后面的版本开始使用catkin编译系统,而ROS2中开始使用ament作为元编译系统,用来构建组成应用程序的多个独立功能包,其并不是全新的编译系统,而是catkin演化的版本。
ament编译系统主要解决如下问题:
- cmake centric
catkin系统以cmake为中心,即使只包含python的代码,也需要cmake进行处理。但是,cmake并不支持python setuptools中的所有功能,而且很难在win上进行移植。 - devel space
catkin系统构建完成后,在工作空间生成devel文件夹,与功能包安装完成后生成的install文件夹,冗余。devel中环境变量的设置问题,也会为开发者使用带来麻烦。 - CMAKE_PREFIX_PATH
Catkin会将编译多个工作区的前缀存储到环境变量CMAKE_PREFIX_PATH中, 但是这种方法会干扰变量中的其他值, 在ament中, 不同工作区的前缀会放到不同的环境变量中。 - catkin_simple
用于改善用户体验catkin的工具包,不稳定。ament也实现了类似的功能,可靠性更强。 - Building within a single CMake context
使用catkin_make命令可以一次性编译工作空间中的所有功能包, 当存在相同命名的功能包时, 会编译失败, ament在这方面也进行了改善。
版权声明:本文为u011832219原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。