1. 程式人生 > >手眼標定的一些經驗(基於眼在手上和眼在手外)

手眼標定的一些經驗(基於眼在手上和眼在手外)

手眼標定是機器視覺進行應用的開端。狹義上將,進行機械臂抓取之前,必定要進行手眼標定,以完成視覺感測器到執行機械臂的互聯。廣義上講,任何需要機器視覺以及執行機構的裝置,比如自動駕駛系統,或者三維重構系統,手眼標定都是不可或缺的。


手眼標定分為兩大類別,眼在手上(Eye-in-Hand)和眼在手外(Eye-To- Hand)兩大類。
 


顧名思義,兩種標定方式區別於相機移動與否。在標定原理上講,兩種原理都是求解一個AX=XB求解矩陣X的過程,至於為什麼在每個分章節都會講到。


眼在手外(Eye-To-Hand)

眼在手外的標定法,將
定義:
p(Pix):畫素座標,標定格座標
c(Camera):相機座標
h(Hand):機械臂末端座標
b(Base):世界座標
Tbc:從相機座標系到世界座標系的轉移矩陣,這裡是待求的矩陣
Tbh:從機械臂末端到世界座標系的轉移矩陣
Tcp:從標定板座標系到相機座標系的轉移矩陣,這裡和擴充套件的外引數指的是同一個矩陣
Thp:從標定板到機械手末端的轉移矩陣,這裡充當不變數,勾連起各個引數
 


我們可以得到如下等式:
Tbc*Tcp=Tbh*Thp
此等式自然成立,變換後得到
Tbh-1* Tbc*Tcp=Thp

所以我們可以通過多組資料得到:
T_bh^(①-1) T_bc T_cp^①=T_bh^(②-1) T_bc T_cp^②  
移項得到
〖T_bh^② T〗_bh^(①-1) T_bc=T_bc T_cp^② T_cp^(①-1)

這時候我們發現AX=XB出現了,
 

-0.0244673453075173    0.0129474934887250    0.999616782285073    -23.2031360705242
-0.999630883532739    0.0114943948954908    -0.0246165711166530    -1434.12212027217
-0.0118087129339921    -0.999850109415579    0.0126614770266597    886.281289665969
0    0    0    1

AX=XB解法:
       本文主要是講解經典手眼標定問題中的TSAI-LENZ 文獻方法,參考文獻為“A New Technique for Fully Autonomous and Efficient 3D Robotics Hand/Eye Calibration”,並且實現了基於OpenCV的C++程式碼程式,code可去CSDN資源下載,MATLAB版本作者為蘇黎世理工的Christian Wengert,也可在此處下載。

手眼標定問題描述
       在機器人校準測量、機器人手眼協調以及機器人輔助測量等領域,都要求知道機器人執行器末端(抓取臂)座標系和感測器(比如用來測量三維空間中目標位置和方向並固定在機器人手上的攝像機)座標系之間的相互關係,確定這種轉換關係在機器人領域就是通常所說的手眼標定。
       將手眼標定系統如下圖所示,其中HgijHgij為機器人執行器末端座標系之間相對位置姿態的齊次變換矩陣;HcijHcij為攝像機座標系之間相對位置姿態的齊次變換矩陣;HcgHcg為像機與機器人執行器末端之間的相對位置姿態齊次矩陣。
  
       經過座標系變換,HgijHgij、HcijHcij和HcgHcg滿足如下關係: 
HgijHcg=HcgHcij⇔(Rgij0Tgij1)(Rcg0Tcg1)=(Rcg0Tcg1)(Rcij0Tcij1)HgijHcg=HcgHcij⇔(RgijTgij01)(RcgTcg01)=(RcgTcg01)(RcijTcij01)


這時候可以看到我們的AX=XB出現了,Hcg就是我們這裡要求的X

       將上式展開,可以得到手眼標定的基本方程: 
{RgijRcg=RcgRcij(Rgij−I)Tcg=RcgTcij−Tgij{RgijRcg=RcgRcij(Rgij−I)Tcg=RcgTcij−Tgij

       因此,手眼標定問題也就轉化為從上述方程組中求解出RcgRcg和TcgTcg,下面就按照TSAI文獻所述求解該方程組。
“兩步法”手眼標定
       一般用“兩步法”求解基本方程,即先從基本方程上式求解出RcgRcg,再代入下式求解出TcgTcg。在TSAI文獻中引入旋轉軸-旋轉角系統來描述旋轉運動來進行求解該方程組,具體的公式推導可以檢視原始文獻,這裡只歸納計算步驟,不明白的地方可閱讀文獻,計算步驟如下:
Step1:利用羅德里格斯變換將旋轉矩陣轉換為旋轉向量
{rgij=rodrigues(Rgij)rcij=rodrigues(Rcij){rgij=rodrigues(Rgij)rcij=rodrigues(Rcij)
Step2:向量歸一化
⎧⎩⎨θgij=∥rgij∥2Nrgij=rgijθgijθcij=∥rcij∥2Nrcij=rcijθcij{θgij=‖rgij‖2Nrgij=rgijθgijθcij=‖rcij‖2Nrcij=rcijθcij
Step3:修正的羅德里格斯引數表示姿態變化
⎧⎩⎨Pgij=2sinθgij2NrgijPcij=2sinθcij2Nrcij{Pgij=2sin⁡θgij2NrgijPcij=2sin⁡θcij2Nrcij
Step4:計算初始旋轉向量P′cgPcg′
skew(Pgij+Pcij)Pcg′=Pcij−Pgijskew(Pgij+Pcij)Pcg′=Pcij−Pgij
       其中,skew為反對稱運算,假設一個三維向量V=[vx;vy;vz]V=[vx;vy;vz],其反對稱矩陣為: 
skew(V)=⎡⎣⎢0vz−vy−vz0vxvy−vx0⎤⎦⎥skew(V)=[0vz−vy−vz0vxvy−vx0]
Step5:計算旋轉向量PcgPcg
Pcg=2Pcg′1+|Pcg′|2−−−−−−−−√Pcg=2Pcg′1+|Pcg′|2
Step6:計算旋轉矩陣RcgRcg
Rcg=(1−|Pcg|22)I+12(PcgPcgT+4−|Pcg|2−−−−−−−−√skew(Pcg))Rcg=(1−|Pcg|22)I+12(PcgPcgT+4−|Pcg|2skew(Pcg))
Step7:計算平移向量
(Rgij−I)Tcg=RcgTcij−Tgij