历经磨难,总算在 RT-Thread Studio 环境下,用 micro_ros 软件包,实现了小车与 ROS2 主机的通讯;小车是用 STM32F411CE核心板控制的(不知道是否可以这样理解: 只要是能在 RT-Thread 下运行的单片机,且内存够,就可以实现之?micro_ros 软件包对所有可以在 RT-Thread studio 环境下编译的单片机都做了相应的支持?题外话,有兴趣的朋友可以去研究研究)。
这一步目标是用订阅的主题 turtle1/cmd_vel 信息控制小车运行。
首先分析一下屏幕上的小海龟是如何响应操作的,上述主题只是针对上、下、左、右四个方向键,小海龟的具体响应如下:
turtle1/cmd_vel 在的 Twist 数据 6个参数只有 linear.x 和 angular.z 有效,对应小海龟的动作为:
linear.x = 2(对应向上箭头按键),向前走一段;
linear.x = -2(对应向下箭头按键),向后走一段;
angular.x = 2(对应向右箭头按键),右转一定角度
angular.x = -2(对应向左箭头按键),左转一定角度
小车也按照此方式接受操控。
将上述参数在 micro_ros 线程中转换为符合小车通讯协议的命令,和 cmdrcv (串口接收)线程一样发送给主线程,和原来一样处理。均使用定速、定距离命令实现。
直行:左、右两个轮子运行速度和距离相同,根据小车减速比,1:120的速度定为150mm/s, 1:48的速度定为 250mm/s;行走距离100mm。
转动:左、右两个轮子速度相反,每次转90°,对应距离按轮距58mm计算,(58*3.14)/4 = 45mm,速度同上。
这个解析只是示意性的,重点在于是否能可靠的实现上述操作,也就是程序逻辑是否正确。
传递信息仍使用邮箱 rtMB_ToMain。格式完全按照 cmdrcv 线程,只是线程 ID 改变,以便后续可以处理特殊的信息。
信息数据结构借用 CmdRcv2MainMsg_t,以便主线程用同样方式处理,程序不用改变。
既然已纳入我的程序框架,那就完全按照其它线程的处理,上一步纠缠于C和Cpp的问题,没有顾上,micro_ros线程主循环是用的延时:
这次改用线程定时唤醒机制,每5ms唤醒一次,延时操作用唤醒计数实现:
在数据接收中增加两个变量,一个用于取走 Twist 数据,一个建立新数据标志,通知主循环处理,为便于调试,暂时保留了数据输出:
基于上述确定的小车操作,预先定义了四个命令数据:
在micro_ros线程主循环中,根据新数据标志,解析命令,构建命令数据,转发给主线程:
因为数据格式没有改变,和原来从串口接收的自定义通讯帧一样,故主程序不用改变,只是由于信息中线程ID不同,case中需要增加一个micro_ros 线程的ID:
至此,micro_ros 线程接收 ROS2 主机的 turtle_teleop_key 节点(node)的操作处理相关程序已完成。最后,将所有线程都有的看护功能也加上:
micro_ros 线程已完全符合程序的总体风格了。
看护程序使用了数组数据结构,程序只是循环对数组中的数据处理,故无需修改,只需将数组增加一项即可:
编译,几个笔误,修改后一次通过,功能测试,OK!
虚实小海龟
这一步相对简单,要按我以往的习惯,应该合并在上一步完成,只是这一路走来,遇到了太多的意想不到,看似简单的事情,却要折腾一周乃至一个月,所以有点不敢一步走得太大了。
后面再着手消化 turtle_teleop_key 的其它几个功能,看看如何融入到我的小车操控上。
各位看官估计会觉得小车有点简陋?为何使用杜邦线连接?好丑!
顺带解释一下:
我做这个小车的初衷是作为大学生学习单片机编程的素材,所以起名“掌上单片机实验室”。小车用市场上任何核心板均可控制。
用杜邦线连接,可以给学生充分的发挥空间,学生根据自己的想法,选择单片机的端口,而不必受限于成品控制板固定的连接。
同时也给老师提供了出题的空间:指定或变换某个端口实现功能,从而迫使学生去消化相关资料,无法简单的拷贝完成。如果所用端口固定,则解决方式也相应变窄,老师就无法产生新的要求,学生也无需深入,只要有一个完成了,其他人照搬即可。
其实,从学习编程的角度考虑,小车最终运行的效果如何,并非重点,重点应该放在编程思路、数据构建、问题解决等涉及到人的能力方面,小车只是作为一个载体,提供具象的目标和趣味性而已,就像中学的数学应用题。
上述实现方式,可以选择市场上很多成熟的模块,生成一些新的需求和挑战。如目前小车上所用的8266通讯模块,也可以是蓝牙或其它功能模块,从而丰富学习内容,在这个过程中提升分析问题、解决问题的能力。
期待有老师能基于此编写出更能提升学习兴趣的单片机教程,我愿全力配合。
——————————
文中程序:
通过网盘分享的文件:RTT_ROS2_2.rar
接链: https://pan.baidu.com/s/1wRDyoiMv78RCIMeiFQdRBw
提取码: bcmb