跳转至

ROS基础

ROS定义

ROS (Robot Operating System, 机器人操作系统) 提供一系列程序库和工具以帮助软件开发者创建机器人应用软件。它提供了硬件抽象、设备驱动、函数库、可视化工具、消息传递和软件包管理等诸多功能。

ROS/介绍 - ROS Wiki --- ROS/Introduction - ROS Wiki

image

ROS组成

image

通信机制

image

ROS1 中的通信机制采用 松耦合分布式架构,核心理念如下:

  • 松耦合(Loose Coupling)
    系统模块通过中介机制(ROS Master) 通信,而非彼此直接调用或依赖;
  • 分布式(Distributed)
    各节点可部署在不同设备/计算机上,通过网络通信协同工作;
  • 点对点通信
    节点注册与发现通过 ROS Master 实现,后续通信走点对点连接(TCP/UDP)。

松耦合的关键特性:

  1. 解耦设计(Loose Coupling)

  2. 发布者与订阅者互不依赖,不需了解对方;

  3. 只需统一话题名与消息类型即可通信;
  4. 节点可动态启动、重启、替换,不影响系统运行。

  5. 点对点连接(Peer-to-Peer)

  6. 通信由节点之间直接建立 TCP 或 UDP 连接完成;

  7. ROS Master 仅在注册和撮合阶段参与,通信阶段不介入。

  8. 可扩展 & 易调试

  9. 各节点支持独立开发、单独部署、模块化测试

  10. 支持跨设备分布式部署,适合构建大型复杂机器人系统。

通信机制的结构组成:

组件 说明
Node(节点) ROS 的基本功能单元,每个节点负责一个模块任务(如激光雷达驱动、路径规划)
ROS Master 中央协调器,负责节点注册、话题匹配、服务发现等
Topic(话题) 异步消息通信机制,支持多对多消息广播
Service(服务) 同步请求-响应机制,适合请求式控制通信(如“开始识别”)
Action(动作) 具备异步反馈、进度更新与中止支持,适合长时间任务(如导航、机械臂移动)
Message(消息) 节点通信数据格式,由 .msg​ 文件定义

开发工具

image

应用功能

image

生态系统

image

image

ROS核心概念

ROS的概念分为三个层次:文件系统层、计算图层、社区层

ROS文件系统层次

文件系统层概念主要指在硬盘里能看到的ROS目录和文件,例如:

  • Packages(功能包): Packages是在ROS中整理及组织软体的主要单元。一个Packages包含节点(ROS runtime processes)、ROS程式库(ROS-dependent library)、数据集(datasets)、配置文件(configuration files)⋯⋯等等。Packages是您在ROS中能建立及分享的最小单元。
  • Metapackages: Metapackages 是一组具体的服务相关的功能包。大部分的metpackages 只作为转换rosbuild Stacks的向后兼容的备选。
  • Package Manifests(功能包清单): Manifests (package.xml) 描述一个package的元信息,包括了package的名字,版本,功能简述,证书信息,依赖关系,以及一些其他的被export的package所有的信息。关于package.xml 的文件说明,参考REP-0127.
  • Repositories: 代码仓库是使用VCS版本控制系统的软件包集合,软件包利用版本控制维持同一版本,它能使用catkin自动发布工具bloom进行发布。这些代码仓库常通过映射来进行转换 rosbuild Stacks.仓库可以是只有一个软件包。
  • Message (msg) types: 存储在my_package/msg/MyMessageType.msg的Message文件,主要定义了ROS系统的messages传输的数据结构。
  • Service (srv) types: 存储在 my_package/srv/MyServiceType.srv的服务services文件,定义了ROS的服务通信时的请求(request )和响应(response )相关的数据结构。

ROS计算图层次

计算图是ROS在点对点网络里整合并处理数据的过程。基本计算图概念是 节点, 主机, 参数服务器, 消息, 服务, 话题, and 数据包,它们通过不同的方式提供数据给图层。

  • Nodes(节点):节点是 ROS 中的计算处理单元,用于执行具体功能。ROS 设计为一个细粒度模块化系统,一个完整的机器人控制系统通常由多个节点构成。

例如:一个节点控制激光雷达;一个节点控制轮式电机;一个节点负责定位;一个节点进行路径规划;一个节点提供图形用户界面(GUI)。

每个 ROS 节点是通过 ROS 客户端库(如 roscpp​ 或 rospy​)编写的。

  • Master(主节点):ROS Master 提供名称注册与查询服务,它是整个计算图的中心协调者
    若没有 Master,节点之间无法相互发现、交换消息或调用服务

  • Parameter Server(参数服务器)
    参数服务器允许通过键值对形式在中央位置存储和共享参数数据。目前,参数服务器是 ROS Master 的一部分。

  • Messages(消息)

节点之间通过传递消息(Message)进行通信。消息本质上是一种数据结构,由具有明确类型的字段组成。
支持的类型包括:

  • 基本类型:整型、浮点型、布尔型等;
  • 基本类型数组;
  • 支持结构体嵌套和数组嵌套(类似于 C 语言中的 struct​ 结构)。

  • Topics(话题)

ROS 采用发布 / 订阅(Publish / Subscribe)机制进行异步通信。节点通过将消息发布到一个话题(Topic)来发送数据,而订阅该话题的节点则会接收到这些消息。

  • 话题是用于标识消息内容的名称
  • 一个话题可以同时拥有多个发布者与订阅者;
  • 同一个节点可以同时发布和/或订阅多个话题;
  • 发布者与订阅者互不感知彼此存在,实现了通信的解耦
  • 可以将话题视为一种强类型的消息总线(message bus) ,只要消息类型匹配,任何人都可以通过这个总线进行通信。

  • Services(服务):

虽然发布/订阅机制灵活,但由于其多对多、单向通信的特性,不适用于需要请求/响应交互的场景。
这种一对一、同步交互由**服务(Service)**机制实现。

服务通过一对消息结构来定义:一个用于请求,另一个用于响应。
提供服务的节点以名称注册服务,客户端节点通过发送请求消息并等待响应来使用该服务。
在编程接口中,ROS 客户端库通常将其抽象为远程过程调用(RPC)形式,方便开发者调用。 * Bags(包文件):

Bag 是 ROS 中用于保存和回放消息数据的一种文件格式。

它在以下场景中非常重要:

  • 保存传感器数据;
  • 离线分析;
  • 算法开发与测试。

Bag 文件允许开发者在没有真实硬件的情况下进行回放调试。

ROS通信机制

ROS(Robot Operating System)提供了多种通信机制,以满足不同模块间的数据交换和协同控制需求。主要包括四大通信机制:Topic、Service、Action 和 Parameter Server。

Topic

话题通信

  • 特点:异步、多对多通信
  • 机制:基于发布(Publisher)/订阅(Subscriber)模型
  • 适用场景:适合传输连续不断的数据流,如图像、激光、IMU 等传感器数据
  • 优点:解耦、扩展性强,不阻塞发送方

示例:摄像头节点发布图像,多个图像处理节点同时订阅进行处理。

Service

服务通信

  • 特点:同步、一对一通信
  • 机制:客户端发出请求,服务端响应,完成一次交互
  • 适用场景:适合短时间的命令交互,如“获取参数”、“启动任务”等
  • 优点:简单直接,阻塞调用

示例:导航控制节点请求路径规划节点生成路径,等待结果返回。

Parameter Server

参数服务器

  • 特点:集中式参数管理机制
  • 机制:以键值对(key-value)形式存储数据,节点通过 ROS Master 共享和访问这些参数
  • 适用场景:适用于全局配置参数或静态标定数据的共享,如传感器参数、PID 控制参数、机器人模型路径等
  • 优点

  • 各节点统一读取和更新共享参数,避免硬编码

  • 支持运行时动态修改参数
  • 可从 launch 文件加载,增强灵活性

示例

  • 控制节点从参数服务器读取 max_velocity​ 控制最大速度
  • 图像处理节点读取 camera_intrinsics​ 获取相机内参

Action

Action(动作通信) 并不是 ROS 最基础的通信机制,而是在 Service 基础上扩展的一种异步任务机制,用于处理长时间执行任务,支持反馈与中止。

它通过底层封装多个话题和服务实现,属于更高级的通信抽象层。

  • 特点:异步、有反馈、可取消的任务通信机制
  • 机制:客户端发送目标,服务器执行,并周期性反馈进度,可中途取消
  • 适用场景:适合耗时任务,如“移动到指定位置”、“机械臂抓取”
  • 优点:灵活,支持状态反馈与中断控制

示例:控制机械臂从 A 移动到 B,可在中途查看进度或取消任务。

通信对比

特性 Topic Service Action Parameter Server
通信类型 异步 同步请求响应 异步+反馈+取消 配置参数共享
一对多支持 ✅(多节点可访问)
是否阻塞 否(访问阻塞较低)
使用场景 数据流传输 控制指令请求 长时间任务 配置、标定参数

ROS文件系统

ROS文件系统级指的是在硬盘上ROS源代码的组织形式,其结构大致可以如下图所示:

image

WorkSpace --- 自定义的工作空间

    |--- build:编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。

    |--- devel:开发空间,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。

    |--- src: 源码

        |-- package:功能包(ROS基本单元)包含多个节点、库与配置文件,包名所有字母小写,只能由字母、数字与下划线组成

            |-- CMakeLists.txt 配置编译规则,比如源文件、依赖项、目标文件

            |-- package.xml 包信息,比如:包名、版本、作者、依赖项...(以前版本是 manifest.xml)

            |-- scripts 存储python文件

            |-- src 存储C++源文件

            |-- include 头文件

            |-- msg 消息通信格式文件

            |-- srv 服务通信格式文件

            |-- action 动作格式文件

            |-- launch 可一次性运行多个节点 

            |-- config 配置信息

        |-- CMakeLists.txt: 编译的基本配置