拥抱ROS2系列:ROS2概述和实践入门(一)
ROS可以说是?前机器?相关开源社区最流?的项?之?,它是?个易?且完备的机器?开发框架、?态乃?社区,海量的机器?开源项?(涵盖感知、规划、控制、定位、SLAM和建图、可视化等?乎所有机器?领域)均使?ROS作为基础。
以?动驾驶汽?为代表的新的机器?应?场景对于中间层和开发框架在实时性、可靠性、伸缩性、跨平台可移植等??提出了?量新的需求,ROS 显然不能满?这些需求,ROS2因此产?,在经历了若?年的迭代后,ROS2项??前已经相对完备和稳定,对于我们开发者??,是时候拥抱ROS2了。
1.为什么转向ROS
ROS?2007年发布以来,为机器?社区提供了?套相对完善的中间层、?具、软件乃?通?的接?和标准,可以说,凭借ROS,机器??业领域的开发者能够快速开发系统原型并做测试和验证。?动驾驶本质上是机器?研究的?个应?领域,在产品原型快速开发的过程中也通常会采?ROS。
如果说ROS1为科研和原型开发提供了很好的?态的话,那么ROS2就是?于实际产品的部署环境的开发架构和相应?具链。
2. ROS1的天然缺陷
ROS1项?的初衷是为了给科研机器?Willow Garage PR2提供?个开发环境和相应的?具,为了让这套软件在更多的机器?上运?,ROS为机器?开发构建了应?层的抽象和通?的消息接?,最终在机器?社区中?为使?并发展为?前最流?的机器?软件?态体系之?。然?,ROS1研发的初衷就注定了该架构存在以下缺陷:
- ?实时性(real-time)
- 嵌?式设备不友好
- 对于?络通信的重依赖(需要?带宽且稳定的?络连接)
- 多?于学术应?
- 超?的灵活性带来的不规范的编程模式
- 原?的ROS仅?持单机器?
然?如今ROS已在?量?业领域的应?,包括科研机器?、?业机器?、轮式机器?、?动驾驶汽?乃?航天??驾驶设备,其原来的功能设计已经不能满?海量应?对于某些性能(如实时性、安全性、嵌?式移植等)的需求,ROS2即在这样的背景下被设计和开发。
3. ROS2相较于ROS1的提升和改进
相较于ROS1,ROS2在设计之初就考虑了在产品环境下?临的?些挑战,具体来说,ROS2采?(或者计划采?)以下策略以提升其在产品环境的适?度:
- ?持多机器?
- 对?型嵌?式设备和微控制器的?持
- 实时系统:?持实时控制,包括进程间和机器间通信的实时性
- ?持?理想?络环境:在低质量?延迟等?络环境下系统仍然能够?作
- 对产品环境的?持的能力
- 规范的编程模型以?持基于ROS的?规模?的构建、开发和部署
4. ROS2中的DDS中间层
ROS1的核?是?个基于master中?节点的匿名发布-订阅通信中间层,相?之下,ROS2采?基于RTSP(Real-Time Publish-Subscribe)协议的DDS作为中间层,DDS(Data-Distribution Service)是?种?于实时和嵌?式系统发布-订阅式通信的?业标准,这种点到点的通信模式类似于ROS1的中间层,但是DDS不需要像ROS1那样借由master节点来完成两个节点间通信,这使得系统更加容错和灵活,DDS 被?泛应?于关键系统中,包括战舰、?型基础设施(如?电站)、?融系统、空间系统、航空系统等场景,这些?例也证实了DDS的可靠性。
多个?商提供多种DDS实现,?般来说DDS的底层通信机制基于UDP协议或者共享内存机制(当然也有 ?商提供基于TCP的DDS实现),?ROS2?持多种DDS实现,??可以根据实际情况选择DDS中间层, ?前来说ROS2 Foxy完整?持以下DDS中间层:
- eProsima的Fast RTPS(当前ROS2版本默认的DDS实现)
- RTI的Connext DDS
- Eclipse Cyclone DDS
了解更多DDS相关背景,可以参考这篇?章:
https://design.ros2.org/articles/ros_on_dds.html
ROS2的内部架构:
ROS2的内部接?主要包括两个层:
- rmw (ros middleware interface): 相对底层的接?层,直接和DDS交互,C语?实现
- rcl (ros cliend libraries): 对rmw相对?层的抽象,c/c++实现
此外上图中还有?个ros_to_dds组件,该组件主要为??直接访问DDS层提供接?。
更多关于rmw和rcl等中间层的实现机制以及ROS msg,DSS idl?件和python、c++和C上的类(或者结 构体)的转换可以参考ROS2官??档:
https://docs.ros.org/en/foxy/Concepts/About-Internal-Interfaces.html
5. ROS2中的QoS策略
ROS2中引?了Quality of Service, QoS(服务质量)的策略?于配置节点间通信,进?提升了ROS2适应于不同应?场景的灵活性。ROS1只?持基于TCP的通信,通过配置QoS,ROS2可以表现出TCP的可靠性,也可以表现出UDP那样的?实时性。??可以通过选择不同的QoS配置?件以实现不同的通信表现,QoS配置?件为策略的集合,ROS2提供了预设的QoS配置?件,如下所?:
- 发布-订阅机制的QoS设定
- 服务 (Service) 的QoS设定
- 传感器数据的QoS设定
- 参数的QoS设定
- DDS中间层默认的QoS设定
6. ROS2的安装和开发环境准备
ROS2?前?乎每半年会release?个版本,不同的版本会有对应的代号(类似与ROS1中的Kinetic, Melodic和Noetic等版本代号),以下是ROS2的?些历史版本:
- Crystal: 2018年12?
- Dashing: 2019年5?底
- Eloquent: 2019年11?
- Foxy: 2020年6?
- Galactic: 2021年5?
我们以最新的Galactic为例,ROS2是跨平台的架构,同时?持Linux, MacOS和Windows,但是依据我们在ROS1上开发的经验,我依然推荐?家在Linux的Ubuntu发?版上从事相应的ROS2 Application开发?作。在Ubuntu上,安装ROS2可以通过binary安装或者源代码编译安装,在Ubuntu上,最简单的安装?式是通过Debian packages安装(也就是apt安装),我们以此为例,在Ubuntu 20.04上使?apt 安装ROS2的Galactic版本。
7. ROS2在Ubuntu下的安装
在你的Ubuntu 20.04系统中,配置ROS2的apt源:
sudo apt update && sudo apt install curl gnupg lsb-release
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/s
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-k
更新apt索引:
sudo apt update
使?apt安装完整的ROS2:
sudo apt install ros-galactic-desktop
安装完成后,在~/.bashrc?件中添加ros2的环境变量:
echo "source /opt/ros/galactic/setup.bash" >> ~/.bashrc
简单地验证?下安装情况,新建?个terminal,运?demo的talker:
ros2 run demo_nodes_cpp talker
在另?个terminal中,运?listener:
ros2 run demo_nodes_py listener
可以看到,?个类似于ROS1的Publisher-Subscriber通信demo就运?起来了:
不难发现,ROS2并不需要像ROS1那样启动roscore(即master节点),ROS2这种去中?化的策略能让其适应更多?业应?和产品级应?场景的需求。
NOTE:ROS1和ROS2可以并存于同?台电脑,你只需要source不同的setup.bash即可完成环境的选择。
8. ROS2的基本工具和命令
和ROS1?样,ROS2也提供了?量的开发调试?具,如Rviz, Rqt等?具均已经可以在ROS2中使?,运行rqt,可以看到我们刚刚运?的两个demo节点:
运? rviz2 可以启动ROS2环境下的rviz软件。
同时,ROS2也提供类似于ROS1的命令?指令,指令和ROS1略有区别:
- ros2 node : 输出node相关信息
- ros2 topic : topic相关指令,包括list,hz,echo等
- ros2 service :service相关指令,如list,call,type等
- ros2 bag : rosbag相关指令, 录包,播包,打印数据包信息等
- ros2 bag :package相关指令
- ros2 param: 参数相关
- ros2 launch:运?launch?件
- ros2 run:运?单个节点
完整的ros2命令如下所?:
绝?多数指令基本是将ros1中的rosxxxx拆分成了ros2 xxxx。