引言
由于YouTube和Netflix的出現(xiàn),我們開始躺著看手機(jī)。然而,長時間用手拿著手機(jī)會讓人感到疲勞。這次我們制作了一個可以在你眼前保持適當(dāng)距離并調(diào)整位置的自動移動手機(jī)支架,讓你無需用手拿著手機(jī)。請務(wù)必試試!
準(zhǔn)備工作
這次我們使用了Elephant Robotics公司的機(jī)械臂。與其他產(chǎn)品相比,它價格便宜,作為初學(xué)者也相對容易上手。
myCobot 280 Pi- 6 DOF Collaborative Robot (Raspberry Pi version)
為了讓攝像頭跟蹤面部,我們采用了OAK-D OpenCV DepthAI攝像頭。它不僅僅是進(jìn)行視頻捕捉,還能輔助進(jìn)行面部識別所需的神經(jīng)網(wǎng)絡(luò)運算,因此即使微控制器沒有GPU,也能高速進(jìn)行面部識別。
這是一個可以始終將顯示屏調(diào)整到眼前適當(dāng)距離的手機(jī)支架。主要由OAK-D攝像頭和機(jī)械臂“myCobot”構(gòu)成。OAK-D攝像頭不僅可以獲取視頻,還可以獲取深度信息,從而計算出攝像頭到臉部的距離。myCobot是一款具有6個旋轉(zhuǎn)軸的機(jī)械臂,能夠?qū)崿F(xiàn)多種動作。通過OAK-D攝像頭獲取的圖像來計算臉部的三維位置,myCobot可以將手機(jī)顯示屏移動到眼前。這樣一來,即使不用手拿著手機(jī)也能享受視頻。
將OAK-D攝像頭和手機(jī)安裝到myCobot上
myCobot的末端有四個M2.6的螺絲孔。我們3D打印了一個手機(jī)殼,并利用這些螺絲孔將殼子固定到myCobot上,從而固定手機(jī)。
另一方面,OAK-D攝像頭有一個1/4英寸的螺絲孔。我們在3D打印的殼子上也開了一個用于1/4英寸螺絲的孔,以便固定攝像頭。
作為參考,這里放置了此次使用的STL數(shù)據(jù)。
As a reference, here are the STL files used for this project.
Smartphone holders with a camera for myCobot by techlife_hacking - Thingiverse
機(jī)械臂的動作
X方向的移動:J1軸的旋轉(zhuǎn)
Y方向的移動:J4軸的旋轉(zhuǎn)
Z方向的移動:J2和J3軸的旋轉(zhuǎn)(J2和J3反向旋轉(zhuǎn))
使用J2和J3軸來進(jìn)行深度方向的移動。僅移動J2會影響Y方向,因此讓J3以與J2軸相反的方向旋轉(zhuǎn)相同的量,以減小影響。
3D Face Tracking
在XY平面上跟蹤面部
通過對OAK-D攝像頭獲取的圖像進(jìn)行面部檢測,可以獲取相機(jī)畫面中面部的坐標(biāo)(x, y)。
將OAK-D攝像頭畫面的中心坐標(biāo)設(shè)為目標(biāo)值,將面部識別獲得的面部坐標(biāo)(x, y)作為反饋值進(jìn)行PID控制。
深度方向(Z方向)上的面部跟蹤
由于OAK-D攝像頭配備了立體攝像頭,因此不僅可以獲取平面上的面部坐標(biāo),還可以獲取深度方向的面部坐標(biāo)z。將面部與顯示屏之間既不過近也不過遠(yuǎn)的距離設(shè)為目標(biāo)值,利用立體攝像頭測量的面部坐標(biāo)(z)作為反饋值進(jìn)行PID控制。
myCobot和OAK攝像頭
將OAK攝像頭和myCobot附帶的Raspberry Pi通過USB連接。OAK攝像頭計算出面部的目標(biāo)坐標(biāo),myCobot附帶的Raspberry Pi根據(jù)這些坐標(biāo)進(jìn)行PID控制,以調(diào)整攝像頭的方向。
環(huán)境
為myCobot附帶的Raspberry Pi進(jìn)行環(huán)境構(gòu)建。
myCobot
在myCobot的Raspberry Pi版本中,只要接通電源,就可以立即使用。機(jī)械臂可以通過Python進(jìn)行操作,并且官方也提供支持。
# test
from pymycobot.mycobot import MyCobot
mycobot = MyCobot('/dev/ttyUSB0')
# 使其直立
# go zero
mycobot.send_angles([0,0,0,0,0,0], 80)
OAK-D OpenCV DepthAI攝像頭
安裝用于操作OAK-D攝像頭的depthai庫。
OAK-D OpenCV DepthAI Camera
Install the depthai library to operate the OAK-D camera.
# install dependency
sudo curl -fL http://docs.luxonis.com/_static/install_dependencies.sh | bash
# get sources
git clone https://github.com/luxonis/depthai.git
# install depthai
python3 install_requirements.py
演示
環(huán)境搭建完成后,請運行演示程序。若攝像頭能夠在保持一定距離的同時追蹤面部,則說明系統(tǒng)運行正常。
# get demo sources
git clone https://github.com/tech-life-hacking/depthai.git
# execute demo
python3 depthai_demo.py
PID的調(diào)整
如果myCobot的動作不穩(wěn)定,請調(diào)整PID值。
# settings
PID_control.PID(P值, I值, D值)
pidX.setTargetPosition(幀中的點的位置(X方向): 范圍0-1, 0.5是中心)
pidY.setTargetPosition(幀中的點的位置(Y方向): 范圍0-1, 0.5是中心)
pidZ.setTargetPosition(攝像頭和面部的距離(米), 0.5米 = 50厘米)
#en
PID_control.PID(P value, I value, D value)
pidX.setTargetPosition(Position of the point in the frame (X direction): Range 0-1, 0.5 is the center)
pidY.setTargetPosition(Position of the point in the frame (Y direction): Range 0-1, 0.5 is the center)
pidZ.setTargetPosition(Distance between the camera and the face (meters), 0.5m = 50cm)
# default
pidX = PID_control.PID(10, 10, 3.75)
pidY = PID_control.PID(6.5, 5, 2.5)
pidZ = PID_control.PID(50, 30, 20)
pidX.setTargetPosition(0.5)
pidY.setTargetPosition(0.5)
pidZ.setTargetPosition(0.5)
確定目標(biāo)值
Setting Target Values
確定myCobot攝像頭指向目標(biāo)值的代碼如下。nnData[0]表示OAK-D攝像頭檢測到的面部包圍框的四個角的坐標(biāo)。將這四個角的坐標(biāo)和除以2,可以得出包圍框的中心點。spatialCoordinates.z是一個方法,用于返回攝像頭和面部之間的距離測量結(jié)果。
x = (self._nnData[0].xmin + self._nnData[0].xmax) / 2
y = (self._nnData[0].ymin + self._nnData[0].ymax) / 2
z = int(self._nnData[0].spatialCoordinates.z) / 1000
結(jié)語
這次我們使用OAK-D攝像頭進(jìn)行面部識別,并利用能夠做出復(fù)雜動作的機(jī)械臂進(jìn)行面部跟蹤。通過計算機(jī)視覺捕捉人類的動作,并據(jù)此操控機(jī)械臂,可以發(fā)現(xiàn)它能夠進(jìn)行非常多樣的動作。希望這能為大家的開發(fā)提供參考。
審核編輯 黃宇
-
攝像頭
+關(guān)注
關(guān)注
59文章
4793瀏覽量
95275 -
python
+關(guān)注
關(guān)注
55文章
4767瀏覽量
84375 -
面部識別
+關(guān)注
關(guān)注
1文章
375瀏覽量
26609 -
機(jī)械臂
+關(guān)注
關(guān)注
12文章
506瀏覽量
24458 -
具身智能
+關(guān)注
關(guān)注
0文章
29瀏覽量
28
發(fā)布評論請先 登錄
相關(guān)推薦
評論