165 lines
6.2 KiB
Markdown
165 lines
6.2 KiB
Markdown
# ROS 2 基础概念
|
||
|
||
ROS 2 (Robot Operating System 2) 是一个用于构建机器人应用程序的开源框架。它提供了一套工具、库和约定,帮助开发者创建可维护、可扩展且可重用的机器人软件。
|
||
|
||
## 1. Node (节点)
|
||
|
||
**节点** 是 ROS 2 中最小的可执行单元,代表一个单一功能模块。每个节点执行特定任务(如控制传感器、处理图像、规划路径等),并通过标准接口与其他节点通信。
|
||
|
||
- **特点**:
|
||
- 轻量级,单一职责
|
||
- 使用命名空间避免命名冲突
|
||
- 支持多种客户端库(C++、Python、Java等)
|
||
|
||
- **核心概念**:
|
||
- 节点名称:唯一标识符,如 `/camera_driver`
|
||
- 命名空间:用于组织节点,如 `/robot1/camera_driver`
|
||
|
||
## 2. Discovery (发现机制)
|
||
|
||
**发现机制** 是 ROS 2 中节点自动发现其他节点和服务的过程。它允许节点在网络中找到彼此并建立通信,无需硬编码地址。
|
||
|
||
- **工作原理**:
|
||
- 使用 DDS (Data Distribution Service) 作为底层通信中间件
|
||
- 通过参与者(Participant)、主题(Topic)和服务(Service)的发现实现
|
||
- 自动管理连接的建立和断开
|
||
|
||
- **关键组件**:
|
||
- ROS 2 守护进程 `ros2 daemon`(后台运行,管理发现)
|
||
- DDS 域(Domain ID):控制节点可见性(同一域的节点才能通信)
|
||
|
||
## 3. Interfaces (接口)
|
||
|
||
**接口** 定义了节点之间通信的消息格式。ROS 2 提供了三种主要通信接口类型:
|
||
|
||
### 3.1 Topics (话题) - 发布/订阅通信
|
||
|
||
**话题** 是节点之间传递数据的命名通道。一个节点可以**发布**(发送)数据到某个话题,其他节点可以**订阅**(接收)该话题的数据。
|
||
|
||
- **特点**:
|
||
- 单向、异步通信
|
||
- 一对多或多对多通信模式
|
||
- 消息类型严格定义(如 `std_msgs/String`、`sensor_msgs/Image`)
|
||
|
||
- **使用场景**:
|
||
- 持续数据流(如传感器数据、状态信息)
|
||
|
||
### 3.2 Services (服务) - 请求/响应通信
|
||
|
||
**服务** 实现节点之间的双向同步通信。一个节点提供**服务**,其他节点发送**请求**并等待**响应**。
|
||
|
||
- **特点**:
|
||
- 请求/响应模式
|
||
- 同步通信(客户端等待服务端处理)
|
||
- 需要定义请求和响应的消息类型(.srv 文件)
|
||
|
||
- **使用场景**:
|
||
- 一次性任务(如获取配置、执行动作)
|
||
|
||
### 3.3 Actions (动作) - 目标导向通信
|
||
|
||
**动作** 是服务的扩展,支持长时间运行的任务,并提供反馈和取消功能。
|
||
|
||
- **特点**:
|
||
- 目标-反馈-结果模式
|
||
- 可取消、可获取进度反馈
|
||
- 异步执行
|
||
- 消息类型定义在 .action 文件中
|
||
|
||
- **使用场景**:
|
||
- 长时间运行的任务(如导航、抓取物体)
|
||
|
||
## 4. Parameters (参数)
|
||
|
||
**参数** 是节点的配置值,可以在运行时动态修改。参数支持多种数据类型(整数、浮点数、字符串、布尔值等)。
|
||
|
||
- **管理方式**:
|
||
- 命令行设置
|
||
- 配置文件(YAML)
|
||
- 运行时动态修改(通过 `ros2 param` 命令或 API)
|
||
|
||
- **常用操作**:
|
||
- `ros2 param list`:列出节点参数
|
||
- `ros2 param set`:设置参数值
|
||
- `ros2 param get`:获取参数值
|
||
|
||
## 5. Introspection (内省)
|
||
|
||
**内省** 允许开发者在运行时检查和监控 ROS 2 系统的状态。通过内省工具,您可以查看节点、话题、服务和参数的信息。
|
||
|
||
- **常用工具**:
|
||
- `ros2 node list`:列出所有节点
|
||
- `ros2 topic list`:列出所有话题
|
||
- `ros2 service list`:列出所有服务
|
||
- `ros2 topic echo`:查看话题消息内容
|
||
- `ros2 node info`:查看节点详细信息
|
||
|
||
## 6. Launch (启动系统)
|
||
|
||
**Launch** 允许您同时启动多个节点和配置它们的参数。使用 Python 或 XML 编写的启动文件可以简化系统启动过程。
|
||
|
||
- **特点**:
|
||
- 同时启动多个节点
|
||
- 配置节点参数
|
||
- 设置命名空间和重映射
|
||
- 支持条件启动和依赖关系
|
||
|
||
- **常用工具**:
|
||
- `ros2 launch`:执行启动文件
|
||
- 启动文件格式:Python(推荐)、XML、YAML
|
||
|
||
## 7. Client Libraries (客户端库)
|
||
|
||
**客户端库** 是 ROS 2 提供的编程接口,允许开发者使用不同语言编写节点。
|
||
|
||
- **主要客户端库**:
|
||
- **rclcpp**:C++ 客户端库(推荐用于高性能应用)
|
||
- **rclpy**:Python 客户端库(推荐用于快速原型开发)
|
||
- **rcljava**:Java 客户端库
|
||
- **其他**:Swift、Go 等语言的社区支持
|
||
|
||
- **核心特性**:
|
||
- 统一的 API 接口
|
||
- 自动内存管理
|
||
- 支持所有 ROS 2 通信模式
|
||
|
||
## 8. 通信中间件
|
||
|
||
ROS 2 使用 **DDS (Data Distribution Service)** 作为默认通信中间件,提供可靠的实时数据交换。DDS 是工业标准的中间件,适用于嵌入式系统和高性能计算。
|
||
|
||
- **DDS 特性**:
|
||
- 高可靠性
|
||
- 低延迟
|
||
- 实时支持
|
||
- 可扩展性
|
||
- 服务质量(QoS)配置
|
||
|
||
## 9. 服务质量(QoS)
|
||
|
||
**QoS (Quality of Service)** 配置允许您控制通信的可靠性、持久性和其他特性。QoS 设置对于确保系统在不同环境下的性能至关重要。
|
||
|
||
- **主要 QoS 策略**:
|
||
- Reliability:可靠传输(保证交付)或最佳 effort(不保证交付)
|
||
- Durability:数据是否持久化(对晚加入的节点可见)
|
||
- History:保留消息历史的深度
|
||
- Deadline/Lifespan:消息的截止时间和寿命
|
||
|
||
## 10. 系统架构概览
|
||
|
||
ROS 2 系统由以下层次组成:
|
||
|
||
1. **应用层**:节点、话题、服务、动作
|
||
2. **中间件层**:DDS 通信系统
|
||
3. **工具层**:命令行工具、可视化工具、调试工具
|
||
4. **硬件抽象层**:传感器、执行器、硬件接口
|
||
|
||
## 11. 与 ROS 1 的主要区别
|
||
|
||
- **通信中间件**:ROS 1 使用 TCPROS/UDPROS,ROS 2 使用 DDS
|
||
- **节点发现**:ROS 1 依赖 roscore,ROS 2 去中心化
|
||
- **接口类型**:ROS 2 添加了 Actions
|
||
- **参数系统**:ROS 2 支持动态参数配置
|
||
- **编译系统**:ROS 1 使用 catkin,ROS 2 使用 colcon
|
||
- **支持的语言**:ROS 2 对 Python 3 的支持更好,添加了更多语言选项
|
||
|
||
这些基础概念是理解和使用 ROS 2 的核心。通过掌握这些概念,您可以开始构建复杂的机器人系统,并利用 ROS 2 的强大功能。 |