原理講解
根據(jù)目標(biāo)物塊的特征,首先通過機(jī)械結(jié)構(gòu)使目標(biāo)物塊每次被識別時,目標(biāo)物塊都出現(xiàn)在攝像頭的固定角度,固定距離。這樣就保證了攝像頭每次識別目標(biāo)物塊時,目標(biāo)物塊都會出現(xiàn)在拍攝照片的固定像素范圍。
其次,根據(jù)目標(biāo)物塊的特點(diǎn)(物塊之間只有顏色差異)只要完成對目標(biāo)物塊出現(xiàn)范圍的像素點(diǎn)顏色的識別,就能判斷出具體是哪一個目標(biāo)物塊。所以采用了對特定區(qū)域像素點(diǎn)的顏色識別算法。從演示視頻中可以看出,每次抓取物塊之前,都會先通過U型推手把目標(biāo)物塊先固定在車身正前方的U型推手內(nèi)如下圖。
此時補(bǔ)光燈進(jìn)行補(bǔ)光,以減少環(huán)境光對識別結(jié)果的影響。從圖片也可以看出,識別環(huán)節(jié),攝像頭是正對目標(biāo)物塊,而且距離很近,這個設(shè)計(jì)就保證了攝像頭拍攝到的大部分像素點(diǎn)都被目標(biāo)物塊的顏色所填滿,增加了識別面積。
可以看到,攝像頭拍攝到的圖片,目標(biāo)物塊幾乎填滿了整個圖片。接下來就通過旭日X3派進(jìn)行顏色識別,使用旭日X3派借助OpenCV,通過HSV顏色模型,實(shí)現(xiàn)對目標(biāo)物塊的顏色識別。
顏色識別
- 導(dǎo)入需要用的庫
import cv2 as cv import time import numpy as np import sys import os import serial import serial.tools.list_ports
os.system('ls /dev/tty[a-zA-Z]*') uart_dev= '/dev/ttyS3' #定義串口端口 baudrate = 115200 #波特率 ser = serial.Serial(uart_dev, int(baudrate), timeout=1)
- 選擇8號相機(jī)用作視頻獲取
cap_follow = cv.VideoCapture(8)
剪切獲取到的圖像,只顯示和處理一正中小塊
ret, frame = cap_color.read() #cv.imshow("frame", frame)#代碼在電腦上測試時候用于觀察,放在X3派上要注釋掉 ROI = frame[50:150, 50:200]#get useful ROI
獲取一幀圖片并進(jìn)行裁剪,只保留小部分目標(biāo)物塊的像素點(diǎn),這有兩個原因:
(1)獲取到的一整幀圖片周圍有非目標(biāo)物塊的周圍環(huán)境,如果納入計(jì)算過程的話會影響到最終識別結(jié)果
(2)縮小圖片體積,可以減少CPU負(fù)載,提升運(yùn)算速度
- 把截取后的圖片轉(zhuǎn)化成HSV顏色模型,并創(chuàng)建三個數(shù)組分別用于存放轉(zhuǎn)化后HSV模型圖片中每一個像素點(diǎn)的H、S、V通道的值
hsv = cv.cvtColor(ROI, cv.COLOR_BGR2HSV) #cv.imshow("hsv", hsv) color_h = [] color_s = [] color_v = []
- 把轉(zhuǎn)化為HSV模型的圖片中每一個像素點(diǎn)都取出來,相加以后取平均值(取平均值是為了減少噪點(diǎn)對最后結(jié)果的影響。再把取平均值后的H、S、V三個通道的值賦給新的變量用于最后的比較)
color_h.append(np.mean(hsv[:,:,0])) color_s.append(np.mean(hsv[:,:,1])) color_v.append(np.mean(hsv[:,:,2])) h = color_h[0] s = color_s[0] v = color_v[0]
- 比較最終值和顏色范圍,確定識別結(jié)果,并通過串口把結(jié)果發(fā)送給下位機(jī)
if 35 <= h <= 77 and 43 <= s <= 255 and 46 <= v <= 255: print('green') ser.write(b'g') #red_h 10 --> 20 elif 0 <= h <= 20 and 43 <= s <= 255 and 46 <= v <= 255: print('red') ser.write(b'r') elif 156 <= h <= 180 and 43 <= s <= 255 and 46 <= v <= 255: print('red') elif 100 <= h <= 124 and 43 <= s <= 255 and 46 <= v <= 255: print('blue') ser.write(b'b') elif 0 <= h <= 180 and 0 <= s <= 255 and 0 <= v <= 46: print('black') ser.write(b'B') #white_v 221 --> 200 elif 0 <= h <= 180 and 0 <= s <= 30 and 180 <= v <= 255: print('white') ser.write(b'w') else: print('I do not know') ser.write(b'e')
解釋一下串口發(fā)送字符的含義:
g——green
r——red
b——blue
B——black
w——write
e——error
(最后'e'一個表示識別的顏色不在既定范圍內(nèi))
為什么選用使用HSV顏色模型而不是用RGB?
RGB 是我們接觸最多的顏色空間,由三個通道表示一幅圖像,分別為紅色(R),綠色(G)和藍(lán)色(B)。這三種顏色的不同組合可以形成幾乎所有的其他顏色。但是人眼對于這三種顏色分量的敏感程度是不一樣的,在單色中,人眼對紅色最不敏感,藍(lán)色最敏感,所以 RGB 顏色空間是一種均勻性較差的顏色空間。如果顏色的相似性直接用歐氏距離來度量,其結(jié)果與人眼視覺會有較大的偏差。對于某一種顏色,我們很難推測出較為精確的三個分量數(shù)值來表示。所以,RGB 顏色空間適合于顯示系統(tǒng),卻并不適合于圖像處理。
在圖像處理中使用較多的是 HSV 顏色空間,它比 RGB 更接近人們對彩色的感知經(jīng)驗(yàn),可非常直觀地表達(dá)顏色的色調(diào)、鮮艷程度和明暗程度,方便進(jìn)行顏色的對比(詳細(xì)解釋可參見地平線開發(fā)者社區(qū)。
在 HSV 顏色空間下,比 BGR 更容易跟蹤某種顏色的物體,常用于分割指定顏色的物體。
HSV 表達(dá)彩色圖像的方式由三個部分組成:Hue(色調(diào)、色相)、Saturation(飽和度、色彩純凈度)、Value(明度)。用下圖圓柱體來表示 HSV 顏色空間,圓柱體的橫截面可以看做是一個極坐標(biāo)系 ,H 用極坐標(biāo)的極角表示,S 用極坐標(biāo)的極軸長度表示,V 用圓柱中軸的高度表示。
Hue 用角度度量,取值范圍為0~360°,表示色彩信息,即所處的光譜顏色的位置,表示如下:
顏色圓環(huán)上所有的顏色都是光譜上的顏色,從紅色開始按逆時針方向旋轉(zhuǎn),Hue=0 表示紅色,Hue=120 表示綠色,Hue=240 表示藍(lán)色等等。在 GRB中 顏色由三個值共同決定,比如黃色為即(255,255,0);在HSV中,黃色只由一個值決定,Hue=60即可。HSV 圓柱體的半邊橫截面(Hue=60):
其中水平方向表示飽和度,飽和度表示顏色接近光譜色的程度。飽和度越高,說明顏色越深,越接近光譜色飽和度越低,說明顏色越淺,越接近白色。飽和度為0表示純白色。取值范圍為0~100%,值越大,顏色越飽和。
豎直方向表示明度,決定顏色空間中顏色的明暗程度,明度越高,表示顏色越明亮,范圍是 0-100%。明度為0表示純黑色(此時顏色最暗)。
動作實(shí)現(xiàn)
下位機(jī)負(fù)責(zé)所有機(jī)器人動作的控制,包括直線行駛、轉(zhuǎn)彎、轉(zhuǎn)圈、目標(biāo)物塊抓取、放置等等,此處先講解目標(biāo)物塊抓取動作部分。先看機(jī)械設(shè)計(jì),機(jī)器人前方的圓柱形帶傳動可收納式抓手是靠兩個原動件提供動力的。
舵機(jī)提供動力控制抓手的開合,用于夾取目標(biāo)物塊和釋放目標(biāo)物塊;42步進(jìn)電機(jī)控制傳送帶從而控制抓手,用于使抓手升降。
從視頻可以看出,每抓取一個物塊需要五個動作:
(1)抓手下降到一半高度;
(2)抓手張開;
(3)抓手下降到最低點(diǎn);
(4)抓手閉合,抓取物塊;
(5)抓手上升到最高點(diǎn)。
代碼講解
由于初步設(shè)計(jì)時時間較緊,故選擇Arduino該平臺作為主控。學(xué)習(xí)舵機(jī)、步進(jìn)電機(jī)控制,有很多種主控方案可以選擇,大家可按需選擇。代碼主要部分:
- 導(dǎo)入需要用到的庫、創(chuàng)建舵機(jī)、步進(jìn)電機(jī)對象
#include #include AccelStepper stepperArm(1,armstepPin,armdirPin); Servo armServo;
- 在 setup函數(shù)里面對舵機(jī)、步進(jìn)電機(jī)進(jìn)行初始化
stepperArm.setMaxSpeed(1200.0); stepperArm.setAcceleration(400.0); armServo.attach(8); armServo.write(servoMid);
- 抓取動作控制(五個步驟)
void Get(){ //抓手下降一半 if (getTurns == 0){ stepperArm.moveTo (armStepperHigh1); //Serial.println("我是抓手,我現(xiàn)在在下降"); if (stepperArm.currentPosition() == armStepperHigh1){ getTurns ++; } } //抓手張開一點(diǎn) if ( getTurns == 1){ for (armAngle = servoMid; armAngle <= servoEnd; armAngle ++) { armServo.write(armAngle); delay(5); } getTurns ++; } //抓手下降到最低端 if (getTurns == 2){ stepperArm.moveTo (armStepperHigh2); if (stepperArm.currentPosition() == armStepperHigh2){ getTurns ++; } } //抓取物塊 if ( getTurns == 3){ //delay(2000); for (armAngle = servoEnd; armAngle >= servoMid; armAngle --) { armServo.write(armAngle); delay(5); } getTurns ++; } //上升抓手到最高位置 if (getTurns == 4){ stepperArm.moveTo (armStepperHigh0); if(stepperArm.currentPosition() == armStepperHigh0){ getTurns = 0; ifOverGet = 1; } } }
原作者:衣柜旁的小明
原鏈接:本文轉(zhuǎn)自地平線開發(fā)者社區(qū)
-
嵌入式
+關(guān)注
關(guān)注
5143文章
19570瀏覽量
315678 -
機(jī)器人
+關(guān)注
關(guān)注
213文章
29559瀏覽量
211907 -
人工智能
+關(guān)注
關(guān)注
1804文章
48829瀏覽量
247292
發(fā)布評論請先 登錄
詳細(xì)介紹機(jī)場智能指路機(jī)器人的工作原理
【「# ROS 2智能機(jī)器人開發(fā)實(shí)踐」閱讀體驗(yàn)】+內(nèi)容初識
復(fù)合機(jī)器人抓取精度的影響因素及提升策略
名單公布!【書籍評測活動NO.58】ROS 2智能機(jī)器人開發(fā)實(shí)踐
海康機(jī)器人F4系列:搬運(yùn)多面手,拓寬應(yīng)用場景
【「具身智能機(jī)器人系統(tǒng)」閱讀體驗(yàn)】2.具身智能機(jī)器人的基礎(chǔ)模塊
【「具身智能機(jī)器人系統(tǒng)」閱讀體驗(yàn)】2.具身智能機(jī)器人大模型
【「具身智能機(jī)器人系統(tǒng)」閱讀體驗(yàn)】1.初步理解具身智能
【「具身智能機(jī)器人系統(tǒng)」閱讀體驗(yàn)】+初品的體驗(yàn)
agv搬運(yùn)機(jī)器人是怎么實(shí)現(xiàn)無人搬運(yùn)的?

搬運(yùn)碼垛機(jī)器人的特性和運(yùn)用方式
智能移動機(jī)器人

智能目標(biāo)顏色識別抓取丨國產(chǎn)Cortex-A55人工智能實(shí)驗(yàn)箱機(jī)械臂案例分享

復(fù)合機(jī)器人倉庫搬運(yùn)方案

AGV搬運(yùn)機(jī)器人:智能物流的得力助手

評論