# 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 的强大功能。