日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

相机标定:机器人手眼标定全解析

發布時間:2023/12/31 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 相机标定:机器人手眼标定全解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

編輯:OAK中國
首發:oakchina.cn
喜歡的話,請多多👍???

前言

Hello,大家好,這里是OAK中國,我是助手君。
最近有不少小伙伴詢問用OAK做機器人項目,正好助手君看到這篇優質好文,分享給大家。注:本文已獲取作者@張貺恩授權轉載了哦,原文地址。


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

1. 坐標系標定通用方法

機器人手眼標定其實就是兩個坐標系之間轉換關系的標定。假設現在有兩個坐標系robot和camera,并且我們已知對應的幾個固定點P在這兩個坐標系的坐標 robotP和 cameraP 。那么根據坐標系轉換公式,我們可以得到:
[1] robotP = robotTcamera cameraP

上式中 robotTcamera 就代表我們希望求出來的相機到機器人的轉換矩陣。 robotP和cameraP為補1后的“齊次坐標”: [x,y,z,1]T,這樣我們的齊次坐標變換矩陣robotTcamera便可以同時包含旋轉以及平移。

只要學過線性代數的同學應該都清楚,式[1]相當于就是一個N元一次方程,只要點P的個數大于我們求解的轉換矩陣維度同時這些點線性不相關,我們便可以通過偽逆矩陣計算出來 robotTcamera

[2] robotTcamera = robotP(cameraP)-1

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

當坐標變換存在非線性變換時,我們也可以設計并訓練一個神經網絡Tnet 直接擬合兩組坐標之間的關系:

[3] robotP =Tnet (cameraP)

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

通過以上的計算我們可以知道,只要我們能夠同時測量出來固定點P在兩個坐標系的坐標 robotP和cameraP并且測量出來多組數據,我們就可以很方便地計算出來坐標變換矩陣。當然在實際過程中我們有可能很難同時測量出來固定點 P 在兩個坐標系的坐標,在后面我會分相機和機器人的情況討論如何用一些小trick來盡量實現這個測量目標,如何進行標定,以及如何進行標定精度的驗證。

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


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

我們應該養成一個習慣,即遇到問題時先考慮我們的待求量和已知量。如Fig 1 所示。在eye-to-hand的問題中,待求量為相機到機器人基座坐標系的固定轉換矩陣 baseTcamera 。注意我們這里用的base而不是robot來表示機器人基座坐標系,因為需要與機器人其他部分的坐標系進行區分。機器人基座坐標系是固定不動的,而其他的關節,例如機器人末端坐標系end,是不斷變化的。考慮到相機是固定在一個位置,因此相機只有相對于基座坐標系才是固定不動的,這樣我們的待求量baseTcamera是一個固定參數,標定才有意義。

根據我們在節1中討論的,我們接下來需要測量幾組固定點P在機器人基座坐標系下的坐標baseP和 在相機坐標系下的坐標cameraP。那么怎么去測量這些點的坐標呢?接下來我們需要用到一個標定神器:棋盤格。

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

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

通過識別棋盤格,我們便可以得到棋盤格角點在相機坐標系的坐標imgP,但是這是二維坐標,通過相機內參和物體的深度信息我們可以計算出來cameraP ,這個我們之后會分為3D相機和2D相機進行討論。我們可以假設已經測量出來了cameraP ,接下來我們只要測量出來對應的棋盤格點在機器人中的坐標baseP,便可以標定出來機器人和相機之間的轉換矩陣 baseTcamera。棋盤格在標定的時候,會固定在機器人的末端,而機器人的末端坐標系(end)到基座坐標系(base)可以通過機器人正向運動學計算得到。那么我們可以通過如下關系測量出來棋盤格點在機器人基座坐標系的坐標baseP :

[4]baseP = baseTendendTboardboradP

式[4] 中,baseTendendTboard分別代表機器人末端坐標系(end)到基座坐標系(base)的轉換矩陣和棋盤格坐標系(board)到機器人末端坐標系(end)的轉換矩陣。其中baseTend可以實時根據機器人正運動學得到,而endTboard可以通過設計一個固定尺寸的棋盤格得到。當棋盤格尺寸以及安裝固定后,我們可以設棋盤格的左上角點為原點,然后測量或者根據設計尺寸得到棋盤格原點到機器人末端坐標原點的平移坐標。另外棋盤格平面一般與機器人末端平面平行,這樣該原點的法向量也知道了,接下來便可以計算得到endTboardboradP 代表棋盤格角點在棋盤格坐標系下的坐標,這個同樣根據設計棋盤格的尺寸得到。另外我們需要注意棋盤格的角點在機器人坐標系和在圖像坐標系的順序需要一一對應,但是一般的方形棋盤格會有旋轉對稱的問題,即我們無法區分出來棋盤格的原點是左上角點還是右下角點,因此手眼標定時我們也可以用下面的非對稱棋盤格。

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

當我們根據式[4]計算得到棋盤格角點在機器人基座坐標系中的坐標baseP ,然后根據圖像識別加相機內參和深度信息得到棋盤格在相機坐標系中的坐標 cameraP ,我們便可以根據節1所述的方法計算得到相機到機器人的轉換矩陣:

[5] baseTcamera = baseP(cameraP)-1

接下來我會再討論如何將棋盤格在圖像中的坐標 imgP ,轉換為棋盤格在相機坐標系中的坐標cameraP。

2.1. 3D相機

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

式[6]中z為目標點的深度值,3D相機能夠測出來目標點的深度,從而能夠計算出目標點的3維坐標。列數 u 和行數 v 為目標點在圖像中的坐標。x,y,z代表目標點在相機坐標系下的三維坐標。 fx和 fy為焦距,用于描述像素單位和三維坐標單位之間的比例關系。 u0和 v0為相機光心在圖像中的投影位置,用于計算圖像原點和相機坐標系原點之間的位移。

我們通過求逆矩陣,可以根據目標點的圖像坐標計算得到其三維坐標cameraP。相機內參一般相機提供方會給出,有的相機提供方還會直接提供計算好的三維點云信息。如果相機提供方只給出了一個深度圖,也沒有給相機內參,則需要我們通過張正友標定法,標定出來相機的內參。opencv,python,matlab等提供了完善的內參標定工具包,可以直接使用。

Fig 4. 相機內參解釋。

2.2. 2D相機

2.2.1. 基于平面深度z進行目標3D坐標估計

在節2.1中我們說明了3D相機的情況下由2D圖像坐標轉換到3D相機坐標系的方法。如果我們使用的是2D相機,那么我們便缺失了深度信息,也就是式[6]中的 z ,因此2D相機一般用于一個平面的物體識別。這樣我們只需要估計出一個平面的 z 坐標,然后便可以根據式[6] 計算得到目標點在相機坐標系下的三維坐標cameraP。

2.2.2. 基于平面參考點集進行目標3D坐標估計

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

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

如Fig 5所示,我們可以通過擺放三個標志物于相機視野的角落,這樣識別出來三個位置點 在圖像坐標系中的坐標
,[u1,v1]T, [u2,v2]T 。然后我們可以構建平行四邊形,用兩個坐標軸的向量去計算目標點在圖像坐標系的坐標[ui,vi]T。注意這里的坐標軸不需要是直角坐標軸,從而更加符合實際情況,因為實際貼標志物時不可能做到兩條坐標軸完全垂直。

接下來,我們在機器人末端安裝探針,通過觸碰標志物,得到這三個位置點在機器人基座坐標系的坐標[x0,y0,z0]T, [x1,y1,z1]T , [x2,y2,z2]T ,這三個點應該在一個平面上。因為式[9]計算出來的是一個比例關系,因此根據相似三角形的原理,我們可以計算出目標點點在機器人基座坐標系base的坐標basepi= [xi,yi,zi]T :

通過式[7]-[10]我們可以發現,通過建立一個平面中三個參考點的非直角坐標系,然后就可以將目標點的圖像坐標[ui,vi]T轉換為在機器人基座坐標系的三維坐標basepi= [xi,yi,zi]T 。這個方法需要目標平面與相機平面平行,但是不需要知道目標點的深度值,也不需要參考點為直角坐標系。

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

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

3.1. 3D相機

如Fig 6所示,當相機固定于機械臂末端時,此時相機坐標系與機械臂末端坐標系的變換關系固定,而與基座坐標系的變換關系會時刻變化,因此此時我們的待求量變為了相機坐標系camera到機械臂末端坐標系end的變換矩陣endTcamera 。而根據Fig 6圖中的各個坐標系的關系,我們可以列出來如下的坐標變換方程:

[11] baseP= baseTendendP=baseTendendTcameracameraP

式[11]中 baseP代表固定在某個位置的棋盤格的點到機器人基座坐標系的坐標。這個坐標的計算有兩種途徑:(i)在機械臂末端裝上探針,直接由末端去觸碰棋盤格點,根據機器人正向運動學得到的末端到基座坐標系的轉換矩陣 [公式] 加上棋盤格角點到末端坐標系的坐標 baseTend ,我們可以得到固定的棋盤格角點在機器人基座坐標系的坐標 endP。(ii)接下來我們在末端裝上camera,因為3D相機可以直接測量出棋盤格角點以及對應的3D坐標 baseP ,所以我們加上機器人末端到基座坐標系的轉換矩陣baseTend 和相機坐標系到機器人末端坐標系的轉換矩陣 endTcamera 便可以求出來棋盤格在機器人基座坐標系的坐標baseP 。不過很不幸,相機坐標系到機器人末端坐標系的轉換矩陣 endTcamera是我們的待求量,我們還不知道,因此我們需要對式[11]進行下簡單的變換:

[12] (baseTend)-1 basep(cameraP)-1=endTcamera

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

3.2. 2D相機

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

4. 標定結果評價

當手眼標定結束后,我們還希望對我們的標定結果進行評價。根據式[1]我們可以發現,目標點 P 在機器人坐標系中的坐標可以由兩種途徑獲得,一種是直接通過機器人末端觸碰的方式得到測量值 robotPmeasure ,另外一種是通過相機識別加標定出來的轉換矩陣得到預測值 robotPpredict =robotTcameracameraP。通過測量幾組不同位置的目標點,我們可以比較測量值robotPmeasure和預測值 robotPpredict =robotTcameracameraP 的距離誤差。通過計算各個點的誤差的均值和標準差,最終我們可以計算得出標定結果的系統誤差(均值)和隨機誤差(標準差)。

5.總結

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


OAK中國
| OpenCV AI Kit在中國區的官方代理商和技術服務商
| 追蹤AI技術和產品新動態

戳「+關注」獲取最新資訊↗↗

總結

以上是生活随笔為你收集整理的相机标定:机器人手眼标定全解析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。