掌上单片机实验室 – 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
相关文章:

掌上单片机实验室 – RT-Thread + ROS2 初探(25)
在初步尝试RT-Thread之后,一直在琢磨如何进一步感受它的优点,因为前面只是用了它的内核,感觉和FreeRTOS、uCOS等RTOS差别不大,至于它们性能、可靠性上的差异,在这种学习性的程序中,很难有所察觉。 RT-Threa…...
Kotlin中的?.和!!主要区别
目录 1、?.和!!介绍 2、使用场景和最佳实践 3、代码示例和解释 1、?.和!!介绍 Kotlin中的?.和!!主要区别在于它们对空指针的处理方式。 ?.(安全调用操作符):当变量可能为null时,使用?.可以安全地调用其方法或属性…...

iframe嵌入踩坑记录
iframe嵌入父子页面token问题 背景介绍 最近在做在平台A中嵌入平台B某个页面的需求,我负责的是平台B这边,使这个页面被嵌入后能正常使用。两个平台都实现了单点登录。 其实这是第二次做这个功能了,原本以为会很顺利,但没想到折腾…...
面试小札:Java的类加载过程和类加载机制。
Java类加载过程 加载(Loading) 这是类加载过程的第一个阶段。在这个阶段,Java虚拟机(JVM)主要完成三件事: 通过类的全限定名来获取定义此类的二进制字节流。这可以从多种来源获取,如本地文件系…...
Spring 上下文对象
1. Spring 上下文对象概述 Spring 上下文对象(ApplicationContext)是 Spring 框架的核心接口之一,它扩展了 BeanFactory 接口,提供了更多企业级应用所需的功能。ApplicationContext 不仅可以管理 Bean 的生命周期和配置࿰…...

Wireshark抓取HTTPS流量技巧
一、工具准备 首先安装wireshark工具,官方链接:Wireshark Go Deep 二、环境变量配置 TLS 加密的核心是会话密钥。这些密钥由客户端和服务器协商生成,用于对通信流量进行对称加密。如果能通过 SSL/TLS 日志文件(例如包含密钥的…...

测试人员--如何区分前端BUG和后端BUG
在软件测试中,发现一个BUG并不算难,但准确定位它的来源却常常让测试人员头疼。是前端页面的问题?还是后台服务的异常?如果搞错了方向,开发人员之间的沟通效率会大大降低,甚至导致问题久拖不决。 那么&#…...

【Vue】指令扩充(指令修饰符、样式绑定)
目录 指令修饰符 按键修饰符 事件修饰符 双向绑定指令修饰符 输入框 表单域 下拉框 单选按钮 复选框 样式绑定 分类 绑定class 绑定style tab页切换示例 指令修饰符 作用 借助指令修饰符,可以让指令的功能更强大 分类 按键修饰符:用来…...
Ubuntu20.04 Rk3588 交叉编译ffmpeg7.0
firefly 公司出的rk3588的设备,其中已经安装了gcc 交叉编译工具,系统版本是Ubuntu20.04。 使用Ubuntu20.04 交叉编译ffmpeg_ubuntu下配置ffmpeg交叉编译器为arm-linux-gnueabihf-gcc-CSDN博客文章浏览阅读541次。ubuntu20.04 交叉编译ffmpeg_ubuntu下配…...

HTML常用表格与标签
一、table表格标签: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <!--有大小为1的边框--> <table border"1">…...

网络安全与加密
1.Base64简单说明描述:Base64可以成为密码学的基石,非常重要。特点:可以将任意的二进制数据进行Base64编码结果:所有的数据都能被编码为并只用65个字符就能表示的文本文件。65字符:A~Z a~z 0~9 / 对文件进行base64编码…...
MySQL数据库-索引的介绍和使用
目录 MySQL数据库-索引1.索引介绍2.索引分类3.创建索引3.1 唯一索引3.2 普通索引3.3 组合索引3.4 全文索引 4.索引使用5.查看索引6.删除索引7.索引总结7.1 优点7.2 缺点7.3 索引使用注意事项 MySQL数据库-索引 数据库是用来存储数据,在互联网应用中,数据…...
【图像去噪】论文精读:Pre-Trained Image Processing Transformer(IPT)
请先看【专栏介绍文章】:【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中) 文章目录 前言Abstract1. Introduction2. Related…...
Java SE 与 Java EE:基础与进阶的探索之旅
在编程世界中,Java语言以其跨平台、面向对象、丰富的类库等特点,成为了众多开发者和企业的首选编程语言。而Java SE与Java EE,作为Java平台的两个重要组成部分,各自承载着不同的使命,同时又紧密相连,共同构…...

ssm旅游推荐系统的设计与开发
摘 要 旅游推荐系统是一个综合性的在线旅游推荐平台,旨在为用户提供便捷的旅游规划和预定服务。通过该系统,用户能够浏览各类景点信息并进行分类查找,同时获取详尽的景点介绍和相关照片,以辅助做出旅行决策。系统提供在线门票订购…...
【人工智能】用Python和NLP工具构建文本摘要模型:使用NLTK和spaCy进行自然语言处理
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 文本摘要是自然语言处理(NLP)中的关键任务之一,广泛应用于新闻、博客、社交媒体和搜索引擎等场景。通过生成简洁而准确的文本摘要,我们可以大大提升信息处理效率。本文将探讨如何使用Python结合NLP工具…...

51c大模型~合集76
我自己的原文哦~ https://blog.51cto.com/whaosoft/12617524 #诺奖得主哈萨比斯新作登Nature,AlphaQubit解码出更可靠量子计算机 谷歌「Alpha」家族又壮大了,这次瞄准了量子计算领域。 今天凌晨,新晋诺贝尔化学奖得主、DeepMind 创始人哈萨…...
资源控制器--laravel进阶篇
laravel的控制器当中有个资源控制器,这个比较好用。 创建资源控制器 php artisan make:controller PhotoController --resource 创建个路由来使用该资源控制器 use App\Http\Controllers\PhotoController; Route::resource(photos, PhotoController::class); 隐式模型绑定不…...

对象:是什么,使用,遍历对象,内置对象
对象使用: 对象访问:(对象每个属性之间用逗号隔开) 补充:也可以通过 对象名[‘属性名’] 对象方法: 方法名:匿名函数 调用方法不需要控制台打印,只要调用就自动输出值 遍历对象: …...

设计模式:4、命令模式(双重委托)
目录 0、定义 1、命令模式包括四种角色 2、命令模式的UML类图 3、代码示例 0、定义 将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 1、命令模式包括四种角色 接…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...