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





