2022电赛省赛C题-小车跟随行驶系统—视觉篇(openmv)心得体会


前言

        这次电赛是我第一次参加省级以上的比赛,作为一名即将大三的学生来说有些晚了,况且由于学业紧张,openmv只学习了短短一个多星期左右就赶鸭子上架地上场比赛了。因此这篇文章也来记录一下我在比赛过程中识别方面的思路,控制方面这次比赛只写了一部分代码,可能过段时间整理完后也会写一篇心得体会。

一、识别整体思路

        此次C题整体识别的任务主要集中在巡线和分辨停车线,岔道口等等,一开始我巡线采用比赛前就写好并测试过的二值化代码,但后来发现二值化的确可以非常准确的识别,但是这个函数的返回值太少了,不像find_blob可以返回色块面积,甚至是密度等等参数,因而后面改为用识别色块的方法巡线,我在一开始使用了灰度进行判断,刚开始的想法只是灰度比RGB的帧率高一些,避免脱机时引起问题,后面发现其他组同学用的RGB会在阴影比较大的时候产生很多误识别问题,灰度反而能稍微避免一些这个问题,也算是误打误撞了。主要思路是摄像头判断黑线色块的中心点坐标,比如说QQVGA的分辨率是160*120,那么黑线的中点就应该在80的位置(前提是摄像头位置正确且x,y轴正确)这时候将当前识别到的中心点x坐标数据发送给单片机,由单片机PID进行控制(PID的desired就是80,算出error即可)。这样就完成了基本的巡线。

sensor.reset()                        ##初始化
sensor.set_pixformat(sensor.GRAYSCALE)##选择灰度模式
sensor.set_framesize(sensor.QQVGA)    ##选择分辨率(分辨率越高帧率可能越低)

二、识别停车线

为了保险起见,我在识别停车线时采用了两个条件同时满足的办法来防止误识别,采用面积和中心点坐标判断。停车线作为一个面积比正常线大的多的色块是可以很轻松地识别出来的,而在摄像头识别到停车线时,其中心点坐标依旧保持基本不变,这样就防止了碰到不规则阴影或者岔路口面积发生改变时误停车的情况。

if((largest_blob.cy() >= 50 and largest_blob.cy() <= 70) and Area >= 12000):  ##判断停车线(两重判断)
    data = bytearray([0xAA, largest_blob.cy(), 1, 0XBB]) 
    uart.write(data)

       我的代码部分 ps:我的摄像头架的方向不一样,根据方向,我的摄像头上面的y轴是实际方向的x轴,因此返回的是y轴坐标。这个摄像头问题确实恶心了我四天,但一开始搭车的时候已经架好了就不麻烦队友了。。。

三、识别内外圈 

        我的思路可能稍微麻烦一些,通过单片机判断这圈是内圈还是外圈,并发送数据给openmv,由此我根据数据选择外圈的函数还是内圈的函数。

       在判断内外圈分界线方面我一样用了面积和中心点坐标的办法,在我测试过程中,停车线面积和分界线差别还是很大的,因此这个就可以很准确的判断出来了。但当识别出现意外时还是需要一个保底的办法。也就是中心点坐标判断。当识别到分界线时,由于有一条向内的黑线,此时得到的黑色色块的中心点坐标会发生偏移,偏移到内圈的方向去一些,因此可以根据这个来区分停车线。(极端情况:两个面积大小差不多时这个办法很有用)

     当单片机发送此圈为内圈的信息且内外圈判断完成后,我使用了分割roi来使摄像头只能识别到内圈的黑线。这个就需要根据赛道进行判断,其实roi如果带上一些外圈的黑线也不要紧,我在find_blob函数中将比较小的黑色色块过滤掉了,就不会产生一些意外的小色块出现导致识别错误的情况。

 if(Area>=8000 and largest_blob.cy()<=50):            ##内外圈岔道口判断
              blobs2 = img.find_blobs(GRAYSCALE_THRESHOLD,roi=(53,0,107,65),merge=True)
              if blobs2:
               largest_blob = max(blobs2, key=lambda b: b.pixels())
               data = bytearray([0xAA, largest_blob.cy(),0,0XBB])
               uart.write(data)

                                                      识别岔道 

ROIS = [
        (0, 0, 160, 30, 0.7),
        (0, 30, 160, 60, 0.3),
        (0, 90, 160, 30, 0.1)
       ]                              ##选择ROI感兴趣区,将视野进行分割

                                                     我的roi感兴趣区 


总结

        这次电赛是我第一次参加这种规模比较大的比赛,可能思路和代码有很多问题,希望大家多多包涵。但是在封箱前的测试中我的识别是没有什么问题的(虽然线下展示的时候因为光线的问题还是识别出了问题。。。最后只拿了一个省二,在这个问题上我肯定有很大的责任)之后的比赛和科研中我也会继续学习、记录,希望未来我的专业技术能够有所增长。

完全代码链接:https://download.csdn.net/download/qzh020312/86394697

  • 19
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
<项目介绍> 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到94.5分,放心下载使用! 该资源适合计算机相关专业(如人工智能、通信工程、自动化、软件工程等)的在校学生、老师或者企业员工下载,适合小白学习或者实际项目借鉴参考! 当然也可作为毕业设计、课程设计、课程作业、项目初期立项演示等。如果基础还行,可以在此代码基础之上做改动以实现更多功能。 1.物体识别 本次实验目的是使得小车可以跟踪目标,故首先确定跟踪目标,由于小车整体框架从零开始搭建,并没有太多的金钱可以选择昂贵的摄像头,故本次实验的目标识别选择较为简单的方式以减少硬件压力。本次实验首先识别纯色物体,是完成对纯色物体识别之后更进一步选择跟踪AprilTag。 AprilTag是一个视觉基准系统,可用于各种任务,包括AR,机器人和相机校准。这个tag可以直接用打印机打印出来,而AprilTag检测程序可以计算相对于相机的精确3D位置,方向和id。 AprilTag内容主要包含三个步骤: 第一步是如何根据梯度检测出图像中的各种边缘。 第二步即如何在边缘图像中找出需要的四边形图案并进行筛选,AprilTag尽可能的对检测出的边缘检测,首先剔除非直线边缘,在直线边缘进行邻接边缘查找,最终若形成闭环则为检测到一个四边形。对四边形进行解码确定Apriltag标签。 第三步确定四边形的中心点作为要跟踪的三维左边点。 Openmv对以上步骤进行了函数封装,可以用img.find_apriltags()函数定位Apriltag标签,并且可以通过该函数的返回值的方法确定三维坐标和三维角度:可以用获取x轴坐标tag.x_translation(), tag.y_translation()、tag.z_translation()是y、z轴坐标 。 2.云台追踪 openmv中搜索目标函数的返回值包括了目标物体中心的x、y坐标,原点是在图片的最左下角,就是说如果我们按照直接得到的坐标都是正的,但是我们要求云台追踪目标就是让目标始终出现在视野最中间,都是正的值我们无法判断图片到底是往哪边偏。为了解决这样的问,我们只需要对得到的坐标进行简单的处理,openmv获得图片宽高都可以用函数获得,故已知图片宽width,高度height,目标中心点坐标x,y。按照相对比例来判断目标点在相机内的相对位置: $$ y1=y/height-0.5 $$ $$ x1=x/width-0.5 $$ 这样x1,y1就是我们最新获得的值,其取值范围均为[-0.5,0.5]。 为了实现云台始终追随目标,我们还需要将得到的坐标值转换为舵机旋转的角度,本实验云台为二自由度云台,如图1.1。下面的舵机控制偏航角与相机x轴相关,上面的舵机负责控制俯仰角与相机y轴相关,偏航角舵机的机械转角范围为[0,180],其中,当角度为0时,舵机朝向右侧,角度为180度时,舵机朝向左侧。俯仰角的机械转角范围为[90,180],其中,当角度为90度时,平台成水平,当角度为180度时,平台垂直水平面。 <img src="readme.imgs/1-16497681807631.jpg" style="zoom: 25%;" /> ​ **图1.1** 算法上的实现,算法上的实现可以使用pd控制,pd控制较为稳定更适合舵机。我们已知(x1,y1)为当前目标的坐标,目的是将其移动到镜头中央,那么目标点为(0,0),我们获得了x轴的偏差以及y轴的偏差error_x,error_y上一次x,y偏差为error_x_last,error_y_last。假设此时舵机角度为yaw_now,pitch_now,那么有简化版增量式pd算法为

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值