目录
第1章 简介
第2章 历史
第3章 特点
(1)点对点设计
(2)不依赖编程语言
(3)精简与集成
(4)便于测试
(5)开源
(6)强大的库及社区:
(7)通道:
(8)工具:
(9)强大的库:
(10)生态系统:
第4章 ROS的系统架构
第5章 ROS与Linux
5.1 ROS能安装在Linux之上吗?
5.2 Xenomai实时Linux内核
5.3 PREEMPT_RT
5.3 ROS1与ROS2区别
第6章 在Windows系统之上安装ROS:ROSOnWindows
6.1 安装步骤
6.2 ROSOnWindows(RoW)带来了以下几个好处:
6.3 ROS2能提升Windows的实时性吗?
小结
第1章 简介
随着机器人领域的快速发展和复杂化,代码的复用性和模块化的需求原来越强烈,而已有的开源机器人系统又不能很好的适应需求。2010年Willow Garage公司发布了开源机器人操作系统ROS(robot operating system),很快在机器人研究领域展开了学习和使用ROS的热潮。ROS是用于编写机器人软件程序的一种具有高度灵活性的软件架构。
它包含了大量工具软件、库代码和约定协议,旨在简化跨机器人平台创建复杂、鲁棒的机器人行为这一过程的难度与复杂度。
ROS为Robot Operating System(机器人操作系统)的简写,是一个面向机器人的开源元操作系统(open-source,meta-operating system)。它能够提供类似传统操作系统的诸多功能,如硬件抽象、底层设备控制、进程间消息传递和程序包管理等。此外,它还提供相关工具和库,用于获取、编译、编辑代码以及在多个计算机之间运行程序完成分布式计算。
ROS的运行架构是一种使用ROS通信模块实现模块间P2P的松耦合的网络连接的处理架构,它执行若干种类型的通讯,包括基于服务的同步RPC(远程过程调用)通讯、基于Topic的异步数据流通讯,还有参数服务器上的数据存储。
第2章 历史
ROS起源于2007年前后斯坦福大学人工智能实验室的STAIR(Stanford Artificial Intelligence Robot) 项目与Willow Garage公司的个人机器人项目(Personal Robotics project)之间的合作。
在2009年初推出了ROS0.4,现在所用系统的框架在这个版本中已初具雏形。经过近一年的测试后,于2010年初推出了ROS1.0版,并在当年三月份推出了正式发行版本:ROS Box Turtle,到现在(2016年5月)已经发行了10个版本,最新版本是ROS Kinetic Kame。比较有趣的是,ROS各版本均以龟作为发行代号,至今已设计出10种造型奇特的“ROS龟”。
从2008年至2013年,ROS主要由Willow Garage公司管理维护,但这并不意味着ROS是封闭的系统,相反,它是由众多学校及科研机构联合开发及维护的,这种联合开发模式也为ROS系统生态的构建与壮大带来有力的促进。2013年,Willow Garage公司被Suitable Technologies公司收购,此前几个月,ROS的开发和维护管理工作被移交给了新成立的开源基金会 Open Source Robotics Foundation。
第3章 特点
ROS的主要目标是为机器人研究和开发提供代码复用的支持。ROS是一个分布式的进程(即“节点”)框架,这些进程被封装在易于被分享和发布的程序包和功能包中。ROS也支持一种类似于代码储存库的联合系统,这个系统也可以实现工程的协作及发布。可以使一个工程的开发和实现从文件系统到用户接口完全独立决策(不受ROS限制)。同时,所有的工程都可以被ROS的基础工具整合在一起。
ROS在某些程度上和其他常见的机器人架构有些相似之处,如:Player、Orocos、CARMEN、Orca和Microsoft Robotics Studio。对于简单的无机械手的移动平台来说,Player是非常不错的选择。ROS则不同,它被设计为适用于有机械臂和运动传感器的移动平台(倾角激光、云台、机械臂传感器)。与Player相比,ROS更有利于分布式计算环境。当然,Player 提供了较多的硬件驱动程序,ROS则在高层架构上提供了更多的算法应用(如集成OpenCV的视觉算法)。
ROS的主要特点可以归纳为以下几条:
(1)点对点设计
ROS通过点对点设计以及服务和节点管理器等机制可以分散由于计算机视觉和语音识别等功能带来的实时计算压力,这种设计能适应服务机器人遇到的调战。
(2)不依赖编程语言
ROS支持多种现代高级编程语言,C++、Python和Lisp语言已经在ROS中实现编译,并得到应用,Octave和Java的测试库也已经实现。
为了支持多语言编程,ROS采用了一种语言中立的接口定义语言(language-neutral interface definition language,IDL )来实现各模块之间的消息传送。
(3)精简与集成
ROS建立的系统具有模块化的特点,各模块中的代码可以单独编译,而且编译使用的CMake工具使它很容易的就实现精简的理念。ROS基本将复杂的代码封装在库里,只是创建了一些小的应用程序为ROS显示库的功能,这就允许了对简单的代码超越原型进行移植和重新使用。作为一种新加入的有优势,单元测试当代码在库中分散后也变得非常的容易,一个单独的测试程序可以测试库中很多的特点。
ROS不修改用户的主函数,所以代码可以被其他的机器人软件使用。其优点是ROS很容易和其他的机器人软件平台集成。例如,在计算机视觉方面,ROS已经与OpenCV实现集成。在驱动、导航和模拟器方面,ROS已经与Player系统实现集成。在规划算法方面,ROS也已与OpenAVE系统实现集成。
(4)便于测试
为机器人开发软件比其他软件开发更具挑战性,主要是因为调试准备时间长,且调试过程复杂。况且,因为硬件维修、经费有限等因素,不一定随时有机器人可供使用。ROS提供两种策略来解决上述问题。
1. 精心设计的ROS系统框架将底层硬件控制模块和顶层数据处理与决策模块分离,从而可以使用模拟器替代底层硬件模块,独立测试顶层部分,提高测试效率。
2. ROS另外提供了一种简单的方法可以在调试过程中记录传感器数据及其他类型的消息数据,并在试验后按时间戳回放。通过这种方式,每次运行机器人可以获得更多的测试机会。例如,可以记录传感器的数据,并通过多次回放测试不同的数据处理算法
(5)开源
ROS遵从BSD协议,这给了使用者很大的自由,使开发者可以清楚的查看、自由的使用源代码,如果有需要,可以根据不同的系统及硬件环境对源代码进行修改,或者进行二次开发。
(6)强大的库及社区:
ROS提供了广泛的库文件实现以机动性、操作控制、感知为主的机器人功能。同时由于其开源特性,ROS的支持与发展依托着一个强大的社区。其官方网站尤其关注兼容性和支持文档,提供了一套“一站式”的方案使得用户得以搜索并学习来自全球开发者数以千计的ROS程序包。
(7)通道:
ROS提供了一种发布-订阅式的通信框架用以简单、快速地构建分布式计算系。
(8)工具:
ROS提供了大量的工具组合用以配置、启动、自检、调试、可视化、登录、测试、终止分布式计算系统。
(9)强大的库:
ROS提供了广泛的库文件实现以机动性、操作控制、感知为主的机器人功能。
(10)生态系统:
ROS的支持与发展依托着一个强大的社区。ros.org尤其关注兼容性和支持文档,提供了一套“一站式”的方案使得用户得以搜索并学习来自全球开发者数以千计的ROS程序包。
第4章 ROS的系统架构
ROS系统是用于编写机器人软件程序的一种具有高度灵活性的软件架构;它包含了大量工具软件、库代码和约定协议。
ROS包含了大量工具软件、库代码和约定协议,旨在简化跨机器人平台创建复杂、鲁棒的机器人行为这一过程的难度与复杂度。
ROS设计者将ROS表述为“ROS = Plumbing + Tools + Capabilities + Ecosystem”,即ROS是通讯机制、工具软件包、机器人高层技能以及机器人生态系统的集合体。
ROS提供一些标准操作系统服务,例如硬件抽象,底层设备控制,常用功能实现,进程间消息以及数据包管理。ROS是基于一种图状架构,从而不同节点的进程能接受,发布,聚合各种信息(例如传感,控制,状态,规划等等)。
ROS可以分成两层,低层是上面描述的操作系统层,高层则是广大用户群贡献的实现不同功能的各种软件包,例如定位绘图,行动规划,感知,模拟等等。
第5章 ROS与Linux
5.1 ROS能安装在Linux之上吗?
ROS(Robot Operating System)可以安装在Linux操作系统之上。事实上,ROS最常用的版本是针对Ubuntu Linux发行版进行开发和测试的。ROS支持多个Ubuntu版本,包括16.04(Xenial)、18.04(Bionic)和20.04(Focal)。安装ROS需要根据特定的Ubuntu版本和ROS版本进行操作,具体的安装步骤可以参考ROS官方文档和教程。
Linux是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。
伴随着互联网的发展,Linux得到了来自全世界软件爱好者、组织、公司的支持。它除了在服务器方面保持着强劲的发展势头以外,在个人电脑、嵌入式系统上都有着长足的进步。使用者不仅可以直观地获取该操作系统的实现机制,而且可以根据自身的需要来修改完善Linux,使其最大化地适应用户的需要。
5.2 Xenomai实时Linux内核
Xenomai是一个开源的实时操作系统(Real-Time Operating System,RTOS)框架,旨在为Linux系统提供可预测性和低延迟的实时性能。它通过在Linux内核之上构建一个实时性的内核扩展,提供了一个分层的实时架构。
Xenomai允许开发人员在Linux上同时运行实时和非实时任务,实时任务可以以确定性的方式响应外部事件,并确保任务的执行时间可靠和准确。它提供了两种实时任务调度方式:
-
Cobalt:Cobalt是Xenomai的核心部分,提供了与硬实时性能相匹配的API和调度器。Cobalt任务利用严格的优先级调度策略,确保实时任务的最小延迟和高优先级。使用Cobalt API可以编写实时任务并与其他非实时任务交互。
-
Native:Xenomai还提供了一种称为Native的调度方式,它与Linux内核的调度器集成。Native调度器允许简单的实时任务运行在Linux内核上,而无需额外的内核模块。这种方式提供了一些限制,但仍比传统的Linux调度器具有更好的实时性能。
Xenomai广泛应用于需要高实时性能的系统和应用,如机器人控制、自动化系统、数据采集系统、实时音频和视频处理等。它为实时任务提供了强大的基础设施,并允许开发人员编写可靠且高效的实时应用程序。
需要注意的是,集成Xenomai可能需要对操作系统进行定制和内核配置,因此在使用Xenomai时,建议参考官方文档和社区资源以获得更详细的指导和支持。
5.3 PREEMPT_RT
PREEMPT_RT(Preemptible Real-Time)是一个针对Linux内核的补丁,旨在提供可预测性和可配置的实时性能。它通过增加内核抢占性,使得Linux内核具备实时性能,能够满足实时任务对于低延迟和可预测性的需求。
PREEMPT_RT补丁的主要目标是减少Linux内核的不可抢占性(non-preemptibility),即减少内核运行时不可被中断的时间。通过将关键的内核代码段和操作转换为可抢占的形式,PREEMPT_RT使得实时任务能够在特定时间约束下得到及时响应。
PREEMPT_RT补丁具有以下特点和优势:
-
高实时性能:PREEMPT_RT补丁降低了内核的不可抢占性,减少了内核代码的执行时间,从而提供了更低的延迟和更高的实时性能。
-
系统可预测性:PREEMPT_RT补丁使得内核中的任务响应时间更可预测,减少了不可控的延迟和抖动。这对于需要确保实时任务可靠和准时执行的应用程序非常重要。
-
灵活性和可配置性:PREEMPT_RT补丁提供了多种配置选项,可以根据应用程序的实时需求进行调整。可以选择不同的内核预定义选项或自定义选项,以满足具体应用的实时性能要求。
PREEMPT_RT补丁被广泛应用于需要高实时性能和可预测性的系统,如机器人控制、数据采集、自动化和嵌入式系统等。然而,使用PREEMPT_RT补丁需要注意的是,在应用补丁之前,需要仔细评估应用程序的需求、硬件平台的支持以及可能引入的系统稳定性和兼容性问题。此外,PREEMPT_RT补丁并非官方支持的Linux内核版本,需要额外的维护和更新,以保持与最新内核版本的兼容性。
5.3 ROS1与ROS2区别
ROS(Robot Operating System)是一个用于机器人开发的开源框架。
ROS1和ROS2是ROS的两个主要版本,它们之间有一些重要的区别。
-
通信机制:ROS1使用了TCP/IP和XMLRPC作为基本的通信机制。这种机制在小规模系统上运行良好,但在大规模系统中存在一些限制。而ROS2引入了一种名为Data Distribution Service(DDS)的新的通信机制,该机制基于发布-订阅模式,支持更灵活、可靠和实时的通信。
-
支持语言:ROS1主要支持C++和Python两种编程语言,而ROS2扩展到了更多的编程语言,包括C++, Python, Java, C#, JavaScript和Ruby,使得开发人员可以使用自己熟悉的语言进行开发。
-
实时性:ROS1在实时性方面存在一定的局限性。而ROS2通过DDS通信机制的引入,支持实时性,使得ROS2可以在对实时性要求更高的应用中使用。
-
可移植性:由于ROS1的设计目标是用于研究和实验室环境,因此在可移植性方面存在一些限制。ROS2则在设计时考虑了可移植性,使得它更容易在不同平台上运行,包括嵌入式系统和实时操作系统。
-
安全性:ROS2在设计时考虑了安全性,并提供了一些安全功能,如认证和加密传输。这些功能使得ROS2更适合应用于对安全性要求较高的场景,如军事和医疗应用。
需要注意的是,
ROS1和ROS2是两个并行的项目,它们之间没有直接的升级路径。因此,在将ROS1应用迁移到ROS2时,需要进行适当的修改和重写代码。同时,目前还有许多ROS1的库和工具尚未迁移到ROS2,因此在选择版本时需要考虑到项目的特定需求和可用资源。
5.4 ROS2是如何提升实时性的?
在ROS 2中提高实时性的主要方法如下:
-
使用实时操作系统(RTOS):选择适合实时应用的操作系统作为ROS 2的底层平台,例如FreeRTOS、Xenomai或RTLinux。这些RTOS具有强大的实时性能和可预测性,可以有效提高ROS 2的实时性。这是ROS2提升实时性的关键的一环。
-
使用实时通信机制:ROS 2提供了多种通信机制,包括发布-订阅、服务和操作行为。对于实时应用,使用高实时性的通信机制,例如ROS 2的Real-Time Data Distribution(RTDDS)或Fast-RTPS。这些通信机制具有较低的延迟和高吞吐量,有助于提高实时性能。ROS2为基于ROS的应用程序提供了多种提高实时性的通信机制。
-
硬件加速:通过硬件加速技术来提高实时性。例如,使用FPGA(现场可编程门阵列)或ASIC(应用特定集成电路)来实现ROS 2中的某些任务,如传感器数据的预处理或实时控制算法的加速。
-
优化代码:进行代码优化以提高实时性能。这包括消除不必要的延迟或瓶颈,减少计算量,使用更高效的算法和数据结构等。使用ROS 2中的性能分析工具(如rclcpp_profiler)来找出代码中的性能瓶颈并进行优化。
-
配置系统参数:配置操作系统的参数以优化实时性能。这包括优化调度策略、内存管理和中断处理等。根据具体的RTOS和硬件平台,调整系统参数以适应实时需求。
-
避免阻塞操作:在实时应用中,尽量避免使用会导致阻塞的操作。例如,避免长时间的计算、I/O操作或等待资源释放等。使用非阻塞调用和异步操作来提高实时性。
-
使用时间关键节点(Time-Sensitive Networking,TSN):TSN是一种网络通信技术,可在以太网上提供严格的实时性能。将ROS 2与TSN网络结合使用,可以提供高精度和可靠的实时通信。
需要注意的是,提高ROS 2的实时性是一个综合性的工作,需要对整个系统进行细致的优化和配置。具体的方法和技术取决于应用的实时要求、硬件平台和操作系统。建议在实际应用中进行测试和调优,以确保满足实时性能的需求。
第6章 在Windows系统之上安装ROS:ROSOnWindows
ROSOnWindows(简称RoW)是一个官方支持的项目,旨在将ROS2引入Windows操作系统。
通过RoW,开发人员可以在Windows上使用ROS2进行机器人开发。
RoW 最早在 Windows 10 中的 Windows Subsystem for Linux (WSL 2) 上进行了实现,后来也支持了原生的 Windows 10 和 Windows Server 2019。
6.1 安装步骤
以下是使用RoW在Windows上安装和使用ROS2的一般步骤:
-
安装WSL 2:首先,确保您的Windows 10 版本支持WSL 2,并将其启用。然后,从Microsoft Store中安装一个适合的Linux发行版,如Ubuntu 20.04。
-
安装RoW工具:在WSL 2环境中,运行PowerShell并执行以下命令来安装RoW工具:
Invoke-WebRequest -Uri https://aka.ms/rosinstall | Out-File rosinstall
-
安装ROS2:在WSL 2环境中,运行PowerShell并执行以下命令来下载并安装ROS2:
wsl -- ./rosinstall
-
在Windows上使用ROS2:安装完成后,您可以在WSL 2环境中使用ROS2。可以参考ROS2的官方文档和教程来学习如何使用ROS2进行机器人开发。
请注意,由于RoW还是一个相对较新的项目,一些ROS2的功能和工具可能在Windows上有一些限制或不完全支持。因此,在使用RoW时,建议使用ROS2官方文档中针对Windows的特定部分,并遵循Windows上的最佳实践和建议。
有关更详细的安装和使用RoW的信息,您可以参考ROS官方文档中的ROSOnWindows部分:https://index.ros.org/doc/ros2/Releases/Release-Eloquent-Elusor/Installation/Windows-Install-Binary/
6.2 ROSOnWindows(RoW)带来了以下几个好处:
-
Windows生态系统支持:RoW使得在Windows操作系统上使用ROS2成为可能。这对于那些已经在Windows平台上进行开发的用户来说具有很大的吸引力,他们可以利用Windows上的开发工具和生态系统来构建和调试机器人应用程序。
-
跨平台开发和部署:RoW允许开发人员在Windows上进行ROS2开发,并轻松地将其应用程序部署到其他支持ROS2的平台,如Linux和嵌入式系统。这提供了更大的灵活性和便利性,使开发人员能够在不同的硬件配置和操作系统上进行机器人应用程序的开发和测试。
-
工具和资源共享:通过RoW,Windows用户可以访问和共享ROS2社区中存在的各种工具、库和资源。这些资源包括各种ROS2软件包、仿真工具、开发工具、教程和示例代码等。RoW为Windows用户打开了与全球ROS2开发者社区合作和共享的大门。
-
ROS2和Windows生态系统的互补性:对于那些在Windows平台上使用传感器、驱动器、图像处理和机器学习库以及其他各种硬件和软件的用户来说,RoW提供了将这些技术集成到ROS2生态系统中的机会。这种互补性可以使ROS2与Windows上可用的广泛工具和库无缝集成,从而打开更多的机器人应用领域。
虽然RoW使得在Windows上使用ROS2变得更加便利,但仍需注意其中的一些限制和注意事项。
在使用RoW时,建议参考ROS官方文档和RoW特定文档,以获得最佳的安装、配置和使用指南。
6.3 ROS2能提升Windows的实时性吗?
相对于ROS1,ROS2在实时性方面有所改进,并且提供了一些功能来支持实时应用。然而,需要明确的是,ROS2本身并不能显著提升Windows操作系统的实时性。也就是说,ROS2是软实时,并非操作系统调度层实时,也并不是硬件驱动层实时。
Windows操作系统并非实时操作系统(Real-Time Operating System,RTOS),它的调度器和内核设计并不专注于实时性能。尽管Windows提供了一些实时性能改进的功能,如实时时钟、实时优先级和调度策略,但它仍不具备传统实时操作系统的严格实时保证。
在ROS2中,针对实时性的改进主要体现在通信层面。ROS2引入了一种名为Data Distribution Service(DDS)的通信机制,该机制基于发布-订阅模式,支持更灵活、可靠和实时的通信。DDS协议本身支持实时性,并提供了使用QoS(Quality of Service)配置来满足实时性要求的方法。
使用ROS2的实时性特性需要结合支持实时性的系统和硬件平台,并进行适当的配置和调整。这通常涉及使用专门的实时操作系统、硬件加速以及优化和调整ROS2应用程序的参数和配置。在Windows上,并非所有实时性的需求都能够得到满足。
因此,要在Windows上获得更高的实时性能,建议考虑使用专门的实时操作系统,如Linux的实时内核(如PREEMPT-RT或Xenomai)或专为实时应用设计的实时操作系统(如VxWorks或RTOS)。这样的操作系统更适合需要严格实时保证的应用程序,并能与ROS2集成以提供更高的实时性能。
小结
随着技术的发展及人们需求的提高,机器人集成了越来越多的功能、传感器,对用户来说这越来越方便,但对开发者来说恰恰相反,功能的增加带来开发与集成难度迅速上升,机器人操作系统的出现有效缓解了这种问题。从计算机和智能手机的发展过程来看,合适与成熟的操作系统是智能机器人行业大规模发展和在人们的生活中普及的必要条件。
可以预见,未来几年将会出现众多机器人操作系统,在经过充分的发展竞争后将会有为数不多的几个操作系统会发展壮大并占据绝大部分市场,就像曾经的计算机操作系统和现在的手机操作系统。