MaixPy 人脸追踪云台教程

本文介绍人脸追踪云台的组装和使用。(修改Maix内部算法可以改为追踪其它任何物体)

云台的组装

  1. 人脸追踪套件包含:M1 dock,亚克力支架,二轴舵机云台。如下图所示:

2 打开M1 dock的包装盒,焊接双排排针,建议朝上焊接。同时 接上摄像头和屏幕。

3. 使用螺丝将亚克力支架固定到云台上:

4. 使用尼龙螺柱将dock固定到亚克力支架上,使用双面泡棉胶将屏幕固定到亚克力支架上

5. 使用 公对母 杜邦线连接 舵机信号线 与dock。

舵机线定义为:红色:5V;褐色:GND;黄色:信号线。

我们将底部舵机的信号线连接至dock的35脚,第二个舵机的信号线连接至34脚。(如果连接反,后面的动作会异常,交换两根线即可)

6. 下载烧录 人脸追踪云台的MaixPy固件:https://blog.sipeed.com/p/162.html

7. 上电,并在串口终端(115200 baudrate)敲入如下命令:

import PT
PT_test=PT.PT()

这时云台会回归初始位置。初次安装的舵机初始位置可能不对,此时需要断电,拆卸云台,并调整云台舵机至合适角度。

8. 重新上电, 并敲入如下命令:

import PT
PT_test=PT.PT()
PT_test.run()

此时可看到屏幕显示摄像头内容,并用红框圈出了人脸。(注意该例程仅支持追踪一个人脸)

移动头部,可以看到云台追踪你的人脸运动。演示视频在:

如果你想要设置云台PID参数的P参数(默认参数为,x轴-0.07, y轴-0.05), 使用以下命令:

       PT_test = PT.PT(P_x = xx,P_y = xx)

9. 确认一切运行正常,则可以使用扎带固定杜邦线:

10. 如果想开机启动人脸追踪程序,则可以在init.py中加入对应代码:

附录A (code of PT.py):


import machine
from fpioa_manager import *
global fm
class PT:
	def __init__(self,P_x = -0.07,P_y = -0.05,x_init_ang = 90,y_init_ang = 9
		global fm
		if x_init_ang > 160 or x_init_ang<30:
			print("x_init_ang value error")
			return None
		if y_init_ang > 160 or y_init_ang<30:
			print("y_init_ang value error")
			return None
		if P_x > 0 :
			print("x axis P_value(P_x) must <0")
			return None
		if P_y > 0 :
			print("y axis P_value(P_y) must <0")
			return None
		self.Px = P_x
		self.Py = P_y
		self.x_angle = x_init_ang
		self.y_angle = y_init_ang
		self.print_en = pr_en
		self.limite_value = limited_val				 
		self.cam=machine.ov2640();				      
		self.lcd=machine.st7789();				      
		self.demo=machine.demo_face_detect();			   
		self.demo.init();					       
		self.cam.init();						
		self.lcd.init();						
		fm.registered(34,fm.fpioa.TIMER1_TOGGLE1);		      
		fm.registered(35,fm.fpioa.TIMER1_TOGGLE2);		      
		self.y_axis=machine.pwm(machine.pwm.TIMER1,machine.pwm.CHANEEL0,
		self.x_axis=machine.pwm(machine.pwm.TIMER1,machine.pwm.CHANEEL1,
		self.x_axis.duty(7.5)					   
		self.y_axis.duty(7.5)					   
										
	def set_P(self,P_x = 0,P_y = 0):					
		if P_y >= 0 :						   
			print("y axis P_value(P_y) must <0")		    
			return False					    
		if P_x >= 0 :						   
			print("x axis P_value(P_x) must <0")		  
			return False					    
		self.Px = P_x						   
		self.Py = P_y						   
	def run(self):							  
		ex = 0.0							
		ey = 0.0							
		ux_angle = 0.0						  
		uy_angle = 0.0						  
		x = 0.0							 
		y = 0.0							 
		x1 = 0							  
		x2 = 0							  
		y1 = 0							  
		y2 = 0							  
		image = bytearray(320*240*2);				   
		while(1):						       
			self.cam.get_image(image);			      
			data = self.demo.process_image(image);		  
			self.lcd.draw_picture_default(image);		   
			x1=data[0];					     
			x2=data[1];					     
			y1=data[2];		
			y2=data[3];					     
										
			if x1 > 320 or x2 > 320 or y1 > 240 or y2 > 240 :       
				continue					
			x =(x2 - x1)/2+x1;				      
			y =(y2 - y1)/2+y1;				      
										
			ex = (160 - x);					 
			ey = (120 - y);					 
										
			ux_angle = ex  * self.Px				
			if abs(ex) < 5 : ux_angle = 0			   
			if ux_angle >= 15 : ux_angle = 15		       
			if ux_angle <= -15 : ux_angle = -15		     
										
			uy_angle = ey  * self.Py				
			if abs(ey) < 5 : ux_angle = 0			   
			if uy_angle >= self.limite_value : uy_angle = self.limit
			if uy_angle <= -self.limite_value : uy_angle = -self.lim
										
			self.x_angle = ux_angle + self.x_angle		  
			self.y_angle = uy_angle + self.y_angle       
			if self.x_angle * 0.055 >= 9.8 :			
			    self.x_angle = 180				  
			    ux_angle = 0					
			if self.x_angle * 0.055 <= 0.5 :			
			    self.x_angle = 0				    
			    ux_angle = 0					
			x_angle_duty =  (self.x_angle) * 0.055		  
			y_angle_duty =  (self.y_angle) * 0.055		  
										
			if self.print_en == 1 :				 
				print("x = ",x)				 
				print("y = ",y)				 
				print("ux_angle = ",ux_angle)		   
				print("uy_angle = ",uy_angle)		   
				print("x_angle = ",self.x_angle)		
				print("y_angle = ",self.y_angle)		
			self.x_axis.duty(2.5+x_angle_duty)		      
			self.y_axis.duty(2.5+y_angle_duty)
			

附录B (云台安装)

这部分在发货时已经完成,仅供DIYer参考

首先安装下半部分舵机
修剪舵机臂
准备安装底盘
固定两颗螺丝
将舵机插入底盘
安装上半部分舵机
剪去平台上所有凸起部分
平台上对应位置钻孔

发表评论