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的圖片
在這裏插入圖片描述

相關文章
相關標籤/搜索