python OpenCV与NAOqi库在机器人点球比赛中的应用

情到浓时终转凉″ 提交于 2020-12-17 13:47:31

前言

近期我省举办的机器人大赛刚刚落下帷幕,有幸参与其中的NAO机器人点球比赛,凭借着较好的运气取得了吉林省第一名。本文将从比赛的各个方面讲述所用程序及策略,所用程序代码如有不足之处,以及更好的逻辑优化,欢迎大家在评论区留言。

本文章不提供源代码,仅提供部分核心代码供大家交流学习。

完整代码后续会发到CSDN上供大家下载

NAO机器人点球比赛简介

简而言之,就是队伍分别担任进攻方和防守方,进攻方共三次机会,每次进球记一分,最后以得分数判别胜负。进攻方要求只能触球一次;守方无限制。并要求机器人具备识别足球的功能。
在这里插入图片描述

使用环境

  1. python2.7(为了适应NAOqi库)
  2. NAOqi(本文不再过多介绍,更多信息请查阅我的前几篇文章)
  3. opencv

策略分析

  1. 由于比赛使用的是8mm的绿色草坪,NAO会由于草坪出现走路不稳的情况,我们采用了使用海报纸将nao机器人的脚包起来,降低机器人脚部与地面的摩擦,使机器人能在草坪上正常移动。
  2. 第二点,也是最重要的一点,所有的一切都是建立在让机器人成功识别的前提下进行的 。这里我们使用的是opencv中的霍夫圆检测搭配naoqi中的“ALVideoDevice”模块来调用nao的摄像头。这一点会在后面详细说明。
  3. 在机器人识别成功并且走到球附近后,根据球的相对位置,控制机器人进行微调,然后调用Choregraphe中预设好踢球的程序,完成一整套进攻的流程。
  4. 防守策略目前是使用Choregraphe直接控制机器人,根据场上局势控制机器人左、右走。

代码模块分析

项目的目录结构如下:
在这里插入图片描述
主要分为 机器人控制模块、工具包、机器人视觉模块、以及主模块。

机器人控制模块

控制模块的主要功能是:
1.通过naoqi的ALMotion模块,对机器人的关节角度进行控制,在整个程序中主要用在机器人头部的复位上。

2.通过naoqi完成对机器人本身已经预设好的程序的调用。

核心代码
在这里插入图片描述
对机器人某关节角度进行控制的函数,第一个参数为一个ALMotion代理,第二个为关节名,第三个为转到的目标角度,默认速度被我设为0.2。
关于NAO机器人以及API文档的使用请翻看我的上几个博客。


接下来是本程序的两个最核心部分之一,通过python调用机器人中预设好的程序。
代码如下:(此部分封装在一个继承自threading.Thread的类的构造函数中)
在这里插入图片描述
在这里插入图片描述
然后我们封装一个方法,方便我们在主函数中调用:
在这里插入图片描述




工具包

工具包中包括两个模块,第一个模块用于掩膜操作(详情查看我的上一篇文章),第二个模块通过ALVideoDevice代理来获得机器人传回的图片,一帧一帧组合形成视频流。
在这里插入图片描述
核心部分如下:
在这里插入图片描述


视觉模块

第二个最核心的部分就是视觉模块。本模块主要是在我在第一篇文章中的霍夫圆检测识别红球程序之上,更改了筛选球颜色的阈值(通过掩膜操作以及图片拼接所得到)所得到,在绿色草坪上的识别成功率极高。
拼接部分核心程序:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020121520443552.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NsZWFybG92ZTdf,size_16,color_FFFFFF,t_70
其中重要方法霍夫圆检测,各参数具体如下:


cv2.HoughCircles(image, method, dp, minDist, circles, param1, param2, minRadius, maxRadius)

image:为输入图像,需要灰度图,程序中传入的为经过一系列预处理的图像(平滑去噪后的图像)

method:为检测方法, 常用为CV_HOUGH_GRADIENT

dp:为检测内侧圆心的累加器图像的分辨率于输入图像之比的倒数,如dp=1,累加器和输入图像具有相同的分辨率,如果dp=2,累计器便有输入图像一半那么大的宽度和高度

minDist:表示两个圆之间圆心的最小距离

param1:有默认值100,它是method设置的检测方法的对应的参数,对当前唯一的方法霍夫梯度法cv2.HOUGH_GRADIENT,它表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半

param2:有默认值100,它是method设置的检测方法的对应的参数,对当前唯一的方法霍夫梯度法cv2.HOUGH_GRADIENT,它表示在检测阶段圆心的累加器阈值,它越小,就越可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了

minRadius:有默认值0,圆半径的最小值

maxRadius:有默认值0,圆半径的最大值

单位为像素(px)。

主函数模块

主函数的功能主要是将各个单独的模块关联到一起,以及在识别到球以后的机器人微调的策略问题。
在我们完成了对足球的识别后,需要机器人根据球的相对位置,进行简单的调整;我们在比赛中使用的是一种没有用到测距,较为取巧的一种方法:

在这里插入图片描述

我将图片划分成了四个区域,根据圆心的坐标位置(opencv图像中的坐标位置在我的上一篇文章中提到过),来决定机器人移动的距离。(机器人的移动通过ALMotion模块下的moveTo()方法实现)

核心代码如下,具体参数的值请根据实际情况进行调整。
在这里插入图片描述

结语

看着码了好久的文章,沉默了好久,这可能是我关于NAO这边的最后一篇文章了,以后的精力可能要更多的放在考研和深度学习这方面了。但还是很感激这个小破机器人的,在摆弄他的时候真的是对我的技术的一种磨练(痛苦的查API文档,以及python语言一点点适应,可以说刚开始学python就是为了给它服务吧,但现在已经不打算继续发展下去了)。写这些文章即是对自己这两年来学习NAO相关知识的一个交代,又算是对我的协会成员们的一个交代吧。
就这样。

年更博主,可以先关注上,以后不定期更新

最后,放一张小NAO的图片
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!