《平衡小车控制系统》电子设计大赛校赛感悟

news2024/11/24 11:14:40

我们学校举行了一次电子设计大赛选拔赛,虽然我们在测试的时候全部都可以完成,最后考核的时候因为方案选择问题以及各种设计逻辑等原因没能成功晋级,但我能从这次备赛中学到很多东西,遂分享一下,与广大网友交流经验。(只讲思路,代码太烂了就不提供了)

题目如下:

考察点:

基础部分:1.小车循迹 2.停车+蜂鸣器 3.控速停车

发挥部分:1.视觉云台,激光打靶 2.上下坡 3.字模识别+信息传输 4.考察小车上坡部分是否能够灵活,不写死。(虽然差不多也算是写死了)

根据题目要求,其实主要就分两部分:平衡小车循迹上坡+激光云台追靶子。

平衡小车部分:硬件清单:STM32F103C8T6 MPU6050 蜂鸣器模块 OLED显示屏 LM2596降压模块 正点原子ESP8266WiFi模块 TB6612MG 按键 波动开关 

激光云台:STM32F103C8T6 串口TTL模块 OLED显示屏 左右舵机线 还有些零件

基础部分:

小车循迹部分:模块采用的是八路灰度传感器,代码层面只需要移植商家给的资料,然后通过现场调试,通过自适应调试能够很好地适应赛道情况。处理逻辑也不难,就是当检测到左边出现黑线就给小车双轮赋值一个差速使它往右拐,检测到右边出现黑线就往左拐。然后用循迹函数封装起来。(在赛场上我还看到了拿OpenMV做循迹的,当时我们还没有这个财力,后续可能会考虑一下优化方案,这也是我们吃亏的地方TvT)

如下图所示:

小车平地停车部分:我们根据赛道规则,这里有挺多方案,可以选择通过检测黑线个数,达到第四个就让小车停下来,也可以通过时间计时,大概时间点停下来,也可以通过里程计,计算到差不多的时候停下来,我们采用的是比较保险的里程计+黑线检测方法。让小车停下来。(至于声光提醒只需要给个标志位然后在主函数执行即可)

时间要求:正常速度应该在20-30s内即可完成,速度要求可以忽略。

发挥部分:

发挥部分还是比较复杂的考虑的因素很多,我们整体方案采用的是工控机+OpenCV等方式进行执行视觉的全部功能(这里有个弊端,也是后面没晋级的原因)这里分几个点讲述一下大体思路,代码写的比较丑就不分享了。

视觉部分:

主要是OpenCV的处理算法,由于寒假期间配置过了环境以及YOLOv5,YOLOv8等环境,对OpenCV有了比较深刻的了解,所以我后面就主要负责这一部分。

识别靶子思路

                                                          

可以看到靶子是张这个样子的,我首先考虑的是,通过OpenCV识别圆形的算法实现靶子检测,但是当时没有考虑到一个点,如果单单是检测圆形的话,这要求比较严格,仅仅只有在小车运动的时候靶子始终正对着摄像头才有可能是一个标准的圆。所以只能另寻其路。

我们通过观察靶子实时运动情况,发现一个方案,就是通过椭圆拟合算法,恰好OpenCV里面也有类似的算法。然后通过灰度,高斯模糊,二值,边沿检测,轮廓提取等视觉处理方法,最后还要进行椭圆拟合(长短轴限定,面积限定等方法提高精确度)拟合成功后最重要的是得到靶子中心的坐标(这个是相对于摄像头图像640x480大小左上角来说的坐标),然后通过串口把中心坐标传输给单片机,再通过PID算法控制激光云台进行云台追踪。最后的效果如下:


                                (做了半个月的效果还算可以至少跑基础部分还不会跟丢)

识别字模思路:

                                              

                                                                         (字模库)                          

因为我们用的是工控机所以我们也不能像K210,那样可以进行训练,因为工控机性能没达到那个Level,所以在这里我们用OpenCV自带的模版匹配功能。方案也挺简单。首先按顺序保存待匹配的模版到文件夹里面,因为这里的顺序就是对应的数字1-8的顺序不然没经过训练,他不知道图像对应的是什么顺序。然后再通过对读入的图像进行简单处理,灰度,二值,提取轮廓等,然后获取边框信息再裁剪成符合字模库大小进行一一对比。并且输出对比得分最高的即可实现。所需功能。

传输方式:

因为工控机和平衡小车是不能连一条线的,所以采取的方案是小车搭配ESP8266与主机进行SOCKET通信(TCP)把得到的数字进行取余2判断是奇还是偶。然后让小车指定冲坡。

云台部分:

坐标的作用:

首先我们要明白靶子的中心坐标是指什么?

解释:因为每个摄像头能捕获的视频帧图像大小是固定的,它只能看到这么大的范围。而我们把这么大的范围抽象成像素点,有(640,480)大小的图像,这里的坐标是指距离左上角(0,0)的相对位置。在这里我们可以从图中看出红点坐标是(188,156)。

那么我们得到坐标的目的是什么?

解释:因为我们需要用云台去通过摄像头实时去追靶子,这样我们就需要通过摄像头实时得到靶子的位置。在这里我们为了方便,我们把摄像头中点定为激光中点。

为什么可以把摄像头中点定为激光中点?

因为我们的云台长这个样子:

我们只需要保持在竖直方向上激光和摄像头中点是在同一水平线上的。然后通过双头夹子往摄像头方向偏一定的角度,因为两直线只要不平行就一定会相交(前提是竖直方向是一样高度)。当然,也可以横轴在同一水平,竖轴形成夹角  。                              

                                           

这样我们就可以认为摄像头中点就是激光打到的中点了。

激光云台部分:

得到坐标后,我们还需要控制云台通过转动横轴竖轴(这里我们称X,Y轴)来实现实时追踪运动的靶子。这里发现,我们可以实时得到靶子中心点和摄像头中心点的坐标差,有了这个,我们就可以仿照平衡小车,速度环,直立环,转向环等等使用PID算法实现实时追踪。大概就张这个样子。

有了这个函数,我们只需要调KP,KI,KD即可(都试试看看哪个效果比较好就用哪个)

调试方法:

由于我们用的是数字舵机   X轴365.5°(转弯一圈要复位) Y轴180°

所以因为脉冲范围是500-2500,所以对于我们来说,主要调的是KI,要求累加到2000左右。如果用的是步进电机的话,可能不需要KI,可能KP就差不多了(我同学说的)

调好之后,再进行一些算法处理比如过滤偏移量过大的点,动态调节PID(适应冲坡速度剧增)等等方法,可以增强稳定性。

平衡小车部分:

                                               

冲坡部分:

这一部分,主要是要做好循迹和选择合适的时候加大速度冲上坡,当然如果循迹模块用得不好,每次上坡都是不稳定因素,他只取决于在最后一刻冲坡的角度,如果偏的太多可能会冲歪,后续就会脱离轨道循不回去。我们就采取比较笨的方法,就是检测到黑线就嘎嘎加速,一直走直到冲完坡的时候才减速。这样是十分不稳定的,但是没有什么办法,因为判断坡放在哪,八路循迹是做不到的,如果用里程计也是有点误差的。除非我们用OpenMV实时监测路况。(如果网友有好的办法,请指教)

停坡部分:

这次比赛的精髓,对于我们来说就是不可控因素,因为我们停坡其实相对写死,我们采用的方案是上坡后通过检测黑线来让停止,当然由于坡上平地只有8cm,这很可能会来不及停就冲下去了,所以我们就使用一个刚好能冲上坡的速度,让它冲上去速度就减小到一个很小的速度,再给他赋值一个相对平衡的目标值即可实现停坡。因为只要两秒,可以用反复赋值硬控两秒。我们在比赛前两天,发现我们这种办法其实不稳定,换一个场地就会受到影响,所以我们只能在实地调整。)不知道网友是否有更好地方法交流交流)

下坡部分:

主要做的是减速+偏转一定角度,使其下坡能够及时循迹,防止脱离轨道,循不回去。这里也没做什么方案,就纯属硬调。

反思与总结:这次没能成功晋级校赛原因其实有很多,但大部分都是自己的原因,因为我们选择的是工控机OpenCV做视觉处理 STM32F103C8T6作为主控。没考虑周到。

1.工控机没有写自启动程序,而采用电脑远程终端控制并且写了两个代码需要切换代码,这样做会被误认为在数字识别部分动手脚,违反规矩。

2.STM32F103C8T6作为主控,缺点是引脚太少了!!!我们本来想加上按键来执行每个部分,但是无奈的是管脚都拉满了,根本不够用,其实也是因为自己没学好其他单片机的原因造成的,这是后续需要加强的。

3.代码逻辑,不应该把全部部分融合到一起,依次执行,仅仅通过计时器来控制每一部分执行时间。导致我们在附加部分,老师没放好坡我的小车就已经开始走了,最后直接喜提0分(满分30)应该要通过关机开机然后按按键的方法,不要再写一堆了。

总结下来还是因为自己水平没达到像其他实验室同学,师兄的Level。后续需要加强学习,不断提高自己的能力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1836673.html

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

相关文章

嵌入式技术学习——c51单片机——蜂鸣器

一、蜂鸣器介绍 蜂鸣器时一种将电信号转化成声音信号的器件,常用来产生设备的按键音,报警音等提示信号。 蜂鸣器分为有源蜂鸣器,无源蜂鸣器 。 有源蜂鸣器:内部自带震荡源,将正负极街上直流电压即可持续发声&#x…

答应我,完成单位投稿任务用对的方法别让自己受投稿之苦

在这个信息爆炸的时代,单位的形象塑造与品牌传播已成为不可忽视的关键环节。作为单位的信息宣传员,我深知每一次对外发声的重要性,它不仅是展示我们工作成果的窗口,更是连接公众、塑造品牌形象的桥梁。然而,在传统的投稿方式中,尤其是依赖于邮箱投稿,我经历了太多次的挫败与无奈…

国际荐酒师香港协会受邀参加2024年美国独立日庆祝活动

国际荐酒师(香港)协会受邀参加2024年美国独立日庆祝活动促进世界酒中国菜的全球化发展 2024年6月18日,国际荐酒师(香港)协会大中华区驻广州办事处荣幸地接受了美国驻广州总领事馆 Nicholas Burns大使和Lisa Heller总领…

第十二章:会话控制

会话控制 文章目录 会话控制一、介绍二、cookie2.1 cookie 是什么2.2 cookie 的特点2.3 cookie 的运行流程2.4 浏览器操作 cookie2.5 cookie 的代码操作(1)设置 cookie(2)读取 cookie(3)删除 cookie 三、se…

使用 Web Serial API 在浏览器中实现串口通讯(纯前端)

文章目录 目的相关资料使用说明代码与演示总结 目的 串口是非常常用的一种电脑与设备交互的接口。目前在浏览器上直接使用电脑上的串口设备了,这篇文章将介绍相关内容。 相关资料 Web Serial API 相关内容参考如下: https://developer.mozilla.org/en…

【Java面试】二十、JVM篇(上):JVM结构

文章目录 1、JVM2、程序计数器3、堆4、栈4.1 垃圾回收是否涉及栈内存4.2 栈内存分配越大越好吗4.3 方法内的局部变量是否线程安全吗4.4 栈内存溢出的情况4.5 堆和栈的区别是什么 5、方法区5.1 常量池5.2 运行时常量池 6、直接内存 1、JVM Java源码编译成class字节码后&#xf…

七大黄金原油短线操作技巧与方法

1、研究K线组合 K线组合是几个交易日K线的衔接和联系,它无法掩饰地透露着黄金价格运行趋势的某种征兆。研究K线组合的深刻蕴含,感知其内在动意,把握黄金价格上涨征兆,可以大大提高上涨的概率。其实对许多诸如“强势整理”、“突破…

管道(channel)入门

管道(Channel) 1、管道本质就是一个数据结构-队列 2、数据是先进先出 3、自身线程安全,多协程访问时不需要加锁,channel本身就是线程安全的 4、管道有类型的,一个string的管道,只能存放string类型的数据 管…

vue3第四十节(pinia的用法注意事项解构store)

pinia 主要包括以下五部分,经常用到的是 store、state、getters、actions 以下使用说明,注意事项,仅限于 vue3 setup 语法糖中使用,若使用选项式 API 请直接查看官方文档: 一、前言: pinia 是为了探索 vu…

一文弄懂 Python os.walk(),轻松搞定文件处理和目录遍历

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ Python os 模块的 walk() 方法以自顶向下或自底向上的方式遍历指定的目录树,从而显示目录树中的文件名。对于目录树中的每个目录,os.walk() 方法都会产生一个包含目录路径、当前…

当同时绑定mousedown和mouseup时,不执行mouseup

问题描述: 当我同时给一个标签添加mousedown和mouseup两个鼠标事件,点击span的时候会触发mousedown事件,但是不会执行mouseup事件;但是注释图二中的setCloudControl方法又能触发mouseup。 后来查阅资料,发现是在封装a…

数据资产入表-数据分类分级标准-数据分级

前情提要:2021年9月1日,《中华人民共和国数据安全法》正式施行,明确规定“国家建立数据分类分级保护制度”,数据分级分类是数据安全管理的重要措施,它涉及到对数据资产的识别、分类和定级,是保障数据合规的…

VUE 项目用 Docker+Nginx进行打包部署

一、Docker Docker 是一个容器化平台,允许你将应用程序及其依赖项打包在容器中。使用 Docker,你可以创建一个包含 Vue.js 应用程序的容器镜像,并在任何支持 Docker 的环境中运行该镜像。 二、Nginx Nginx 是一个高性能的 HTTP 服务器和反向…

递归与回溯 || 排列问题

目录 前言: 全排列 题解: 全排列 II 题解: 子集 题解: 组合 题解: 组合总和 题解: 电话号码的字母组合 题解: 字母大小写全排列 题解: 优美的排列 题解:…

MySQL数据库回顾(1)

数据库相关概念 关系型数据库 概念: 建立在关系模型基础上,由多张相互连接的二维表组成的数据库。 特点: 1.使用表存储数据,格式统一,便于维护 2.使用SQL语言操作,标准统一,使用方便 SOL SQL通用语法 …

MySQL常见面试题自测

文章目录 MySQL基础架构一、说说 MySQL 的架构?二、一条 SQL语句在MySQL中的执行过程 MySQL存储引擎一、MySQL 提供了哪些存储引擎?二、MySQL 存储引擎架构了解吗?三、MyISAM 和 InnoDB 的区别? MySQL 事务一、何谓事务&#xff1…

JCR一区 | Matlab实现GAF-PCNN、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断

JJCR一区 | Matlab实现GAF-PCNN、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断 目录 JJCR一区 | Matlab实现GAF-PCNN、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断分类效果格拉姆矩阵图GAF-PCNNGASF-CNNGADF-CNN 基本介绍程序设计参考资料 分类效果 格拉姆…

数据结构与算法-字符出现的次数

问题描述 以下是这个找出字符串中字符串出现频率最多的字符。大家可以自行研究一下,题目不难,我今天尝试使用C语言来完成解答,但是在解答过程居然出现了一个意想不到的问题。可能是高级语言用多了,C语言某些函数的限制和风险忘记管…

Android开发系列(三)Jetpack Compose 之TextField

TextField 是一个用于接收用户输入的UI组件。它是Jetpack Compose中的一部分,可以方便地实现用户文本输入的功能。 TextField 允许用户输入一个或多个文本行,可以用于接收用户的文本输入、搜索等操作。它提供了一些常用的功能,如输入验证、键…

深入了解SD-WAN:企业广域网的未来

在讨论SD-WAN之前,我们先来了解一下WAN的基本概念。WAN(广域网)是一个连接多个地理位置分散的局域网的通信网络。在企业中,WAN通常连接总部、分支机构、托管设施和云服务等多个网络节点。广域网允许用户共享各种应用和服务&#x…