Lazy loaded image
🤖 ROS 理论与实践
micro-ROS架构与接口调用规范
Words 1288Read Time 4 min
2025-6-26
2025-6-26
type
date
slug
category
icon
password

1. micro-ROS整体架构

micro-ROS是ROS 2在资源受限设备上的实现,它保持了与ROS 2相同的通信模型和API,但针对微控制器进行了优化。
micro-ROS架构由以下几层组成:
  1. 应用层: 用户编写的代码
  1. rclc层: C语言客户端库,提供简化的API
  1. rcl层: ROS客户端库,提供核心功能
  1. rmw层: ROS中间件接口
  1. DDS层: 实时发布订阅协议(使用Micro XRCE-DDS)
  1. 传输层: 通信方式(UART、UDP等)

2. 关键组件及其作用

2.1 分配器(Allocator)

  • 作用:负责内存管理,为ROS操作分配和释放内存
  • 目的:在资源受限设备上实现高效内存管理
  • 特点:使用静态内存池,避免动态内存分配导致的碎片化

2.2 初始化选项(Init Options)

  • 作用:配置ROS系统初始化参数
  • 目的:设置DDS域ID、QoS策略等全局配置
  • 参数传递:通常以引用方式传递,由函数填充内容

2.3 RMW选项(RMW Options)

  • 作用:配置ROS中间件(RMW)的参数
  • 目的:设置通信方式、地址、端口等
  • 特点:micro-ROS使用Micro XRCE-DDS作为中间件

2.4 支持器(Support)

  • 作用:封装ROS上下文和初始化状态
  • 目的:简化初始化过程,管理ROS上下文
  • 内容:包含context、allocator等基础组件

2.5 节点(Node)

  • 作用:表示ROS计算图中的一个实体
  • 目的:提供命名空间和通信入口点
  • 特点:每个节点有独立的名称和命名空间

2.6 发布者(Publisher)和订阅者(Subscriber)

  • 作用:实现话题通信机制
  • 目的:发送或接收特定类型的消息
  • 参数:节点引用、消息类型支持、话题名称

2.7 定时器(Timer)

  • 作用:定期触发回调函数
  • 目的:实现周期性任务,如定期发布消息
  • 参数:支持器引用、超时时间(纳秒)、回调函数

2.8 执行器(Executor)

  • 作用:管理回调函数的执行
  • 目的:处理定时器触发和消息接收事件
  • 特点:支持多种执行策略(ON_NEW_DATA, ALWAYS等)
  • handle_num:表示执行器可以管理的最大句柄数量

3. 接口调用流程

micro-ROS应用的典型初始化流程如下:
  1. 创建分配器:定义内存管理策略
  1. 初始化选项:设置全局配置
  1. 配置RMW:设置通信方式
  1. 初始化支持器:创建ROS上下文
  1. 创建节点:定义通信实体
  1. 创建通信原语:发布者、订阅者、服务等
  1. 创建定时器:设置周期性任务
  1. 初始化执行器:管理回调执行
  1. 添加句柄到执行器:关联定时器和订阅者
  1. 运行执行器:处理事件和回调

4. 参数传递规则

micro-ROS接口的参数传递遵循以下规则:
  1. 初始化函数
      • 第一个参数通常是要初始化的对象的指针
      • 最后一个参数通常是分配器
  1. 获取函数
      • 返回值通常是获取到的对象
      • 或通过指针参数返回获取到的值
  1. 设置函数
      • 第一个参数通常是要设置的对象的指针
      • 后续参数是要设置的值
  1. 引用传递
      • 大多数ROS对象通过指针传递
      • 这样可以避免复制大对象
  1. 返回值
      • 大多数函数返回rcl_ret_t类型的状态码
      • RCL_RET_OK表示成功
      • 其他值表示各种错误

5. 资源管理注意事项

  1. 初始化顺序:按照依赖关系初始化组件
  1. 资源限制:根据设备资源调整参数
      • 消息缓冲区大小
      • 执行器句柄数量
      • 发布者/订阅者数量
  1. 释放顺序:按照初始化的相反顺序释放资源
  1. 错误检查:使用RCCHECK宏检查每个操作的返回值

6. 使用建议

  1. 使用rclc层的函数(如rclc_node_init_default)而不是rcl层函数,简化代码
  1. 为执行器分配足够的句柄数量(等于定时器+订阅者数量)
  1. 使用RCL_MS_TO_NS宏将毫秒转换为纳秒
  1. 使用ROSIDL_GET_MSG_TYPE_SUPPORT宏获取消息类型支持
  1. 在资源受限设备上,尽量减少消息大小和通信频率
通过理解这些组件和流程,您可以更有效地使用micro-ROS,开发出高效、可靠的嵌入式ROS应用。

 
上一篇
基于Docker运行micro-ROS第一个例子
下一篇
Micro ROS基础教程

Comments
Loading...