看过钢铁侠的人都知道里面的贾维斯在帮助托尼斯塔克制作装备的时候,有许多械臂提供帮助制作装备,让装备的制作提高了效率。贾维斯是一个超级强大的人工智能系统,有了它的帮助如鱼的水。我脑海中浮现出来一个想法,让机械臂末端实现人脸识别和跟踪的功能,也有看到有人实现了机械臂末端物体的动态跟踪,看着这个项目好像很容易实现,让我来试一试吧!
项目设备
本次项目需要的设备在下表格里。
mechArm 270-Pi
这是一款大象机器人生产的小六轴机械臂,以树莓派4B为微处理器,ESP32为辅助控制,结构是中心对称结构(仿工业结构)。mechArm 270-Pi本体重量1kg, 负载250g,工作半径270mm,设计紧凑便携,小巧但功能强大,操作简单,能与人协同、安全工作。
mechArm 的资料丰富,提供了许多python的api接口可以方便提供给我来进行使用。它的末端的接口规格都可以从官网获取到资料,可以使用3d打印技术设计一款合适的设备。
计算机视觉
USB无畸变镜头
这里是摄像头的参数,主要是用于人脸识别。
项目流程介绍
整体项目的流程图
这个项目的流程如下图所示,最主要的是解决OpenCV的人脸识别功能和机械臂手眼标定是选择eye in hand 还是eye to hand。
接下来我将简单介绍一下这两个功能有什么作用在项目当中。
OpenCV-人脸识别
OpenCV的全名是Open Source Computer Vision Library,是一个跨平台的电脑视觉库。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
人脸识别即程序对输入的图像进行判别是否有人脸,并识别出有人脸的图像所对应的人。我们常说的人脸识别一般包含了人脸检测和人脸识别两部分。
在人脸检测中,其主要任务是构造能够区分包含人脸实例和不包含人脸实例的分类器。
opencv中提供了三种训练好的级联分类器。级联分类器顾名思义即通过不同的特征进行一步步筛选,最终得出所属的分类,它将一个复杂的分类问题拆解为一个个简单的分类问题,随着级联条件的判断,能够一步步筛出大量的负样本,极大的提升了后面分类的速度。
opencv人脸识别库是开源的,还能够支持python的接口,可以直接进行调用。
这里是分类器的下载地址:http://face-rec.org/databases/
手眼标定
手眼标定实际上就是为了让机械臂知道相机拍出来的物体相对于机械臂在什么位置,换一种说法就是建立相机坐标系与机械臂坐标系的映射关系。
有两种方式
一种是eye to hand,眼在手外面,就是将相机固定在机械臂外面。
由于眼在手外标定时,Base坐标系和Cam坐标系的位置是固定的,因此眼在手外主要是求这两个坐标系的关系。
另一种是eye in hand,眼在手上,就是将相机固定在机械臂末端。
相机坐标系和工具坐标系的位置是相对不变的。因此,标定的就是cam坐标系和tool坐标系的关系。
项目开始
python对mechArm的控制
pymycobot 是用python控制mechArm的库,可以直接调用里面的方法。
介绍几个主要的方法:
release_all_servos()
release all robot arms
get_angles()
get the degree of all joints.
send_angle(id, degree, speed)
Send one degree of joint to robot arm.
send_angles(degrees, speed)
Send the degrees of all joints to robot arm.
degrees: a list of degree value(List[float]), length 6 or 4.
speed: (int) 0 ~ 100
from pymycobot.mycobot import MyCobot
import time
mc = MyCobot('/dev/ttyAMA0',1000000)
time.sleep(4)
for count in range(2):
mc.send_angles([0,0,0,0,0,0],70)
time.sleep(2)
mc.send_angles([0,38.32,(-6.76),10.01,99.22,(-19.77)],70)
time.sleep(2)
mc.send_angles([(-13.18),(-22.14),17.66,147.12,99.22,(-19.77)],70)
time.sleep(2)
mc.send_angles([98.43,(-2.98),(-95.88),161.01,(-1.23),(-19.77)],70)
time.sleep(2)
print(mc.get_angles())
print(mc.get_coords())
mc.send_angles([0,0,0,0,0,0],70)
视频演示
https://www.bilibili.com/video/BV1VW4y1M7Gv/?vd_source=dd6f4a47482e4e14e33125a26c155808
mechArm Pi还是可以很轻易上手的一款机械臂操控性很强。
接下来我们来研究一下如何实现人脸识别功能。
openCV 人脸识别的代码
在前面我介绍到了分类器,让我来演示一下大概的流程是怎么样的。
执行一下代码来看一下效果
import cv2
import matplotlib.pyplot as plt
import time
def video_info():
# Loading classifiers
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# Input video stream
cap = cv2.VideoCapture(0)
# To use a video file as input
#cap = cv2.VideoCapture('demo.mp4')
while True:
_, img = cap.read()
# Conversion to greyscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Detecting faces
faces = face_cascade.detectMultiScale(gray, 1.1, 4)
# Drawing the outline
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
center_x = (x+w-x)//2+x
center_y = (y+h-y)//2+y
cv2.circle(img,(center_x,center_y),10,(0,255,255),2)
# Display effects
cv2.imshow('img', img)
k = cv2.waitKey(30) & 0xff
if k==27:
break
cap.release()
不得不说,opencv锻炼的分类器是十分强大的!很快速的就识别出来了人脸。
就这样我完成了前两项技术的问题:机械臂的基础操作和人脸识别功能的复现。手眼标定在查询资料的时候遇到了困难,在eye in hand 当中换算坐标的时候出现了一些问题,短时间没有办法能够解决,决定去查询更多的资料再来跟大家分享。
总结
这次记录的项目到这里就结束了,因为一些技术上的原因,手眼标定涉及的知识面比较广,需要查询许多资料和寻求多方面的帮助。待我归来之时,我的项目必将成功!如果你喜欢这篇文章的话,点赞留言支持我!
我们下次再见,很快就会回来的。