Lazy loaded image
🤖 ROS 理论与实践
Micro ROS基础教程
Words 3268Read Time 9 min
2025-6-25
2025-6-25
type
date
slug
category
icon
password

1. Micro ROS 话题发布(Publisher)

1.1 代码组成

Micro ROS发布话题的代码主要由以下几个部分组成:
  1. 头文件引入:包含必要的micro_ros库和ESP32相关头文件
  1. 初始化配置:设置网络连接、ROS域ID等参数
  1. 节点创建:创建ROS2节点
  1. 发布者创建:创建话题发布者
  1. 定时器创建:创建定时发布数据的定时器
  1. 执行者创建:创建执行者并添加定时器
  1. 主循环:循环执行发布任务

1.2 接口说明

1.2.1 初始化网络接口

用于初始化网络连接,连接WiFi热点。

1.2.2 初始化ROS选项

初始化ROS选项并设置域ID。

1.2.3 设置代理连接

设置micro_ros代理的IP地址和端口。

1.2.4 连接代理

尝试连接到micro_ros代理。

1.2.5 创建节点

创建ROS2节点,参数包括节点名称和命名空间。

1.2.6 创建发布者

创建话题发布者,参数包括节点、消息类型和话题名称。

1.2.7 创建定时器

创建定时器,设置回调函数和定时时间。

1.2.8 创建执行者

创建执行者并添加定时器。

1.2.9 发布消息

在定时器回调函数中发布消息。

1.2.10 主循环

循环执行发布任务。

1.3 关键点和易错点

  1. 资源分配
      • 确保为执行者分配足够的处理句柄(handle_num),必须大于或等于添加到执行者的定时器、订阅者等数量。
      • 如果资源不足,会导致添加失败。
  1. 代理连接
      • 确保正确配置代理IP和端口。
      • 确保WiFi连接正常。
      • 代码中使用循环尝试连接代理,直到连接成功才继续执行。
  1. 域ID设置
      • 确保发布者和订阅者的域ID一致,否则无法通信。
      • 多用户环境下应使用不同的域ID避免冲突。
  1. 消息类型
      • 使用ROSIDL_GET_MSG_TYPE_SUPPORT宏获取消息类型支持,确保正确指定包名、消息类型和消息名称。
      • 示例中使用的是std_msgs/msg/Int32类型。
  1. 错误检查
      • 使用RCCHECK宏检查函数返回值,如果不是RCL_RET_OK则终止任务。
      • 使用RCSOFTCHECK宏检查函数返回值,如果不是RCL_RET_OK则打印错误但继续执行。
  1. 定时器设置
      • 定时器超时时间以纳秒为单位,使用RCL_MS_TO_NS宏将毫秒转换为纳秒。
      • 示例中定时器超时时间为100毫秒,对应发布频率为10Hz。
  1. 资源释放
      • 在任务结束前应释放所有资源,包括发布者、节点等。

2. Micro ROS 话题订阅(Subscriber)

2.1 代码组成

Micro ROS订阅话题的代码主要由以下几个部分组成:
  1. 头文件引入:包含必要的micro_ros库和ESP32相关头文件
  1. 初始化配置:设置网络连接、ROS域ID等参数
  1. 节点创建:创建ROS2节点
  1. 订阅者创建:创建话题订阅者
  1. 回调函数定义:定义接收消息时的处理函数
  1. 执行者创建:创建执行者并添加订阅者
  1. 主循环:循环执行订阅任务

2.2 接口说明

2.2.1 初始化网络和ROS选项

与发布者相同,需要初始化网络连接、ROS选项和设置代理连接。

2.2.2 创建节点

创建ROS2节点,参数包括节点名称和命名空间。

2.2.3 创建订阅者

创建话题订阅者,参数包括节点、消息类型和话题名称。

2.2.4 定义订阅回调函数

定义接收消息时的处理函数。

2.2.5 创建执行者并添加订阅者

创建执行者并添加订阅者,设置回调函数和消息缓冲区。

2.2.6 主循环

循环执行订阅任务。

2.3 关键点和易错点

  1. 回调函数参数
      • 回调函数的参数是void*类型,需要转换为具体的消息类型。
      • 确保转换类型与订阅的消息类型一致。
  1. 消息缓冲区
      • 需要为每个订阅者准备一个消息缓冲区(示例中的recv_msg)。
      • 当收到新消息时,数据会先复制到这个缓冲区,然后传递给回调函数。
  1. 执行策略
      • 添加订阅者到执行者时,最后一个参数指定执行策略,常用的有:
        • ON_NEW_DATA:只有收到新数据时才调用回调函数
        • ALWAYS:每次循环都调用回调函数
      • 大多数情况下应使用ON_NEW_DATA以避免无谓的回调。
  1. 订阅话题名称
      • 确保订阅的话题名称与发布者发布的话题名称一致,否则无法接收消息。
      • 如果设置了命名空间(ROS_NAMESPACE),话题名称会自动添加命名空间前缀。
  1. 资源释放
      • 在任务结束前应释放所有资源,包括订阅者、节点等。

3. Micro ROS 多话题订阅和发布

3.1 代码组成

Micro ROS多话题订阅和发布的代码结构与单话题类似,但需要创建多个发布者、订阅者、定时器和回调函数。主要组成部分:
  1. 头文件引入:包含必要的micro_ros库和ESP32相关头文件
  1. 初始化配置:设置网络连接、ROS域ID等参数
  1. 节点创建:创建ROS2节点
  1. 多发布者创建:创建多个话题发布者
  1. 多订阅者创建:创建多个话题订阅者
  1. 多定时器创建:创建多个定时器
  1. 多回调函数定义:定义多个回调函数
  1. 执行者创建:创建执行者并添加所有定时器和订阅者
  1. 主循环:循环执行所有任务

3.2 接口说明

3.2.1 创建多个发布者

创建多个话题发布者,每个发布者有不同的话题名称。

3.2.2 创建多个订阅者

创建多个话题订阅者,每个订阅者订阅不同的话题。

3.2.3 创建多个定时器

创建多个定时器,每个定时器对应一个回调函数。

3.2.4 添加所有定时器和订阅者到执行者

创建执行者并添加所有定时器和订阅者。

3.3 关键点和易错点

  1. 执行者句柄数量
      • 执行者的句柄数量必须大于或等于添加到执行者的所有定时器和订阅者的总数。
      • 示例中有3个定时器和3个订阅者,所以句柄数量为6。
  1. 消息缓冲区
      • 每个订阅者都需要一个独立的消息缓冲区。
      • 示例中为三个订阅者分别定义了msg_sub1msg_sub2msg_sub3
  1. 回调函数
      • 每个定时器和订阅者都需要一个独立的回调函数。
      • 确保回调函数与对应的定时器和订阅者正确关联。
  1. 资源管理
      • 随着定时器和订阅者数量的增加,资源消耗也会增加。
      • 确保ESP32有足够的内存和处理能力处理所有任务。
  1. 执行者超时设置
      • 可以为执行者设置超时时间,避免长时间阻塞。
  1. 话题名称唯一性
      • 确保所有发布者和订阅者的话题名称在同一个节点内是唯一的。
  1. 资源释放
      • 在任务结束前应释放所有资源,包括所有发布者、订阅者、节点等。

4. Micro ROS 自定义传输方式

4.1 代码组成

Micro ROS默认使用UDP通过WiFi连接代理,但也支持自定义传输方式,如串口传输。自定义传输方式的代码主要由以下几个部分组成:
  1. 传输接口定义:定义打开、关闭、读取、写入等接口函数
  1. 传输方式设置:设置自定义传输方式
  1. 正常的ROS节点创建和通信:与普通的发布者/订阅者代码类似

4.2 接口说明

4.2.1 定义串口传输接口

4.2.2 设置自定义传输方式

4.2.3 使用自定义传输方式

4.3 关键点和易错点

  1. 编译配置
      • 使用自定义传输方式需要重新编译生成libmicroros.a静态库。
      • 需要修改colcon.meta文件中的"rmw_microxrcedds"参数:
  1. 串口配置
      • 确保正确配置串口参数,包括串口号、波特率、引脚等。
      • 默认使用串口2,波特率为921600,TX引脚为GPIO43,RX引脚为GPIO44。
  1. 串口代理启动
      • 使用串口传输方式时,需要使用不同的代理启动命令:
  1. 串口占用
      • 串口代理会占用串口,导致无法烧录程序。
      • 在烧录程序前需要先关闭串口代理。
  1. 传输接口实现
      • 自定义传输接口必须实现四个函数:打开、关闭、读取、写入。
      • 这些函数必须符合uxr/client/profile/transport/custom/custom_transport.h中定义的接口。
  1. 错误处理
      • 传输接口函数应该正确处理错误并返回适当的值。
      • 打开和关闭函数返回布尔值,表示操作是否成功。
      • 读取和写入函数返回实际读取或写入的字节数。
  1. 超时处理
      • 读取函数需要支持超时参数,以避免无限阻塞。
      • 示例中使用portTICK_PERIOD_MS将超时时间从毫秒转换为滴答数。

5. 总结

Micro ROS是一个强大的框架,允许在资源受限的设备上运行ROS2。通过本文档,我们详细介绍了如何在ESP32上使用Micro ROS进行话题发布、话题订阅、多话题处理和自定义传输方式。
关键要点包括:
  1. 正确初始化网络和ROS选项
  1. 创建节点、发布者、订阅者、定时器和执行者
  1. 设置适当的回调函数
  1. 管理资源,包括分配足够的句柄数量和释放不再使用的资源
  1. 处理错误和超时
  1. 根据需要自定义传输方式
通过遵循这些指南,开发者可以成功地在ESP32上实现ROS2通信,并与其他ROS2节点进行交互。
上一篇
基于Docker运行micro-ROS第一个例子
下一篇
直流电机和电机调速器

Comments
Loading...