type
date
slug
category
icon
password
1. Micro ROS 话题发布(Publisher)1.1 代码组成1.2 接口说明1.2.1 初始化网络接口1.2.2 初始化ROS选项1.2.3 设置代理连接1.2.4 连接代理1.2.5 创建节点1.2.6 创建发布者1.2.7 创建定时器1.2.8 创建执行者1.2.9 发布消息1.2.10 主循环1.3 关键点和易错点2. Micro ROS 话题订阅(Subscriber)2.1 代码组成2.2 接口说明2.2.1 初始化网络和ROS选项2.2.2 创建节点2.2.3 创建订阅者2.2.4 定义订阅回调函数2.2.5 创建执行者并添加订阅者2.2.6 主循环2.3 关键点和易错点3. Micro ROS 多话题订阅和发布3.1 代码组成3.2 接口说明3.2.1 创建多个发布者3.2.2 创建多个订阅者3.2.3 创建多个定时器3.2.4 添加所有定时器和订阅者到执行者3.3 关键点和易错点4. Micro ROS 自定义传输方式4.1 代码组成4.2 接口说明4.2.1 定义串口传输接口4.2.2 设置自定义传输方式4.2.3 使用自定义传输方式4.3 关键点和易错点5. 总结
1. Micro ROS 话题发布(Publisher)
1.1 代码组成
Micro ROS发布话题的代码主要由以下几个部分组成:
- 头文件引入:包含必要的micro_ros库和ESP32相关头文件
- 初始化配置:设置网络连接、ROS域ID等参数
- 节点创建:创建ROS2节点
- 发布者创建:创建话题发布者
- 定时器创建:创建定时发布数据的定时器
- 执行者创建:创建执行者并添加定时器
- 主循环:循环执行发布任务
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 关键点和易错点
- 资源分配:
- 确保为执行者分配足够的处理句柄(handle_num),必须大于或等于添加到执行者的定时器、订阅者等数量。
- 如果资源不足,会导致添加失败。
- 代理连接:
- 确保正确配置代理IP和端口。
- 确保WiFi连接正常。
- 代码中使用循环尝试连接代理,直到连接成功才继续执行。
- 域ID设置:
- 确保发布者和订阅者的域ID一致,否则无法通信。
- 多用户环境下应使用不同的域ID避免冲突。
- 消息类型:
- 使用
ROSIDL_GET_MSG_TYPE_SUPPORT
宏获取消息类型支持,确保正确指定包名、消息类型和消息名称。 - 示例中使用的是
std_msgs/msg/Int32
类型。
- 错误检查:
- 使用
RCCHECK
宏检查函数返回值,如果不是RCL_RET_OK
则终止任务。 - 使用
RCSOFTCHECK
宏检查函数返回值,如果不是RCL_RET_OK
则打印错误但继续执行。
- 定时器设置:
- 定时器超时时间以纳秒为单位,使用
RCL_MS_TO_NS
宏将毫秒转换为纳秒。 - 示例中定时器超时时间为100毫秒,对应发布频率为10Hz。
- 资源释放:
- 在任务结束前应释放所有资源,包括发布者、节点等。
2. Micro ROS 话题订阅(Subscriber)
2.1 代码组成
Micro ROS订阅话题的代码主要由以下几个部分组成:
- 头文件引入:包含必要的micro_ros库和ESP32相关头文件
- 初始化配置:设置网络连接、ROS域ID等参数
- 节点创建:创建ROS2节点
- 订阅者创建:创建话题订阅者
- 回调函数定义:定义接收消息时的处理函数
- 执行者创建:创建执行者并添加订阅者
- 主循环:循环执行订阅任务
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 关键点和易错点
- 回调函数参数:
- 回调函数的参数是
void*
类型,需要转换为具体的消息类型。 - 确保转换类型与订阅的消息类型一致。
- 消息缓冲区:
- 需要为每个订阅者准备一个消息缓冲区(示例中的
recv_msg
)。 - 当收到新消息时,数据会先复制到这个缓冲区,然后传递给回调函数。
- 执行策略:
- 添加订阅者到执行者时,最后一个参数指定执行策略,常用的有:
ON_NEW_DATA
:只有收到新数据时才调用回调函数ALWAYS
:每次循环都调用回调函数- 大多数情况下应使用
ON_NEW_DATA
以避免无谓的回调。
- 订阅话题名称:
- 确保订阅的话题名称与发布者发布的话题名称一致,否则无法接收消息。
- 如果设置了命名空间(ROS_NAMESPACE),话题名称会自动添加命名空间前缀。
- 资源释放:
- 在任务结束前应释放所有资源,包括订阅者、节点等。
3. Micro ROS 多话题订阅和发布
3.1 代码组成
Micro ROS多话题订阅和发布的代码结构与单话题类似,但需要创建多个发布者、订阅者、定时器和回调函数。主要组成部分:
- 头文件引入:包含必要的micro_ros库和ESP32相关头文件
- 初始化配置:设置网络连接、ROS域ID等参数
- 节点创建:创建ROS2节点
- 多发布者创建:创建多个话题发布者
- 多订阅者创建:创建多个话题订阅者
- 多定时器创建:创建多个定时器
- 多回调函数定义:定义多个回调函数
- 执行者创建:创建执行者并添加所有定时器和订阅者
- 主循环:循环执行所有任务
3.2 接口说明
3.2.1 创建多个发布者
创建多个话题发布者,每个发布者有不同的话题名称。
3.2.2 创建多个订阅者
创建多个话题订阅者,每个订阅者订阅不同的话题。
3.2.3 创建多个定时器
创建多个定时器,每个定时器对应一个回调函数。
3.2.4 添加所有定时器和订阅者到执行者
创建执行者并添加所有定时器和订阅者。
3.3 关键点和易错点
- 执行者句柄数量:
- 执行者的句柄数量必须大于或等于添加到执行者的所有定时器和订阅者的总数。
- 示例中有3个定时器和3个订阅者,所以句柄数量为6。
- 消息缓冲区:
- 每个订阅者都需要一个独立的消息缓冲区。
- 示例中为三个订阅者分别定义了
msg_sub1
、msg_sub2
和msg_sub3
。
- 回调函数:
- 每个定时器和订阅者都需要一个独立的回调函数。
- 确保回调函数与对应的定时器和订阅者正确关联。
- 资源管理:
- 随着定时器和订阅者数量的增加,资源消耗也会增加。
- 确保ESP32有足够的内存和处理能力处理所有任务。
- 执行者超时设置:
- 可以为执行者设置超时时间,避免长时间阻塞。
- 话题名称唯一性:
- 确保所有发布者和订阅者的话题名称在同一个节点内是唯一的。
- 资源释放:
- 在任务结束前应释放所有资源,包括所有发布者、订阅者、节点等。
4. Micro ROS 自定义传输方式
4.1 代码组成
Micro ROS默认使用UDP通过WiFi连接代理,但也支持自定义传输方式,如串口传输。自定义传输方式的代码主要由以下几个部分组成:
- 传输接口定义:定义打开、关闭、读取、写入等接口函数
- 传输方式设置:设置自定义传输方式
- 正常的ROS节点创建和通信:与普通的发布者/订阅者代码类似
4.2 接口说明
4.2.1 定义串口传输接口
4.2.2 设置自定义传输方式
4.2.3 使用自定义传输方式
4.3 关键点和易错点
- 编译配置:
- 使用自定义传输方式需要重新编译生成libmicroros.a静态库。
- 需要修改colcon.meta文件中的"rmw_microxrcedds"参数:
- 串口配置:
- 确保正确配置串口参数,包括串口号、波特率、引脚等。
- 默认使用串口2,波特率为921600,TX引脚为GPIO43,RX引脚为GPIO44。
- 串口代理启动:
- 使用串口传输方式时,需要使用不同的代理启动命令:
- 串口占用:
- 串口代理会占用串口,导致无法烧录程序。
- 在烧录程序前需要先关闭串口代理。
- 传输接口实现:
- 自定义传输接口必须实现四个函数:打开、关闭、读取、写入。
- 这些函数必须符合
uxr/client/profile/transport/custom/custom_transport.h
中定义的接口。
- 错误处理:
- 传输接口函数应该正确处理错误并返回适当的值。
- 打开和关闭函数返回布尔值,表示操作是否成功。
- 读取和写入函数返回实际读取或写入的字节数。
- 超时处理:
- 读取函数需要支持超时参数,以避免无限阻塞。
- 示例中使用
portTICK_PERIOD_MS
将超时时间从毫秒转换为滴答数。
5. 总结
Micro ROS是一个强大的框架,允许在资源受限的设备上运行ROS2。通过本文档,我们详细介绍了如何在ESP32上使用Micro ROS进行话题发布、话题订阅、多话题处理和自定义传输方式。
关键要点包括:
- 正确初始化网络和ROS选项
- 创建节点、发布者、订阅者、定时器和执行者
- 设置适当的回调函数
- 管理资源,包括分配足够的句柄数量和释放不再使用的资源
- 处理错误和超时
- 根据需要自定义传输方式
通过遵循这些指南,开发者可以成功地在ESP32上实现ROS2通信,并与其他ROS2节点进行交互。
- Author:felixfixit
- URL:http://www.felixmicrospace.top/article/micro_ros_basic_tutorial
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!