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

掌上单片机实验室 – 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 的生命周期和配置&#xff0…...

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表格标签&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <!--有大小为1的边框--> <table border"1">…...

网络安全与加密

1.Base64简单说明描述&#xff1a;Base64可以成为密码学的基石&#xff0c;非常重要。特点&#xff1a;可以将任意的二进制数据进行Base64编码结果&#xff1a;所有的数据都能被编码为并只用65个字符就能表示的文本文件。65字符&#xff1a;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数据库-索引 数据库是用来存储数据&#xff0c;在互联网应用中&#xff0c;数据…...

【图像去噪】论文精读:Pre-Trained Image Processing Transformer(IPT)

请先看【专栏介绍文章】:【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中) 文章目录 前言Abstract1. Introduction2. Related…...

Java SE 与 Java EE:基础与进阶的探索之旅

在编程世界中&#xff0c;Java语言以其跨平台、面向对象、丰富的类库等特点&#xff0c;成为了众多开发者和企业的首选编程语言。而Java SE与Java EE&#xff0c;作为Java平台的两个重要组成部分&#xff0c;各自承载着不同的使命&#xff0c;同时又紧密相连&#xff0c;共同构…...

ssm旅游推荐系统的设计与开发

摘 要 旅游推荐系统是一个综合性的在线旅游推荐平台&#xff0c;旨在为用户提供便捷的旅游规划和预定服务。通过该系统&#xff0c;用户能够浏览各类景点信息并进行分类查找&#xff0c;同时获取详尽的景点介绍和相关照片&#xff0c;以辅助做出旅行决策。系统提供在线门票订购…...

【人工智能】用Python和NLP工具构建文本摘要模型:使用NLTK和spaCy进行自然语言处理

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 文本摘要是自然语言处理(NLP)中的关键任务之一,广泛应用于新闻、博客、社交媒体和搜索引擎等场景。通过生成简洁而准确的文本摘要,我们可以大大提升信息处理效率。本文将探讨如何使用Python结合NLP工具…...

51c大模型~合集76

我自己的原文哦~ https://blog.51cto.com/whaosoft/12617524 #诺奖得主哈萨比斯新作登Nature&#xff0c;AlphaQubit解码出更可靠量子计算机 谷歌「Alpha」家族又壮大了&#xff0c;这次瞄准了量子计算领域。 今天凌晨&#xff0c;新晋诺贝尔化学奖得主、DeepMind 创始人哈萨…...

资源控制器--laravel进阶篇

laravel的控制器当中有个资源控制器,这个比较好用。 创建资源控制器 php artisan make:controller PhotoController --resource 创建个路由来使用该资源控制器 use App\Http\Controllers\PhotoController; Route::resource(photos, PhotoController::class); 隐式模型绑定不…...

对象:是什么,使用,遍历对象,内置对象

对象使用&#xff1a; 对象访问&#xff1a;&#xff08;对象每个属性之间用逗号隔开&#xff09; 补充&#xff1a;也可以通过 对象名[‘属性名’] 对象方法&#xff1a; 方法名:匿名函数 调用方法不需要控制台打印&#xff0c;只要调用就自动输出值 遍历对象&#xff1a; …...

设计模式:4、命令模式(双重委托)

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

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构

React 实战项目&#xff1a;微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇&#xff01;在前 29 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...