1. 程式人生 > 實用技巧 >物體位姿估計精度驗證實驗(涉及位姿估計,相手眼標定,機械臂運動)

物體位姿估計精度驗證實驗(涉及位姿估計,相手眼標定,機械臂運動)

物體位姿估計精度驗證實驗(涉及位姿估計,相手眼標定,機械臂運動)

1.位姿估計

簡單介紹,採用雙目結構光相機,利用拍攝的點雲資料和CAD模型點雲進行ICP配準,獲取物體在相機座標系下的位姿(R,t)

2.手眼標定

本文采用的是Eye to Hand 方式,與opencv中講解的Eye in Hand方式不同;因此花了點時間,首先還是先來看Opencv官方的手眼標定函式

Opencv 手眼標定函式calibrateHandEye()

(1)Eye in Hand

在opencv 3.4版本以上,提供了手眼標定函式,本文采用的是4.4版本,貼一個官方文件

基本輸入輸出描述:
在這裡插入圖片描述
在這裡插入圖片描述
看著這個旋轉矩陣,有點迷,來看一下官方的圖
在這裡插入圖片描述
在這裡插入圖片描述
可以看出,官方求解的是相機到夾爪的變換矩陣:gTc;
其兩個輸入:

  • 夾爪到機器人基座變換矩陣bTg
  • 目標物體(一般是棋盤格)到相機的變換矩陣cTt

這就感覺很反人類,機器人每次運動讀出來的坑定是基座到機械臂末端的變換矩陣,按照opencv的表示方法應該是gTb;然後pnp演算法可以獲取得到相機每次拍照相對於棋盤格的外參cTt(這個引數和opencv的是相符的);

  • 所以Eye in Hand相機標定使用opencv的標定函式,應該是要把機器人的位姿估計去逆????
  • 那為啥廣大csdn朋友都是直接用的???納悶 (看到最後)

(1)Eye to Hand

在這裡插入圖片描述

這裡我們還是按照opencv的定義吧;
根據target到base從紅色路徑走和藍色路徑走,一次拍攝可以獲得一個等式
bTg · gTt = bTc · cTt

兩次拍攝,有
bTg1 · gTt = bTc · cTt1 (1)
bTg2 · gTt = bTc · cTt2 (2)

用(1)消去(2)中的 gTt,有
bTg2 · inv(bTg1 ) · bTc · cTt1 = bTc · cTt2

挪一挪,成AX=XB的形式:
bTg2 · inv(bTg1 ) · bTc = bTc · cTt2 · inv(cTt1)

對比一下eye in hand:好像bTg逆了一下???在這裡插入圖片描述
那根據opencv變換矩陣的定義,是不是對於eye to hand直接可以用機器人讀出的基座到末端的矩陣???

我懷著好奇試了一下,發現。。。。嚶嚶嚶,錯了;
幾種情況都試了幾下,發現需要求逆的是eye to hand中的bTg,也就是機器人末端位姿取個逆,或許這裡能解釋廣大的csdn友eye in hand中機器人末端矩陣不取逆的原因???

所以我感覺opencv的矩陣定義很迷。。。。。。。。不過反正是可以用了

其他標定函式

我自己用的是網上網友把opencv中的程式碼自己實現了一下

另外還有一個github的matlab版本,這個沒試過

總之原理就這樣

3.機械臂運動

我們設想的是去驗證整個位姿估計框架的精度:
包含了物體到相機,相機到機器人基座兩部分變換關係

實驗方案:

大概就這樣,實際中B是一個框,A是中間那部分,初始狀態就是A放在B中
在這裡插入圖片描述

零部件A固定在臺面,零部件B使用機械臂夾持,初始

機器人位姿校正推導:

這裡的座標系我喜歡用自己的定義,不用opencv那裡 的反人類定義

在這裡插入圖片描述
那麼就有:
在這裡插入圖片描述
然後實驗就是完事了