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

news/2024/11/24 1:13:54/

        在初步尝试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.ppmy.cn/news/1549409.html

相关文章

MacOS通过X11转发远程运行virt-manager进行虚机分配

今天需要通过本地macbook机器连接远程物理机,执行虚机分配,现有文档仅提供window环境安装,如下整理Mac环境下的安装步骤 操作篇 前提条件 支持x11转发的terminal,我本地使用iTerm2;本地安装XQuartz,作为…

ROS机器视觉入门:从基础到人脸识别与目标检测

前言 从本文开始,我们将开始学习ROS机器视觉处理,刚开始先学习一部分外围的知识,为后续的人脸识别、目标跟踪和YOLOV5目标检测做准备工作。我采用的笔记本是联想拯救者游戏本,系统采用Ubuntu20.04,ROS采用noetic。 颜…

136.flask内置jinja2模版使用

文章目录 基本使用 基本使用 入口 # conding:utf-8 import os from flask import Flaskapp Flask(__name__,template_foldertemplate)app.config[SECRET_KEY] os.urandom(20)from controlle.index02 import index02 app.register_blueprint(index02)# 过滤器 app.template_f…

C++设计模式行为模式———迭代器模式

文章目录 一、引言二、迭代器模式三、总结 一、引言 迭代器模式是一种行为设计模式, 让你能在不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素。C标准库中内置了很多容器并提供了合适的迭代器,尽管我们不…

【C++】undefined reference to `xxx_function’”的错误

1. undefined reference to xxx_function’”的错误时 既然编译是说没有定义某个函数,所以我们先看看这个函数是哪一个库实现的。直接搜索编译环境的include目录,看看 xxx_function 这个函数是定义到哪一个头文件,再看看这个函数是哪个源文件…

DimensionX:单图生成任意的3d/4d视图

DimensionX:单图生成任意的3d/4d视图 通俗易懂的来说 在我们的方法中,关键是如何从一张图片生成动态的3D和4D场景。我们使用一个叫做ST-Director的工具,它可以分开处理空间(3D)和时间(4D)两个方面。想象一…

Elasticsearch面试内容整理-分析与映射

在 Elasticsearch 中,分析(Analysis)和映射(Mapping)是数据处理和存储的核心部分。它们共同决定了数据如何被解析、存储以及如何被有效地搜索和查询。以下是关于分析和映射的详细介绍。 分析(Analysis) 分析是将文本数据转换为可以被 Elasticsearch 搜索的索引格式的过程…

爬虫开发工具与环境搭建——使用Postman和浏览器开发者工具

第三节:使用Postman和浏览器开发者工具 在网络爬虫开发过程中,我们经常需要对HTTP请求进行测试、分析和调试。Postman和浏览器开发者工具(特别是Network面板和Console面板)是两种最常用的工具,能够帮助开发者有效地捕…