前言
近期我省舉辦的機器人大賽剛剛落下帷幕,有幸參與其中的NAO機器人點球比賽,憑藉着較好的運氣取得了吉林省第一名。本文將從比賽的各個方面講述所用程序及策略,所用程序代碼若有不足之處,以及更好的邏輯優化,歡迎你們在評論區留言。python
本文章不提供源代碼,僅提供部分核心代碼供你們交流學習。python2.7
完整代碼後續會發到CSDN上供你們下載ide
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文檔的使用請翻看個人上幾個博客。
spa
接下來是本程序的兩個最核心部分之一,經過python調用機器人中預設好的程序。
代碼以下:(此部分封裝在一個繼承自threading.Thread的類的構造函數中)
而後咱們封裝一個方法,方便咱們在主函數中調用:
3d
工具包
工具包中包括兩個模塊,第一個模塊用於掩膜操做(詳情查看個人上一篇文章),第二個模塊經過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的圖片