什么是 ROS?
一个非常重要的概念:ROS 不是一个传统意义上的操作系统(如 Windows, Linux, Android),它更像是一个为机器人软件开发的、灵活的框架和工具集,构建在标准的操作系统(通常是 Ubuntu)之上。

(图片来源网络,侵删)
您可以把它想象成机器人的“软件中间件”或“开发平台”,它提供了一系列库、工具、约定和协议,极大地简化了机器人应用程序的编写、调试、通信和部署。
核心目标:
- 代码复用:让开发者可以轻松地共享和重用他人的代码。
- 模块化:将复杂的机器人系统拆分成独立、可协作的模块(节点)。
- 快速原型开发:提供丰富的工具,让开发者能快速测试和迭代想法。
- 生态系统:拥有庞大而活跃的全球社区,为各种机器人(从轮式机器人到人形机器人、无人机)提供了大量的软件包。
ROS 的核心概念与架构
理解 ROS 的关键在于理解其分布式、进程化的架构,一个 ROS 程序通常由多个独立的进程(称为“节点”)组成,这些节点通过网络(或本地主机)进行通信。
节点
- 定义:一个节点就是一个独立的可执行程序,它可以是一个传感器驱动程序、一个算法(如 SLAM 或路径规划)、一个视觉处理器,或者一个简单的控制脚本。
- 特点:每个节点只负责一项特定任务,一个节点可能专门负责读取激光雷达的数据,另一个节点专门负责根据这些数据规划路径。
- 命名:每个节点都有一个唯一的名称,
/laser_scan_publisher或/move_base。
消息
- 定义:节点之间通信的数据载体,消息是一个简单的数据结构,包含一系列字段(类似 C 语言的结构体或 Python 的类)。
- 特点:消息是强类型的,发送方和接收方必须使用同一种类型的消息才能通信。
- 自定义:用户可以定义自己的消息类型,例如一个包含
x,y,theta位置的Pose2D消息。 - 序列化:消息在通过网络传输时会被序列化(转换为字节流),在接收端再反序列化。
话题
- 定义:节点之间最主要的通信方式,是一种异步的发布/订阅模式。
- 工作方式:
- 发布者:向某个话题发布消息,它不关心谁在订阅,只管发布。
- 订阅者:订阅某个话题,接收所有发布到该话题的消息,它不关心消息是谁发布的。
- 类比:就像一个广播电台(发布者)向特定频率(话题)广播节目(消息),任何调到这个频率的收音机(订阅者)都能收听到。
- 特点:一对多,一个发布者可以对应多个订阅者。
服务
- 定义:另一种通信方式,是一种同步的请求/响应模式。
- 工作方式:
- 客户端:向服务器发送一个请求,并等待响应。
- 服务器:接收请求,进行处理,然后返回一个响应。
- 类比:就像打电话,你(客户端)拨号(请求),对方(服务器)接听并回答(响应),然后通话结束,你不能同时进行多个通话。
- 特点:一对一,一个请求必须得到一个响应。
参数服务器
- 定义:一个共享的、全局的“键-值”存储服务器。
- 用途:用于存储和配置系统的静态参数,例如机器人的尺寸、传感器的校准值、算法的阈值等。
- 特点:所有节点都可以通过
rosparam命令或 API 读取和写入参数,参数在系统启动时加载,可以在运行时动态修改。
工具
ROS 提供了大量的命令行工具来管理和调试系统,其中最核心的是:
roscore:ROS 的主控程序,在运行任何 ROS 程序之前,必须先运行roscore,它会启动:- ROS Master (rosout):ROS 的命名服务器,负责管理话题、服务等。
- Parameter Server:参数服务器。
- rosout:ROS 的日志系统。
rosnode:列出和查看节点信息,如rosnode list,rosnode info /node_name。rostopic:查看和交互话题,如rostopic list,rostopic echo /topic_name(打印消息内容),rostopic hz /topic_name(发布频率)。rosservice:列出和调用服务,如rosservice list,rosservice call /service_name。rosparam:操作参数服务器,如rosparam list,rosparam get /param_name,rosparam set /param_name。rqt:一个强大的图形化工具集,可以替代多个命令行工具,提供可视化的节点图、话题监视器、参数编辑器等。
ROS 的版本与发行版
ROS 有两个主要版本系列,ROS 1 和 ROS 2,它们在设计哲学和架构上有显著不同。

(图片来源网络,侵删)
ROS 1
- 架构:基于中心化的 ROS Master,所有节点都必须先连接到 Master 才能发现彼此,这是一个单点故障源。
- 通信:主要使用 TCP/IP。
- 并发模型:使用单线程的“回调队列”,一个节点在同一时间只能处理一个回调,如果某个回调耗时过长,会影响整个节点的性能。
- 发行版:以版本号命名,如 Noetic (最后一个 LTS 版本, 基于 Ubuntu 20.04), Melodic, Kinetic,每个发行版通常与一个特定的 Ubuntu 版本绑定。
ROS 2
- 诞生原因:为了解决 ROS 1 的局限性,特别是实时性、安全性、多机器人系统和大规模部署等问题。
- 架构:去中心化。不依赖 ROS Master,节点之间通过 DDS (Data Distribution Service) 的发现机制自动找到彼此,更加健壮和可扩展。
- 通信:默认使用 UDP,并支持高质量的实时传输。
- 并发模型:使用多线程,每个节点可以运行多个线程,充分利用多核 CPU 的性能,解决了 ROS 1 的回调阻塞问题。
- 安全性:内置了安全机制,可以对节点、用户、数据进行认证和授权。
- 发行版:以代码名称命名,基于 Ubuntu LTS 版本,最新的稳定版是 Humble Hawksbill (基于 Ubuntu 22.04)。
| 特性 | ROS 1 | ROS 2 |
|---|---|---|
| 核心架构 | 中心化 (依赖 ROS Master) | 去中心化 (依赖 DDS) |
| 通信中间件 | ROS原生 (TCP/IP为主) | DDS (默认为FastRTPS, UDP) |
| 并发模型 | 单线程回调队列 | 多线程 |
| 发现机制 | 由ROS Master管理 | DDS自动发现 |
| 实时性 | 较差 | 良好,支持实时优先级 |
| 安全性 | 无内置安全机制 | 内置安全认证和授权 |
| 推荐场景 | 学术研究、小型项目、原型验证 | 工业、自动驾驶、多机器人、需要高性能和可靠性的场景 |
如何开始学习 ROS?
选择版本
- 新手入门/学术研究:可以从 ROS 1 Noetic 开始,因为它拥有最多的教程、文档和现成的软件包,社区支持最广泛。
- 面向未来/工业界/高性能需求:强烈建议直接学习 ROS 2 Humble,虽然初期资源可能不如 ROS 1 丰富,但它是未来的方向,架构更优。
安装
学习路径
- 掌握基本命令:熟练使用
roscore,rosnode,rostopic,rosservice,rosparam等命令行工具,这是调试和 ROS 交互的基础。 - 编写简单的节点:学习使用 Python 或 C++ 编写自己的发布者和订阅者节点,这是理解 ROS 通信机制的关键一步。
- 理解工作空间:学习创建和使用
catkin(ROS 1) 或colcon(ROS 2) 工作空间来管理自己的代码包。 - 使用现成的软件包:尝试运行一些现成的机器人仿真,如 TurtleBot3 或 Gazebo 中的模型,这能让你体验到 ROS 的强大之处。
- 深入核心概念:学习服务、动作、TF(坐标变换)、URDF(机器人描述文件)等更高级的概念。
- 实践项目:找一个感兴趣的项目,比如让机器人实现 SLAM 和导航,或者用摄像头进行物体识别,将所学知识融会贯通。
ROS 是现代机器人学领域不可或缺的基石,它通过其模块化、可重用的设计,极大地推动了机器人技术的发展。
- ROS 1 是一个成熟、庞大的生态系统,非常适合学习和快速原型开发。
- ROS 2 则代表了未来,它在性能、可靠性和安全性上对 ROS 1 进行了全面的革新,是构建下一代复杂机器人系统的理想选择。
对于任何有志于从事机器人开发的人来说,学习 ROS 都是一项极具价值的投资。
标签: ROS机器人操作系统入门教程 ROS机器人操作系统应用场景 ROS机器人操作系统学习资源
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。