引言
由于YouTube和Netflix的出現,我們開始躺著看手機。然而,長時間用手拿著手機會讓人感到疲勞。這次我們制作了一個可以在你眼前保持適當距離并調整位置的自動移動手機支架,讓你無需用手拿著手機。請務必試試!
準備工作
這次我們使用了Elephant Robotics公司的機械臂。與其他產品相比,它價格便宜,作為初學者也相對容易上手。
myCobot 280 Pi- 6 DOF Collaborative Robot (Raspberry Pi version)
為了讓攝像頭跟蹤面部,我們采用了OAK-D OpenCV DepthAI攝像頭。它不僅僅是進行視頻捕捉,還能輔助進行面部識別所需的神經網絡運算,因此即使微控制器沒有GPU,也能高速進行面部識別。
這是一個可以始終將顯示屏調整到眼前適當距離的手機支架。主要由OAK-D攝像頭和機械臂“myCobot”構成。OAK-D攝像頭不僅可以獲取視頻,還可以獲取深度信息,從而計算出攝像頭到臉部的距離。myCobot是一款具有6個旋轉軸的機械臂,能夠實現多種動作。通過OAK-D攝像頭獲取的圖像來計算臉部的三維位置,myCobot可以將手機顯示屏移動到眼前。這樣一來,即使不用手拿著手機也能享受視頻。
將OAK-D攝像頭和手機安裝到myCobot上
myCobot的末端有四個M2.6的螺絲孔。我們3D打印了一個手機殼,并利用這些螺絲孔將殼子固定到myCobot上,從而固定手機。
另一方面,OAK-D攝像頭有一個1/4英寸的螺絲孔。我們在3D打印的殼子上也開了一個用于1/4英寸螺絲的孔,以便固定攝像頭。
作為參考,這里放置了此次使用的STL數據。
As a reference, here are the STL files used for this project.
Smartphone holders with a camera for myCobot by techlife_hacking - Thingiverse
機械臂的動作
X方向的移動:J1軸的旋轉
Y方向的移動:J4軸的旋轉
Z方向的移動:J2和J3軸的旋轉(J2和J3反向旋轉)
使用J2和J3軸來進行深度方向的移動。僅移動J2會影響Y方向,因此讓J3以與J2軸相反的方向旋轉相同的量,以減小影響。
3D Face Tracking
在XY平面上跟蹤面部
通過對OAK-D攝像頭獲取的圖像進行面部檢測,可以獲取相機畫面中面部的坐標(x, y)。
將OAK-D攝像頭畫面的中心坐標設為目標值,將面部識別獲得的面部坐標(x, y)作為反饋值進行PID控制。
深度方向(Z方向)上的面部跟蹤
由于OAK-D攝像頭配備了立體攝像頭,因此不僅可以獲取平面上的面部坐標,還可以獲取深度方向的面部坐標z。將面部與顯示屏之間既不過近也不過遠的距離設為目標值,利用立體攝像頭測量的面部坐標(z)作為反饋值進行PID控制。
myCobot和OAK攝像頭
將OAK攝像頭和myCobot附帶的Raspberry Pi通過USB連接。OAK攝像頭計算出面部的目標坐標,myCobot附帶的Raspberry Pi根據這些坐標進行PID控制,以調整攝像頭的方向。
環境
為myCobot附帶的Raspberry Pi進行環境構建。
myCobot
在myCobot的Raspberry Pi版本中,只要接通電源,就可以立即使用。機械臂可以通過Python進行操作,并且官方也提供支持。
# 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
演示
環境搭建完成后,請運行演示程序。若攝像頭能夠在保持一定距離的同時追蹤面部,則說明系統運行正常。
# get demo sources
git clone https://github.com/tech-life-hacking/depthai.git
# execute demo
python3 depthai_demo.py
PID的調整
如果myCobot的動作不穩定,請調整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)
確定目標值
Setting Target Values
確定myCobot攝像頭指向目標值的代碼如下。nnData[0]表示OAK-D攝像頭檢測到的面部包圍框的四個角的坐標。將這四個角的坐標和除以2,可以得出包圍框的中心點。spatialCoordinates.z是一個方法,用于返回攝像頭和面部之間的距離測量結果。
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
結語
這次我們使用OAK-D攝像頭進行面部識別,并利用能夠做出復雜動作的機械臂進行面部跟蹤。通過計算機視覺捕捉人類的動作,并據此操控機械臂,可以發現它能夠進行非常多樣的動作。希望這能為大家的開發提供參考。
審核編輯 黃宇
-
攝像頭
+關注
關注
60文章
4841瀏覽量
95695 -
python
+關注
關注
56文章
4797瀏覽量
84688 -
面部識別
+關注
關注
1文章
375瀏覽量
26637 -
機械臂
+關注
關注
12文章
515瀏覽量
24587 -
具身智能
+關注
關注
0文章
43瀏覽量
53
發布評論請先 登錄
相關推薦
評論