一、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 主题的节点 , 也就是 图像处理节点 / 图像显示节点 ( 订阅者 ) ;
  • 消息回调 : 图像处理节点 / 图像显示节点 ( 订阅者 ) 接收到消息后 , 会 自动调用之前注册的 消息回调函数 , 并将接收到的消息作为参数传递给该函数 ;
  • 消息处理 : 消息回调函数 内部就可以对 图片数据进行处理 , 展示图片数据 或 处理图片数据 ;
Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐