【自动驾驶】ROS 机器人操作系统框架 ① ( ROS 简介 | ROS 点对点设计 | ROS 与 自动驾驶 适配 | ROS 节点间消息传递方式 | 发布 / 订阅 模型 )
文章目录
一、ROS 机器人操作系统框架
1、ROS 简介
ROS ( Robot Operating System , 机器人操作系统 ) 的 本质 并不是 传统意义 的 操作系统 , 而是一套 用于 构建机器人应用 的 开源框架 与 工具集 ;
ROS 提供了 命令行工具、图形化界面工具、函数库、编译环境、客户端、中心服务器、开发约定 等组件 组成的 生态系统 , 旨在 简化 复杂机器人系统 的 开发过程 , 可以快速 在不同架构的硬件平台上 创建 复杂、鲁棒 的 机器人 ;
ROS 不是一种编程语言 , 通常使用 C++、Python 等语言开发 ROS 模块 , ;
2、ROS 点对点设计
ROS 采用 点对点 通信架构 , 节点 之间可以 直接通信 , 无需依赖 中央控制器 进行中转 ;
每个 节点 作为独立 功能单元 , 负责单一任务 , 如 : 负责激光雷达数据处理 或 负责图像数据处理 ;
每个节点 可以 独立发布 ( Publish ) 或 订阅 ( Subscribe ) 消息 ( Topic ) , 也可以通过 服务 ( Service ) 或 动作 ( Action ) 进行 请求-响应式 交互 , 无需 中心化管理 , 降低了 模块间的耦合度 ;
点对点设计优点 :
- 鲁棒性 : 避免 单点故障 , 即使 某个节点崩溃 , 只要 关键数据流 还在 , 其他节点仍能继续工作 ;
- 低延迟 : 数据 直接在 发布者 节点 和 订阅者 节点 之间传输 , 减少了 中间环节 带来的延迟 ;
- 低带宽 : 没有 中央控制器 , 避免了 节点 与 中央控制器 之间的 带宽网络瓶颈 ;
3、ROS 分布式设计
ROS 分布式设计 : ROS 支持 跨多台计算机 运行节点 , 节点之间的 通信 对 开发者 透明 , 只要网络连通 , 不同节点 可在 不同机器 上运行 , 不同的 ROS 节点 可以部署到 不同的 计算机 中 , 多台计算机 协同工作 ;
- 高性能节点 : 将 计算密集型任务 部署在高性能主机 , 如 : 点云模型处理 , 图像识别 ;
- 低性能节点 : 将 传感器数据采集 部署在车载嵌入式设备 , 如 : 摄像头数据采集 , 点云数据采集 ;
只需要 统一的 网络环境 , 即可实现 跨设备 节点 之间的通信 , 灵活适配 自动驾驶 的 涉及大量 数据收集 和 数据处理计算 的 多硬件架构 , 分布式架构 可充分利用 异构硬件资源 , 提升整体性能 ;
4、ROS 与 自动驾驶 适配
ROS 适配 自动驾驶 的 模块化架构 ( 点对点设计 ) :
自动驾驶 系统 由 多个 子系统 组成 , 定位系统 -> 感知系统 -> 预测系统 -> 决策系统 -> 控制系统 , ROS 的 点对点设计 天然 契合 自动驾驶 的 架构设计 ;
自动驾驶 各个模块 之间通过 ROS 通信机制交互数据 , 某一模块的 更新或替换 , 如 : 替换激光雷达硬件 / 更新图像处理算法 , 无需重构整个系统 , 极大提升了开发效率 ;
ROS 满足 多硬件协同 与 算力分配 需求 ( 分布式设计 ) :
自动驾驶通常 搭载 激光雷达、摄像头、毫米波雷达 等多种传感器 , 且需要 高性能计算单元 支持 ;
ROS 的 分布式设计 可将 传感器数据采集、算法运算 等任务 分配到 不同硬件 , 避免单一设备算力过载 , 保障系统实时性 ;
二、ROS 节点间消息传递方式解析
1、节点间消息传递
ROS 节点间的 通信消息 以 发布 Publish / 订阅 Subscribe 模式 进行传递 , 该模型有如下特点 :
- 信息载体 - 主题 : 节点 发布 / 订阅 消息 是 在 主题 中 进行的 ;
- 节点 - 主题 对应关系 : 多对多关系 ;
- 一个节点 可以 发布 / 订阅 多个主题 ;
- 多个节点 可以 发布 / 订阅 一个主题 ;
- 发布 / 订阅 互相透明 : 发布主题 的 节点 与 订阅主题 的 节点 互相透明 , 互相不知道对方的存在 ;
2、发布 Publish / 订阅 Subscribe 模式 四大组件
发布 Publish / 订阅 Subscribe 模式 四大组件 :
- 节点 Node : 节点 是 ROS 中执行 具体计算任务 的进程 , 每个节点都有一个 唯一的名称标识 ;
- 节点示例 : 采集 传感器数据 的设备 激光雷达 / 摄像头 / 毫米波雷达 各自是一个节点 ;
- 节点示例 2 : 处理传感器数据的 车载计算单元 / 域控制器 也是一个节点 ;
- 主题 Topic : 主题 是 节点之间 用来交换消息的 虚拟通道 , 类似于 电台频率 ;
- 主题名称 : 每个主题都有一个唯一名称标识 , 如 : /scan , /cmd_vel , /image_raw ;
- 消息 Message : 在 主题 上传输的 数据结构 , 定义了 数据 的 类型和格式 ;
- 主题与消息的联系 : 一个主题的 消息类型 必须是相同的 ;
- 消息类型 : ROS 提供了一系列的 标准消息类型 , 用户也可以 自定义消息类型 ;
- 发布者 Publisher : 发布者 是 节点 中的一段程序 , 负责 向 指定的 若干个主题 发布消息 ;
- 与节点对应关系 : 一个节点 可以有 多个 主题 对应的 发布者 ;
- 订阅者 Subscriber : 订阅者 是 节点 中的一段程序 , 负责 监听 指定的 若干个主题 上的消息 ;
- 与节点对应关系 : 一个节点 可以有 多个 主题 对应的 订阅者 ;
- 工作流程 : 新消息 发布到 订阅的 主题 上 , ROS 将消息传递给 订阅了该主题的 订阅者 所在的 节点 ;
- 匿名属性 : 发布者 和 订阅者 是 匿名 的 , 发布者 和 订阅者 互相不知道对方的存在 , 但是 发布者 和 订阅者 必须知道 主题名称 和 消息类型 ;

3、发布 Publish / 订阅 Subscribe 模式 示例演示
下图中有三个设备 :
- 摄像头 采集 图像数据 ;
- 单片机 处理 图像数据 ;
- 笔记本 展示 图像数据 ;
在 ROS 系统中 , 将三者 注册为 ROS 节点 , 并实现 将 摄像头采集的图像数据 , 通过 发布 Publish / 订阅 Subscribe 模式 , 发送给 单片机 和 笔记本 ;

① 发布者工作流程
发布者 ( 图像采集节点 ) 工作流程 :
- 初始化节点 : 初始化自身为一个 ROS 节点 ;
- 创建发布者 : 创建一个 发布者 Publisher 对象 , 指定要发布到的 主题名称 /image_data 和 消息类型 Message ;
- 生成消息 : 在其主循环中 , 不断 从 摄像头硬件 读取数据 , 将数据 填充到一个 Message 类型的消息对象中 ;
- 发布消息 : 调用 发布者 对象的 publish() 方法 , 将这个消息 发送到 /image_data 主题 , 发布者 ( 图像采集节点 ) 不关心谁会接收这个消息 , 甚至不关心是否有节点在接收 ;
② 订阅者工作流程
图像处理节点 / 图像显示节点 ( 订阅者 ) 工作流程 :
- 初始化节点 : 初始化自身为一个 ROS 节点 ;
- 创建订阅者 : 创建一个 订阅者对象 Subscriber , 指定要订阅的 主题名称 /image_data 和 消息类型 Message , 以及 接收消息的回调函数 ;
- 启动订阅 : 当 图像处理节点 / 图像显示节点 启动 并 订阅 /image_data 主题 后 , 它会 通知 ROS Master 主节点 对 /image_data 主题感兴趣 ;
- 等待消息 : 节点的 主循环 可以继续 执行其他任务 , 或者 等待 消息回调 ;
③ ROS 主节点工作流程
ROS Master 主节点 工作流程 :
- 核心注册表 : ROS 主节点 是 整个 ROS 系统的 核心 , 其中 维护着一个所有 活跃节点、主题、服务 等的注册表 ;
- 发布者发布消息 : 当 发布者 ( 图像采集节点 ) 发布消息 时 , 它会 告诉 ROS Master ( 主节点 ) 在 /image_data 主题上 发布了一个 Message 消息 ;
- 主节点查询主题 : ROS Master ( 主节点 ) 知道 图像处理节点 / 图像显示节点 ( 订阅者 ) 订阅了 /image_data 主题 ;
- 建立连接 : ROS Master ( 主节点 ) 会负责 建立 发布者 ( 图像采集节点 ) 和 图像处理节点 / 图像显示节点 ( 订阅者 ) 之间的 直接通信连接 , 一般是 TCP 连接 ;
- 点对点数据传输 : 一旦 TCP 网络连接建立 , Message 消息 就可以 直接在 发布者 和 订阅者 节点 之间传输 ;
④ 消息传递工作流程
消息传递 工作流程 :
- 消息传递 : 一旦连接建立 , 当 发布者 ( 图像采集节点 ) 发布一个新的 Message 消息到 /image_data 主题时 , ROS 底层通信机制 会 将该消息的副本 高效地 传递给所有订阅了 /image_data 主题的节点 , 也就是 图像处理节点 / 图像显示节点 ( 订阅者 ) ;
- 消息回调 : 图像处理节点 / 图像显示节点 ( 订阅者 ) 接收到消息后 , 会 自动调用之前注册的 消息回调函数 , 并将接收到的消息作为参数传递给该函数 ;
- 消息处理 : 消息回调函数 内部就可以对 图片数据进行处理 , 展示图片数据 或 处理图片数据 ;
更多推荐


所有评论(0)