ROS中阶笔记(十一):ROS 2.0
ROS中阶笔记(十一):ROS 2.0
1 为什要有ROS 2
1.1 ROS 1的特点
- 独立的机器人(PR2)
- 工作站级别的计算资源
- 没有实时性的需求
- 良好的网络连接
- 主要应用于研究
1.2 ROS 1的困境
1.3 ROS 2的曙光
ROS已经走过十个年头,伴随着机器人技术的大发展,ROS也得到了极大的推广和应用。尽管ROS还存在不少局限性,但无法掩盖ROS的锋芒,社区内的功能包还是呈指数级逐年上涨,为机器人开发带来了巨大的便利。不少开发者和研究机构还针对ROS的局限性进行了改良,但这些局部功能的改善往往很难带来整体性能的提升,机器人开发者对新一-代ROS的呼声越来越大,ROS2.0的消息也不绝于耳。
终于在ROSCon 2014上,正式公布了新一代ROS的设计架构(Next-generation ROS:Building on DDS),2015年8月 第一个ROS2.0的alpha版本落地,2016年12月19日,ROS2.0的beta版本正式发布,2017年12月8日,万众瞩目的ROS2.0终于发布了第一个正式版——Ardent Apalone。众多新技术和新概念应用到了新一代的ROS之中,不仅带来了整体架构的颠覆,更是增强了ROS2.0的综合性能。
1.4 ROS 2的版本进化
1.5 ROS 2 VS ROS 1(重点)
1、架构的颠覆
- ROS1的架构下,所有节点需要使用Master进行管理
- ROS2使用基于DDS的Discovery机制,和Master说拜拜
2、API的重新设计
- ROS1中的大部分代码都基于2009年2月设计的API
- ROS2重新设计了用户API,但使用方法类似
3、编译系统的升级
- ROS 1使用rosbuild、catkin管理项 目
- ROS2使用升级版的ament
2 什么是ROS2
2.1 ROS 2的架构
2.2 DDS(ROS 2.0 的优势)
DDS,Data Distribution Service,即数据分发服务
- 2004年由对象管理组织0MG(Object Management Group)发布
- 专门为实时系统设计的数据分发/订阅标准
- 最早应用于美国海军,解决舰船复杂网络环境中大量软件升级的兼容性问题,目前已经成为美国国防部的强制标准,同时广泛应用于国防、民航、工业控制等领域,成为分布式实时系统中数据发布/订阅的标准解决方案。
- 技术核心是以数据为核心的发布订阅模型(Data-Centric Publish-Subscribe,DCPS),这种DCPS模型创建了一个“全局数据空间”(global data space)的概念,所有独立的应用都可以去访问。
- 在DDS中,每一个发布者或者订阅者都称为参与者(participant),类似于ROS中节点的概念。每一个参与者都可以使用某种定义好的数据类型来读写全局数据空间。
2.3 ROS2的通信模型
2.4 ROS2的质量服务原则QoS
2.4.1 QoS的工作模型
2.4.2 QoS的数据结构
typedef struct RMW_PUBLIC_TYPE rmw_qos_profile_t
{
enum rmw_qos_history_policy_t history;
size_t depth;
enum rmw_qos_reliability_policy_t reliability;
enum rmw_qos_durability_policy_t durability;
}rmw_qos_profile_t;
- 每个原则都有对应的系统默认值
- 可以使用DDS厂商提供的配置工具修改QoS的设置
- 多商家的DDS可以并存
2.5 ROS2的编译系统(重点)
2.5.1 ROS2的编译系统简介
1、功能
ament是一种元编译系统,用来构建组成应用程序的多个独立功能包,catkin编译系统进一步演化的版本。
2、组成
- 编译系统:配置、编译、安装独立的功能包
- 构建工具:将多个独立的功能包按照一定的拓扑结构进行链接
ament还处于开发中,目前并不稳定,也不提供并行构建的能力,将来应该会加入
2.5.1 ROS2的编译系统的特点
1、CMake centric catkin
系统以CMake为中心,所以只包含python代码的功能包也需要由CMake进行处理,但是CMake并不支持Python setuptools中的所有功能,而且也很难在Window上进行移植。
2、Devel space
在catkin系统构建完成后,会在工作目录下生成一个devel文件夹,里边是编译好的功能包,以及环境变量的设置等等,基本上等同于ROS安装完成后的目录结构和作用。但是相信很多初学者因为devel中的环境变量而苦恼过,这确实为用户带来了一些不必要的麻烦。
3、catkin_simple catkin_simple
是一个用于改善用户catkin体验的工具包,可以减少复杂的CMake代码,但是会存在不稳定的情况。ament也是实现了类似的功能,但是可靠性更强。
4、Building within a single CMake context
使用catkin_make命令可以一次性编译工作空间中的所有功能包,虽然方便,但如果存在相同命名的功能包时,会编译失败,ament在这方面也进行了改善。
3 安装ROS2
ROS2只支持Ubuntu 16.04以上的系统
因为ROS2更新迭代快,根据时效性,看官网安装。另外对于ROS的实时性没有特别要求,建议用ROS1。
官网:https://index.ros.org/doc/ros2/Installation/Crystal/Linux-Install-Binary/#system-requirements
分别打开两个终端运行以下命令:
$ ros2 run demo_nodes_cpp talker
$ ros2 run demo_nodes_cpp listener
4 话题与服务编程
4.1 ament工作空间的创建
1、创建工作空间
$ mkdir-p ~/ros2_ ws/src
$ cd ~/ros2_ ws/src
2、创建功能包
手动创建:my_package/
CMakeLists.txt
package.xml
3、编译(以ament为例)
$ ament build
4.2 两代ROS的代码对比
- ROS2中的API相比ROS1中发生了较大的变化,ROS2并不是在ROS1的基础上查漏补缺,而是完全从新设计。
关于ROS2的API说明,可以参考API文档:http://docs.ros2.org/ardent/api/rclcpp/index.html - 使用了更多C++的特性,比如auto、make_shared等。
- 加入了QoS配置,从上边的代码中,我们可以看到QoS有默认的配置rmw_qos_profile_default,而且talker将QoS的depth配置设置为“7”。
- 代码的总体架构还是与ROS1极为相似的。