zl程序教程

您现在的位置是:首页 >  其他

当前栏目

ROS2极简总结-核心概念(一)

2023-03-31 10:31:41 时间

参考文献:ROS2 Foundation - An introduction to core concepts

纲要

  1. 计算图(Computation Graph)
  2. 节点(Node)
  3. 节点组成(Node Composition)
  4. 主题和消息(Topics and Messages)
  5. 执行器(Executor)
  6. 服务(Services)
  7. 行动(Actions)
  8. 参数(Params)
  9. 启动文件(Launch files)

1 计算图

计算图(Computation Graph)用于显示ROS进程中点对点网络里的数据等。

  • 呈现ROS系统通信
  • 图的参与者为节点
  • 节点通常可以订阅或发布数据

2 节点

在机器人系统中具备单一、模块化目标的元件。

  • 摄像头驱动
  • 控制电机
  • 感知单元

用于创建发布者、订阅者、服务等

最常见的 ROS 客户端库

  • rclcpp :C++文件的二进制库
  • rclpy :Python脚本库

运行 ROS 节点的命令

ros2 run <package_name> <executable_name> [arguments]

无需主节点即可发现其他节点!(ROS2特色)

自动发现

ROS1 节点通讯

ROS2节点通信

使用ROS_DOMAIN_ID:

无主节点缺陷…… (比如,没有主节点故障!)

ROS1与ROS2对比

节点结构

如果是嵌入式设备,则有:

结构图如下:

完美支持ROS2。

在基于机器人操作系统的机器人应用中弥补资源受限的微控制器和更大处理器之间的差距。

  • 支持所有主要 ROS 功能的微控制器并优化客户端 API
  • 与 ROS 2 无缝集成
  • 资源需求极少但灵活的中间件
  • 具有通用构建系统的多 RTOS 支持
  • 宽泛许可证
  • 充满活力的社区和生态系统
  • 长期可维护性和互操作性

几乎所有机器人产品都使用微控制器。 典型的原因是:

  • 硬件访问
  • 低延迟的硬实时
  • 省电

另一个重要原因是安全性,但请注意,micro-ROS 不是根据任何安全标准开发的。

常见ROS结构

ROS2-统一API接口

ROS2 客户端库

  • API 构建在通用核心客户端库之上
  • 确保对功能任何地更改都反映在所有派生的客户端库中

3 节点组成

统一API

  • 单个进程中节点的组成
  • 简化代码重用

基本原理 将流程布局决策推迟到部署时

  • 不同进程中的节点
  1. 允许故障隔离
  2. 更容易调试
  • 同一进程中的节点
  1. 低开销
  2. 更高效的沟通

将 Node 作为组件编写

继承自 Node 类

  • 允许被其他脚本导入和使用
  • 能够在节点内创建发布者、订阅者、服务器端和客户端

rclpy.Node 的子类

rclcpp.Node 的子类

部署组件

使用 ROS 2 服务 API:通过以下方式加载组件

  • 服务调用
  • 命令行工具
  • 启动

或者:

  • 手动组合
  • 运行独立的可执行文件

通讯基础设施

ROS 中间件提供以下功能:

  • 匿名发布/订阅消息传递
  • 记录和回放消息
  • 请求/响应远程进程调用
  • 抢占式请求/响应远程进程调用
  • 分布式参数系统

4 主题和消息

主题

  • 异步通信
  • 一个主题的多个并发发布者和订阅者
  • 单个节点可以发布和订阅多个主题
  • 像“聊天室(chat room”一样工作
  1. 不是特定的收件人
  2. 例如:激光扫描数据、图像、机器人位置、...
  • 每个主题都有一个专用的消息类型

只有在以下情况下才能进行通信:

  • 接收消息类型相互匹配
  • 服务质量设置相互兼容

消息

组件之间交换信息的数据结构

  • *.msg 是带有字段类型和名称的简单文本文件
  • 以编程语言不可知的方式定义

支持字段类型

  • 支持32位标准消息

Bool

ColorRGBA

Float32MultiArray

Int16

Int64

MultiArrayDimension

UInt16

UInt64

Byte

Duration

Float64

Int16MultiArray

Int64MultiArray

MultiArrayLayout

UInt16MultiArray

UInt64MultiArray

ByteMultiArray

Empty

Float64MultiArray

Int32

Int8

String

UInt32

UInt8

Char

Float32

Header

Int32MultiArray

Int8MultiArray

Time

UInt32MultiArray

UInt8MultiArray

geometry_msgs/Point.msg

geometry_msgs/Quaternion.msg

geometry_msgs/Pose.msg

float64 x float64 y float64 z

float64 x float64 y float64 z float64 w

geometry_msgs/Point position geometry_msgs/Quaternion orientation

5 执行器

协调执行可用通信任务的顺序和时间

  • 为调用回调的节点提供自旋函数(spin()、spin_once()...)
  • 通过寻找可用的工作来协调节点和回调组,并将其分派给一个或多个线程
  1. 订阅回调
  2. 定时器回调
  3. 服务回调
  4. 客户端响应
  • 实现基于线程/并发方案的协调

默认执行器

  rclpy.init(args=args) 
  talker = Talker()  
  rclpy.spin(talker) 

内置执行器

  • SingleThreadedExecutor - 在调用 executor.spin() 的线程中运行回调
  • MultiThreadedExecutor - 在线程池中运行回调
  executor = SingleThreadedExecutor()  
  talker = Talker()
  listener = Listener()


  executor.add_node(talker)  
  executor.add_node(listener)  
  executor.spin()

-End-