基於視覺的機械臂分揀(一)
最近做了一個基於視覺的五軸機械臂分揀的專案,功能基本完成,現在抽點時間出來做一個總結,算是自己做機械臂的一個記錄,在做這個專案之前,你需要先學習一下機械臂的基礎知識(運動學),以及攝像頭方面的知識和座標之間的一個變換的使用。
首先說一下我專案用到的材料:openmv攝像頭,SD卡,五軸機械臂,舵機驅動板,6v輸出的開關電源,以及部分架子,整體如下圖
首先我們來介紹一下機械臂,因為我的機械臂的驅動器用的是舵機,那麼我們先來介紹一下舵機。
舵機又稱之為伺服電機,伺服電機是一種可以控制旋轉角度或者是旋轉角速度的電機。一般舵機有90度舵機、180度舵機、270度舵機、360度舵機。
注意的一點:360度舵機,我們無法控制其旋轉特定的角度,只能控制其以特定的角速度旋轉。
舵機分類
舵機一般分為模擬舵機與數碼舵機兩種,他們的區別在與舵機內部有無mcu(微控制器),有微控制器控制的是數碼舵機,沒有微控制器控制的是模擬舵機。
比如傳統模擬舵機和數字比例舵機都稱之為模擬舵機,數碼舵機的電子電路中帶有mcu微控制器,跟模擬舵機相比,數碼舵機反應速度更快,無反應去範圍小,定位精度高,抗干擾性強。
注意區分數字舵機與數碼舵機之間的區別,數字比例舵機屬於模擬舵機,數碼舵機要貴一些,一般售價在兩百多,而普通的模擬舵機一般在十幾到幾十,買那種舵機看個人的經濟情況,如果剛剛入門,用低成本的模擬舵機就可以了。
接來下講講重點了,舵機的標定(如果舵機不進行標定的話,誤差會比較大,到時候抓取的時候,會偏離較大)
我用的是線性迴歸的方法,儘可能的修正舵機的角度誤差
第一步 做一個標定板
這個標定板的話要看大家的舵機角度,我的舵機都是180度,所以我做的標定板是這個樣子的,比較簡陋。
第二步
你應該知道當我們設定佔空比,舵機會轉到一個角度,而佔空比的取值範圍和驅動板有一定關係,我用的驅動板的解析度是12位的,對應的有效取值(0,4095)。
因為舵機的有效脈寬是0.5ms~2.5ms,脈寬對應的佔空比範圍是:
但是這個是理想情況,與實際上還是有一定誤差的。
標定程式如下
''' 測試機械臂的安裝 舵機角度標定,記錄佔空比與角度之間的對映關係 duty reference range 102 511''' from machine import Pin, I2C from easy_pca9685 import PCA9685 from configs import config i2c = I2C(scl=Pin(config['I2C_SCL']), sda=Pin(config['I2C_SDA'])) #,freq=config['I2C_FREQUENCY']) # 初始化PCA9685物件 pca9685 = PCA9685(i2c, config['PCA9685_ADDRESS']) pca9685.freq(50) # Joint:1 # degree: 180 # range: 0 - #------------------ # RADIUS | DUTY #------------------ # -pi/2 | 145 # -pi/4 | 230 # 0 | 307 # pi/4 | 400 # pi/2 | 468 pca9685.duty(0, 307) # Joint:2 * # degree: 180 #------------------ # RADIUS | DUTY #------------------ # -pi | 530 # -3pi/4 | 420 # -pi/2 | 332 # -pi/4 | 220 # 0 | 110 pca9685.duty(1, 327) # Joint:3 degree: 180* #------------------ # RADIUS | DUTY #------------------ # -pi/6 | 128 # 0 | 172 # pi / 4 | 230 # pi/2 | 305 # 3*pi/4 | 390 pca9685.duty(2, 175) # Joint:4 # degree: 180 # range: 0 - #------------------ # RADIUS | DUTY #------------------ # -pi/2 | 530 # -pi/4 | 425 # 0 | 318 # pi/4 | 208 # pi/2 | 110 pca9685.duty(3, 318) # Joint 5 #------------------ # RADIUS | DUTY #------------------ # -pi/2 | 505 # -pi/4 | 406 # 0 | 307 # pi/4 | 218 # pi/2 | 130 pca9685.duty(4, 307) # 40 OpenS # 80 Grab Box # Grapper #------------------ # WIDTH | DUTY #------------------ # 0 | 300 # 0.02 | 280 # 0.035 | 250 # 0.05 | 200 pca9685.duty(5, 280)
線性擬合程式如下
#-*- coding:utf_8 -*- import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression ''' data = [ [64,500], [74,600], [85,700], [93,800], [103,900], [112,1000], [120,1100], [128,1200], [135,1300], [144,1400], [154,1500], [160,1600], [168,1700], [172,1800], [186,1900], [195,2000], [203,2100], [210,2200], [222,2300], [230,2400], [240,2500]] ''' data = [ [-1.57,545], [-1.047,478], [-0.785,445], [-0.523,407], [0,333], [0.523,260], [0.785,222], [1.047,184], [1.57,124] ] data = np.array(data) angles = data[:,0] pws = data[:,1] plt.scatter(angles,pws) x = angles.reshape(len(angles), 1) y = pws.reshape(len(pws), 1) model = LinearRegression() model.fit(x,y) k = model.coef_[0][0] b = model.intercept_[0] print('擬合後的直線 y = {} * x + {}'.format(k,b))
標定結果如下
機械臂組裝時,我們標定一個舵機,安裝一個,安裝舵機儘量以0度或90度安裝,並且轉轉範圍要在你需要的範圍內。
到這裡機械臂部分基本安裝完成了。