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

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

题目如下:

考察点:

基础部分: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.mzph.cn/web/29592.shtml

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

相关文章

英伟达发布开源模型Nemotron-4 340B

🚀 英伟达发布开源模型Nemotron-4 340B 摘要:英伟达最新发布的开源模型Nemotron-4 340B,可能彻底改变大语言模型(LLM)训练方式。该模型支持多种自然语言和编程语言,使用9万亿个token训练,高达9…

Day 26:2288. 价格减免

Leetcode 2288. 价格减免 句子 是由若干个单词组成的字符串,单词之间用单个空格分隔,其中每个单词可以包含数字、小写字母、和美元符号 ‘$’ 。如果单词的形式为美元符号后跟着一个非负实数,那么这个单词就表示一个 价格 。 例如 “$100”、…

Windows系统部署本地SQL_Server指引

Windows系统部署本地SQL_Server指引 此指引文档环境为Windows10系统,部署SQL_Server 2019为例,同系列系统软件安装步骤类似。 一、部署前准备; 下载好相关镜像文件;设备系统启动后,将不必要的软件停用,避…

【Linux】shell——条件判断test,各种运算符,expr

条件判断——test 真——0 假——1 test expression or [ expression ] 整数运算符 字符串运算符 -z 长度是否为0 -n 长度是否不为0 str1 str2 str1 ! str2 补 &&-->逻辑与,前面为真后面才会执行 || -->逻辑或,前面为假后面才…

VirtFuzz:一款基于VirtIO的Linux内核模糊测试工具

关于VirtFuzz VirtFuzz是一款功能强大的Linux内核模糊测试工具,该工具使用LibAFL构建,可以利用VirtIO向目标设备的内核子系统提供输入测试用例,广大研究人员可以使用该工具测试Linux内核的安全性。 工具要求 1、Rust; 2、修补的Q…

线代的学习(矩阵)

1.矩阵的乘法 矩阵实现满足:内标相等 矩阵相乘之后的结果:前行后列 需要注意:1.矩阵的乘法不具有交换律:AB!BA 2.矩阵的乘法满足分配律:A(BC) AB AC 抽象逆矩阵求逆矩阵 方法1.凑定义法、 方法2.长除法 数字型矩阵…

算法金 | 一个强大的算法模型:t-SNE !!

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种用于降维和数据可视化的非线性算法。它被广泛应用于…

LeetCode 算法:合并两个有序链表 c++

原题链接🔗:合并两个有序链表 难度:简单⭐️ 题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:…

AI智能盒子助力中钢天源设备工厂升级安全防护

中钢集团安徽天源科技股份有限公司成立于2002年3月27日,是中央企业中国中钢股份有限公司控股的上市公司,主导产品为永磁铁氧体器件、钕铁硼器件、四氧化三锰、锶铁氧体预烧料及各类磁选机等。 在中钢天源智能化升级过程中,采用并定制开发一系列厂区安全…

QT day02

思维导图 UI界面设计 设置登录界面,输入账号、密码,登录/取消 按钮 使用手动连接,将登录框中的取消按钮使用第二中连接方式,右击转到槽,在该槽函数中,调用关闭函数 将登录按钮使用qt4版本的连接到自定义…

Python期末复习题库(上)

1. (单选题) Python源程序的扩展名为( A ) A. py B. c C. class D. ph 2. (单选题) 下列( A )符合可用于注释Python代码。 A. # B. */ C. // D. $ 3. (单选题)下列关于Python 语言的特点的说法中,错误的是&#xf…

【Linux基础IO】常见的对文件操作的函数、文件描述符fd、访问文件的本质分析

目录 fopen函数 chdir函数 fclose函数 fwrite和fread函数 open函数 umask函数 write函数 read函数 close函数 文件描述符fd 进程访问文件的本质分析 fopen函数 参数mode: w方式打开文件:1、如果被打开文件不存在,系统会在使用fopen函…

数据结构习题

第一章 绪论 与数据元素本身的形式、内容、相对位置、个数无关的是数据的 逻辑结构。 第二章 线性表 在一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动的元素个数为 63.5。 n/2 单链表的存储密度 小于1。 创建一个包括n个结点的有序单链…

零基础入门学用Arduino 第四部分(一)

重要的内容写在前面: 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后,整体感觉是很好的,如果有条件的可以先学习一些相关课程,学起来会更加轻松,相关课程有数字电路…

Playwright-html-report源码解析

执行命令生成html格式报告 Playwright在执行完成测试,支持生成html格式的测试报告,如下图所示,使用"npx playwright test"执行测试,执行完成后,会提示“npx playwright show-report”命令。执行该命令&#…

创维超充车辆交付仪式暨参观座谈会圆满举行

6月14日,创维超充车辆交付仪式暨参观座谈会在南京成功举行。苏舜集团副总经理程璟一行以及近多出行东部大区总经理张显春一行齐聚一堂。创维汽车总裁、联合创始人吴龙八等领导亲临现场,对各位尊贵嘉宾的到来表示热烈欢迎,并与众人共同见证了这…

RK3588/算能/Nvidia智能盒子:[AI智慧油站」,以安全为基,赋能精准经营

2021年9月,山东省应急管理厅印发了关于《全省危险化学品安全生产信息化建设与应用工作方案(2021-2022 年)》的通知,要求全省范围内加快推进危险化学品安全生产信息化、智能化建设与应用工作,建设完善全省危险化学品安全…

属于PCIe 7.0的那道光来了~

随着数据洪流的持续涌动与计算密集型应用的爆发式增长,传统的电子互连技术在应对高带宽、低延迟、节能等多维度需求时日益显现其局限性。在这个背景下,光学互连技术以其独特的性能优势,逐渐成为业界瞩目的焦点,被视为未来数据中心…

基于Umijs框架的人脸识别系统的服务端口号的更改方法

目录 一、问题描述 二、问题分析 1、umijs介绍 2、Umijs的端口配置 3、umijs的作用 4、尝试启动7000端口 5、再次查看配置文件 三、问题解决 1、更改package.json的start选项中的端口 2、结果验证 (1)项目启动日志查看 (2&#x…

【正则表达式】入门

参考视频:10分钟快速掌握正则表达式_哔哩哔哩_bilibili 这个网站用来测试写的正则表达式效果:regex101: build, test, and debug regex 示例: 限定符 ? 表示前一个字符可有可无 比如这里输入:de? 匹配结果可以得到d和de * 前…