請注意,本文所體現(xiàn)的信息、用途及應(yīng)用完全是 Video-Touch 客座作者的觀點(diǎn)。
您可能看過一些科幻電影,電影中的人可以用身體動作來控制機(jī)器人。如今,借助現(xiàn)代計(jì)算機(jī)視覺和機(jī)器人方法,我們能夠把這種體驗(yàn)變成現(xiàn)實(shí),而且和電影一樣精彩奇妙。
受新冠病毒影響,在如此艱難的時(shí)期,為了讓遠(yuǎn)程控制和遠(yuǎn)程操作變得切實(shí)可用,我們開啟了 VideoTouch 項(xiàng)目。
Video-Touch 是第一個(gè)人機(jī)交互系統(tǒng)。它允許多名用戶,在世界任何地方通過視頻通話應(yīng)用(例如 Google Meet、Zoom、Skype)對其進(jìn)行控制。
我們考慮過,是否有可能只用自己的手來遠(yuǎn)程控制機(jī)器人,而不借助手套、操縱桿等任何額外的設(shè)備,同時(shí)不產(chǎn)生明顯的延遲。于是,我們決定使用計(jì)算機(jī)視覺來實(shí)時(shí)識別動作,并實(shí)時(shí)傳遞給機(jī)器人。在 MediaPipe 的幫助下,我們將其變?yōu)榱爽F(xiàn)實(shí)。
操作系統(tǒng)大致如下:
1. 通過視頻會議應(yīng)用,在用戶設(shè)備上獲取網(wǎng)絡(luò)攝像頭視頻,然后將其發(fā)送至機(jī)器人計(jì)算機(jī)(“服務(wù)器”);
2. 用戶的網(wǎng)絡(luò)攝像頭視頻串流通過 OBS 虛擬攝像頭工具被捕捉到機(jī)器人的計(jì)算機(jī)顯示器上;
3. 識別模塊在 MediaPipe 的幫助下讀取用戶的動作和手勢,并通過 ZeroMQ 發(fā)送給下一個(gè)模塊;
4. 在動作捕捉數(shù)據(jù)的基礎(chǔ)上,機(jī)械臂及其抓手由 Python 控制。
從方案中可以清楚地看出,用戶在操作機(jī)器人時(shí)只需穩(wěn)定的互聯(lián)網(wǎng)連接和一個(gè)視頻會議應(yīng)用。所有的如屏幕捕捉、手部追蹤、手勢識別和機(jī)器人控制等計(jì)算,都可以在 Wi-Fi 與機(jī)器人連接的單獨(dú)設(shè)備上進(jìn)行(只是另一臺筆記本電腦)。接下來,我們將對流水線的各個(gè)環(huán)節(jié)進(jìn)行詳細(xì)說明。
視頻串流和屏幕捕捉
用戶可以使用任何一臺能夠?qū)崿F(xiàn)跨設(shè)備傳輸視頻的軟件。在實(shí)驗(yàn)中,我們使用的是視頻會議的桌面應(yīng)用。用戶在其設(shè)備上呼叫一臺顯示器與機(jī)器人相連的計(jì)算機(jī)。這樣,機(jī)器人就可以看到來自用戶網(wǎng)絡(luò)攝像頭的視頻串流。
現(xiàn)在,我們需要某種機(jī)制來把用戶的視頻從視頻會議傳遞到識別模塊。我們使用的是 Open Broadcaster Software (OBS) 及其虛擬攝像頭工具來捕捉打開視頻會議的窗口。這樣我們就獲得了一個(gè)虛擬攝像頭,它現(xiàn)在有來自用戶網(wǎng)絡(luò)攝像頭的幀及其獨(dú)特的設(shè)備索引,可以在識別模塊中進(jìn)一步使用。
識別模塊
識別模塊的作用是捕捉用戶的動作并將其傳遞給機(jī)器人控制模塊。MediaPipe 會在此發(fā)揮作用。我們?yōu)椴蹲绞植縿幼鲗ふ伊俗钣行А⒆罹_的計(jì)算機(jī)視覺軟件。我們發(fā)現(xiàn)了許多令人興奮的解決方案,但事實(shí)證明,對于如此具有挑戰(zhàn)性的任務(wù)(實(shí)時(shí)設(shè)備端手部運(yùn)動精確識別),MediaPipe 是唯一適合的工具。
我們對 MediaPipe 手部追蹤模塊進(jìn)行了兩項(xiàng)關(guān)鍵修改:增加了手勢識別計(jì)算器并集成了 ZeroMQ 消息傳遞機(jī)制。
兩項(xiàng)關(guān)鍵修改
https://github.com/Arxtage/videotouch.github.io/tree/main
在上次發(fā)表文章的時(shí)候,我們有兩個(gè)版本的手勢識別實(shí)現(xiàn)。第一個(gè)版本如下圖 3 所示,所有的計(jì)算均在手部姿勢識別計(jì)算器內(nèi)進(jìn)行。計(jì)算器將特征點(diǎn)作為輸入進(jìn)行縮放,也就是說,這些特征點(diǎn)根據(jù)手的邊界框大小(而非整個(gè)圖像的大小)進(jìn)行標(biāo)準(zhǔn)化。接下來,它會識別 4 種手勢(另見圖 4):“移動”、“傾斜”、“抓取”和“無手勢”(論文中的“手指距離”手勢是實(shí)驗(yàn)性內(nèi)容,沒有包括在最終演示版中),并輸出手勢類名稱。盡管這個(gè)版本十分穩(wěn)健實(shí)用,但它只是基于簡單的啟發(fā)式規(guī)則,如:“如果此特征點(diǎn) [i].x 《 特征點(diǎn) [j].x,那么它是一個(gè)‘移動’手勢”,而且對于手部旋轉(zhuǎn)這類現(xiàn)實(shí)生活中的情況,此版本無法識別。
發(fā)表文章
https://dl.acm.org/doi/10.1145/3415255.3422892
為了緩解泛化不良的問題,我們實(shí)施了第二個(gè)版本。我們在手動收集和加標(biāo)簽的 1000 個(gè)關(guān)鍵點(diǎn)的數(shù)據(jù)集上訓(xùn)練了來自 scikit-learn 的梯度提升分類器:“移動”、“傾斜”和“抓取”類各有 200 個(gè),而“無手勢”類有 400 個(gè)。順便說一下,如今可以通過最近發(fā)布的 Jesture AI SDK repo(注:我們團(tuán)隊(duì)部分成員的另一個(gè)項(xiàng)目)輕松獲取此類數(shù)據(jù)集。
Jesture AI SDK
https://github.com/jesture-ai/jesture-sdk/tree/main/python#annotation-tool
我們使用縮放的特征點(diǎn)、關(guān)節(jié)間的角度以及成對的特征點(diǎn)距離作為模型的輸入,來預(yù)測手勢類。接下來,我們嘗試只傳遞縮放的特征點(diǎn),而不傳遞任何角度和距離,結(jié)果在 200 個(gè)關(guān)鍵點(diǎn)的本地驗(yàn)證集上獲得了 91% 的類似多類準(zhǔn)確率。對于這個(gè)版本的手勢分類器,還有一點(diǎn)是我們無法直接在 C++ 中運(yùn)行 scikit-learn 模型,所以我們用 Python 進(jìn)行實(shí)現(xiàn),作為機(jī)器人控制模塊的一部分。
發(fā)表后,我們立即推出了一個(gè)在 Keras 中訓(xùn)練的全連接神經(jīng)網(wǎng)絡(luò),它采用的數(shù)據(jù)集與梯度提升模型相同,而得到的結(jié)果更好,準(zhǔn)確率達(dá)到 93%。我們將這個(gè)模型轉(zhuǎn)換為 TensorFlow Lite 格式,現(xiàn)在我們可以在手部姿勢識別計(jì)算器中直接運(yùn)行手勢識別 ML 模型。
得到當(dāng)前手部位置和當(dāng)前手勢類后,我們需要將其傳遞給機(jī)器人控制模塊。進(jìn)行這一步時(shí),我們借助了高性能的異步消息功能庫 ZeroMQ。為了在 C++ 中實(shí)現(xiàn)這一點(diǎn),我們使用了 libzmq 庫和 cppzmq 標(biāo)頭。利用 請求-回復(fù) 方案:識別模塊 C++ 代碼中的 REP(服務(wù)器)和機(jī)器人控制模塊 Python 代碼中的 REQ(客戶端)。
libzmq
https://github.com/zeromq/libzmq
cppzmq
https://github.com/zeromq/cppzmq
請求-回復(fù)
https://learning-0mq-with-pyzmq.readthedocs.io/en/latest/pyzmq/patterns/client_server.html
因此,借助我們修改過的手部追蹤模塊,現(xiàn)在能夠?qū)⑦\(yùn)動捕捉信息實(shí)時(shí)傳遞給機(jī)器人。
機(jī)器人控制模塊
機(jī)器人控制模塊是一個(gè) Python 腳本,它將手部特征點(diǎn)和手勢類作為輸入,并輸出機(jī)器人移動命令(在每一幀上)。運(yùn)行該腳本的計(jì)算機(jī)通過 Wi-Fi 與機(jī)器人連接。我們的實(shí)驗(yàn)中使用了搭載 Nvidia GTX 1050 Ti GPU 的 MSI 筆記本電腦。同時(shí)嘗試在 Intel Core i7 CPU 上運(yùn)行整個(gè)系統(tǒng),由于有高度優(yōu)化的 MediaPipe 計(jì)算圖實(shí)現(xiàn),該運(yùn)行也是實(shí)時(shí)的,延遲可以忽略不計(jì)。
在目前的流水線中,我們使用了 Universal Robotics 的 6DoF UR10 機(jī)器人。由于使用的抓手是雙指的,我們不需要每個(gè)特征點(diǎn)與機(jī)器人手指關(guān)鍵點(diǎn)的完整映射,只需要手中心的位置。借助此中心坐標(biāo)和 python-urx 軟件包,我們現(xiàn)在能夠在所需的方位和方向上改變機(jī)器人的速度:在每一幀上,我們計(jì)算當(dāng)前手中心坐標(biāo)與前一幀坐標(biāo)之差,從而得出速度變化矢量或角度。最后,此機(jī)制看起來與人們用操縱桿控制機(jī)器人的方式非常相似。
python-urx
https://github.com/SintefManufacturing/python-urx
源視頻
https://www.youtube.com/watch?v=F4X4jJwDBy4
高密度觸覺傳感器的觸覺感知
靈巧的操縱要求具有較高的空間分辨率和對物體和環(huán)境的高保真觸覺感知。最新的傳感器數(shù)組非常適合機(jī)器人操縱,因?yàn)樗鼈兛梢院苋菀椎貟旖拥饺魏螜C(jī)器人末端執(zhí)行器上,并適應(yīng)任何接觸面。
源發(fā)布文章
https://dl.acm.org/doi/10.1145/3415255.3422892
Video-Touch 嵌入了一種高密度的觸覺傳感器數(shù)組。它們安裝在雙指機(jī)器人抓手中。每個(gè)指尖上都掛接一個(gè)傳感器數(shù)組。單個(gè)電極數(shù)組可以感應(yīng) 5.8 平方厘米的幀面積,每幀分辨率為 100 點(diǎn)。感應(yīng)頻率等于 120 赫茲。每個(gè)點(diǎn)的力檢測范圍為 1 至 9 牛頓。因此,機(jī)器人以 200 點(diǎn)的分辨率(每個(gè)手指為 100 點(diǎn))檢測施加在機(jī)器人手指抓取的固體或柔性物體上的壓力。
從傳感器數(shù)組處收集的數(shù)據(jù)經(jīng)過處理后,以動態(tài)手指接觸映射圖的形式向用戶顯示。壓力傳感器數(shù)組讓用戶能夠感知被抓物體的順應(yīng)性、硬度、粗糙度、形狀、方向等物理特性。
圖 8:多用戶機(jī)械臂控制功能。用戶能夠在常規(guī)的視頻通話過程中執(zhí)行 COVID-19 檢測 [源視頻]
源視頻
尾注
如此一來,借助 MediaPipe 和機(jī)器人,我們建立了一個(gè)有效的多用戶機(jī)器人遠(yuǎn)程操作系統(tǒng)。在未來,遠(yuǎn)程操作系統(tǒng)的潛在用途將包括醫(yī)療檢測,以及在難以進(jìn)入的環(huán)境(例如外太空)中進(jìn)行的實(shí)驗(yàn)。該系統(tǒng)的多用戶功能解決了有效遠(yuǎn)程協(xié)作的實(shí)際問題,允許在多人小組中進(jìn)行需要手動遠(yuǎn)程控制的項(xiàng)目工作。
我們流水線的另一個(gè)優(yōu)勢特點(diǎn)是,人們可以使用任何帶有攝像頭的設(shè)備,例如手機(jī),來控制機(jī)器人。除了機(jī)械臂,人們還可以操作其他如,邊緣設(shè)備、移動機(jī)器人或無人機(jī)等硬件設(shè)備。當(dāng)然,目前的解決方案具有一定的局限性:延遲時(shí)間、z 坐標(biāo)(深度)的利用,以及手勢類型的便利性都有改進(jìn)的空間。我們十分期待試用 MediaPipe 團(tuán)隊(duì)的更新,并期待著嘗試新類型的抓手(帶手指的抓手)、雙手控制,甚至是全身控制(期待“鐵甲鋼拳”!)。
希望這篇文章對您和您的工作有所幫助。保重身體,堅(jiān)持編碼。非常感謝您的關(guān)注!
責(zé)任編輯:haq
-
機(jī)器人
+關(guān)注
關(guān)注
211文章
28390瀏覽量
206957 -
機(jī)器視覺
+關(guān)注
關(guān)注
161文章
4369瀏覽量
120293
原文標(biāo)題:Video-Touch:手勢識別助力 Google Meet 實(shí)現(xiàn)多用戶遠(yuǎn)程控制機(jī)器人
文章出處:【微信號:tensorflowers,微信公眾號:Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論