亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

OpenCV?NAO機器人輔助撿球丟球流程分析

 更新時間:2022年05月05日 14:49:17   作者:tilblackout  
這篇文章主要介紹了OpenCV?NAO機器人輔助撿球丟球,本項目使用NAO機器人識別球并撿起,然后將其扔到指定位置,主要涉及圖像的獲取、濾波、目標物體定位和NAO機器人的運動控制,需要的朋友可以參考下

1. 概述

NAO機器人身高58cm,體重5.4kg。主要硬件包括CPU、主板、揚聲器、話筒、紅外線、相機、超聲波(聲吶)、傳感器、電機、語音合成器、陀螺儀等。實驗室中NAO機器人的型號為NAO
H25,其構造如下:

NAO機器人的操作系統(tǒng)為Gentoo Linux,它支持Windows、Linux、Mac OS等操作系統(tǒng)的遠程控制,可以在這些平臺上編程控制NAO。頭部CPU運行Linux內(nèi)核,支持Aldebaran Robotics內(nèi)核NAOqi,NAOqi提供了一組應用程序接口(API)用于操作機器人,如控制機器人運動、拍攝、聲音識別、讀傳感器值等。使用C++、Python、.Net、Java、Matlab等語言可以調(diào)用這些API。

本項目使用NAO機器人識別球并撿起,然后將其扔到指定位置。主要涉及圖像的獲取、濾波、目標物體定位和NAO機器人的運動控制。

整個流程大致為:獲取機器人頭部攝像頭的圖片,對圖片進行一系列處理后,再根據(jù)霍夫圓檢測函數(shù)求出圖片中球的坐標。這樣循環(huán)求取球的坐標,先左右移動機器人使球位于圖像的中間以防止球超出攝像頭范圍,再前后移動機器人使球位于圖片的最下方以便于接下來切換到嘴部攝像頭檢測球。接著讓機器人向前移動固定距離,然后切換到嘴部攝像頭進行近距離檢測,與頭部攝像頭檢測類似,循環(huán)檢測并調(diào)整球的坐標到預先設定的像素范圍內(nèi),即可調(diào)用錄制好的抓球動作將球撿起。最后機器人檢測垃圾桶的輪廓,過濾無關輪廓并根據(jù)輪廓重心和輪廓面積移動到指定位置,然后將球扔入垃圾桶內(nèi)即可。

需要解決的問題包括:

(1)OpenCV:圖像指定顏色提取與二值化,噪聲濾除、圓和垃圾桶的輪廓檢測與定位

(1)NAO機器人:攝像頭圖像的獲取、Animation模式下指定動作幀的錄制、根據(jù)檢測到的輪廓坐標進行運動控制

2. 相關技術

本項目主要用到了NAO機器人的運動控制和OpenCV圖像處理等技術。

2.1 NAO機器人

(1)啟動與連接

 按下NAO機器人胸口的按鈕即可啟動NAO。用戶可以通過以太網(wǎng)或Wi-Fi兩種方式連接計算機。第一次使用時先用以太網(wǎng)線連接NAO機器人,在機器人啟動之后再按下其胸口的按鈕,它會報出機器人的IP地址,接著在瀏覽器打開這個IP地址即可進入NAO機器人的設置界面。該界面可以設置機器人的揚聲器音量,Wi-Fi連接、語言等功能。接著通過這個IP地址和固定端口號9559,即可使用C++、Python等編程語言通過TCP/IP協(xié)議與NAOqi進行連接,調(diào)用NAOqi的API即可實現(xiàn)對NAO機器人的操作。

 另外,NAO實際是一臺計算能力足夠強的計算機,它還提供了SSH(安全外殼協(xié)議)的遠程登錄(Telnet)和文件傳輸(FTP)服務。通過遠程登錄和文件傳輸服務,可以像是用一臺裝有Linux操作系統(tǒng)的計算機那樣使用NAO。

(2)NAOqi

 在NAO上執(zhí)行NAOqi是通過一個代理程序(Broker)完成的。啟動機器人時,代理程序會自動加載/etc/naoqi/autoload.ini文件,這個文件中指定了需要加載NAOqi的哪些庫,這些庫文件位于/usr/lib/naoqi目錄下。一個庫包含一個或多個模塊,每個模塊定義了多種方法。例如NAO的運動功能都放在ALMotion模塊中,讓機器人完成移動、轉(zhuǎn)頭、張手等動作分別要調(diào)用ALMotion模塊中的moveto()、setAngles()、OpenHand()等方法。

 使用NAOqi模塊時,不需要像普通Python程序那樣用import語句導入所有模塊,模塊通過Broker通告它所提供的方法。通過Broker,任何模塊都可以找到所有已經(jīng)通告的模塊及方法。

 Broker主要由兩個作用:直接服務,即查找模塊和方法;網(wǎng)絡訪問,即從Broker進程外部調(diào)用模塊方法。Broker既是一個可執(zhí)行程序,也是一個服務器,可以對指定的IP和端口監(jiān)聽遠程命令。通過IP和端口與調(diào)用NAOqi模塊的程序,既可以在機器人上運行,也可以在遠程計算機上直接運行。一般來說Broker是透明的,在大部分情況下,編程時可以不考慮Broker,調(diào)用本地模塊的代碼與調(diào)用遠程模塊的代碼是一樣的。

2.2 Choregraphe

 Choregraphe是NAO提供的編程環(huán)境,用該軟件可以創(chuàng)建應用于NAO機器人的行為模塊,并可以將其上傳至所連接的機器人進行測試。Choregraphe采用的是圖形化編程,創(chuàng)建復雜性為模塊不需要用戶編寫任何一條代碼,Choregraphe也提供用戶自定義功能,允許使用Python語言編寫自定義模塊。在本次撿球程序中主要使用了該軟件的時間軸指令盒和Animation模式來錄制用戶想讓機器人完成的動作。

2.3 OpenCV

 OpenCV是一個跨平臺的計算機視覺庫,它是由英特爾公司發(fā)起并參與開發(fā),以BSD許可證授權發(fā)行,可以在商業(yè)和研究領域中免費使用。OpenCV可用于開發(fā)實時的圖像處理、計算機視覺以及模式識別程序。OpenCV可用于解決如下領域的問題:增強現(xiàn)實、人臉識別、手勢識別、人機交互、動作識別、運動跟蹤、物體識別、圖像分割、機器人。

 OpenCV使用C++語言編寫,它的主要接口也是C++語言,但是依然保留了大量的C語言接口。該庫也有大量的Python,Java and MATLAB的接口,本項目中主要在Python中使用OpenCV接口。

3. 總體設計與詳細設計

系統(tǒng)主要分為三大模塊,分別為:姿勢控制、運動控制、OpenCV視覺處理。

3.1 系統(tǒng)模塊劃分

一、姿勢控制

由于需要根據(jù)攝像頭的圖像識別球,而機器人的不同姿勢決定了機器人的視覺范圍,所以在不同情況下需要指定機器人保持不同的姿勢。

二、運動控制

機器人需要抓球與扔球,而整個動作序列通過填寫不同幀時刻各個關節(jié)的角度值則不僅難以達到理想的效果,而且會花費大量的精力。所以這里通過Choregraphe的Animation模式對動作的關鍵幀進行錄制。

三、OpenCV視覺處理與機器人移動

完成抓球和丟球最核心的工作就是對攝像頭獲取的圖像進行處理并控制機器人的移動,圖像處理主要通過OpenCV提供的API對圖像進行去噪、模糊、顏色提取、輪廓檢測,而機器人的移動主要是通過獲取的輪廓的像素信息控制機器人移動到指定位置。

3.2 主要功能模塊

一、姿勢控制
如下圖所示,NAO機器人使用旋轉(zhuǎn)集合橫滾(roll)、俯仰(pitch)和偏轉(zhuǎn)(yaw)表示運動姿態(tài),分別對應繞X、Y、Z軸方向上的旋轉(zhuǎn)。在描述關節(jié)的運動范圍時,沿旋轉(zhuǎn)軸順時針方向轉(zhuǎn)動為負,逆時針轉(zhuǎn)動為正。

NAO機器人的每個關節(jié)名稱由部件名稱+姿態(tài)名稱組成,如HeadYaw表示機器人頭部左右旋轉(zhuǎn)的關節(jié)。經(jīng)過測試,本項目中初始化動作為ShoulderPitch為80度,ShoulderRoll為20度,HipPitch為-25度,KneePitch為40度,AnklePitch為-20度,其它關節(jié)均為0度。將上述關節(jié)和角度寫入一個list中,然后調(diào)用ALMotion中的angleInterpolationWithSpeed函數(shù)調(diào)整機器人的姿勢。

二、運動控制

 打開Choregraphe-右鍵創(chuàng)建指令盒-時間軸,雙擊創(chuàng)建的時間軸即可編輯機器人的動作,可以在不同幀時刻存儲NAO身體某個關節(jié)或全部關節(jié)的角度信息來完成動作的錄制。而NAO機器人在正常模式下所有關節(jié)的剛度為1,不能移動其關節(jié)。而在Animation模式下,機器人的眼睛和腳部LED的顏色如果是橙色則表示剛度為1,可通過觸摸其手部和腳部讓LED的顏色變?yōu)榫G色,這就可以隨意的調(diào)整機器人的不同關節(jié),調(diào)整完后在軟件中記錄這個關鍵幀即可。

 兩個關鍵幀之間的動作可以通過貝塞爾曲線來模擬生成一個平滑的動作曲線以保證機器人動作的正常執(zhí)行。調(diào)整完動作后,可以生成對應的C++/Python代碼。

三、OpenCV視覺處理與機器人移動

(1)NAO攝像頭的捕捉

 NAO頭部有兩個相機,用于識別視野中的物體,其中前額相機主要用于拍攝遠景圖像,嘴部相機主要用于拍攝下方圖像。相機的可選分辨率有6種,最高為1280x960px,這里設置為640x480px。

 獲取圖像:首先連接ALVideoDevice模塊,再調(diào)用subscribe函數(shù)訂閱圖像,該函數(shù)可以設置圖片的分辨率、獲取圖片的色彩空間等參數(shù)。最后調(diào)用getImageRemote即可從攝像頭中獲取一個圖像數(shù)組,其中0號和1號元素為圖像的寬、高,6號元素為圖像數(shù)據(jù)。獲取圖像后將圖像轉(zhuǎn)為numpy格式并返回。

 與RGB相比,HSV色彩空間不會隨光照強度的變化而發(fā)生劇烈變化,目標物體顏色值也不會出現(xiàn)較大的偏差,一定程度上減弱了光照條件對機器人視覺系統(tǒng)的影響,增強了機器人視覺系統(tǒng)的自適應能力。所以獲取RGB色彩空間的圖像之后,通常將其轉(zhuǎn)化為HSV色彩空間進行檢測。

def getImage(IP, PORT, flag):
    camProxy = ALProxy("ALVideoDevice", IP, PORT)
    resolution = 2    # 640x480
    colorSpace = 11   # RGB
    # 頭部/嘴部攝像頭
    camProxy.setParam(18, flag)
    videoClient = camProxy.subscribe("python_client", resolution, colorSpace, 5)
    naoImage = camProxy.getImageRemote(videoClient)
    camProxy.unsubscribe(videoClient)
    imageWidth = naoImage[0]
    imageHeight = naoImage[1]
    array = naoImage[6]
    im = Image.frombytes("RGB", (imageWidth, imageHeight), array)
    ci = np.array(im)  # 轉(zhuǎn)化成numpy格式圖像
    r, g, b = cv2.split(ci)  # opencv的圖像為BGR因此需要轉(zhuǎn)換一下
    ci = cv2.merge([b, g, r])
    return ci

(2)球檢測

紅球主要通過霍夫圓變換進行檢測,具體步驟如下:

1、從機器人的相機中獲取圖像,并將其轉(zhuǎn)化為HSV色彩空間的圖像。

2、接著根據(jù)HSV顏色范圍表提取指定顏色范圍,以綠球為例,其HSV的范圍為[35,43,46]至[77,255,255],調(diào)用inRange函數(shù)提取出綠色色彩空間。但實際測試效果并不好,會將周圍環(huán)境中無關的內(nèi)容提取出來,而實驗中使用的綠球較鮮艷,經(jīng)測試將HSV的下限中的S(飽和度)調(diào)高至128即可較好的提取出綠色色彩空間。

3、對圖像進行高斯模糊以消除圖片中的噪聲,內(nèi)核取7x7的矩陣。

4、進行一次開操作,即先腐蝕后膨脹以進一步消除噪聲。

5、觀察此時的圖像,除了被檢測的球,還有很多位置有斷斷續(xù)續(xù)的白色。所以先取反然后進行三次閉操作(先膨脹再腐蝕),內(nèi)核取15x15的矩陣。

6、此時得到的二值圖較為理想,圖像處理過程結(jié)果如下圖所示:

7、調(diào)用HoughCircles進行霍夫圓檢測,具體參數(shù)如下:

cv2.HoughCircles(np.uint8(dilated),cv2.HOUGH_GRADIENT,1,100,param1=100,param2=7,minRadius=2,
maxRadius=60)

其中:

第一個參數(shù)為輸入圖像

第二個參數(shù)檢測方法選擇霍夫梯度法

第三個參數(shù)為累加面分辨率大小,這里設置為1表示分辨率與原圖像相同

第四個參數(shù)為param1,即Canny邊緣檢測的高閾值

第五個參數(shù)為param2,其值越小檢測圓的限制就越低

第六個參數(shù)為檢測的最小圓半徑

第七個參數(shù)為檢測的最大圓半徑

8、如果濾波效果好的話,能檢測出圖中所有圓圓心坐標和半徑,這里假設僅有一個綠球,所以最終判斷如果檢測出來的結(jié)果中只有一個圓的話,返回該圓的圓心坐標。

以上即為檢測球圓心的步驟,具體調(diào)用時,連續(xù)獲取10次攝像頭圖像并檢測球圓心,排序后,如果中間元素為(0,0)表示沒有檢測到球,否則將其返回。

(3)抓球

由于NAO機器人蹲下抓取地上的球時姿勢保持太久容易發(fā)熱導致機器人需要散熱才能繼續(xù)使用,由于這需要大量時間和經(jīng)驗,而實訓時間有限,所以這里將球放置在高21cm的平臺上供機器人抓取。

首先在Choregraphe中打開Animation模式,然后記錄3個關鍵幀:

(1)將手掌打開以防止手觸碰到平臺部分

(2)將機器人的右手移動到球上方的一點的高度

(3)接著將右手從右往左移動以保證球能在手掌中。

將上述三個關鍵幀生成代碼后在Python中測試,開始上述動作之前需要調(diào)用ALMotion中的openHand函數(shù)打開機器人的手掌,上述動作完成后再調(diào)用closeHand抓起球。

(4)球定位

將機器人放置到固定位置,然后測試上述的動作能順利的將球抓起。記錄此時機器人與球的相對位置:前腳離平臺9cm、瓶蓋圓心與右腿膝蓋的右側(cè)平行。接著在這個位置調(diào)用之前的球檢測函數(shù),在機器人使用嘴部攝像頭且髖部HipPitch和膝部KneePitch為-25和+40時,球的坐標大概在(523.5,426.5),由于此時機器人離球很近,所以這里允許X、Y坐標都有25像素的偏差,經(jīng)測試在這個偏差范圍內(nèi)可以將球抓起。

上述為嘴部攝像頭的參數(shù)確定,而剛開始由于機器人離球有一定距離,需要用前額攝像頭拍攝球。所以剛開始將機器人保持在固定動作,然后用前額攝像頭檢測球,根據(jù)檢測出的球坐標對(x,y)進行調(diào)整。首先希望球位于到攝像頭的最底端,這里實時檢測球的位置,讓機器人向前移動,將y增大到430以上。接著希望球能位于攝像頭的最中心,所以實時檢測球?qū)⑵鋢坐標調(diào)整到290~350之間。

接著讓機器人前進,直到能從嘴部攝像頭中檢測到綠球。根據(jù)前面的測試,將球坐標穩(wěn)定于(523.5,426.5),且允許有25px的偏差即可。所以與前額攝像頭的步驟一樣,先調(diào)整y坐標再調(diào)整x坐標。

這里要注意的是,由于ALMotion模塊中機器人前進或后退的函數(shù)執(zhí)行過程中會的受一些客觀條件的影響,機器人往往會往左或往右偏離一定的角度。所以在機器人左右或前后移動后,判斷其x或y坐標的偏差,如調(diào)整x坐標時,y坐標的偏差超過一定閾值則認為機器人的移動出現(xiàn)了偏離,所以向左或向右旋轉(zhuǎn)一定的角度進行補償。

最后調(diào)用之前錄制好的抓球動作進行抓球即可。

(5)垃圾桶定位

這里希望將抓取到的球扔到紅色垃圾桶中,同樣通過機器人的攝像頭獲取圖像,然后進行均值偏移濾波和中值濾波,再將圖像轉(zhuǎn)到HSV空間,提取紅色的HSV范圍。接著將結(jié)果進行二值化,再調(diào)用OpenCV中的findContour函數(shù)檢測輪廓,這里根據(jù)垃圾桶與機器人的距離等參數(shù)測試,可得到垃圾桶在一定距離內(nèi)的面積范圍,根據(jù)這個范圍選取出一個輪廓,再通過輪廓的結(jié)果可以計算出輪廓的重心坐標。

將上述檢測垃圾桶重心的功能封裝成一個函數(shù),其返回值為輪廓的重心坐標。這里將垃圾桶放置在機器人的左側(cè)。在機器人抓起球后,首先后退25cm左右,這樣做是防止機器人旋轉(zhuǎn)時被平臺擋住。然后將機器人旋轉(zhuǎn)60°,保證垃圾桶在機器人攝像頭范圍內(nèi)。后續(xù)步驟與檢測球的步驟類似,首先調(diào)整機器人的Y坐標至340左右,接著調(diào)整X坐標在[300,335]范圍內(nèi),最后機器人前進一定的距離即可走到垃圾桶的面前。

(6)丟球

同樣通過Choregraphe的Animation模式來錄制動作,只需記錄機器人手部的動作,共記錄兩幀:張開右臂和移動右臂到正中間。由于垃圾桶的直徑相較于球來說大得多,所以允許的偏差范圍也更大,成功率也更高。

生成Python代碼,執(zhí)行上述動作無誤后,調(diào)用ALMotion模塊中的openHand將球放入垃圾桶中。

4 視頻展示

NAO機器人識別球并抓取丟到垃圾桶

識別的慢是這個NAO機器人內(nèi)部的伺服驅(qū)動模塊壞了,調(diào)用它的前進函數(shù)就會走歪。我就把步幅放慢,慢慢識別,同時還有左右走歪調(diào)整的函數(shù)。換一個沒壞的NAO機器人就不會有這個問題了。

到此這篇關于OpenCV NAO機器人輔助撿球丟球的文章就介紹到這了,更多相關OpenCV 機器人撿球丟球內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Linux下編譯安裝MySQL-Python教程

    Linux下編譯安裝MySQL-Python教程

    這篇文章主要介紹了Linux下編譯安裝MySQL-Python教程,本文使用編譯方式安裝,提供下載地址和測試安裝成功方法,需要的朋友可以參考下
    2015-02-02
  • 如何使用pip安裝清華大學鏡像源

    如何使用pip安裝清華大學鏡像源

    這篇文章主要為大家介紹了如何使用pip安裝清華大學鏡像源步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 利用scrapy將爬到的數(shù)據(jù)保存到mysql(防止重復)

    利用scrapy將爬到的數(shù)據(jù)保存到mysql(防止重復)

    這篇文章主要給大家介紹了關于利用scrapy將爬到的數(shù)據(jù)保存到mysql(防止重復)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2018-03-03
  • Python的logging模塊基本用法

    Python的logging模塊基本用法

    這篇文章主要介紹了Python的logging模塊基本用法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • python檢測服務器是否正常

    python檢測服務器是否正常

    本文介紹使用python檢測服務器是否正常,程序的端口是否正常,需要的朋友可以參考下
    2014-02-02
  • Python四大金剛之元組詳解

    Python四大金剛之元組詳解

    這篇文章主要介紹了Python的元組,小編覺得這篇文章寫的還不錯,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-10-10
  • python else語句在循環(huán)中的運用詳解

    python else語句在循環(huán)中的運用詳解

    這篇文章主要介紹了python else語句在循環(huán)中的運用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • python 實現(xiàn)視頻 圖像幀提取

    python 實現(xiàn)視頻 圖像幀提取

    今天小編就為大家分享一篇python 實現(xiàn)視頻 圖像幀提取,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Django自定義全局403、404、500錯誤頁面的示例代碼

    Django自定義全局403、404、500錯誤頁面的示例代碼

    這篇文章主要介紹了Django自定義全局403、404、500錯誤頁面的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • python溫度轉(zhuǎn)換華氏溫度實現(xiàn)代碼

    python溫度轉(zhuǎn)換華氏溫度實現(xiàn)代碼

    這篇文章主要介紹了python溫度轉(zhuǎn)換華氏溫度實現(xiàn)代碼內(nèi)容,有需要的朋友們可以測試下。
    2020-12-12

最新評論