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

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

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

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章