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

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

题目如下:

考察点:

基础部分: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。后续需要加强学习,不断提高自己的能力!

  • 17
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本火锅店点餐系统采用Java语言和Vue技术,框架采用SSM,搭配Mysql数据库,运行在Idea里,采用小程序模式。本火锅店点餐系统提供管理员、用户两种角色的服务。总的功能包括菜品的查询、菜品的购买、餐桌预定和订单管理。本系统可以帮助管理员更新菜品信息和管理订单信息,帮助用户实现在线的点餐方式,并可以实现餐桌预定。本系统采用成熟技术开发可以完成点餐管理的相关工作。 本系统的功能围绕用户、管理员两种权限设计。根据不同权限的不同需求设计出更符合用户要求的功能。本系统中管理员主要负责审核管理用户,发布分享新的菜品,审核用户的订餐信息和餐桌预定信息等,用户可以对需要的菜品进行购买、预定餐桌等。用户可以管理个人资料、查询菜品、在线点餐和预定餐桌、管理订单等,用户的个人资料是由管理员添加用户资料时产生,用户的订单内容由用户在购买菜品时产生,用户预定信息由用户在预定餐桌操作时产生。 本系统的功能设计为管理员、用户两部分。管理员为菜品管理、菜品分类管理、用户管理、订单管理等,用户的功能为查询菜品,在线点餐、预定餐桌、管理个人信息等。 管理员负责用户信息的删除和管理,用户的姓名和手机号都可以由管理员在此功能里看到。管理员可以对菜品的信息进行管理、审核。本功能可以实现菜品的定时更新和审核管理。本功能包括查询餐桌,也可以发布新的餐桌信息。管理员可以查询已预定的餐桌,并进行审核。管理员可以管理公告和系统的轮播图,可以安排活动。管理员可以对个人的资料进行修改和管理,管理员还可以在本功能里修改密码。管理员可以查询用户的订单,并完成菜品的安排。 当用户登录进系统后可以修改自己的资料,可以使自己信息的保持正确性。还可以修改密码。用户可以浏览所有的菜品,可以查看详细的菜品内容,也可以进行菜品的点餐。在本功能里用户可以进行点餐。用户可以浏览没有预定出去的餐桌,选择合适的餐桌可以进行预定。用户可以管理购物车里的菜品。用户可以管理自己的订单,在订单管理界面里也可以进行查询操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值