前言
近期我省舉辦的機器人大賽剛剛落下帷幕,有幸參與其中的NAO機器人點球比賽,憑借著較好的運氣取得了吉林省第一名,本文將從比賽的各個方面講述所用程式及策略,所用程式代碼如有不足之處,以及更好的邏輯優化,歡迎大家在評論區留言,
本文章不提供源代碼,僅提供部分核心代碼供大家交流學習,
完整代碼后續會發到CSDN上供大家下載
NAO機器人點球比賽簡介
簡而言之,就是隊伍分別擔任進攻方和防守方,進攻方共三次機會,每次進球記一分,最后以得分數判別勝負,進攻方要求只能觸球一次;守方無限制,并要求機器人具備識別足球的功能,

使用環境
- python2.7(為了適應NAOqi庫)
- NAOqi(本文不再過多介紹,更多資訊請查閱我的前幾篇文章)
- opencv
策略分析
- 由于比賽使用的是8mm的綠色草坪,NAO會由于草坪出現走路不穩的情況,我們采用了使用海報紙將nao機器人的腳包起來,降低機器人腳部與地面的摩擦,使機器人能在草坪上正常移動,
- 第二點,也是最重要的一點,所有的一切都是建立在讓機器人成功識別的前提下進行的 ,這里我們使用的是opencv中的霍夫圓檢測搭配naoqi中的“ALVideoDevice”模塊來呼叫nao的攝像頭,這一點會在后面詳細說明,
- 在機器人識別成功并且走到球附近后,根據球的相對位置,控制機器人進行微調,然后呼叫Choregraphe中預設好踢球的程式,完成一整套進攻的流程,
- 防守策略目前是使用Choregraphe直接控制機器人,根據場上局勢控制機器人左、右走,
代碼模塊分析
專案的目錄結構如下:

主要分為 機器人控制模塊、工具包、機器人視覺模塊、以及主模塊,
機器人控制模塊
控制模塊的主要功能是:
1.通過naoqi的ALMotion模塊,對機器人的關節角度進行控制,在整個程式中主要用在機器人頭部的復位上,
2.通過naoqi完成對機器人本身已經預設好的程式的呼叫,
核心代碼

對機器人某關節角度進行控制的函式,第一個引數為一個ALMotion代理,第二個為關節名,第三個為轉到的目標角度,默認速度被我設為0.2,
關于NAO機器人以及API檔案的使用請翻看我的上幾個博客,
接下來是本程式的兩個最核心部分之一,通過python呼叫機器人中預設好的程式,
代碼如下:(此部分封裝在一個繼承自threading.Thread的類的建構式中)


然后我們封裝一個方法,方便我們在主函式中呼叫:

工具包
工具包中包括兩個模塊,第一個模塊用于掩膜操作(詳情查看我的上一篇文章),第二個模塊通過ALVideoDevice代理來獲得機器人傳回的圖片,一幀一幀組合形成視頻流,

核心部分如下:

視覺模塊
第二個最核心的部分就是視覺模塊,本模塊主要是在我在第一篇文章中的霍夫圓檢測識別紅球程式之上,更改了篩選球顏色的閾值(通過掩膜操作以及圖片拼接所得到)所得到,在綠色草坪上的識別成功率極高,
拼接部分核心程式:

其中重要方法霍夫圓檢測,各引數具體如下:
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的圖片

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/235528.html
標籤:其他
