一、ROS简介
对于许多初学者来说,机器人操作系统这个名字可能让人感到困惑。实际上,ROS是一个分布式通信框架,旨在简化程序进程之间的通信。
一个机器人通常由多个部件组成,每个部件都有相应的控制程序,以实现机器人的运动和感知功能等。要协调这些部件,或是多个机器人之间的协作,就需要实现它们之间的通信。ROS正是为了解决这种分布式通信问题而设计的。
随着越来越多的开发者参与ROS的开发和贡献,社区中出现了大量的第三方工具和开源软件包,使得ROS得以不断发展。
初学者常常会有一个误解,认为学会了ROS就等于学会了机器人开发。实际上,ROS仅仅是一个通信框架,机器人的各种算法和应用程序仍需使用C++、Python等编程语言进行开发。
二、ROS的性能特色
在深入学习ROS之前,先了解ROS的一些特性:元操作系统、分布式通信机制、松耦合软件框架以及丰富的开源功能库,这些有助于建立对ROS的基本认识。
ROS被视为机器人领域的元操作系统,实际上并不是一个完整的操作系统,它的底层任务调度、编译和设备驱动等功能依然依赖于Ubuntu Linux。
可以说,ROS是运行在Ubuntu Linux上的一个亚操作系统或软件框架,提供了硬件抽象、函数调用和进程管理等功能,并包含用于获取、编译和跨平台的工具。
ROS的核心思想是将机器人的软件功能拆分为多个节点,节点之间通过发送消息进行通信。这些节点可以部署在同一台主机上,也可以分布在不同的主机,甚至可以跨越互联网。ROS的主节点负责管理和调度网络中各个节点之间的通信,并提供配置全局参数的服务。
ROS采用松耦合的软件框架,通过分布式通信机制实现节点间的进程通信。这样的组织方式使得开发过程灵活,管理和维护也更为方便。
ROS具备丰富的开源功能库,基于BSD协议,允许任何人进行修改、重用和再发布,甚至可以在商业和闭源产品中使用,使用ROS能够快速构建自定义的机器人原型。
三、ROS的发行版本
类似于Linux发行版,ROS的发行版包含了一系列常用功能包,将ROS系统打包安装到原生系统中。ROS最初是基于Ubuntu系统开发的,其发行版本名称规则与Ubuntu相同,即版本名称由两个相同首字母的英文单词组成,并按字母表顺序递增。下图展示了ROS的一些主要版本。



四、ROS的学习方法
想要掌握ROS并有效使用,需进行大量实践。在快速了解ROS的核心概念和编程范式后,结合实际项目深入理解ROS。采用正确的方法解决问题,可以迅速提升能力。以下是一些主要的学习资源。
五、ROS系统架构
安装完ROS后,许多用户可能急于开始编写程序。由于ROS的架构相对复杂,为了便于理解后续的各种概念,接下来将讨论ROS的系统架构,以帮助大家全面掌握ROS中的各种概念。根据官方的说法,可以从计算图、文件系统和开源社区的视角来理解ROS的架构。
1. 从计算图视角理解ROS架构
在ROS中,可执行程序的基本单位称为节点(node),节点之间通过消息机制进行通信,形成网状结构,即计算图。

节点是可执行程序,通常称为进程。每个在ROS功能包中创建的可执行程序在启动后即成为一个ROS节点。
节点之间通过消息收发进行通信,消息机制包括话题(topic)、服务(service)和动作(action)。计算图中的节点、话题、服务和动作需有唯一名称标识。
ROS通过节点实现代码和功能的解耦,提高系统的容错性和可维护性。
消息是构成计算图的核心,包含消息机制和消息类型两部分。数据包(Rosbag)是用于保存和回放话题中数据的文件。
参数服务器为整个ROS网络中的节点提供可修改的参数。
主节点负责调度管理各个节点之间的通信过程。
2. 从文件系统视角理解ROS架构
ROS程序的不同组件需存放在不同的文件夹中,这些文件夹根据功能对文件进行组织,形成ROS的文件系统结构。

工作空间是包含功能包、编译包和可执行文件的文件夹,用户可以根据需要创建多个工作空间。
功能包是ROS中软件组织的基本形式,具有创建ROS程序的最小结构和最少内容,包含ROS节点源码、脚本和配置文件等。
CMakeLists.txt是功能包的配置文件,用于编译时的配置。package.xml是功能包清单文件,使用XML标签格式标记该功能包的各类相关信息。
include/ 是功能包的头文件目录,MSG、SRV和action三个文件夹分别存放非标准话题消息、服务消息和动作消息的定义文件。scripts目录存放Bash、Python等脚本文件,launch目录存放节点的启动文件。
3. 从开源社区视角理解ROS架构
ROS是开源软件,独立的网络社区分享和贡献软件及教程,形成了强大的ROS开源社区。

