構(gòu)建一個擁有端到端自主繪圖系統(tǒng)的機(jī)器人
這個項目構(gòu)成了伊利諾伊大學(xué)厄巴納-香檳分校ME461:機(jī)械系統(tǒng)計算機(jī)控制的最終產(chǎn)品。該項目的主要課題是一個多用途機(jī)器人,配備了機(jī)載傳感器,包括輪式編碼器、IMU距離傳感器等,以及德州儀器的F28379D發(fā)射臺板,更大的項目目標(biāo)是使用機(jī)器人完成給定的任務(wù),或使用傳感器和控制器來設(shè)計新型機(jī)器人功能。
對于我們的項目,我們選擇開發(fā)一個移動繪圖機(jī)器人,能夠?qū)⒑唵蔚挠脩羯傻膱D像轉(zhuǎn)換為紙上的物理繪圖。利用OpenCV實現(xiàn)了一個圖像處理流水線,從輸入圖形中提取基于邊緣的輪廓,并將其離散為有序的二維點集。這些點通過LabVIEW接口傳遞給機(jī)器人,該接口實時傳輸航路點數(shù)據(jù)和控制標(biāo)志。在機(jī)載系統(tǒng)中,機(jī)器人利用輪式編碼器反饋和機(jī)載陀螺儀跟蹤其位置和航向,并使用點跟蹤控制算法生成前進(jìn)速度和轉(zhuǎn)彎速率命令,以驅(qū)動機(jī)器人到達(dá)每個航路點。設(shè)計并集成了一個伺服驅(qū)動的筆機(jī)構(gòu),可以在繪制筆畫之間升降標(biāo)記,從而清晰地再現(xiàn)單個輪廓或線條。
總的來說,這個項目在ME461機(jī)器人的可編程動力學(xué)和實際用戶輸入之間建立了一個新的聯(lián)系。它展示了即使只有一小部分傳感器,也可以將不像編寫代碼本身的簡單輸入轉(zhuǎn)錄成機(jī)器人的有用指令,從而可以執(zhí)行強(qiáng)大的現(xiàn)實世界任務(wù)。
Python圖像處理
為了將數(shù)字繪制的圖像轉(zhuǎn)換為ME 461機(jī)器人的點集,我們使用OpenCV, Scikit-image和Numpy(以及用于可視化的Matplotlib)。使用img_to_stroke_points()函數(shù),用戶輸入圖像的文件路徑、每個組件(路徑)所需的路徑數(shù)以及最小路徑長度。然后腳本使用OpenCV讀取圖像,并額外應(yīng)用Otsu灰度濾波器。這將使用Scikit-image skeleton()函數(shù)對要進(jìn)行骨架化的圖像進(jìn)行預(yù)處理。skeleton()函數(shù)從灰度圖像中創(chuàng)建一個1像素寬邊緣的外推圖,其中每個邊緣是機(jī)器人要遵循的一組點(或路徑)。創(chuàng)建點之后,將創(chuàng)建一個3D numpy張量(使用np.array()數(shù)據(jù)結(jié)構(gòu))。張量的形狀如下:[(邊/路徑的數(shù)量)x(每條路徑的點數(shù))x 2 (x, y)]。該腳本還以可復(fù)制粘貼的格式打印張量。下面是一個將MS Paint星形轉(zhuǎn)換為一組點的示例。
虛擬儀器實現(xiàn)
LabVIEW VI使用Python節(jié)點接收張量。然后,它開始使用TCPIP通信與機(jī)器人通信。它還通過嵌套的for循環(huán)開始迭代Python數(shù)組中所有輪廓(路徑/邊)中的所有點。每次機(jī)器人發(fā)送一個信號,表示它已經(jīng)準(zhǔn)備好進(jìn)入下一個點,發(fā)送按鈕就會被激活,這樣用戶就可以點擊發(fā)送下一個點以及筆的“狀態(tài)”,并且for循環(huán)會增加到下一個點。筆狀態(tài)(向上[0]或向下[1])由LabVIEW通過檢查下一個點是否是新路徑/邊的開始來確定。如果是,則將筆狀態(tài)設(shè)置為抬起筆。否則,將筆狀態(tài)設(shè)置為降低筆。
在前面板上,用戶可以看到回路中的哪個點即將被發(fā)送給機(jī)器人(X坐標(biāo),Y坐標(biāo)),筆的狀態(tài)(筆值/筆狀態(tài)),以及機(jī)器人的當(dāng)前位置(X, Y),在坐標(biāo)和視覺上都是繪圖中的一個框。為了確認(rèn)和調(diào)試的目的,顯示了輪廓的數(shù)量和每個輪廓的點的數(shù)量。
路徑算法
能夠重建全尺寸繪制圖像的軟件管道的最后一段是ME461機(jī)器人本身的動態(tài)和航路點算法??刂茩C(jī)器人的軟件集成了實時傳感、狀態(tài)估計、通信和運動控制,了解其當(dāng)前位置,向下一個位置移動,并根據(jù)這些運動及時驅(qū)動繪圖器具。
整個航路點算法是UIUC系統(tǒng)工程課程中現(xiàn)有腳本的修改版本。為了方便地與Python-OpenCV圖像處理的輸出接口,waypoint following被實現(xiàn)為一個順序的點對點控制方法。目標(biāo)坐標(biāo)從LabVIEW流化并存儲為控制器的活動目標(biāo)。在每次控制更新時,機(jī)器人計算其當(dāng)前位置與目標(biāo)航路點之間的相對位置,從而提供到目標(biāo)的距離和期望的前進(jìn)方向??刂破鳟a(chǎn)生正向速度指令,該正向速度指令隨距離減小而減小(隨距離增大而增大),并受飽和限制,以保證安全運行和減少超調(diào)。一個單獨的轉(zhuǎn)彎率命令調(diào)整機(jī)器人朝著目標(biāo)方向前進(jìn)。前進(jìn)運動減少或暫停時,航向誤差大,以防止橫向漂移。一旦機(jī)器人進(jìn)入指定的位置公差,就認(rèn)為到達(dá)了一個航路點,之后控制器前進(jìn)到下一個目標(biāo)。這種方法使機(jī)器人能夠可靠地沿著單個路徑點和封閉路徑進(jìn)行平滑和可預(yù)測的運動。下圖展示了主動態(tài)函數(shù)內(nèi)部控制邏輯的摘錄;它包括上述公差的定義和機(jī)器人接近最終目的地時發(fā)生的修改動力學(xué)。
機(jī)器人軟件實現(xiàn)了一個簡單的狀態(tài)機(jī)來管理它從一個路徑點移動到另一個路徑點的行為。LabVIEW作為一個外部接口,傳輸航路點坐標(biāo)并監(jiān)控機(jī)器人狀態(tài),但排序和決策邏輯駐留在嵌入式控制器上。機(jī)器人一次處理一個航路點,將接收到的目標(biāo)存儲為活動目標(biāo),并執(zhí)行閉環(huán)控制,直到檢測到最后一個航路點。機(jī)器人的狀態(tài)轉(zhuǎn)換決定了何時接受新的航路點,何時啟用運動,以及何時控制器前進(jìn)到下一個目標(biāo)。這種一次一點的結(jié)構(gòu)簡化了LabVIEW和機(jī)器人之間的協(xié)調(diào),防止遺漏或亂序命令,并確保簡單和復(fù)雜路徑的可靠執(zhí)行。下面的圖像演示了用于啟動路徑點之間的移動以及筆移動的簡單狀態(tài)機(jī)控制流。
硬件的修改
我們設(shè)計了一個簡單的3d打印支架,安裝在機(jī)器人的前面,并將伺服裝置固定在適當(dāng)?shù)奈恢?。支架定位伺服器,使?biāo)記接觸紙在前輪之間的中心點。
使用HS-311伺服器驅(qū)動標(biāo)記。伺服旋轉(zhuǎn)以提升和降低筆,提供繪圖和非繪圖運動之間的干凈轉(zhuǎn)換。之所以選擇這種伺服裝置,是因為它在實驗室中很容易獲得,并為這種應(yīng)用提供了足夠的扭矩。
扭力彈簧直接安裝在伺服輸出上,標(biāo)記用拉鏈系在彈簧上。這創(chuàng)造了一個兼容的筆架,允許標(biāo)記保持與紙接觸,同時吸收由紋理實驗室地板引起的小高度變化。扭轉(zhuǎn)彈簧提供輕的、一致的向下的力,而不會增加過多的摩擦,這有助于防止機(jī)器人抬起或車輪打滑。拉鏈連接使不同的筆或標(biāo)記之間的交換和微調(diào)性能變得容易。
設(shè)計的挑戰(zhàn)
在開發(fā)這個項目的過程中,我們遇到了無數(shù)的設(shè)計挑戰(zhàn),這些挑戰(zhàn)促使我們對軟件管道的每個維度進(jìn)行細(xì)化。第一個也是最重要的挑戰(zhàn)涉及收緊航點公差,也就是說,機(jī)器人在決定向LabVIEW指示它準(zhǔn)備好接受下一個命令之前到達(dá)目標(biāo)目的地的精度。為了做到這一點,我們修改了目標(biāo)點的徑向距離,在這一點上,控制輸入的前進(jìn)和轉(zhuǎn)向運動被減少到更大,并縮小了機(jī)器人需要達(dá)到的半徑,以便認(rèn)為自己已經(jīng)到達(dá)了一個航路點。最終,這兩種變化都是實現(xiàn)機(jī)器人對許多點的精確控制的核心;這些變化的凈效果是更緩慢、更深思熟慮的動作。雖然這降低了機(jī)器人穿越航路點的速度,但它大大提高了精度,允許繪制封閉曲線,并在繪制多個連接組件時最小化漂移。
我們面臨的另一個設(shè)計挑戰(zhàn)涉及到圖像分辨率,也就是說,我們?yōu)榻o定的輸入筆畫生成的路徑點的數(shù)量。如果繪制的圖像的筆畫寬度太粗,或者如果我們允許python腳本生成的點網(wǎng)格過于密集,那么機(jī)器人可能必須遍歷到許多鄰接點。機(jī)器人的最終路徑將是一系列急轉(zhuǎn)彎或過多的點,這將花費機(jī)器人太長時間來跟蹤。為了解決這個問題,我們將每個輪廓的點數(shù)量限制在一個合理的值,并在連接的組件之間進(jìn)行標(biāo)準(zhǔn)化。雖然這在理論上限制了我們圖像的實際分辨率,但它確保了更精簡的軟件工作流程,并最終從機(jī)器人產(chǎn)生更可靠的繪制圖像。
總的來說,我們的設(shè)計過程是高度迭代的,并且對我們軟件工作流程的所有元素進(jìn)行了常規(guī)更改。考慮到我們的整個過程在三個不同的步驟之間移動- python, LabVIEW和ME461機(jī)器人上的c代碼,很難理解我們遇到的錯誤來源是由于輸入處理不當(dāng)還是控制器錯誤。為此,我們的調(diào)試過程圍繞著隔離問題和探索控制器或python處理代碼中單元變化的輸出變化而展開。如果有更多的時間,我們會繼續(xù)更新我們項目的每個元素,目標(biāo)是提高繪制的圖像分辨率,并為整個軟件工作流提供進(jìn)一步的自主權(quán)。
傳感器的實現(xiàn)
以下視頻提供了該項目中使用的傳感器和執(zhí)行器的簡要概述。一般來說,只有車輪編碼器和IMU,特別是陀螺-z值被用于傳感。這個設(shè)備單獨允許一個穩(wěn)定的估計線性位置坐標(biāo)和速度,以及通過整合車輛的偏航率的軸承。重要的是要強(qiáng)調(diào)如何使用輪式編碼器來控制和分析線性運動和軸承變化的變化;車輪打滑使這種方法不切實際。
結(jié)論
這個項目成功地展示了一個端到端的自主繪圖系統(tǒng),它集成了傳感、通信、控制和機(jī)械驅(qū)動。通過將基于車輪編碼器的位置估計與imu派生的航向信息相結(jié)合,機(jī)器人能夠在來自LabVIEW界面的路徑點之間準(zhǔn)確導(dǎo)航。所實現(xiàn)的點跟隨控制器可靠地檢測到路徑點的到達(dá)和繪制路徑的閉合。此外,伺服驅(qū)動的筆機(jī)構(gòu)和柔性扭轉(zhuǎn)彈簧提供了穩(wěn)定和精確的繪制和非繪制運動控制,能夠干凈地創(chuàng)建單個筆畫或形狀輪廓。總的來說,這個項目揭示了使用實時機(jī)器人導(dǎo)航和控制的實際挑戰(zhàn)和解決方案。然而,它也展示了即使是簡單的機(jī)器人控制系統(tǒng)也能完成的功能。這個項目培養(yǎng)了我們在機(jī)械系統(tǒng)編程和設(shè)計方面的技能,是我們未來在控制設(shè)計和自主系統(tǒng)方面工作的跳板。
本文編譯自hackster.io





