1. 程式人生 > 實用技巧 >基於視覺的機械臂分揀(一)

基於視覺的機械臂分揀(一)

  最近做了一個基於視覺的五軸機械臂分揀的專案,功能基本完成,現在抽點時間出來做一個總結,算是自己做機械臂的一個記錄,在做這個專案之前,你需要先學習一下機械臂的基礎知識(運動學),以及攝像頭方面的知識和座標之間的一個變換的使用。

首先說一下我專案用到的材料: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度安裝,並且轉轉範圍要在你需要的範圍內。

到這裡機械臂部分基本安裝完成了。