看過鋼鐵俠的人都知道里面的賈維斯在幫助托尼斯塔克制作裝備的時候,有許多械臂提供幫助制作裝備,讓裝備的制作提高了效率。賈維斯是一個超級強大的人工智能系統,有了它的幫助如魚的水。我腦海中浮現出來一個想法,讓機械臂末端實現人臉識別和跟蹤的功能,也有看到有人實現了機械臂末端物體的動態跟蹤,看著這個項目好像很容易實現,讓我來試一試吧!
項目設備
本次項目需要的設備在下表格里。
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)
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 當中換算坐標的時候出現了一些問題,短時間沒有辦法能夠解決,決定去查詢更多的資料再來跟大家分享。
總結
這次記錄的項目到這里就結束了,因為一些技術上的原因,手眼標定涉及的知識面比較廣,需要查詢許多資料和尋求多方面的幫助。待我歸來之時,我的項目必將成功!如果你喜歡這篇文章的話,點贊留言支持我!
我們下次再見,很快就會回來的。
審核編輯黃昊宇
-
人臉識別
+關注
關注
76文章
4011瀏覽量
81860 -
機械臂
+關注
關注
12文章
513瀏覽量
24555
發布評論請先 登錄
相關推薦
評論