前面化解了Micro_ROS通讯问题,并在 RT-Thread Studio 环境下,使用Micro_ROS软件包中的例程,实现了STM32F411CE核心板和ROS2主机的通讯。之后还尝试修改例程 micro_ros_sub_twist.c ,实现了接收 turtle_teleop_key 所发出的 turtle1/cmd_vel 信息,很是兴奋,认为只需将由 msh 命令启动的例程纳入到我的程序中(msh本身是个独立线程,和我的程序运行无关),即可实现用 turtle_teleop_key操控小车了。
计划第一步先将 micro_ros_sub_twist.c 示例程序略加修改后加入到我的程序中,作为一个线程(示例本身也是创建了一个线程),由我的程序启动,在收到ROS2主机信息的基础上,下一步实现在此线程中解析数据,并通过 RT-Thread的消息机制和其它线程交互,操控小车。
本以为这是块“豆腐”,不用一天即可完成,没想到却“硌了牙”!整整花了一周时间才搞定。欲知详情,容我慢慢道来。
一、构思
之前完成了前文所述的 ROS2 及 Micro_ROS 基本环境;这一步计划在原有的程序框架下,增加一个线程,专门负责和 ROS2 主机通讯,类似于原来程序中的命令接收线程。将收到的 ROS2 信息解析后,转发给相应线程,实现小车的操控。
第一步想要实现的是订阅(subscribe)turtle_teleop_key 所发出的 turtle1/cmd_vel 主题,其数据格式为 twist,而 RT-Thread 软件包 Micro_ROS 中就有相应例程:micro_ros_sub_twist.c,略加修改后作为我的线程即可(从表面上看十分简单)。
为减小不确定性,这一步都没有考虑使用收到的信息控制小车,只是将收到的内容输出即可,重点是能在我的程序框架下运行此例程,实现和 ROS2 主机交互。
二、实施
新线程命名为:microRosThread。
总不能直接拷贝例程吧,所以第一步先将变量名个性化:
再按我原来的方式创建线程:
将原来示例中的初始化部分放在线程的开始部分,和原程序中其它线程一样,先完成各自的初始化,之后进入while(1)循环: