制造一個“繪圖驅(qū)動”的機器人
手勢捕獲和“繪制模式”
我們的項目從一個基于網(wǎng)絡攝像頭的手跟蹤界面開始,它把一個簡單的手勢變成了一個繪圖工具。使用MediaPipe,我們跟蹤一只手,并根據(jù)相對于手掌大小的指尖距離計算標準化的“開放性”分數(shù)。當開放度低于拳頭閾值時,我們進入拳頭狀態(tài),并開始以像素坐標記錄拳頭中心的二維路徑。當拳頭保持關(guān)閉時,我們只在拳頭移動了至少一個小的最小步時附加點,以避免噪音和重復。我們還通過在畫布覆蓋上繪制線段來渲染跟蹤,因此用戶可以確切地看到正在記錄的路徑。當用戶再次張開手(張開程度超過張開閾值),退出繪制模式,完成繪制輪廓。
關(guān)鍵點提取和路徑排序
輪廓確定后,我們通過檢測路徑上的關(guān)鍵特征,將繪制的筆畫轉(zhuǎn)換為一組穩(wěn)定的路徑點。我們將折線光柵化為二進制遮罩,并運行g(shù)oodFeaturesToTrack (GFTT)來找到代表整體形狀的角和突出點,而無需傳輸每個原始痕跡樣本。由于GFTT可以返回聚類檢測,我們應用簡單的基于半徑的非最大值抑制,因此最終的航點集在整個行程中分散。接下來,我們通過將每個檢測到的點投影到原始折線上,并根據(jù)它們沿路徑的距離參數(shù)對它們進行排序,從而按照正確的行程順序?qū)@些關(guān)鍵點進行排序。這一步很重要,因為探測器本身并不知道哪個點是“第一個”還是“下一個”,發(fā)送無序的點會產(chǎn)生不穩(wěn)定的運動。結(jié)果是一個路徑點的有序列表,它們遵循路徑繪制的相同方向。
標準化,縮放和網(wǎng)絡傳輸
在傳輸之前,我們將有序的像素路徑點轉(zhuǎn)換為機器人友好的坐標(以米為單位),并確保它們適合有界的工作空間。我們平移整個路徑,使路徑點0成為原點(0,0),我們可以選擇翻轉(zhuǎn)y軸,因為相機坐標向下增加,而機器人/世界坐標通常向上增加。然后,我們統(tǒng)一縮放平移路徑,使最大絕對坐標位于±1.25米內(nèi),保證機器人不會被命令超出預定范圍。最后的輸出被打包成一個標準的64-float有效負載,代表最多32個(x,y)點;如果生成的點較少,我們用零填充其余的點(用作嵌入側(cè)的“停止”哨兵)。我們通過TCP將有效負載傳輸為8個數(shù)據(jù)包,每個數(shù)據(jù)包有8個浮點數(shù),由開始和結(jié)束字節(jié)組成,并且我們故意在數(shù)據(jù)包之間添加短延遲以保持嵌入式接收器的穩(wěn)定。這給了機器人一個完整的、一致的路點列表,它獨立于相機分辨率或繪圖比例。
嵌入式接收、路點存儲和后續(xù)控制器
在嵌入式系統(tǒng)上,每個傳入數(shù)據(jù)包更新八個接收浮點數(shù),我們將這些浮點數(shù)視為每個數(shù)據(jù)包的四個(x,y)路點對。當數(shù)據(jù)包到達時,我們填充一個全局robotdest[]數(shù)組并增加計數(shù)器,直到我們接收到所有64個路點,此時我們通過設置wp_rx_done = 1和重置statpos = 0從“等待”模式切換到“跟隨”模式。在等待完整的集合時,機器人只是保持位置在(0,0),這樣它就不會過早地移動部分數(shù)據(jù)。一旦跟隨開始,我們的控制循環(huán)就會反復調(diào)用xy_control(…)函數(shù),該函數(shù)接受機器人的估計(x,y,偏航)狀態(tài),并輸出指向當前航路點的前進速度參考和轉(zhuǎn)彎率命令。當控制器報告到達當前路徑點時,我們前進到下一個索引,并在到達恰好為(0,0)的路徑點時停止,由于Python填充方案,它充當了一個明確的路徑結(jié)束標記。停止后,我們繼續(xù)指揮最后的航路點作為等待位置,這樣機器人就可以穩(wěn)定下來,而不是漂移。這種端到端管道讓繪制的手勢路徑成為機器人可以自主遵循的安全、有界、有序的路點計劃。
本文編譯自hackster.io





