通栏式网站,做社区生意的网站,百度四川建设厅网站,网页设计作品田田田田田田田田田田田田田田引言 由于YouTube和Netflix的出现#xff0c;我们开始躺着看手机。然而#xff0c;长时间用手拿着手机会让人感到疲劳。这次我们制作了一个可以在你眼前保持适当距离并调整位置的自动移动手机支架#xff0c;让你无需用手拿着手机。请务必试试#xff01; 准备工作 这次我们… 引言 由于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数据。 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 MyCobotmycobot MyCobot(/dev/ttyUSB0)
# 使其直立
# go zero
mycobot.send_angles([0,0,0,0,0,0], 80) OAK-D OpenCV DepthAI摄像头 安装用于操作OAK-D摄像头的depthai库。 # 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厘米)#enPID_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) 确定目标值 确定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摄像头进行面部识别并利用能够做出复杂动作的机械臂进行面部跟踪。通过计算机视觉捕捉人类的动作并据此操控机械臂可以发现它能够进行非常多样的动作。希望这能为大家的开发提供参考。