一點關於機器人學和計算機視覺中的座標變換的理解
好久沒有些知乎文章了,主要是最近對視覺SLAM這一塊的關注度少了,研究生生活已經把我的興趣點拉到別的方向了,不會再那麼熱情地關注視覺SLAM了~~
今天和同學討論起來了關於座標系的絕對變換問題和相對變換問題。由於我本科學機器人的,因此對於剛體變換這個概念是非常熟悉的,下面簡答地說一下:
在機器人學中(通常研究的是機械臂,因為機械臂有很多關節,可以使用D-H法,而不是移動機器人),我們經常關心這樣一類的座標變換:從動座標系(如機械臂末端)到基座標系(通常是機器人的基座,固定不動)的座標變換,是一種齊次變換,對於這個變換,常稱之為“位姿”。比如,有一個空間點
,在
基座標系
下的座標為
,在
動座標系
下的座標為
,則二者之間有這樣的數學關係:
其中,
即是
動系
相對於
基系
的位姿(若不特別說明,這裡均使用的是
齊次座標、齊次矩陣
),也就是我們常說的機器人的末端位姿,即我們用座標變換矩陣來描述一個座標系相對於基座標系的位姿。這是在點的意義下對座標變換的問題進行討論的,事實上,我們更關心的是機器人的末端位姿,所以我們更關係座標系的變換,那麼問題開始來了~
1.絕對變換
所謂的
絕對變換,
指的是“
動座標系
的每一次變換都是相對於
基座標系
進行變換的”,如“沿著基座標系的X軸移動m個單位;繞基座標系的Y軸旋轉30°”。舉個例子,假設動座標系的初始位姿是
,有一個空間點
,在
基座標系
下的座標為
,在
動座標系
下的座標為
,初始時,動系相對於基系的位姿為
,前面已經說到,此時點
和
的關係為:
然後空間點
隨著
動座標系
相對
基座標系
的Z軸旋轉30°,記為
。經過此次變換後,此時空間點
從基系的初始位置
運動到新位置記為
,則有:
再相對基座標系的Y軸平移+50個單位,記為
,則新的位置又變為:
顯然,經過這一番變換後,動系的
位姿
已經變成了:
由此可見,每次變換都是左乘的,即“絕對變換”對位姿的改變是“左乘”規則。
2.相對變換
所謂的
相對變換,
指的是“
動座標系
的每次變換都是相對於
前一個座標系
進行變換的”(這裡沒有特意提到
基座標系
,其實,可以把每一次的前一個座標系作為
基系
去看待就可以),如“沿著基座標系的X軸移動m個單位後得到一個新的動系;然後再繞這個新的座標系的Y軸旋轉30°”。舉個例子,假設動座標系的初始位姿是
,記此時的動係為系1。然後相對
基座標系的Z軸
旋轉30°,此時動系的位姿相對於前一個動系的位姿是
,記此時的動係為系2。再相對這個
新的動座標系的Y軸
平移+50個單位,此時
,得到新的動系,系3,此時,系3相對於系2的位姿顯然就是
接下來,我們想知道,經過這一番相對變換後,空間點
在基座標系下的新位置是多少呢?由於每一次變換都是相對前一個座標系的變換,即我們每次都知道動系相對於前一個座標系的位姿,所以,很顯然,我們需要把從後往回去計算,即此時,空間點
在系2的位置為:
然後,從系2的角度去看,相對於系1的位置為:
最後,相對於基系的位置為:
顯然,經過這種“相對變換”的操作後,動系的位姿為:
由此可見,“相對變換”對動座標系的位姿的改變是“右乘”的。
上面簡單地介紹了機器人學中的座標變換的基礎問題,說的也比較囉嗦(我的特點,,,)由於這個文章不是教學文章,而且都已經是寫進教科書的東西了,大家就不要跟我在這裡較真了,把寶貴的時候省出來。
在計算機視覺中,比如視覺SLAM問題中,我們通常會求兩幀之間的位姿,如下圖:
也就是說,視覺SLAM中,我們計算幀-幀之間的位姿的時候,其實就是求的當前幀相對於前一幀的變換(這裡我們先不去考慮Local Map的事情,僅僅是為了陳述問題),然後當我們想得到當前幀的位姿,只需要把前面的都乘起來就OK(我知道這樣會有誤差累積,請陳獨秀同志坐下!)。比如,以上圖為例,假設第一幀的位姿為
,中間經過兩個相對變換
和
,那麼,第三幀的位姿就可以由下式得到:
誒?問題突然就來了,同樣是相對變換,怎麼這裡就是
左乘
的順序了呢?(這個左乘也不是我瞎編出來的,在《state estimation》這本書中,開始講姿態的時候也是這麼講的),而上面講的機器人學中的相對變換的順序卻是
右乘
呢?(如果沒有學習過機器人學的CVer們,應該是不會有這個問題的,只有我這種研究Robotics的人在步入CV大門的菜鳥才會懵圈)
這個問題在我第一次入門CV時遇到的,要想捋清楚這個問題,我們還是要回到上面給出的座標變換的定義:
這個式子是將動系中的點都投影回到基座標系(CV中,與之對應的就是世界座標系)中去了,在機械臂的實際工作中這是很有實際意義的,對於每個工件的位姿,我們想知道的是他在空間的位置,也就是相對於固定座標系的位置,所以,機器人學中感興趣的是從動繫到基座標系,不管動系怎麼動,在我計算出了機械臂的正運動學後,我就可以時時刻刻知道末端相對於基座標系的位姿了。簡而言之,機器人學中,我們研究的都是圍繞著基座標系,不管什麼,都要往基座標系投影回來。
而在計算機視覺中,我們能直接感受到的資料就是相機採集到的資料,所以最容易直接獲得的是空間點在相機座標系(動系)的座標,在視覺SLAM中,我們總是關心當前幀的特徵點投影在下一幀的哪個地方(方便我們建立特徵匹配、求解幀-幀之間的位姿),而且,我們經常會把世界座標系中的空間點投影到相機座標系和影象中(參考針孔模型的公式,這就涉及到從世界座標系到動座標系的對映),所以更感興趣的是下面這樣的過程:
這與上面恰恰相反,顯然有
。因此,
在CV中的座標變換矩陣定義是與機器人學中的座標變換定義恰恰相反
,以旋轉矩陣(繞Z軸)為例:
機器人學中:
計算機視覺中:
二者恰好是
互逆
的(由於旋轉矩陣是正定的,因此互逆=互為轉置,因此陳獨秀同志請坐下!)(知乎怎麼寫矩陣啊,,,,,,)
在這種互逆的情況下,我們就能來理解為什麼機器人學中的相對變換都是右乘,而到了計算機視覺中就是左乘了,以下圖為例,做個簡單的計算就明白了:
其中,為了區分,CV中的位姿用
來表示。由圖可知:
機器人學:
計算機視覺:
證明:在
下,兩個式子等價
因為:
所以:
證明完畢!
3結束語
雖然其實這並不是一個什麼有意思的問題,甚至可以說,對於一些大佬,在腦子中想想就明白的事情了。的確,這個問題並不是多難,其實我們只要清楚兩個領域中如何定義的變換矩陣就OK,至於為什麼同樣是變換矩陣,為什麼兩個領域定義的不一樣呢?其實,這只是從各自領域所研究的問題特點出發的,比如V-SLAM中,經常需要把世界點投影到相機座標系中,所以
從世界座標系到動系的對映
就更加方便一些(那我想知道相機座標系相對於世界座標系的位姿怎麼辦?很簡單啊,取個逆就完了,而且位姿的逆是很好算的。)這很容易在大家學習過程中就能明白的。
(這塊曾經有些廢話,本次更新讓我刪掉了,容易引起不必要的誤會)
最後再囉嗦一句,這其實沒有任何本質的問題,僅僅只是為了方便的數學處理上的不同,物理意義都是沒區別的!希望此文能對那些從機器人轉入計算機視覺的小夥伴有所幫助吧~