您當前的位置:首頁 > 舞蹈

一點關於機器人學和計算機視覺中的座標變換的理解

作者:由 Kissrabbit 發表于 舞蹈時間:2018-11-11

好久沒有些知乎文章了,主要是最近對視覺SLAM這一塊的關注度少了,研究生生活已經把我的興趣點拉到別的方向了,不會再那麼熱情地關注視覺SLAM了~~

今天和同學討論起來了關於座標系的絕對變換問題和相對變換問題。由於我本科學機器人的,因此對於剛體變換這個概念是非常熟悉的,下面簡答地說一下:

在機器人學中(通常研究的是機械臂,因為機械臂有很多關節,可以使用D-H法,而不是移動機器人),我們經常關心這樣一類的座標變換:從動座標系(如機械臂末端)到基座標系(通常是機器人的基座,固定不動)的座標變換,是一種齊次變換,對於這個變換,常稱之為“位姿”。比如,有一個空間點

p

,在

基座標系

下的座標為

P_0

,在

動座標系

下的座標為

P_1

,則二者之間有這樣的數學關係:

P_0=T_1^0P_1

其中,

T_1^0

即是

動系

相對於

基系

的位姿(若不特別說明,這裡均使用的是

齊次座標、齊次矩陣

),也就是我們常說的機器人的末端位姿,即我們用座標變換矩陣來描述一個座標系相對於基座標系的位姿。這是在點的意義下對座標變換的問題進行討論的,事實上,我們更關心的是機器人的末端位姿,所以我們更關係座標系的變換,那麼問題開始來了~

1.絕對變換

所謂的

絕對變換,

指的是“

動座標系

的每一次變換都是相對於

基座標系

進行變換的”,如“沿著基座標系的X軸移動m個單位;繞基座標系的Y軸旋轉30°”。舉個例子,假設動座標系的初始位姿是

T_1^0

,有一個空間點

p

,在

基座標系

下的座標為

P_1

,在

動座標系

下的座標為

P_0

,初始時,動系相對於基系的位姿為

T_1^0

,前面已經說到,此時點

P_1

P_0

的關係為:

P_1=T_1^0P_0

然後空間點

p

隨著

動座標系

相對

基座標系

的Z軸旋轉30°,記為

T_{rot}(Z,30^\circ)

。經過此次變換後,此時空間點

p

從基系的初始位置

P_1

運動到新位置記為

P_2

,則有:

P_2=T_{rot}(Z,30^\circ)P_1=T_{rot}(Z,30^\circ)T_1^0P_0

再相對基座標系的Y軸平移+50個單位,記為

T_{trans}(Y,50)

,則新的位置又變為:

P_3=T_{trans}(Y,50)P_2=T_{trans}(Y,50)T_{rot}(Z,30^\circ)T_1^0P_0

顯然,經過這一番變換後,動系的

位姿

已經變成了:

T_3^0=T_{trans}(Y,50)T_{rot}(Z,30^\circ)T_1^0

由此可見,每次變換都是左乘的,即“絕對變換”對位姿的改變是“左乘”規則。

2.相對變換

所謂的

相對變換,

指的是“

動座標系

的每次變換都是相對於

前一個座標系

進行變換的”(這裡沒有特意提到

基座標系

,其實,可以把每一次的前一個座標系作為

基系

去看待就可以),如“沿著基座標系的X軸移動m個單位後得到一個新的動系;然後再繞這個新的座標系的Y軸旋轉30°”。舉個例子,假設動座標系的初始位姿是

T_1^0

,記此時的動係為系1。然後相對

基座標系的Z軸

旋轉30°,此時動系的位姿相對於前一個動系的位姿是

T_2^1=T_{rot}(Z,30^\circ)

,記此時的動係為系2。再相對這個

新的動座標系的Y軸

平移+50個單位,此時

T_{trans}(Y,50)

,得到新的動系,系3,此時,系3相對於系2的位姿顯然就是

T_3^2=T_{trans}(Y,50)

接下來,我們想知道,經過這一番相對變換後,空間點

p

在基座標系下的新位置是多少呢?由於每一次變換都是相對前一個座標系的變換,即我們每次都知道動系相對於前一個座標系的位姿,所以,很顯然,我們需要把從後往回去計算,即此時,空間點

p

在系2的位置為:

P^{

然後,從系2的角度去看,相對於系1的位置為:

P^{

最後,相對於基系的位置為:

P_3=T_1^0T_2^1P^{

顯然,經過這種“相對變換”的操作後,動系的位姿為:

T_3^0=T_1^0T_{rot}(Z,30^\circ)T_{trans}(Y,50)

由此可見,“相對變換”對動座標系的位姿的改變是“右乘”的。

上面簡單地介紹了機器人學中的座標變換的基礎問題,說的也比較囉嗦(我的特點,,,)由於這個文章不是教學文章,而且都已經是寫進教科書的東西了,大家就不要跟我在這裡較真了,把寶貴的時候省出來。

在計算機視覺中,比如視覺SLAM問題中,我們通常會求兩幀之間的位姿,如下圖:

一點關於機器人學和計算機視覺中的座標變換的理解

也就是說,視覺SLAM中,我們計算幀-幀之間的位姿的時候,其實就是求的當前幀相對於前一幀的變換(這裡我們先不去考慮Local Map的事情,僅僅是為了陳述問題),然後當我們想得到當前幀的位姿,只需要把前面的都乘起來就OK(我知道這樣會有誤差累積,請陳獨秀同志坐下!)。比如,以上圖為例,假設第一幀的位姿為

T_1^0

,中間經過兩個相對變換

\Delta T_2^1

\Delta T_3^2

,那麼,第三幀的位姿就可以由下式得到:

T_3^0=\Delta T_3^2\Delta T_2^1T_1^0

誒?問題突然就來了,同樣是相對變換,怎麼這裡就是

左乘

的順序了呢?(這個左乘也不是我瞎編出來的,在《state estimation》這本書中,開始講姿態的時候也是這麼講的),而上面講的機器人學中的相對變換的順序卻是

右乘

呢?(如果沒有學習過機器人學的CVer們,應該是不會有這個問題的,只有我這種研究Robotics的人在步入CV大門的菜鳥才會懵圈)

這個問題在我第一次入門CV時遇到的,要想捋清楚這個問題,我們還是要回到上面給出的座標變換的定義:

這個式子是將動系中的點都投影回到基座標系(CV中,與之對應的就是世界座標系)中去了,在機械臂的實際工作中這是很有實際意義的,對於每個工件的位姿,我們想知道的是他在空間的位置,也就是相對於固定座標系的位置,所以,機器人學中感興趣的是從動繫到基座標系,不管動系怎麼動,在我計算出了機械臂的正運動學後,我就可以時時刻刻知道末端相對於基座標系的位姿了。簡而言之,機器人學中,我們研究的都是圍繞著基座標系,不管什麼,都要往基座標系投影回來。

而在計算機視覺中,我們能直接感受到的資料就是相機採集到的資料,所以最容易直接獲得的是空間點在相機座標系(動系)的座標,在視覺SLAM中,我們總是關心當前幀的特徵點投影在下一幀的哪個地方(方便我們建立特徵匹配、求解幀-幀之間的位姿),而且,我們經常會把世界座標系中的空間點投影到相機座標系和影象中(參考針孔模型的公式,這就涉及到從世界座標系到動座標系的對映),所以更感興趣的是下面這樣的過程:

P_1=T_0^1P_0

這與上面恰恰相反,顯然有

T_0^1=(T_1^0)^{-1}

。因此,

在CV中的座標變換矩陣定義是與機器人學中的座標變換定義恰恰相反

,以旋轉矩陣(繞Z軸)為例:

機器人學中:

一點關於機器人學和計算機視覺中的座標變換的理解

計算機視覺中:

一點關於機器人學和計算機視覺中的座標變換的理解

二者恰好是

互逆

的(由於旋轉矩陣是正定的,因此互逆=互為轉置,因此陳獨秀同志請坐下!)(知乎怎麼寫矩陣啊,,,,,,)

在這種互逆的情況下,我們就能來理解為什麼機器人學中的相對變換都是右乘,而到了計算機視覺中就是左乘了,以下圖為例,做個簡單的計算就明白了:

一點關於機器人學和計算機視覺中的座標變換的理解

其中,為了區分,CV中的位姿用

H

來表示。由圖可知:

機器人學:

T_3^0=T_1^0\Delta T_1\Delta T_2

計算機視覺:

H_3^0=\Delta H_2\Delta H_1H_1^0

證明:在

H=T^{-1}

下,兩個式子等價

因為:

H=T^{-1}

所以:

T_3^0=(H_3^0)^{-1}=(\Delta H_2\Delta H_1H_1^0)^{-1}=(H_1^0)^{-1}(\Delta H_1)^{-1}(\Delta H_2)^{-1}=T_1^0\Delta T_1\Delta T_2

證明完畢!

3結束語

雖然其實這並不是一個什麼有意思的問題,甚至可以說,對於一些大佬,在腦子中想想就明白的事情了。的確,這個問題並不是多難,其實我們只要清楚兩個領域中如何定義的變換矩陣就OK,至於為什麼同樣是變換矩陣,為什麼兩個領域定義的不一樣呢?其實,這只是從各自領域所研究的問題特點出發的,比如V-SLAM中,經常需要把世界點投影到相機座標系中,所以

從世界座標系到動系的對映

就更加方便一些(那我想知道相機座標系相對於世界座標系的位姿怎麼辦?很簡單啊,取個逆就完了,而且位姿的逆是很好算的。)這很容易在大家學習過程中就能明白的。

(這塊曾經有些廢話,本次更新讓我刪掉了,容易引起不必要的誤會)

最後再囉嗦一句,這其實沒有任何本質的問題,僅僅只是為了方便的數學處理上的不同,物理意義都是沒區別的!希望此文能對那些從機器人轉入計算機視覺的小夥伴有所幫助吧~

標簽: 座標系  變換  位姿  動系  相對