VR第一視角遠(yuǎn)程牽引控制機(jī)械臂項(xiàng)目概述:
項(xiàng)目方案:VR+動(dòng)捕+機(jī)械臂。
項(xiàng)目完成情況:
把CC3220開(kāi)發(fā)板的TCP Server弄出來(lái)了,可以遠(yuǎn)程控制機(jī)械臂了,最終還是沒(méi)有時(shí)間搭建HTTP Server,攝像頭共享就只能作罷了。
不采用傳統(tǒng)的輸入設(shè)備(如:鍵盤、鼠標(biāo)、手柄等)來(lái)做控制,也不是簡(jiǎn)單的讓機(jī)械臂和操作者的手臂同步。具體實(shí)現(xiàn)步驟如下。
1. 制作一個(gè)機(jī)械臂
某寶上直接買了一個(gè)幾十塊現(xiàn)成的,雖然很糙,但是足夠用了。
2. 安裝機(jī)械臂的第一視角
配合兩個(gè)舵機(jī)實(shí)現(xiàn)上下左右的轉(zhuǎn)動(dòng)。
這里本來(lái)應(yīng)該是用JPEG攝像頭連到CC3220開(kāi)發(fā)板來(lái)做遠(yuǎn)程的, 開(kāi)發(fā)板上搭建HTTP Server最終還是沒(méi)搞定。
測(cè)試的時(shí)候用了一臺(tái)手機(jī)代替開(kāi)發(fā)板(手機(jī)上倒是做了完整的測(cè)試界面,包括控制、攝像頭畫面、信息窗口)。
3. 機(jī)械臂的遠(yuǎn)程控制及第一視角的遠(yuǎn)程共享
這里先說(shuō)說(shuō)之前的測(cè)試方案:
機(jī)械臂和控制第一視角的舵機(jī)都用Arduino驅(qū)動(dòng),把Arduino和手機(jī)用OTG線連接。手機(jī)上搭建一個(gè)HTTP服務(wù)器,負(fù)責(zé)接收遠(yuǎn)程指令和手機(jī)攝像頭畫面(作為機(jī)械臂的第一視角)的遠(yuǎn)程共享。機(jī)械臂的控制指令通過(guò)手機(jī)USB發(fā)送給Arduino。
結(jié)合CC3220的方案:
攝像頭畫面共享沒(méi)實(shí)現(xiàn),沒(méi)有搞定開(kāi)發(fā)板上的HTTP Server。在官方Demo里的“network_terminal”的基礎(chǔ)上修改的TCP Server,從Socket里面獲得控制指令,轉(zhuǎn)換成PWM信號(hào)控制機(jī)械臂的舵機(jī)。這次只控制機(jī)械臂的舵機(jī),沒(méi)有遠(yuǎn)程攝像頭舵機(jī)的控制。
4. 在3D開(kāi)發(fā)環(huán)境下的開(kāi)發(fā)
首先重構(gòu)一個(gè)虛擬的機(jī)械臂,只要保證重要的機(jī)械結(jié)構(gòu)一致就可以了,其它的細(xì)節(jié)不需要(參考下圖)。
然后為用戶構(gòu)建一個(gè)虛擬的半透明屏幕,綁定在視角前方,用來(lái)顯示機(jī)械臂第一視角的畫面。(U
nity下面獲取遠(yuǎn)程畫面不是很方變,這里沒(méi)有做視頻流,而是通過(guò)刷新的方式一幀一幀獲取攝像頭畫面,用base64Binary格式壓縮到HTTP服務(wù)器的響應(yīng)中)
導(dǎo)入一個(gè)單手臂的模型,并握有配套的手柄模型。
因?yàn)橐玫絍R,這里選擇了Unity3D。遠(yuǎn)程通信要實(shí)現(xiàn):
- 讓操作者用頭部轉(zhuǎn)動(dòng)去控制機(jī)械臂第一視角的轉(zhuǎn)動(dòng)
- 分析虛擬機(jī)械臂的運(yùn)動(dòng)從而計(jì)算出相應(yīng)的控制指令來(lái)實(shí)現(xiàn)現(xiàn)實(shí)的機(jī)械臂和虛擬機(jī)械臂的同步。
結(jié)合CC3220的方案:
上面展示的是測(cè)試時(shí)候的方案,手機(jī)VR的SDK用的是Cardboard。結(jié)合CC3220開(kāi)發(fā)板的時(shí)候,更換了Google Daydream的SDK,手柄也直接替換成了Daydream的手柄。沒(méi)有搞定遠(yuǎn)程視頻共享,所以刪掉了虛擬的半透明屏幕,重新制作了虛擬工作環(huán)境:包括多視角觀察窗口(左測(cè)和上方兩個(gè)視角)、傳感器監(jiān)控(數(shù)據(jù)、模型)、舵機(jī)轉(zhuǎn)角計(jì)算結(jié)果的監(jiān)控、虛擬鍵盤(用于設(shè)置TCP Server的IP地址和端口)。Daydream下面不能像Cardboard一樣設(shè)計(jì)屏幕輸入界面,所以才設(shè)計(jì)了一個(gè)虛擬鍵盤。
5. 引入動(dòng)捕設(shè)備
用三顆MPU6050實(shí)現(xiàn)手臂動(dòng)捕,這樣在虛擬環(huán)境下就有了完全同步的虛擬手臂了。測(cè)試的時(shí)候用了一個(gè)自制的手柄不帶任何運(yùn)動(dòng)傳感器。
結(jié)合CC3220開(kāi)發(fā)板做測(cè)試的時(shí)候,采用Daydream,可以用Daydream的遙控器代替自己做的手柄。雖然Daydream的遙控器是九軸的,但校準(zhǔn)方面還是純主觀性的,說(shuō)白了跟六軸的效果是一樣。在Daydream下面藍(lán)牙插件做的有點(diǎn)問(wèn)題,不夠順暢。如果不壓縮數(shù)據(jù),會(huì)出現(xiàn)明顯的延時(shí)和卡頓,目前還是依靠犧牲傳感器計(jì)算結(jié)果的精度來(lái)解決。感興趣可以看看后面的一個(gè)演示視頻,遙控器可以不用死死捏在手上,可以變換握姿。操作上也更加豐富了。另外,Daydream的遙控器有觸摸板,配合觸摸板下的按鍵,可以實(shí)現(xiàn)多種操作的組合。
6. 控制流程
測(cè)試方案:
(動(dòng)捕設(shè)備) (運(yùn)動(dòng)分析得到控制指令)
操作者的手臂 ------> 同步的虛擬手臂 ------> 牽引虛擬的機(jī)械臂 ------> 遠(yuǎn)程讓機(jī)械臂同步
(頭部轉(zhuǎn)動(dòng)分析得到控制指令)
操作者的頭部 ---------------------------------> 遠(yuǎn)程讓機(jī)械臂同步
(遠(yuǎn)程圖傳)
虛擬環(huán)境下的虛擬屏幕<-------------機(jī)械臂第一視角
CC3220方案:
(敲擊輸入)
虛擬鍵盤 -----------------> 設(shè)置TCP Server的IP和端口
(動(dòng)捕設(shè)備) (運(yùn)動(dòng)分析得到控制指令)
操作者的手臂 ------> 同步的虛擬手臂 ------> 牽引虛擬的機(jī)械臂 ------> 遠(yuǎn)程讓機(jī)械臂同步
項(xiàng)目開(kāi)發(fā)環(huán)境:
硬件清單:
測(cè)試方案:
- 機(jī)械臂 x 1(四個(gè)舵機(jī))
- 舵機(jī) x 2(用于轉(zhuǎn)動(dòng)手機(jī))
- Arduino x 1
- 安卓手機(jī) x 2
- 動(dòng)捕設(shè)備 x 1(IMU:MPU6050 x 3, MCU:MSP430F5259, BLE:CC2540)
- 手柄 x 1
CC3220的方案:
- 機(jī)械臂 x 1(四個(gè)舵機(jī))
- CC3220 x 1
- 安卓手機(jī) x 1(7.0以上系統(tǒng),Daydream Ready)
- 動(dòng)捕設(shè)備 x 1(IMU:MPU6050 x 3, MCU:MSP430F5259, BLE:CC2540)
- Daydream手柄 x 1
3D開(kāi)發(fā)環(huán)境:
測(cè)試方案:
- Unity3D 5.4.2 + Cardboard SDK
CC3220的方案:
- Unity3D 5.6.3 + Google VR SDK
CC3220開(kāi)發(fā)環(huán)境:
- CCS7.4 + simplelink_cc32xx_sdk_1_60_00_04
項(xiàng)目圖片:
測(cè)試方案:
機(jī)械臂
安裝了手機(jī)
手機(jī)測(cè)試軟件界面
動(dòng)捕設(shè)備+控制手柄
動(dòng)捕佩戴好后拍照
Unity3D開(kāi)發(fā)環(huán)境界面截圖
VR畫面截圖
CC3220的方案:
機(jī)械臂:
動(dòng)捕設(shè)備+Daydream手柄
動(dòng)捕佩戴好后拍照
Unity3D開(kāi)發(fā)環(huán)境界面截圖
VR界面截圖:
項(xiàng)目視頻:
用手機(jī)代替開(kāi)發(fā)板測(cè)試的視頻:
動(dòng)捕加Daydream演示視頻:
CC3220測(cè)試視頻: