文章目錄

  • 基本介紹:
  • 座標系變換運算規則:
  • 關係運算説明:
  • 座標系運算規則一:
  • 座標系運算規則二:
  • 齊次座標系:
  • 齊次座標系下的座標變換:
  • 眼在手外:
  • 眼在手內:
  • 解方程:
  • - Tais方法
  • 使用opencv完成手眼標定
  • 歐拉角變換為旋轉矩陣:
  • 旋轉矩陣變成歐拉角:
  • 易錯點:

基本介紹:

  • 眼在手外(eye to hand):
    相機固定在機械臂以外的地方,主要標定相機和基底座標系的轉換矩陣。
  • 眼在手上(eye in hand):
    相機固定在機械臂末端,主要標定相機和機械臂末端的轉換矩陣。

座標系變換運算規則:

Emgu CV 實現眼在手上標定_機械臂:機械臂末端座標系到機械臂基底座標系的旋轉矩陣

Emgu CV 實現眼在手上標定_Emgu CV 實現眼在手上標定_02:機械臂末端座標系到機械臂基底座標系的平移矩陣

Emgu CV 實現眼在手上標定_#計算機視覺_03:機械臂末端座標系到機械臂基底座標系變換矩陣

以上等價於:機械臂末端座標系在基底座標系下的描述

關係運算説明:

Emgu CV 實現眼在手上標定_旋轉矩陣_04
由於R是正交矩陣,正交矩陣的逆=正交矩陣的轉置,所以有時候也會寫為Emgu CV 實現眼在手上標定_旋轉矩陣_05

座標系運算規則一:

假設有兩個座標系A,B,其中座標系B中的點b是由座標系A中的點a轉換來的,則點a和點b之間有如下等式
Emgu CV 實現眼在手上標定_Emgu CV 實現眼在手上標定_06
由以上等式可以看出:
Emgu CV 實現眼在手上標定_旋轉矩陣_07

座標系運算規則二:

假設由三個座標系A,B,C,已知如下關係:Emgu CV 實現眼在手上標定_#計算機視覺_08,求Emgu CV 實現眼在手上標定_機械臂_09

對於旋轉矩陣Emgu CV 實現眼在手上標定_機械臂_10: Emgu CV 實現眼在手上標定_Emgu CV 實現眼在手上標定_11

對於平移矩陣Emgu CV 實現眼在手上標定_#opencv_12:Emgu CV 實現眼在手上標定_旋轉矩陣_13 形式麻煩!

齊次座標系:

  1. 已知座標系A下的點Emgu CV 實現眼在手上標定_旋轉矩陣_14,則點Emgu CV 實現眼在手上標定_旋轉矩陣_15的齊次座標系可以寫成Emgu CV 實現眼在手上標定_Emgu CV 實現眼在手上標定_16
  2. 已知齊次座標系下一點Emgu CV 實現眼在手上標定_#opencv_17,則點Emgu CV 實現眼在手上標定_#計算機視覺_18的真實三維座標為Emgu CV 實現眼在手上標定_#opencv_19
  3. 齊次座標系下的變換矩陣:Emgu CV 實現眼在手上標定_#opencv_20
  4. Emgu CV 實現眼在手上標定_#計算機視覺_21

齊次座標系下的座標變換:

  1. 已知a,b,c分別為座標系A,B,C下的齊次座標,則有如下關係:
    Emgu CV 實現眼在手上標定_#計算機視覺_22

眼在手外:

求解目標:機械臂基底座標系相機座標系的變換矩陣Emgu CV 實現眼在手上標定_旋轉矩陣_23

手眼標定座標系表示:

  • 機械臂基底座標系 – base
  • 機械臂末端座標系 – end
  • 相機座標系 – camera
  • 標定板座標系 – board

Emgu CV 實現眼在手上標定_#計算機視覺_24

實現方法:

  1. 把標定板固定在機械臂末端
  2. 使用相機拍攝不同機械臂姿態下的標定板圖片n張,n>3

則對每張圖片可知:Emgu CV 實現眼在手上標定_#opencv_25

變形得:

Emgu CV 實現眼在手上標定_Emgu CV 實現眼在手上標定_26

其中:

Emgu CV 實現眼在手上標定_旋轉矩陣_27

Emgu CV 實現眼在手上標定_旋轉矩陣_28

Emgu CV 實現眼在手上標定_旋轉矩陣_29

已知對每張圖片:
Emgu CV 實現眼在手上標定_機械臂_30
**則可以得到如下等式:**左乘Emgu CV 實現眼在手上標定_旋轉矩陣_31 右乘Emgu CV 實現眼在手上標定_旋轉矩陣_32

Emgu CV 實現眼在手上標定_機械臂_33

眼在手內:

求解目標:機械臂末端座標系相機座標系的變換矩陣Emgu CV 實現眼在手上標定_#opencv_34

手眼標定座標系表示:

  • 機械臂基底座標系 – base
  • 機械臂末端座標系 – end
  • 相機座標系 – camera
  • 標定板座標系 – board

Emgu CV 實現眼在手上標定_Emgu CV 實現眼在手上標定_35

實現方法:

  1. 把標定板放在固定位置不動
  2. 移動機械臂末端,從不同角度拍攝n張標定板圖片

則對每張圖片可知:Emgu CV 實現眼在手上標定_機械臂_36

變形得:

Emgu CV 實現眼在手上標定_旋轉矩陣_37

其中:

Emgu CV 實現眼在手上標定_旋轉矩陣_27

Emgu CV 實現眼在手上標定_旋轉矩陣_28

Emgu CV 實現眼在手上標定_機械臂_40

已知對每張圖片:
Emgu CV 實現眼在手上標定_Emgu CV 實現眼在手上標定_41
**則可以得到如下等式:**左乘Emgu CV 實現眼在手上標定_旋轉矩陣_31 右乘Emgu CV 實現眼在手上標定_旋轉矩陣_43

Emgu CV 實現眼在手上標定_#opencv_44

解方程:

無論是眼在手外還是眼在手內,都可以得到一個經典的方程組Emgu CV 實現眼在手上標定_#opencv_45,這個方程組有n-1個方程 (n是拍攝的圖片數量)

其中X是我們要求得的手眼矩陣,裏面有6個線性無關的變量,其中旋轉3個自由度,平移3個自由度

- Tais方法

**形式變換:**由於A,B,X均為變換矩陣
Emgu CV 實現眼在手上標定_旋轉矩陣_46
Emgu CV 實現眼在手上標定_#opencv_45可以拆解成如下兩個等式
Emgu CV 實現眼在手上標定_#opencv_48
Tais方法:先求解Rx,再求解Tx

旋轉的表示:

**旋轉矩陣:**3*3矩陣Emgu CV 實現眼在手上標定_旋轉矩陣_49

旋轉向量:Emgu CV 實現眼在手上標定_機械臂_50

剛體繞旋轉軸旋轉,Emgu CV 實現眼在手上標定_機械臂_51表示的是旋轉軸的方向,Emgu CV 實現眼在手上標定_機械臂_51的長度表示剛體繞旋轉軸的角度

旋轉角:Emgu CV 實現眼在手上標定_Emgu CV 實現眼在手上標定_53

旋轉角又稱歐拉角,一般情況下旋轉角指的是座標系繞x軸旋轉後,再繞y軸旋轉後,再繞z軸旋轉分別的角度

使用opencv完成手眼標定

Emgu CV 實現眼在手上標定_機械臂_54

Emgu CV 實現眼在手上標定_#計算機視覺_55

歐拉角變換為旋轉矩陣:

Emgu CV 實現眼在手上標定_Emgu CV 實現眼在手上標定_56

旋轉矩陣變成歐拉角:

Emgu CV 實現眼在手上標定_機械臂_57

Emgu CV 實現眼在手上標定_#opencv_58

solvePnP()

bool cv::solvePnP(InputArray	objectPoints,
				  InputArray	imagePoints,
				  InputArray	cameraMatrix,	// 相機內參
				  InputArray	distCoeffs,		// 相機畸變係數
				  OutputArray	rvec,			// R
				  OutputArray	objectPoints,	// T
				  bool			useExtrinsicGuess = false,
				  int			flags = SOLVEPNP_ITERATIVE)

易錯點:

1. 利用calibrateCamera函數中計算的R、T,來作為標定板座標系到相機座標系的輸入

問題分析:對手眼標定來説,這個R、T沒有問題。但是由於後續的抓取來説,使用的物體三維座標是相機重建的點雲,即相機之前標定的內參下的點雲。此時手眼標定的相機座標系和實際抓取使用的相機座標系輕微的不一致,導致抓取總是有輕微誤差。

2. 識別標定板角點方向反了!

由於在建立棋盤格上的三維座標系的時候,我們默認是從棋盤格左上角到右下角建立的,如果識別反了,則會有個別圖片棋盤格識別的角點和輸入的棋盤格三維座標對應不上!

Emgu CV 實現眼在手上標定_#計算機視覺_59