当前位置: 首页 > article >正文

掌上单片机实验室 – RT-Thread + ROS2 初探(25)

        在初步尝试RT-Thread之后,一直在琢磨如何进一步感受它的优点,因为前面只是用了它的内核,感觉和FreeRTOS、uCOS等RTOS差别不大,至于它们性能、可靠性上的差异,在这种学习性的程序中,很难有所察觉。

        RT-Thread的显性优势之一就是其丰富的软件包,可以将特定功能方便的加入程序,大大提升实现某种目标的可行性和便利性。但那么多软件包,选哪个作为学习素材呢?既希望能和小车结合得比较顺畅、自然,又不希望增加过多硬件,从而增加学习成本。

        十几天前,和一位大学教师朋友聊起,得知ROS从1到2改进了不少,将原来和单片机通讯的rosserial升级为可以在单片机上运行的MicroROS,能支持ROS2的大多数功能,关键是RT-Thread里有MicroROS软件包。

        顿悟,ROS 是结合小车的最佳学习素材啊!五年前就曾尝试过,已初步联通 rosserial,只是在将 rosserial 加入到小车 FreeRTOS 程序框架中时遇阻,后又因其它事情分心而搁置;现在重拾 ROS 顺理成章。正好RT-Thread 将其集成,化解了要基于 RTOS 实施 ROS 的心结,因小车的控制程序都是基于RTOS框架实现的。

        很早就想让圆梦小车成为 ROS的外设,希望这次能如愿。

一、初步规划

        ROS第一个演示的示例就是控制小海龟,而我的小车完全可以成为现实世界的“小海龟”,所以第一步计划就是利用这个示例,让小海龟走出屏幕,到现实世界里转转。

        核心是能将 PC 上运行的 ROS2 和现实世界的小车通讯,让小车具备虚拟小海龟的能力。

        略微了解了一下ROS2,其核心就是一套基于DDS的分布式通讯机制,使机器人各个部件可以相互交流,协同工作。它根据机器人这一特定的需求,设计了诸如:节点、主题、服务、参数、动作等通讯方式,以便在设计机器人部件时,有章可循;组合在一起时,可以无障碍沟通。

        实际上,如今的物联网也是这个需求,如果每个设备都自说自话,就很难在一起工作了。

二、环境准备

        要实现上述规划,首先要做如下环境的准备。

2.1构建 Linux环境

        虽说 ROS2 已经有 Windows 版本,但从网上的信息看,似乎还是对 Linux 支持得比较好,对于我这种PC编程菜鸟而言,还是减少些麻烦,按推荐的来。

        我是将 Linux 安装在虚拟机上,因为这样方便和 Windows 主机交互,毕竟很多资料都在Win下。五年前也是这样做的。

        首先卸载掉原来玩 rosserial 时的 Ubuntu16.04,重新安装推荐的 ubuntu22.04。为了减少不确定性,顺便将 Vmware 升级到 17.5 版。

2.2安装ROS2

        在那个大学老师朋友以及一个澳门中学老师朋友(他在教ROS课程)的指点下,完全参照鱼香ROS的《ROS2机器人入门到实战教程》,完成了ROS2的安装,虽说遇到点网络问题,但还算顺利的安装完成了(多数使用了鱼香ROS的一键安装,很方便)。链接如下:

        https://blog.csdn.net/qq_27865227/article/details/131363638

        测试小海龟示例,OK!

        按教程完成了相关工具的安装,顺利实现了图形化显示节点、服务等信息,以及仿真三维模型显示。

2.3安装 MicroROS

        这才是要做的核心,鱼香教程中使用Docker命令运行 micro_ros_agent,可我安装 Docker 后始终运行不了,Linux功底太差,加之网络问题,放弃了。

        搜了很多 MicroROS 的安装文章,先按鱼香ROS社区中的帖子安装,编译失败。

        QQ群求助,有人指点:让我一步步完整地按照鱼香ROS的教程走,这样有些隐含的依赖关系就能建立。

        于是我将虚拟机都删除重装,以免卸载不干净。从头开始,逐篇执行所有的安装操作,确有改善,能编译成功了。

        可运行后,和单片机的通讯存在问题,收到几条消息后,显示:segemtation fault(段出错)

        第一次:单片机端是基于RT-Thread的MicroROS库生成的示例程序,下载到STM32F411CE上运行。担心是因此所致,教程中用的是ESP32,正好手上有个ESP32核心板。

        按教程先安装了 Vscode 以及 PlatformIO,将教程示例下载到 ESP32 核心板中,结果还是一样。无奈,为减少不确定性,购买了鱼香 ROS的 FishBot 控制板,板子还没到手,在看了附带的FishBot 配套资料后,就预感问题可能出在虚拟机上,因为资料中特别提及:不建议在虚拟机上安装ROS2及MicroROS!

        还是不太死心,拿到板子后继续测试,结果一样:Segmentantion Fault!

        因手头没有PC机可以单独安装 Linux,便去南大的学生朋友那里,一方面请他们指点(计算机系学生 Linux 在行);另一方面,验证一下是否在物理机上就没有问题!结果确实如此,在物理机上一切正常!

        悲催!为化解此问题整整耗了约两周时间。

        基于虚拟机玩ROS2彻底死心!(准确的说:是玩MicroROS 不行)

        手上闲置的电脑太老,无法用U盘启动安装 Linux。正好朋友那里有闲置的工控机主板,配置为:Intel i3-2350M,8G内存,64G硬盘,基本能满足 Ubuntu22.04 运行需求。拿来后用闲置的有机玻璃板略加美化,有了一台可以安装 Linux 的物理机:

        前面的工作重复一遍,有了那么多次的反复试错的经历,这次安装很顺利,一个晚上就完成了ubuntu22.04、ROS2 humble、MicroROS 的安装。

        注:折腾那么多遍之后的建议:如果有朋友要安装 MicroROS(其它还是按鱼香ROS的教程做),按 MicroROS 官网上的步骤安装,比较靠谱,而且版本应该是最新的,链接如下:

        https://micro.ros.org/docs/tutorials/core/first_application_linux/ 

        完成上述安装后,用FishBot 控制板、ESP32核心板以及基于RT-Thread生成的STM32F411CE核心板,均无问题。

        基础环境总算构建完成。

2.4 针对小车的准备(将有线串口变为无线)

        小车是需要移动的,而前面所构建的小车控制程序是在 STM32F411CE上,RT-Thread 暂时还不支持 ESP32,而 STM32F411CE 没有 Wifi,只能通过串口通讯,虽说成功的和 ROS2 主机通讯了,可总不能连着一条导线吧。

        以往都是用两个无线透传模块或蓝牙透传模块实现。无线透传模块是我自己做的,效果虽然不错,可那是半双工通讯。MicroROS 所用的通讯协议大概率应该是全双工的,网上查了很久,也没找到详细资料;当初研究 rosserial,还搜到了协议帧的定义;这次是完全“黑箱”,用串口助手监听的内容找不到规律。

        蓝牙透传模块我不确定是否为全双工模式;而使用 PC 上的蓝牙串口服务,在 Linux 下实在没有能力搞定,故暂放弃选择蓝牙。

        性价比高且易于实施的只能选 ESP8266 方案。按我的理解:WiFi通讯应该是全双工的。用WiFi通讯还有一个好处:未来应该可以实现一对多通讯,也就是说可以控制多个小车了。

        网上这方面资料很多,关键是可以基于 Arduino IDE 编程,具备较好的可控性(用现成模块最大的障碍就是不可控,遇到问题很难化解,这也是我自己制作无线透传模块的缘由)。虽说自己编程需要耗费一些时间,可用现成模块遇到问题往往更耗时间,有可能最终还无解。

        正好手上有一块以前尝试ESP8266 Arduino编程的NodeMCU 模块(可以直接 USB 连接 PC 烧写程序)以及一块单独ESP8266模块。参考以下文章着手实施两个ESP8266之间的串口透传:

        https://blog.csdn.net/m0_70301192/article/details/129964501

        首先是要验证是否可行,故将其程序简化,PC端连接的ESP8266为AP、Server端:

        单片机端连接 ESP8266 模块为 STA、Client端:

        程序中增加了LED闪烁指示,以便直观地判断通讯状态。

        略加调试实现透传后,首先用两个串口助手测试,全双工OK!

        在装有ubuntu22.04的PC机上连接NodeMCU(Server端+AP)模块;STM32F411CE单片机UART2连接ESP8266模块(Client端)的UART口。

        PC运行ROS2以及micro_ros_agent,单片机运行RT-Thread下的MicroROS示例程序,通讯OK!和连接导线状态一样,无线串口成功啦!

        小海龟走下屏幕的基础均已完成,下一步编写小车上的 MicroROS 程序,让小海龟附体。

三、总结与展望

        重点是小车如何能成为 ROS2 的外设,并非深究 ROS2 本身,所以没有过多在 ROS2 上下功夫,Linux 功底又太差,上述构建环境的过程有点艰难。

        期望能将 ROS 引入到单片机的学习中,成为一个有趣的素材。而且其分布式通讯的理念也是如今万物互联世界所需要的,尤其是想在嵌入式领域工作,几乎均要涉及到设备互联。

        后续编写小车上的 MicroROS 程序估计还会遇到困难,主要是没有系统的参考资料,或者说我没有找到,好像只能参考示例程序自己修改实现。我希望能有系统的 API 函数说明,在看例程时就能理解,并加以改动以实现自己所需的目标。如有朋友知道哪里有此文档,盼在评论中告知,谢谢!

——————————

文中所提ESP8266透传程序

通过网盘分享的文件:ESP8266透传程序.rar

链接: https://pan.baidu.com/s/14nVtSbVpbc7c7ZKsfe0hvQ 

提取码: atez


http://www.kler.cn/a/406487.html

相关文章:

  • VMware虚拟机Ubuntu桥接模式突然连接不上网络解决办法
  • 23种设计模式-模板方法(Template Method)设计模式
  • react中Fragment的使用场景
  • 《Python制作动态爱心粒子特效》
  • 硬件知识 cadence16.6 原理图输出为pdf 网络名下划线偏移 (ORCAD)
  • [大数据]Trino
  • 【FTHR-G0001开发板测评】简介、程序测试
  • 不用 SQL 的数据仓库
  • leetcode-11-盛最多水的容器
  • 使用 Java Stream 优雅实现List 转化为Map<key,Map<key,value>>
  • 6、PyTorch中搭建分类网络实例
  • 对抗样本存在的原因
  • 鸿蒙NEXT开发-Navigation组件导航
  • 用 Python 写了一个俄罗斯方块小游戏(附源码)
  • 机器人打包物品研究现状简述
  • stm32启动过程解析startup启动文件
  • 【分享一个vue指令】鼠标放置提示指令v-tooltip
  • 【git】husky - pre-commit script failed (code 2)
  • 数据库课程设计全流程:方法与实例解析
  • C#调用JAVA
  • Rust编程与项目实战-模块std::thread(之一)
  • Rust 的静态网站生成器「GitHub 热点速览」
  • VTK知识学习(11)- 可视化管线
  • 第J7周:对于ResNeXt-50算法的思考
  • Linux Docker 部署 Jenkins 详解教程
  • C#里怎么样判断文件是否存在?