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