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

news2024/11/24 7:22:10

        在初步尝试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.coloradmin.cn/o/2246522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

李宏毅机器学习课程知识点摘要(14-18集)

线性回归,逻辑回归(线性回归sigmoid),神经网络 linear regression , logistic regression , neutral network 里面的偏导的相量有几百万维,这就是neutral network的不同,他是…

ThingsBoard规则链节点:AWS SQS 节点详解

引言 ThingsBoard 是一个开源的物联网平台,提供了设备管理、数据收集、处理和可视化等功能。规则链是 ThingsBoard 中的一个强大功能,允许用户定义复杂的业务逻辑来处理设备上报的数据。在规则链中,AWS SQS 节点用于将消息发送到 Amazon Simp…

在Windows 11上启用远程桌面及其故障排查

在Windows 11上启用远程桌面 这将允许其它设备远程连接到你的电脑,并像坐在你的电脑前一样操纵你的电脑桌面。 启用方法很简单,先在设置中找到远程桌面。 点击进入后,点击右侧的滑钮启用远程桌面即可。 勾选启用网络级别验证使得登录者在能…

【H2O2|全栈】JS进阶知识(八)ES6(4)

目录 前言 开篇语 准备工作 浅拷贝和深拷贝 浅拷贝 概念 常见方法 弊端 案例 深拷贝 概念 常见方法 弊端 逐层拷贝 原型 构造函数 概念 形式 成员 弊端 显式原型和隐式原型 概念 形式 constructor 概念 形式 原型链 概念 形式 结束语 前言 开篇语…

RabbitMQ3:Java客户端快速入门

欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…

zotero7 插件使用

zotero style 1、下载地址 Zotero 插件商店 | Zotero 中文社区 2、配置 在工具插件里 3、配置 style 进入高级→设置编辑器 查找 easy 设置完即可显示, 注1:easyscholar的密钥要自行申请注册,注册地址:easySchol…

uniapp+vue3+ts H5端使用Quill富文本插件以及解决上传图片反显的问题

uniappvue3ts H5端使用Quill富文本插件以及解决上传图片反显的问题 1.在项目中安装Quill npm i quill1.3.72.需要显示富文本的页面完整代码 <template><view><div ref"quillEditor" style"height: 65vh"></div></view> &…

关于pip install 包 时出现This is an issue with the package mentioned above,not pip的问题

关于This is an issue with the package mentioned above,not pip 今天在用pip下载gensim包的时候&#xff0c;出现了上图中的问题&#xff0c;提示信息是&#xff1a;This is an issue with the package mentioned above,not pip 那说明是包的问题&#xff0c;而不是在使用 pi…

rust中解决DPI-1047: Cannot locate a 64-bit Oracle Client library问题

我们在使用rust-oracle crate连接oracle进行测试的过程中&#xff0c;会发现无法连接oracle&#xff0c;测试运行过程中抛出“DPI-1047: Cannot locate a 64-bit Oracle Client library”错误。该问题是由于rust-oracle需要用到oracle的动态连接库&#xff0c;我们通过安装orac…

软件测试面试之常规问题

1.描述一下测试过程 类似题目:测试的生命周期 思路:这是一个“范围”很大的题目&#xff0c;而且回答时间一般在3分钟之内&#xff0c;不可能非常详细的描述整个过程&#xff0c;因此答题的思路要从整体结构入手&#xff0c;不要过细。为了保证答案的准确性&#xff0c;可以引…

D77【 python 接口自动化学习】- python基础之HTTP

day77 postman接口请求 学习日期&#xff1a;20241123 学习目标&#xff1a;http 定义及实战&#xfe63;&#xfe63;postman接口请求 学习笔记&#xff1a; get请求 post请求 总结 get请求用于查询数据post请求用于添加数据

在 Swift 中实现字符串分割问题:以字典中的单词构造句子

文章目录 前言摘要描述题解答案题解代码题解代码分析示例测试及结果时间复杂度空间复杂度总结 前言 本题由于没有合适答案为以往遗留问题&#xff0c;最近有时间将以往遗留问题一一完善。 LeetCode - #140 单词拆分 II 不积跬步&#xff0c;无以至千里&#xff1b;不积小流&…

【从零开始的LeetCode-算法】3297. 统计重新排列后包含另一个字符串的子字符串数目 I

给你两个字符串 word1 和 word2 。 如果一个字符串 x 重新排列后&#xff0c;word2 是重排字符串的 前缀&#xff0c;那么我们称字符串 x 是 合法的 。 请你返回 word1 中 合法 子字符串的数目。 示例 1&#xff1a; 输入&#xff1a;word1 "bcca", word2 "…

.NET9 - 新功能体验(二)

书接上回&#xff0c;我们继续来聊聊.NET9和C#13带来的新变化。 01、新的泛型约束 allows ref struct 这是在 C# 13 中&#xff0c;引入的一项新的泛型约束功能&#xff0c;允许对泛型类型参数应用 ref struct 约束。 可能这样说不够直观&#xff0c;简单来说就是Span、ReadO…

Git错误:gnutls_handshake() failed: The TLS connection was non-properly terminated

最终我通过这个博客解决了问题&#xff1a;解决Git错误&#xff1a;gnutls_handshake() failed: The TLS connection was non-properly terminated 解决方案 1. 检查网络连接 首先&#xff0c;确保你的网络连接是稳定的。尝试访问其他HTTPS网站或服务&#xff0c;以排除网络问…

【C++知识总结】c++第一篇,简单了解一下命名空间是什么

一、C的由来 C语言是一种结构化和模块化的编程语言&#xff0c;它对于处理较小规模的程序非常适用。然而&#xff0c;当面临需要高度抽象和建模的复杂问题&#xff0c;以及规模较大的程序时&#xff0c;C语言就显得不那么合适了。为了应对这种挑战&#xff0c;并在解决软件危机…

Sickos1.1 详细靶机思路 实操笔记

Sickos1.1 详细靶机思路 实操笔记 免责声明 本博客提供的所有信息仅供学习和研究目的&#xff0c;旨在提高读者的网络安全意识和技术能力。请在合法合规的前提下使用本文中提供的任何技术、方法或工具。如果您选择使用本博客中的任何信息进行非法活动&#xff0c;您将独自承担…

【大数据学习 | Spark-Core】Spark提交及运行流程

spark的集群运行结构 我们要选择第一种使用方式 命令组成结构 spark-submit [选项] jar包 参数 standalone集群能够使用的选项。 --master MASTER_URL #集群地址 --class class_name #jar包中的类 --executor-memory MEM #executor的内存 --executor-cores NUM # executor的…

【CSP CCF记录】201903-2第16次认证 二十四点

题目 样例1输入 10 934x3 54x5x5 7-9-98 5x6/5x4 3579 1x19-9 1x9-5/9 8/56x9 6x7-3x6 6x44/5 样例1输出 Yes No No Yes Yes No No No Yes Yes 样例1解释 思路 参考&#xff1a;CCF小白刷题之路---201903-2 二十四点&#xff08;C/C 100分&#xff09;_ccf认证小白-CSDN博客 …

多目标粒子群优化(Multi-Objective Particle Swarm Optimization, MOPSO)算法

概述 多目标粒子群优化&#xff08;MOPSO&#xff09; 是粒子群优化&#xff08;PSO&#xff09;的一种扩展&#xff0c;用于解决具有多个目标函数的优化问题。MOPSO的目标是找到一组非支配解&#xff08;Pareto最优解&#xff09;&#xff0c;这些解在不同目标之间达到平衡。…