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

前言

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

本文章不提供源代码,仅提供部分核心代码供你们交流学习。python2.7

完整代码后续会发到CSDN上供你们下载ide

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文档的使用请翻看个人上几个博客。


spa

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




3d

工具包

工具包中包括两个模块,第一个模块用于掩膜操做(详情查看个人上一篇文章),第二个模块经过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的图片
在这里插入图片描述