相機標定是機器人視覺中非常重要的一步,可以幫助機器人轉換識別到的視覺資訊,從而完成後續的控制工作,例如視覺抓取等等。 筆者做過一些機器人手眼標定的工作,在此用盡量簡單的語言來描述下機器人手眼標定的流程。本文的目的在於讓大家對於相機標定有一個感性的認知,能夠知道不同條件下機器人手眼標定的流程,具體的實現方法及技術細節還需要大家自行google。

1。 座標系標定通用方法

機器人手眼標定其實就是兩個座標系之間轉換關係的標定。假設現在有兩個座標系robot和camera,並且我們已知對應的幾個固定點

\bf{p}

在這兩個座標系的座標

^\text{robot}\bf{p}

^\text{camera}\bf{p}

。那麼根據座標系轉換公式,我們可以得到:

[1]

^\text{robot}\bf{p}=^\text{robot}T_\text{camera}~^\text{camera}\bf{p}

上式中

^\text{robot}T_\text{camera}

就代表我們希望求出來的相機到機器人的轉換矩陣。

^\text{robot}\bf{p}

^\text{camera}\bf{p}

為補1後的“齊次座標”:

[x, y, z, 1]^T

,這樣我們的齊次座標變換矩陣

^\text{robot}T_\text{camera}

便可以同時包含旋轉以及平移。

只要學過線性代數的同學應該都清楚,式[1]相當於就是一個N元一次方程,只要點

\bf{p}

的個數大於我們求解的轉換矩陣維度同時這些點線性不相關,我們便可以透過偽逆矩陣計算出來

^\text{robot}T_\text{camera}

[2]

^\text{robot}T_\text{camera}=^\text{robot}\bf{p} ~(^\text{camera}\bf{p})^{-1}

計算出來的座標變換矩陣便可以直接應用於後續的座標變換。現在計算出來的矩陣允許座標進行旋轉,平移,以及任意方向的縮放。如果想要把這個座標矩陣變成剛性的變換矩陣,只需要將其左上角的旋轉矩陣正交化即可,但是加了這個約束後有可能降低座標變換精度,即剛性變換矩陣約束太多,造成欠擬合。

當座標變換存在非線性變換時,我們也可以設計並訓練一個神經網路

T_\text{net}

直接擬合兩組座標之間的關係:

[3]

^\text{robot}\bf{p}=T_\text{net}(^\text{camera}\bf{p})

當然一般情況下,式[2]中的線性矩陣便足以描述機器人和相機之間的座標轉換關係。引入神經網路進行非線性擬合,訓練集的擬合精度會非常高,但是當訓練點個數不足的時候,會發生過擬合,使得實際測試時擬合精度反而降低。

透過以上的計算我們可以知道,只要我們能夠同時測量出來固定點

\bf{p}

在兩個座標系的座標

^\text{robot}\bf{p}

^\text{camera}\bf{p}

並且測量出來多組資料,我們就可以很方便地計算出來座標變換矩陣。當然在實際過程中我們有可能很難同時測量出來固定點

\bf{p}

在兩個座標系的座標,在後面我會分相機和機器人的情況討論如何用一些小trick來儘量實現這個測量目標,如何進行標定,以及如何進行標定精度的驗證。

2。 相機放置在固定位置,與機器人分開(eye-to-hand)

相機標定(一):機器人手眼標定

Fig 1。 機器人eye-to-hand標定。

我們應該養成一個習慣,即遇到問題時先考慮我們的待求量和已知量。如Fig 1 所示。在eye-to-hand的問題中,待求量為相機到機器人基座座標系的固定轉換矩陣

^\text{base}T_\text{camera}

。注意我們這裡用的base而不是robot來表示機器人基座座標系,因為需要與機器人其他部分的座標系進行區分。機器人基座座標系是固定不動的,而其他的關節,例如機器人末端座標系end,是不斷變化的。考慮到相機是固定在一個位置,因此相機只有相對於基座座標系才是固定不動的,這樣我們的待求量

^\text{base}T_\text{camera}

是一個固定引數,標定才有意義。

根據我們在節1中討論的,我們接下來需要測量幾組固定點

\bf{p}

在機器人基座座標系下的座標

^\text{base}\bf{p}

和 在相機座標系下的座標

^\text{camera}\bf{p}

。那麼怎麼去測量這些點的座標呢?接下來我們需要用到一個標定神器:棋盤格。

相機標定(一):機器人手眼標定

Fig 2。 棋盤格及角點識別。

如Fig 2所示,我們可以透過相應的視覺演算法準確地識別棋盤格的角點,具體演算法在opencv,python,matlab,和ros等常用平臺中都有包裝好的函式,直接呼叫即可,在此不進行贅述。

透過識別棋盤格,我們便可以得到棋盤格角點在相機座標系的座標

^\text{img}\bf{p}

,但是這是二維座標,透過相機內參和物體的深度資訊我們可以計算出來

^\text{camera}\bf{p}

,這個我們之後會分為3D相機和2D相機進行討論。我們可以假設已經測量出來了

^\text{camera}\bf{p}

,接下來我們只要測量出來對應的棋盤格點在機器人中的座標

^\text{base}\bf{p}

,便可以標定出來機器人和相機之間的轉換矩陣

^\text{base}T_\text{camera}

。棋盤格在標定的時候,會固定在機器人的末端,而機器人的末端座標系(end)到基座座標系(base)可以透過機器人正向運動學計算得到。那麼我們可以透過如下關係測量出來棋盤格點在機器人基座座標系的座標

^\text{base}\bf{p}

[4]

^\text{base}\bf{p}=^\text{base}T_\text{end}~^\text{end}T_\text{board}~^\text{board}\bf{p}

式[4] 中,

^\text{base}T_\text{end}

^\text{end}T_\text{board}

分別代表機器人末端座標系(end)到基座座標系(base)的轉換矩陣和棋盤格座標系(board)到機器人末端座標系(end)的轉換矩陣。其中

^\text{base}T_\text{end}

可以實時根據機器人正運動學得到,而

^\text{end}T_\text{board}

可以透過設計一個固定尺寸的棋盤格得到。當棋盤格尺寸以及安裝固定後,我們可以設棋盤格的左上角點為原點,然後測量或者根據設計尺寸得到棋盤格原點到機器人末端座標原點的平移座標。另外棋盤格平面一般與機器人末端平面平行,這樣該原點的法向量也知道了,接下來便可以計算得到

^\text{end}T_\text{board}

^\text{board}\bf{p}

代表棋盤格角點在棋盤格座標系下的座標,這個同樣根據設計棋盤格的尺寸得到。另外我們需要注意棋盤格的角點在機器人座標系和在影象座標系的順序需要一一對應,但是一般的方形棋盤格會有旋轉對稱的問題,即我們無法區分出來棋盤格的原點是左上角點還是右下角點,因此手眼標定時我們也可以用下面的非對稱棋盤格。

相機標定(一):機器人手眼標定

Fig 3。 非對稱棋盤格及角點識別,旋轉180度可以區分左上角點跟右下角點。

當我們根據式[4]計算得到棋盤格角點在機器人基座座標系中的座標

^\text{base}\bf{p}

,然後根據影象識別加相機內參和深度資訊得到棋盤格在相機座標系中的座標

^\text{camera}\bf{p}

,我們便可以根據節1所述的方法計算得到相機到機器人的轉換矩陣:

[5]

^\text{base}T_\text{camera}=^\text{base}\bf{p} ~(^\text{camera}\bf{p})^{-1}

接下來我會再討論如何將棋盤格在影象中的座標

^\text{img}\bf{p}

,轉換為棋盤格在相機座標系中的座標

^\text{camera}\bf{p}

2。1。 3D相機

相機的影象座標為二維座標,代表了在影象中的行和列數。將二維的影象座標轉換為在相機座標系的三維座標,是基於需要用到相機的內參公式和深度值:

[6]

z \begin{bmatrix}     u \\     v \\     1   \end{bmatrix} = \begin{bmatrix}     f_x & 0 & u_0 \\     0 & f_y & v_0 \\     0 & 0 & 1 \\   \end{bmatrix} \begin{bmatrix}     x \\     y \\     z   \end{bmatrix}

式[6]中

z

為目標點的深度值,3D相機能夠測出來目標點的深度,從而能夠計算出目標點的3維座標。列數

u

和行數

v

為目標點在影象中的座標。

x, y,  z

代表目標點在相機座標系下的三維座標。

f_x

f_y

為焦距,用於描述畫素單位和三維座標單位之間的比例關係。

u_0

v_0

為相機光心在影象中的投影位置,用於計算影象原點和相機座標系原點之間的位移。

我們透過求逆矩陣,可以根據目標點的影象座標計算得到其三維座標

^\text{camera}\bf{p}

。相機內參一般相機提供方會給出,有的相機提供方還會直接提供計算好的三維點雲資訊。如果相機提供方只給出了一個深度圖,也沒有給相機內參,則需要我們透過張正友標定法,標定出來相機的內參。opencv,python,matlab等提供了完善的內參標定工具包,可以直接使用。

相機標定(一):機器人手眼標定

Fig 4。 相機內參解釋。

2。2。 2D相機

2。2。1。 基於平面深度z進行目標3D座標估計

在節2。1中我們說明了3D相機的情況下由2D影象座標轉換到3D相機座標系的方法。如果我們使用的是2D相機,那麼我們便缺失了深度資訊,也就是式[6]中的

z

,因此2D相機一般用於一個平面的物體識別。這樣我們只需要估計出一個平面的

z

座標,然後便可以根據式[6] 計算得到目標點在相機座標系下的三維座標

^\text{camera}\bf{p}

2。2。2。 基於平面參考點集進行目標3D座標估計

另外當2D相機只用於識別平面上物體的位移和旋轉時,我們也可以直接透過下面這個方法直接估計目標點的位置和旋轉。

相機標定(一):機器人手眼標定

Fig 5。 非垂直座標系下目標點的表示。

如Fig 5所示,我們可以透過擺放三個標誌物於相機視野的角落,這樣識別出來三個位置點 在影象座標系中的座標

   [ u_0 , v_0 ]^T

[u_1 , v_1 ]^T

   [ u_2, v_2 ]^T

。然後我們可以構建平行四邊形,用兩個座標軸的向量去計算目標點在影象座標系的座標

[ u_i , v_i ]^T

。注意這裡的座標軸不需要是直角座標軸,從而更加符合實際情況,因為實際貼標誌物時不可能做到兩條座標軸完全垂直。

[7]

\begin{bmatrix}     u_i \\     v_i   \end{bmatrix} = \begin{bmatrix}     u_0 \\     v_0   \end{bmatrix} + k_1 \begin{bmatrix}     u_1-u_0 \\     v_1-v_0   \end{bmatrix} + k_2 \begin{bmatrix}     u_2-u_0 \\     v_2-v_0   \end{bmatrix}

[8]

\begin{bmatrix}     u_i - u_0 \\     v_i - v_0   \end{bmatrix} =\begin{bmatrix}     u_1-u_0 &  u_2-u_0  \\     v_1-v_0   & v_2-v_0\end{bmatrix}  \begin{bmatrix}     k_1\\      k_2   \end{bmatrix}

[9]

\begin{bmatrix}     k_1\\      k_2   \end{bmatrix}  =\begin{bmatrix}     u_1-u_0 &  u_2-u_0  \\     v_1-v_0   & v_2-v_0\end{bmatrix} ^{-1} \begin{bmatrix}     u_i - u_0 \\     v_i - v_0   \end{bmatrix}

接下來,我們在機器人末端安裝探針,透過觸碰標誌物,得到這三個位置點在機器人基座座標系的座標

[x_0 , y_0, z_0 ]^T

[x_1 , y_1, z_1 ]^T

[x_2 , y_2, z_2 ]^T

,這三個點應該在一個平面上。因為式[9]計算出來的是一個比例關係,因此根據相似三角形的原理,我們可以計算出目標點點在機器人基座座標系base的座標

^\text{base}p_i=[x_i, y_i, z_i]^T

[10]

\begin{bmatrix}     x_i - x_0 \\     y_i - y_0  \\ z_i - z_0  \end{bmatrix} =\begin{bmatrix}     x_1-x_0 &  x_2-x_0  \\     y_1-y_0   & y_2-y_0 \\  z_1-z_0   & z_2-z_0\end{bmatrix}  \begin{bmatrix}     k_1\\      k_2   \end{bmatrix}

透過式[7]-[10]我們可以發現,透過建立一個平面中三個參考點的非直角座標系,然後就可以將目標點的影象座標

[ u_i , v_i ]^T

轉換為在機器人基座座標系的三維座標

^\text{base}p_i=[x_i, y_i, z_i]^T

。這個方法需要目標平面與相機平面平行,但是不需要知道目標點的深度值,也不需要參考點為直角座標系。

3。 相機固定在機器人末端(eye-in-hand)

相機標定(一):機器人手眼標定

Fig 6。 機器人eye-in-hand標定。

3。1。 3D相機

如Fig 6所示,當相機固定於機械臂末端時,此時相機座標系與機械臂末端座標系的變換關係固定,而與基座座標系的變換關係會時刻變化,因此此時我們的待求量變為了相機座標系camera到機械臂末端座標系end的變換矩陣

^\text{end}T_\text{camera}

。而根據Fig 6圖中的各個座標系的關係,我們可以列出來如下的座標變換方程:

[11]

^\text{base}\bf{p}=^\text{base}T_\text{end}~~^\text{end}\bf{p}=^\text{base}T_\text{end}~^\text{end}T_\text{camera}~^\text{camera}\bf{p}

式[11]中

^\text{base}\bf{p}

代表固定在某個位置的棋盤格的點到機器人基座座標系的座標。這個座標的計算有兩種途徑:(i)在機械臂末端裝上探針,直接由末端去觸碰棋盤格點,根據機器人正向運動學得到的末端到基座座標系的轉換矩陣

^\text{base}T_\text{end}

加上棋盤格角點到末端座標系的座標

^\text{end}\bf{p}

,我們可以得到固定的棋盤格角點在機器人基座座標系的座標

^\text{base}\bf{p}

。(ii)接下來我們在末端裝上camera,因為3D相機可以直接測量出棋盤格角點以及對應的3D座標

^\text{camera}\bf{p}

,所以我們加上機器人末端到基座座標系的轉換矩陣

^\text{base}T_\text{end}

和相機座標系到機器人末端座標系的轉換矩陣

^\text{end}T_\text{camera}

便可以求出來棋盤格在機器人基座座標系的座標

^\text{base}\bf{p}

。不過很不幸,相機座標系到機器人末端座標系的轉換矩陣

^\text{end}T_\text{camera}

是我們的待求量,我們還不知道,因此我們需要對式[11]進行下簡單的變換:

[12]

(^\text{base}T_\text{end})^{-1}~^\text{base}\bf{p}~(^\text{camera}\bf{p})^{-1}=^\text{end}T_\text{camera}

觀察式[12]我們可以發現,左式中的三個變數都是已知量,因此我們便可以透過機器人觸碰棋盤格加相機識別棋盤格角點3D座標的方法,求出來相機到機器人末端座標系的轉換矩陣

^\text{end}T_\text{camera}

3。2。 2D相機

正如節2。2中討論的那樣,2D相機因為無法測量深度值,因此無法直接重建出來目標物體的3D座標資訊。如果2D相機裝在手臂上,那大多數是用來進行視覺伺服控制的,可以不用進行相機和機器人末端座標系的標定。不過我們之前在節2。2。2中提出了一個基於平面參考點集的方法,在這裡同樣適用。只要目標物體所在工作平臺的參考點集可以實時被測量到,同時我們又事先標定了這個參考點集在機器人基座座標系的座標,那麼我們便可以透過同樣的比例關係(見式[7]-[10]),計算得到目標點在機器人基座座標系的座標。

4。 標定結果評價

當手眼標定結束後,我們還希望對我們的標定結果進行評價。根據式[1]我們可以發現,目標點

\bf{p}

在機器人座標系中的座標可以由兩種途徑獲得,一種是直接透過機器人末端觸碰的方式得到測量值

^\text{robot}\bf{p}^\text{measure}

,另外一種是透過相機識別加標定出來的轉換矩陣得到預測值

^\text{robot}\bf{p}^\text{predict}=^\text{robot}T_\text{camera}~^\text{camera}\bf{p}

。透過測量幾組不同位置的目標點,我們可以比較測量值

^\text{robot}\bf{p}^\text{measure}

和預測值

^\text{robot}\bf{p}^\text{predict}=^\text{robot}T_\text{camera}~^\text{camera}\bf{p}

的距離誤差。透過計算各個點的誤差的均值和標準差,最終我們可以計算得出標定結果的系統誤差(均值)和隨機誤差(標準差)。

本文討論了在3D/2D eye-to-hand/eye-in-hand的不同情況下,機器人手眼關係的不同的標定方法。正如我們在節1中所提到的,標定兩個座標系最直接的方式就是儘量測量出來同一組點在不同座標系下的座標,從而直接可以透過矩陣偽逆的方法計算出來座標變換矩陣。當然,還有更高階的方法在不滿足上述條件下的情況也可以標定出來矩陣,也就是經典的Ax=xB問題的求解,其中A,B已知,x為待求量。這個求解方法我之後有時間會再寫文章進行討論。另外還有經典的張正友相機標定法,我也會抽空進行解讀。

PS:著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明作者、出處、及原文連結。