使用树莓派4b和OpenCV做机械臂夹取
文章目錄
- 前言
- 一、基本功能
- 二、主要代碼
- 1.圖像處理部分
- 2.舵機(jī)驅(qū)動(dòng)部分
前言
?本人第一次在csdn上發(fā)技術(shù)類文章,原諒在此多說一些廢話。項(xiàng)目是自己的畢設(shè),比較簡單還望不要見笑,如果發(fā)現(xiàn)有什么問題歡迎指正。發(fā)文章的目的一方面是希望用自己微薄的能力的幫助有需要的人,另一方面想要記錄下自己一步一步走過的痕跡,我不知道自己還能走多久,但只要我還在做這些東西就會(huì)記錄下來,一起努力前進(jìn)吧。
一、基本功能
主控采用的是樹莓派4b,機(jī)械臂采用的是社團(tuán)現(xiàn)成的幻爾機(jī)械臂,因?yàn)橛貌坏搅杂啥人园研D(zhuǎn)機(jī)械手的舵機(jī)拆了下來,攝像頭用的是淘寶買的樹莓派攝像頭20塊左右,還買了支架和補(bǔ)光燈用來架設(shè)攝像頭,夾取平臺(tái)是自己建模用3d打印機(jī)打出來的。
基本功能就是在有物塊在平臺(tái)上時(shí)機(jī)械臂會(huì)自動(dòng)夾取物體放置在指定位置,主要用到的就是OpenCV的一些庫函數(shù)和像素點(diǎn)坐標(biāo)轉(zhuǎn)換一些簡單數(shù)學(xué)運(yùn)算以及舵機(jī)的控制。
二、主要代碼
在寫代碼實(shí)現(xiàn)功能之前要先安裝好樹莓派的一些庫,有以下幾個(gè)東西需要安裝好或調(diào)試好,安裝好OpenCV的庫(當(dāng)時(shí)我搞了好長時(shí)間),開啟攝像頭功能,要能用攝像頭顯示視頻,熟悉樹莓派的一些基本使用,像是gpio,i2c之類的。
1.圖像處理部分
寫代碼之前一些庫的引用
import RPi.GPIO as GPIO import cv2 as cv import time import math import numpy as np具體代碼,其中攝像頭的畫面進(jìn)行了一些截取,只顯示放置平臺(tái)部分方便后續(xù)處理,得到的圖片坐標(biāo)是物塊在截取圖片中以左上角為起點(diǎn)的像素點(diǎn)坐標(biāo),我采用的的等比縮放的方法得到實(shí)際坐標(biāo),即畫面尺寸和實(shí)際尺寸之間有一定比例,后續(xù)要想得到機(jī)械臂坐標(biāo)系坐標(biāo)還要進(jìn)行進(jìn)一步轉(zhuǎn)化。
我的像素點(diǎn)坐標(biāo)獲取借鑒了另一位博主的文章OpenCV-Python學(xué)習(xí)筆記(使用opencv識(shí)別物體的位置,找到中心點(diǎn)位)_pd很不專業(yè)的博客-CSDN博客_opencv識(shí)別物體并輸出坐標(biāo)點(diǎn)
?#獲取視頻物體坐標(biāo)cap = cv.VideoCapture(0)#選擇攝像頭ret,frame = cap.read()zero = frame[115:365,195:445]#截取畫面尺寸cv.imwrite("tupian.jpg",zero)#存儲(chǔ)圖片zero0 = cv.imread("/home/pi/Desktop/tupian.jpg",1)zero1 = cv.GaussianBlur(zero0,(5,5),0)#高斯濾波zero2 = cv.cvtColor(zero1,cv.COLOR_BGR2GRAY)#顏色空間轉(zhuǎn)換ret,zero3 = cv.threshold(zero2,110,255,cv.THRESH_BINARY_INV)#設(shè)置閾值,二值化處理kai0 = np.ones((5,5),np.uint8)zero4 = cv.morphologyEx(zero3,cv.MORPH_OPEN,kai0,iterations=3)#開運(yùn)算#判斷是否有物體if(np.mean(zero4)>0):print("object")contours,hierarchy = cv.findContours(zero4,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)#輪廓擬合cnt0 = contours[0]rect0 = cv. minAreaRect(cnt0)box0 = cv.boxPoints(rect0)box0 = np.int0(box0)zero5 = cv.drawContours(zero0,[box0],0,(0,0,255),3)#畫矩形框M0 = cv.moments(cnt0)# 計(jì)算第一條輪廓的各階矩,字典形式center_x0 = int(M0['m10']/M0['m00'])center_y0 = int(M0['m01']/M0['m00'])cv. circle(zero0,(center_x0,center_y0),7,128,-1)#繪制中心點(diǎn)str0 = '(' +str(center_x0)+',' +str(center_y0)+')'#把坐標(biāo)轉(zhuǎn)化為字符串cv.putText(zero0,str0,(center_x0-50,center_y0+40),cv.FONT_HERSHEY_SIMPLEX,1,(255,0,0),2,cv.LINE_AA)#坐標(biāo)點(diǎn)位繪制在圖片上print(center_x0,center_y0)#輸出像素點(diǎn)坐標(biāo)#沒有物體輸出else:print("No object")#關(guān)閉攝像頭cap.release()cv.destroyAllWindows()?中間的轉(zhuǎn)動(dòng)角度計(jì)算與每個(gè)人的機(jī)械臂夾取方式與運(yùn)動(dòng)軌跡規(guī)劃有關(guān),且本人并沒有學(xué)過機(jī)器人運(yùn)動(dòng)學(xué)相關(guān)知識(shí)這部分代碼就不展示了,當(dāng)時(shí)看了另一篇博客從中得到啟發(fā)延伸到自己5自由度的機(jī)械臂。
機(jī)械臂轉(zhuǎn)動(dòng)角度計(jì)算_AI視覺網(wǎng)奇的博客-CSDN博客_機(jī)械臂關(guān)節(jié)角度
2.舵機(jī)控制部分
原先的想法是用舵機(jī)驅(qū)動(dòng)板PCA9685來驅(qū)動(dòng)舵機(jī),好處就是只需要用i2c通信就可以輸出16路可控pwm,但由于在樹莓派上下載的庫始終效果不好,而且源碼不好修改最終放棄了,值得一提的是因?yàn)椴僮鞑划?dāng)還把樹莓派的電源芯片燒了,好在最后修好了。
PCA9685
?最后只能用樹莓派引腳輸出PWM和外接穩(wěn)壓電源來控制舵機(jī),發(fā)送完pwm之后要進(jìn)行消抖要不然數(shù)字舵機(jī)會(huì)不停抖動(dòng),由于代碼過長且許多都是重復(fù)只有參數(shù)不同,所以只展示一部分。
GPIO.setmode(GPIO.BOARD)#GPIO采用BOAED模式 GPIO.setwarnings(False)#清除報(bào)錯(cuò) #設(shè)置引腳 pins_0 = 12 #GPIO.1云臺(tái) pins_1 = 16 #GPIO.4下關(guān)節(jié) pins_2 = 18 #GPIO.5上關(guān)節(jié) pins_3 = 22 #GPIO.6調(diào)整關(guān)節(jié) pins_4 = 32 #GPIO.26夾取關(guān)節(jié)#引腳為輸出模式 GPIO.setup(pins_0,GPIO.OUT) GPIO.setup(pins_1,GPIO.OUT) GPIO.setup(pins_2,GPIO.OUT) GPIO.setup(pins_3,GPIO.OUT) GPIO.setup(pins_4,GPIO.OUT)#設(shè)置PWM頻率為50Hz pwm0 = GPIO.PWM(pins_0,50) pwm1 = GPIO.PWM(pins_1,50) pwm2 = GPIO.PWM(pins_2,50) pwm3 = GPIO.PWM(pins_3,50) pwm4 = GPIO.PWM(pins_4,50)#初始/無動(dòng)作姿態(tài) pwm0.start(6.55) pwm1.start(10.23) pwm2.start(4.077) pwm3.start(3.56) pwm4.start(5) time.sleep(0.2)#消抖 pwm0.ChangeDutyCycle(0) pwm1.ChangeDutyCycle(0) pwm2.ChangeDutyCycle(0) pwm4.ChangeDutyCycle(0) time.sleep(1)?實(shí)物圖
還有許多功能可以改進(jìn),譬如多顏色識(shí)別等等,由于后續(xù)還有考試需要準(zhǔn)備所以暫時(shí)只能做到這里。
總結(jié)
以上是生活随笔為你收集整理的使用树莓派4b和OpenCV做机械臂夹取的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对vue服务端渲染的理解以及其使用场景
- 下一篇: 应用在hiapk安卓市场分类排行榜中不显