2022年电赛C题——小车跟随行驶系统——做题记录以及经验分享

前言

自己打算将做过的电赛真题,主要包含控制组的,近几年出现的小车控制题目,自己做过的真题以及在准备电赛期间刷真题出现的问题以及经验分享给大家

这次带来的是22年电赛C题------小车跟随行驶系统,这道题目指定使用的是TI的单片机,完成以下功能

采⽤ TI 的 MCU设计⼀套⼩⻋跟随⾏驶系统,由⼀辆领头⼩⻋和⼀辆跟随⼩⻋组成,要求⼩⻋具有循 迹功能,且速度在0.3 ~ 1m/s 可调,能在指定路径上完成⾏驶操作。

好了,废话不多说,开始


赛题分析

以下是赛题的任务部分,要求采用TI的MCU,双车跟随,且具有循迹功能,速度在0.3 ~ 1m/s内可调,能在指定路径上完成行驶操作

好,根据题目我们来分析,几个重要的点

1. 采用TI的MCU 2. 领头小车和跟随小车 3. 具有循迹功能 4. 速度在0.3m/s-1m/s内可调 5. 到达终点时要发出声光提示 6. 可沿内外圈行驶,且内外圈可控 7. 当专家在E端放下等停标志时,小车停车,等待5s后停止 8. 双车之间的通信 9. 具有跟随功能


1、领头小车和跟随小车车型选择

这道题目要求的是双车,要搭建两个小车

这道题目建议使用

三轮小车,前轮为万向轮或牛眼轮,后两轮为驱动轮

当然,四轮小车也是可以的,我在做这道题目的时候,采用过前轮为舵机转向,后两轮为驱动轮的方案,效果也相当不错

在B站中观摩到的很多UP,还采用的是四轮小车,这种效果看起来也还不错

但是三轮小车的控制程度比后两种的车型难度较低,很适合入门级别摸索

对三轮小车的控制差不多了,就可以往后进阶了,四轮小车也是一样的原理,只不过多加了一些些东西


2、TI的MCU

做这道题目的时候,没有采用TI的MCU,使用的是Stm32F103RCT6

TI单片机是后面才学的,后面学会了TI的MCU后,使用起来和32是一样的

这道题目在练习时不必纠结是何种MCU,我们要理解的是这道题目需要我们的什么知识点,使用不同的MCU只是换了一个方式去调用外设,其内部核心原理都是一样的

一般来说,定时器,串口,中断都是要频繁使用的资源


3、具有循迹功能

这道题目的一个基础功能就是循迹,一切都是在循迹的基础上进行的,根据题目可以看到是黑线,黑线循迹和之前21年送药小车循红线的思路其实是一样的

黑线还比红线多了几种选择

黑线可以采用红外对管来循迹,可以采用几路红外对管并排排列,分别放在小车的前部,小车在运动行驶的过程中,根据红外对管传回来的状态来实时修正小车的位置

放五个红外对管,根据不同的状态给不同的偏差值,然后根据偏差使用PID算法,始终使小车保持在正中位置,即可达到循迹功能

类似的还有OpenMv巡线,灰度巡线

相关可以参考这个链接,我的21年送药小车教程里讲过的,都是一个思路,大家熟悉后,循迹基本就搞定了

分享21年电赛F题-智能送药小车-做题记录以及经验分享


还有哦,调节转向PID提一个醒

转向PID只需要调节P和D就行了

因为这道题目的要求是,速度在0.3m/s-1m/s内可调,你初始调节的PID参数,当速度快起来之后,后面速度的转向,可能就转不过来,可能会偏离赛道,这个时候,建议将速度拉到最大,然后调节PID参数,将这个PID参数作为最终加载值,这样PID参数适用于最大速度以下的转向

多调试,一般先给个P,放车进赛道,走一段,到达最大弯道,即那四个最大拐角的时候,看现象,转不过去,就加P,加到能够快速转过最大拐角时,即是合理P

可以适当给D,增加快速响应


4、速度在0.3m/s-1m/s内可调

这个简单,只需要设置几个按键,按键1速度为0.3m/s,按键2速度为0.5m/s...依次类推

不同的速度如何设置呢?

我们使用的是速度环,PID调节的期望速度,我们只需要给期望速度,这就是我们的小车行驶的速度

按下按键,速度在0.3m/s,期望速度为0.3m/s


5、到达终点发出声光提示

这个如何实现呢,摄像头识别到停止线后,小车停止

蜂鸣器响,灯光亮


6、可沿内外圈行驶,且内外圈可控

内外圈可控,是这道题的难点之一,题目要求小车要实现内圈超车的功能

,这就要求小车能准确拐到内圈中,并实施超车

如何实现内外圈切换呢?

  1. 在做题时,起初是MV端实现,当小车在跑第二圈的时候,识别到停止线两次后,对外圈的线进行屏蔽,摄像头上就只对左边内圈线感兴趣,此时,巡线偏差修改,小车根据PID算法,拐到内圈轨道行驶

后面,发现这种方法不太稳定,可能会出现,识别停止线错误,从而造成拐入内圈时机不正确,于是舍弃了这种方案

  1. 于是在32端实现,当摄像头识别到停止线两次后,左右轮给一个差速,左轮速度比右轮速度小,小车进而有一个向左偏移,然后根据传回来的巡线偏差,迅速调节小车姿态,从而拐入内圈行驶

这种方案经测试,效果较好,成功率也挺高的,从而实现内外圈可控


7、当专家在E端放下等停标志时,小车停车,等待5s后停止

这个就是MV端的任务嘞,当识别到等停标志后,根据MV传回来的标志位进行判断,等待5s后再继续进行行驶

这一小问要求的是速度为1m/s,1m/s在这个小赛道上速度是超快的了,我们在调试的时候,发现,速度一快之后,摄像头识别准确性大大降低,当时好像采取的是模板匹配还是神经网络,效果还是不理想

后面就没咋调了,主要是摄像头方面,需要多调节一下


8、双车之间的通信

根据说明,全程所有的操作,只有在领头小车上完成,有启动按键和设置按键,跟随小车只有一个上电开关

这也就是说,领头小车是通信主机,跟随小车是通信从机,主机始终发数据,从机始终接收主机发过来的数据

这里我们采用的是蓝牙模块HC-05,蓝牙还是很好用的,配置好后,每次用的时候直接用就行嘞,区分好主机和从机就行

说一下具体思路,主车设置按键,按下按键设置速度和题目模式,此时按下按键后,通过蓝牙主机发送数据给从机,告诉从机此时的行驶速度和题目模式,按下确认键后,两小车开始行进


9、具有跟随功能

这也是一个小难点,跟随小车要和领头小车保持20cm的间距,全程都不能发生小车碰撞

这里呢,我们采用HC-SR04超声波模块根据超声波探测前方小车的距离,实时改变小车的速度,从而达到控制间距的目的

这里呢,我们一开始使用的是,当小于某个距离阈值时,小车速度--,大于某个阈值时,小车速度++,始终保持20cm

这样嘞,经过调试,发现效果不咋好,勉勉强强可以跟随哈哈哈,也能加速和减速,总的来说就是程序的鲁棒性不行

理想情况是,离前方小车比较远,加速,离得非常近,减速,然后保持一段距离,离得非常近,马上往后

后面经过改进,知道了,其实可以根据超声波模块的距离变化,使用PID算法,输入为期望的跟随距离/小车当前得跟随距离,输出的是小车的速度

这种,跟随效果就非常好嘞,但是在源代码中并未添加,大家可以尝试一下,我所了解到得一种跟随得较好方案


调试经验分享

这道题目看起来,不就是寻黑线吗,简简单单

但是在做得时候还是发现了很多问题的

下面分享一下调试经验

1、速度的计算

我所计算的速度,都是以RPM为单位的根据小车转一圈的脉冲数和小车当前读取的脉冲数进行计算,大家可以参考我之前写过的这篇文章的评论区查找如何将小车的脉冲数转换为RPM

Stm32-使用TB6612驱动电机及编码器测速

这里推荐轮趣的MG310电机,这个电机,最高转速为500转,小小一个电机,经过测试还是可以勉强跑到1m/s的

至少前几问绝对够用了,大家还可以选择其他电机


2、主要程序逻辑

这道题目的主要程序逻辑还是挺简单的,按下按键设置速度和模式,按下确认键下小车开始行驶

后面就是一些模式的函数的书写,根据按键按下的模式选择,选择响应的模式函数,遇到停止线停止


3、内外圈的切换

这个估计一下子调不好,内外圈当时卡了我们好久

你们看,当识别到停止线两次后,还要往前走一段,才是内外圈交点 ,这个时候才开始内外圈交换,所以这个距离可以采取记脉冲的方式,也可以采用延时的方式来进行解决,当脉冲数达到后,或者是延时时间到后,立马给个差速,小车就拐到内圈去了

这个距离或者是延时时间需要好好把握一下


4、通信

这个也不多说了,初次建议首先使用串口,连接两个蓝牙,分别插到电脑,打开上位机,互相发送数据,成功后,就说明蓝牙配置完成

如果后面出问题的话,就是程序的问题,从程序内部寻找原因,硬件原因排除

下方是蓝牙的配对步骤



5、跟随功能

这个呢,上述说过的超声波PID跟随,是后面了解到的,还未调试,但是我觉得是一个非常好的方案,跟随效果应该会非常好

具体大家还可以参考其他大佬的教程,讲的挺好的


总结

这道题目看起来简单,但是有好几个难点,不只是简简单单循个迹,有很多小细节

大家可以根据我上方的经验分享以及赛题分析进行参考,做出自己的第一辆小车

经过这道题目后,多磨磨,将会对以下几种知识点熟练运用并掌握嘞

  • 常见循迹方案
  • 超声波的基本使用
  • 无线通信模块的使用
  • 电赛经验get, 经验值+1

希望我的分享对你有帮助,同样,我也开源了自己做这道题的代码,大家可以参考学习


开源链接

大家可以参考学习

大家可以自行访问,进行下载

下方为gitee开源链接,请大家点一个star,谢谢

oufen / 2022年电赛C题-小车跟随系统

相关推荐
2401_858286112 分钟前
101.【C语言】数据结构之二叉树的堆实现(顺序结构) 下
c语言·开发语言·数据结构·算法·
寻找码源1 小时前
【头歌实训:利用kmp算法求子串在主串中不重叠出现的次数】
c语言·数据结构·算法·字符串·kmp
带多刺的玫瑰3 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
yigan_Eins3 小时前
【数论】莫比乌斯函数及其反演
c++·经验分享·算法
陌小呆^O^3 小时前
Cmakelist.txt之win-c-udp-server
c语言·开发语言·udp
时光の尘3 小时前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
-一杯为品-4 小时前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
爱摸鱼的孔乙己4 小时前
【数据结构】链表(leetcode)
c语言·数据结构·c++·链表·csdn
Dola_Pan4 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法
IU宝5 小时前
C/C++内存管理
java·c语言·c++