引言
今天我們將深入了解myCobot320AIKit的機(jī)器識(shí)別算法是如何實(shí)現(xiàn)。
當(dāng)今社會(huì),隨著人工智能技術(shù)的不斷發(fā)展,機(jī)械臂的應(yīng)用越來越廣泛。作為一種能夠模擬人類手臂動(dòng)作的機(jī)器人,機(jī)械臂具有高效、精準(zhǔn)、靈活、安全等一系列優(yōu)點(diǎn)。在工業(yè)、物流、醫(yī)療、農(nóng)業(yè)等領(lǐng)域,機(jī)械臂已經(jīng)成為了許多自動(dòng)化生產(chǎn)線和系統(tǒng)中不可或缺的一部分。例如,在工廠生產(chǎn)線上的自動(dòng)化裝配、倉庫物流中的貨物搬運(yùn)、醫(yī)療手術(shù)中的輔助操作、農(nóng)業(yè)生產(chǎn)中的種植和收獲等場(chǎng)景中,機(jī)械臂都能夠發(fā)揮出其獨(dú)特的作用。本文將重點(diǎn)介紹機(jī)械臂結(jié)合視覺識(shí)別技術(shù)在myCobot320AIKit場(chǎng)景中的應(yīng)用,并探討機(jī)械臂視覺控制技術(shù)的優(yōu)勢(shì)和未來發(fā)展趨勢(shì)。
產(chǎn)品介紹
myCobot320M5Stack
myCobot320是一款面向用戶自主編程開發(fā)的六軸協(xié)作機(jī)器人,350MM的運(yùn)動(dòng)半徑,最高可達(dá)1000g的末端負(fù)載,0.5MM的重復(fù)定位精度;全面開放軟件控制接口,多種主流編程語言可以快速上手控制機(jī)械臂。
myCobotAdaptivegripper
mycobot自適應(yīng)夾爪,自適應(yīng)夾爪是一種機(jī)器人末端執(zhí)行器,用于抓取和搬運(yùn)各種形狀和尺寸的物體。自適應(yīng)夾爪具有很高的靈活性和適應(yīng)性,可以根據(jù)不同的物體形狀和尺寸自動(dòng)調(diào)整其夾緊力度和夾取位置。它可以結(jié)合機(jī)器視覺,根據(jù)視覺算法獲取到的信息調(diào)夾爪整夾緊力度和夾取位置。該夾爪能夠負(fù)載抓取1kg的物體,最大的夾距90mm,使用電力驅(qū)動(dòng)的一款?yuàn)A爪,使用起來相當(dāng)?shù)姆奖恪?/span>
以上就是我們使用到的設(shè),以及后續(xù)用到的myCobot320AIKit。
視覺算法
視覺算法是一種利用計(jì)算機(jī)圖像處理技術(shù)來實(shí)現(xiàn)對(duì)圖像和視頻進(jìn)行分析和理解的方法。它主要包括圖像預(yù)處理、特征提取、目標(biāo)檢測(cè)、姿態(tài)估計(jì)等幾個(gè)方面。
圖像預(yù)處理:
圖像預(yù)處理是對(duì)原始圖像進(jìn)行處理,使其更適合后續(xù)的分析和處理,常用的算法有圖像去噪算法、圖像增強(qiáng)算法、圖像分割算法。
特征點(diǎn)提取:
特征提取是從圖像中提取出關(guān)鍵特征,以便進(jìn)行進(jìn)一步的分析和處理,SIFT算法、SURF算法、ORB算法、HOG算法、LBP算法等.
目標(biāo)檢測(cè):
目標(biāo)檢測(cè)是在圖像中尋找某個(gè)特定的物體或目標(biāo),常用的算法,有Haar特征分類器、HOG特征+SVM分類器、FasterR-CNN、YOLO
姿態(tài)估計(jì):
姿態(tài)估計(jì)是通過識(shí)別物體的位置、角度等信息,來估計(jì)物體的姿態(tài),常用的算法有PnP算法、EPnP算法、迭代最近點(diǎn)算法(ICP)等。
舉例說明
顏色識(shí)別
這樣說的太抽象,我們實(shí)踐操作來演示這個(gè)步驟,如何從下面這張圖片中檢測(cè)到白色的高爾夫球。我們使用到的是OpenCV的機(jī)器視覺庫。
圖像處理:
首先我們得對(duì)圖片進(jìn)行預(yù)處理,方便計(jì)算機(jī)能夠快速的找到目標(biāo)物體,這一步的操作是將圖片轉(zhuǎn)化成灰度圖。
灰度圖:灰度圖是一種將彩色圖像轉(zhuǎn)換為黑白圖像的方法,它描述了圖像中每個(gè)像素的亮度或灰度級(jí)別。在灰度圖中,每個(gè)像素的值表示它的亮度,通常在0到255的范圍內(nèi),其中0表示黑色,255表示白色。中間的值表示不同程度的灰度。
import cv2
import numpy as np
image = cv2.imread('ball.jpg')
# turn to gray pic
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray', gray)
灰度處理后的圖片
二值化處理:
我們可以看到圖片中的高爾夫球跟背景是有很大的顏色差別的,可以通過顏色檢測(cè)出目標(biāo)物體。高爾夫球是白色,但是在光線的作用下,還有一些灰色的陰影部分。所以我們?cè)谠O(shè)置灰度圖的像素的時(shí)候得考慮進(jìn)去灰色的部分。
lower_white = np.array([180, 180, 180]) # Lower limit
upper_white = np.array([255, 255, 255]) # Upper limit
# find target object
mask = cv2.inRange(image, lower_white, upper_white)
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
這一個(gè)步驟就叫做二值化處理,將目標(biāo)物體從背景中分離出來.
過濾輪廓:
到二值化處理完后,我們需要設(shè)置一個(gè)過濾的輪廓面積的大小。如果不設(shè)置的話會(huì)出現(xiàn)下面圖片中的結(jié)果,會(huì)發(fā)現(xiàn)有很多地方都被選中,我們只想要最大的那一個(gè)就將小面積的區(qū)域給過濾
#filter
min_area = 100
filtered_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > min_area]
#draw border
for cnt in filtered_contours:
x, y, w, h = cv2.boundingRect(cnt)
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)
完整代碼:
import cv2
import numpy as np
image = cv2.imread('ball.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
lower_white = np.array([170, 170, 170])
upper_white = np.array([255, 255, 255])
mask = cv2.inRange(image, lower_white, upper_white)
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
min_area = 500
filtered_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > min_area]
for cnt in filtered_contours:
x, y, w, h = cv2.boundingRect(cnt)
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)
cv2.imshow('Object Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
與之不同的是,我們是想用機(jī)械臂來抓取物體,找到檢測(cè)的目標(biāo)物體還不夠,我們需要獲取到目標(biāo)物體得坐標(biāo)信息。
為了獲取被測(cè)目標(biāo)物體的坐標(biāo)信息,使用到了OpenCV的Arcuo碼,是一種常見的二維碼,用于相機(jī)標(biāo)定,姿態(tài)估計(jì)和相機(jī)跟蹤等計(jì)算機(jī)視覺任務(wù)。Arcuo碼每個(gè)都是由唯一的標(biāo)識(shí)符,通過在途中檢測(cè)和識(shí)別這些碼,可以推斷相機(jī)的位置,相機(jī)與碼之間的關(guān)系。
圖片中兩個(gè)唯一的二維碼,來固定裁剪圖片的大小,固定arcuo碼的位置,就能通過計(jì)算獲取到目標(biāo)物體。
這樣就能檢測(cè)出來目標(biāo)物體所在的位置了,返回x,y坐標(biāo)給到機(jī)械臂的坐標(biāo)系中,機(jī)械臂就可以進(jìn)行抓取。
具體的代碼
# get points of two aruco
def get_calculate_params(self, img):
"""
Get the center coordinates of two ArUco codes in the image
:param img: Image, in color image format.
:return: If two ArUco codes are detected, returns the coordinates of the centers of the two codes; otherwise returns None.
"""
# Convert the image to a gray image
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Detect ArUco marker.
corners, ids, rejectImaPoint = cv2.aruco.detectMarkers(
gray, self.aruco_dict, parameters=self.aruco_params
)
"""
Two Arucos must be present in the picture and in the same order.
There are two Arucos in the Corners, and each aruco contains the pixels of its four corners.
Determine the center of the aruco by the four corners of the aruco.
"""
if len(corners) > 0:
if ids is not None:
if len(corners) <= 1 or ids[0] == 1:
return None
x1 = x2 = y1 = y2 = 0
point_11, point_21, point_31, point_41 = corners[0][0]
x1, y1 = int((point_11[0] + point_21[0] + point_31[0] + point_41[0]) / 4.0), int(
(point_11[1] + point_21[1] + point_31[1] + point_41[1]) / 4.0)
point_1, point_2, point_3, point_4 = corners[1][0]
x2, y2 = int((point_1[0] + point_2[0] + point_3[0] + point_4[0]) / 4.0), int(
(point_1[1] + point_2[1] + point_3[1] + point_4[1]) / 4.0)
return x1, x2, y1, y2
return None
# set camera clipping parameters
def set_cut_params(self, x1, y1, x2, y2):
self.x1 = int(x1)
self.y1 = int(y1)
self.x2 = int(x2)
self.y2 = int(y2)
# set parameters to calculate the coords between cube and mycobot320
def set_params(self, c_x, c_y, ratio):
self.c_x = c_x
self.c_y = c_y
self.ratio = 320.0 / ratio
# calculate the coords between cube and mycobot320
def get_position(self, x, y):
return ((y - self.c_y) * self.ratio + self.camera_x), ((x - self.c_x) * self.ratio + self.camera_y)
YOLOv5識(shí)別
YOLO算法區(qū)別與OpenCV算法不同的點(diǎn)在于,YOLOv5算法是一種基于深度學(xué)習(xí)的目標(biāo)檢測(cè)算法,與OpenCV的傳統(tǒng)計(jì)算機(jī)視覺方法有所不同。雖然OpenCV也提供了目標(biāo)檢測(cè)功能,但它主要基于傳統(tǒng)的圖像處理和計(jì)算機(jī)視覺技術(shù)。Yolov5則是一種基于神經(jīng)網(wǎng)絡(luò)的深度學(xué)習(xí)模型,通過訓(xùn)練神經(jīng)網(wǎng)絡(luò)來實(shí)現(xiàn)目標(biāo)檢測(cè)。
神經(jīng)網(wǎng)絡(luò)就像是一個(gè)人的大腦一樣,外界不停的給他傳輸知識(shí),讓他去學(xué)習(xí),告訴他這個(gè)是蘋果,這個(gè)是草莓。通過不斷地訓(xùn)練學(xué)習(xí),給不同地蘋果地圖片,草莓地圖片給它認(rèn)識(shí)。之后他就在能一張圖片里面精準(zhǔn)地找到蘋果,草莓。
Code
# detect object
def post_process(self, input_image):
class_ids = []
confidences = []
boxes = []
blob = cv2.dnn.blobFromImage(input_image, 1 / 255, (self.INPUT_HEIGHT, self.INPUT_WIDTH), [0, 0, 0], 1,
crop=False)
# Sets the input to the network.
self.net.setInput(blob)
# Run the forward pass to get output of the output layers.
outputs = self.net.forward(self.net.getUnconnectedOutLayersNames())
rows = outputs[0].shape[1]
image_height, image_width = input_image.shape[:2]
x_factor = image_width / self.INPUT_WIDTH
y_factor = image_height / self.INPUT_HEIGHT
cx = 0
cy = 0
try:
for r in range(rows):
row = outputs[0][0][r]
confidence = row[4]
if confidence > self.CONFIDENCE_THRESHOLD:
classes_scores = row[5:]
class_id = np.argmax(classes_scores)
if (classes_scores[class_id] > self.SCORE_THRESHOLD):
confidences.append(confidence)
class_ids.append(class_id)
cx, cy, w, h = row[0], row[1], row[2], row[3]
left = int((cx - w / 2) * x_factor)
top = int((cy - h / 2) * y_factor)
width = int(w * x_factor)
height = int(h * y_factor)
box = np.array([left, top, width, height])
boxes.append(box)
'''Non-maximum suppression to obtain a standard box'''
indices = cv2.dnn.NMSBoxes(boxes, confidences, self.CONFIDENCE_THRESHOLD, self.NMS_THRESHOLD)
for i in indices:
box = boxes[i]
left = box[0]
top = box[1]
width = box[2]
height = box[3]
cv2.rectangle(input_image, (left, top), (left + width, top + height), self.BLUE,
3 * self.THICKNESS)
cx = left + (width) // 2
cy = top + (height) // 2
cv2.circle(input_image, (cx, cy), 5, self.BLUE, 10)
label = "{}:{:.2f}".format(self.classes[class_ids[i]], confidences[i])
# draw real_sx, real_sy, detect.color)
self.draw_label(input_image, label, left, top)
# cv2.imshow("nput_frame",input_image)
# return input_image
except Exception as e:
print(e)
exit(0)
if cx + cy > 0:
return cx, cy, input_image
else:
return None
YOLO開發(fā)者提供了開源代碼在GitHub上,如果有特殊地需求,可以自行設(shè)置訓(xùn)練的方式,達(dá)到效果。
除此之外,還有形狀識(shí)別,特征點(diǎn)識(shí)別,二維碼識(shí)別,形狀識(shí)別等這些功能都集合在myCobot320AIKit當(dāng)中。
myCobot320AIKit
這是一個(gè)適配機(jī)械臂myCobot320的人工智能套裝,將上述視覺算法跟機(jī)械臂相結(jié)合的一個(gè)應(yīng)用場(chǎng)景。myCobot320機(jī)械臂末端搭配著自適應(yīng)夾爪和吸泵,對(duì)物體進(jìn)行抓取/吸取。
識(shí)別西瓜進(jìn)行抓取
顏色木塊的識(shí)別,用吸泵進(jìn)行吸取
這是一套非常適合剛?cè)腴T學(xué)習(xí)人工智能,計(jì)算機(jī)視覺算法識(shí)別,機(jī)械臂原理的套裝。這個(gè)套裝是開源的,提供全部的代碼以供學(xué)習(xí)。
gif的python動(dòng)圖
如果你想要了解更多關(guān)于myCobot320AIKit的介紹,操作的使用,這邊給你提供之前發(fā)布過的一篇AIKit320的介紹。
總結(jié)
如果你有更好的想法關(guān)于人工智能套裝,你完全可以自己打造一個(gè)屬于自己機(jī)械臂的應(yīng)用場(chǎng)景,以AIKit為基礎(chǔ)大膽的展示你的想法。
機(jī)械臂視覺控制技術(shù)是一種應(yīng)用廣泛、發(fā)展迅速的技術(shù)。相比傳統(tǒng)的機(jī)械臂控制技術(shù),機(jī)械臂視覺控制技術(shù)具有高效、精準(zhǔn)、靈活等優(yōu)勢(shì),可以在工業(yè)生產(chǎn)、制造、物流等領(lǐng)域得到廣泛應(yīng)用。隨著人工智能、機(jī)器學(xué)習(xí)等技術(shù)的不斷發(fā)展,機(jī)械臂視覺控制技術(shù)將會(huì)有更廣泛的應(yīng)用場(chǎng)景。在未來的發(fā)展中,需要加強(qiáng)技術(shù)研發(fā)和創(chuàng)新,不斷提高技術(shù)水平和應(yīng)用能力。
審核編輯 黃宇
-
機(jī)器人
+關(guān)注
關(guān)注
211文章
28714瀏覽量
208727 -
AI
+關(guān)注
關(guān)注
87文章
31753瀏覽量
270538 -
人工智能
+關(guān)注
關(guān)注
1796文章
47818瀏覽量
240604 -
機(jī)械臂
+關(guān)注
關(guān)注
12文章
527瀏覽量
24744 -
視覺算法
+關(guān)注
關(guān)注
0文章
32瀏覽量
5620
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論