本文重點介紹了一款專為機器人教育而設(shè)計的具有動態(tài)跟蹤功能的創(chuàng)客友好型機械臂
硬件組件
M5Stack ESP32 Basic Core IoT Development Kit
Raspberry Pi 4 Model B
Espressif ESP32S
Elephant Robotics myCobot 320 m5
引言
今天文章的重點是使用myCobot 320機械臂重新創(chuàng)建一個視覺跟蹤案例,該案例由Elephant Robotics作為官方解決方案提供,使用戶能夠快速上手并逐步跟進,以查看如何重現(xiàn)結(jié)果并識別任何潛在問題。 設(shè)備
myCobot 320 M5Stack
myCobot 320 M5Stack是six-degree-of-freedom的機械臂,工作半徑為350mm,末端執(zhí)行器最大有效載荷為1kg,支持各種主流編程語言和操作系統(tǒng),本文主要使用Python來控制機械臂。
從圖像中我們可以看到,該裝置由一個 myCobot 機械臂和一個用于捕獲圖像數(shù)據(jù)的相機組成。機械臂的具體參數(shù)如下。

照相機
你不需要使用和我一樣的相機;關(guān)鍵是它可以安裝在機械臂的末端執(zhí)行器上,并且可以通過USB電纜獲取圖像數(shù)據(jù)。對于這個設(shè)置,我使用了myCobot Pro Camera Flange,這是大象機器人專門為myCobot改裝的末端執(zhí)行器相機。

環(huán)境設(shè)置
●操作系統(tǒng):Windows 10
●編程語言:Python
●IDE:PyCharm
●庫:Numpy、OpenCV、STag、pymycobot、json、time(推薦這些庫的最新版本)
知識介紹
openCV
OpenCV(開源計算機視覺庫)是一個用于計算機視覺和機器學習的開源軟件庫,廣泛應(yīng)用于圖像處理、視頻分析和目標檢測。OpenCV為開發(fā)人員提供了一套豐富的工具,用于處理圖像數(shù)據(jù)和實現(xiàn)復雜的視覺算法。在機械臂的背景下,OpenCV可用于視覺跟蹤,其中相機實時捕捉目標,分析和提取目標的位置和運動軌跡。然后機械臂根據(jù)這些信息調(diào)整其運動,實現(xiàn)精確的對象抓取和操縱。這種視覺跟蹤技術(shù)廣泛應(yīng)用于自動化、工業(yè)機器人和智能制造。
Stag
STag標記是一種二維條碼系統(tǒng),廣泛用于機器視覺中的標記檢測和空間定位。這些標記由黑白圖案組成,通常呈方形,中心有獨特的二進制圖案,使它們能夠被計算機視覺系統(tǒng)快速準確地識別。
手眼校準-手眼配置(Hand-Eye Calibration – Eye-in-Hand Configuration)
手眼校準涉及確定相機(眼睛)和機械臂末端執(zhí)行器(手)之間的精確空間和方向關(guān)系。在這種情況下,我們主要討論的是“手眼”場景,它指的是本項目中遇到的情況。手眼校準對于建立相機相對于機械臂末端執(zhí)行器的定位方式至關(guān)重要。在手眼配置中,相機安裝在機械臂末端執(zhí)行器上,因此視野和相機角度隨著機械臂的移動而變化。目標是計算相機坐標系和機械臂末端執(zhí)行器坐標系之間的變換。這使得機器人能夠通過相機感知周圍環(huán)境,并執(zhí)行目標跟蹤和精確抓取等任務(wù)。

眼校準步驟
1.相機姿態(tài)變化:在手眼配置中,相機的視角隨著機械臂的每次移動而變化。通過移動機械臂,可以捕捉校準對象的多個視點,從而產(chǎn)生相機不同姿態(tài)的數(shù)據(jù)。
2.數(shù)據(jù)收集:機械臂被移動到幾個不同的位置,每次,它捕獲校準板或特定物體的圖像。末端執(zhí)行器的姿態(tài)(由編碼器提供)和物體的姿態(tài)(通過圖像處理計算)被記錄下來。
3、攝像機與末端執(zhí)行器關(guān)系的求解:利用最小二乘等算法,計算攝像機與末端執(zhí)行器之間的變換矩陣,建立它們之間的坐標變換關(guān)系。
用代碼實現(xiàn)該過程主要分為兩部分:校準過程和跟蹤運動模塊。
校準過程
1.坐標轉(zhuǎn)換
在手眼標定過程中,涉及不同坐標系之間的變換。關(guān)鍵坐標系如下:
●世界幀(W):通常固定在環(huán)境中的參考幀。
●底架(B):固定在機械臂底座的框架,用于表示手臂的姿勢。
●末端執(zhí)行器框架(E):當相機安裝在機械臂末端執(zhí)行器上時,該框架代表手臂末端執(zhí)行器的姿勢。
●相機框架(C):固定在相機上的框架,用于描述相機看到的物體的姿勢。
在手眼標定中,目標是解決攝像機框架和機械臂末端執(zhí)行器框架之間的變換矩陣。這使得攝像機檢測到的物體的姿態(tài)被轉(zhuǎn)換成機械臂末端執(zhí)行器坐標,從而實現(xiàn)對目標物體的精確操作。
def eyes_in_hand_calculate(self, pose, tbe1, Mc1, tbe2, Mc2, tbe3, Mc3, Mr):
tbe1, Mc1, tbe2, Mc2, tbe3, Mc3, Mr = map(np.array, [tbe1, Mc1, tbe2, Mc2, tbe3, Mc3, Mr])
# Convert pose from degrees to radians
euler = np.array(pose) * np.pi / 180
Rbe = self.CvtEulerAngleToRotationMatrix(euler)
Reb = Rbe.T
A = np.hstack([(Mc2 - Mc1).reshape(-1, 1),
(Mc3 - Mc1).reshape(-1, 1),
(Mc3 - Mc2).reshape(-1, 1)])
b = Reb @ np.hstack([(tbe1 - tbe2).reshape(-1, 1),
(tbe1 - tbe3).reshape(-1, 1),
(tbe2 - tbe3).reshape(-1, 1)])
U, S, Vt = svd(A @ b.T)
Rce = Vt.T @ U.T
tce = Reb @ (Mr - (1/3)*(tbe1 + tbe2 + tbe3) - (1/3)*(Rbe @ Rce @ (Mc1 + Mc2 + Mc3)))
eyes_in_hand_matrix = np.vstack([np.hstack([Rce, tce.reshape(-1, 1)]), np.array([0, 0, 0, 1])])
return eyes_in_hand_matrix
2.數(shù)據(jù)收集
通過將機械臂移動到不同的位置,收集有關(guān)機械臂末端執(zhí)行器的各種位置和相機觀察的數(shù)據(jù)。
在您的代碼中,機械臂的姿勢是通過調(diào)用“ml.get_coords()”方法獲得的,而相機的位置數(shù)據(jù)是通過“stag_identify()”函數(shù)收集的,該函數(shù)識別標記對象。
def reg_get(self, ml):
for i in range(30):
Mc_all = self.stag_identify()
tbe_all = ml.get_coords()
...
return Mc, tbe
3.坐標變換矩陣
根據(jù)每個位置的數(shù)據(jù),可以導出兩種轉(zhuǎn)換:
●Ai是機械臂末端執(zhí)行器在不同位置的變換矩陣,代表末端執(zhí)行器的運動。
●Bi是相機在相機坐標系中觀察到的物體的變換矩陣,代表相機的運動。
這些變換矩陣通過視覺系統(tǒng)和機械臂系統(tǒng)(使用'get_coords')獲得。
4.求解校準矩陣
根據(jù)校準模型:

●Ai代表機械臂末端執(zhí)行器的運動(從世界框架到末端執(zhí)行器框架)。
●Bi表示相機的運動(在相機坐標系中看到的物體的運動)。
●Xce是待求解的手眼校準矩陣,代表相機和機械臂末端執(zhí)行器之間的剛體變換。
通過收集Ai和Bi的多個位置,可以使用最小二乘法來求解Xce。雖然代碼中沒有顯示這部分邏輯,但通??梢允褂肧VD分解等方法來解決。
保存收集到的數(shù)據(jù)并計算結(jié)果后,就可以實現(xiàn)后續(xù)的跟蹤功能。
[[0.9825202432037423, 0.03775722308035847, 0.1822864882543945, -21.50838594386444], [-0.04022441808787263, 0.9991420672993772, 0.009855229181470597, -0.6545263884052905], [-0.1817579926285262, -0.017015330087522124, 0.9831960692850951, 59.71321654600654], [0.0, 0.0, 0.0, 1.0]]
5. 視覺跟蹤
手眼校準的輸出是一個剛體變換矩陣,用于描述相機和機械臂的末端執(zhí)行器之間的空間關(guān)系。該矩陣構(gòu)成了機械臂視覺控制和操作的基礎(chǔ)。利用這個矩陣,機械臂可以將視覺系統(tǒng)感知到的物體位置轉(zhuǎn)換為自己的坐標系。前面提到的 STag 代碼是使用 OpenCV 算法識別的。
def stag_robot_identify(self, ml):
marker_pos_pack = self.stag_identify()
target_coords = ml.get_coords()
while (target_coords is None):
target_coords = ml.get_coords()
# print("current_coords", target_coords)
cur_coords = np.array(target_coords.copy())
cur_coords[-3:] *= (np.pi / 180)
fact_bcl = self.Eyes_in_hand(cur_coords, marker_pos_pack, self.EyesInHand_matrix)
for i in range(3):
target_coords[i] = fact_bcl[i]
return target_coords
基于從識別出的代碼中返回的坐標,機械臂相應(yīng)地移動,沿末端執(zhí)行器的 XYZ 軸進行運動,以實現(xiàn)跟蹤目標。
def vision_trace_loop(self, ml):
mc.set_fresh_mode(1)
time.sleep(1)
ml.send_angles(self.origin_mycbot_horizontal, 50)
self.wait()
time.sleep(1)
origin = ml.get_coords()
while 1:
target_coords = self.stag_robot_identify(ml)
target_coords[0] -= 300
self.coord_limit(target_coords)
print(target_coords)
for i in range(3):
target_coords[i+3] = origin[i+3]
ml.send_coords(target_coords, 30)
總結(jié)
總體來說,在運行這段代碼的時候,可能還是會出現(xiàn)一些小插曲,有些功能沒有完全解釋清楚。使用過許多手眼校準方法后,我發(fā)現(xiàn)這是更直接的自動校準方法之一,盡管它缺乏一些精度,但可以通過優(yōu)化來改進??偟膩碚f,這個案例值得探索,特別是對于那些對機械臂和視覺系統(tǒng)有一定了解的人來說!
-
機器人
+關(guān)注
關(guān)注
213文章
31093瀏覽量
222356 -
機械臂
+關(guān)注
關(guān)注
14文章
596瀏覽量
26134 -
大象機器人
+關(guān)注
關(guān)注
0文章
86瀏覽量
380
原文標題:使用myCobot 320機械臂實現(xiàn)視覺跟蹤和手眼校準案例
文章出處:【微信號:ElephantRobotics,微信公眾號:大象機器人】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
大象機器人攜手進迭時空推出 RISC-V 全棧開源六軸機械臂產(chǎn)品
開源工業(yè)增強型機械臂
機器人:高級創(chuàng)客王總經(jīng)典在線問答整理
【Landzo C1申請】星創(chuàng)客教育培訓
【KittenBot機器人試用申請】makers club創(chuàng)客俱樂部新課程引進項目
教育機器人方興未艾,你了解多少?
如何控制真實機械臂/機器人呢
機器人系統(tǒng)與控制需求簡介
制作一個教育機器人
制造業(yè)最常見的機器人——機械臂
機械臂和移動機器人的架構(gòu)介紹
智能小六軸機械臂重磅賦能機器人教育
緊湊型的小六軸機械臂,重磅賦能機器人教育
機械臂在教育醫(yī)療領(lǐng)域的應(yīng)用
自動化革命:大象機器人的Mercury A1機械臂
專為機器人教育而設(shè)計的創(chuàng)客友好型機械臂
評論