关于位姿变换的一点体会
關(guān)于位姿變換的一點(diǎn)體會(huì)
- 1.題外話
- 2.剛體的位姿變換
- 2.1 位姿變換的定義
- 2.2 旋轉(zhuǎn)矩陣的具體形式
- 2.2.1 二維情況
- 2.2.2 三維情況
- 3.旋轉(zhuǎn)方向
- 4.平移方向
1.題外話
對(duì)于剛體的位姿變換問(wèn)題,以前總覺(jué)得很簡(jiǎn)單,不就是個(gè)旋轉(zhuǎn)平移嘛??墒菐滋焓謩?dòng)做了的坐標(biāo)變換卻做了很久才做好。究其原因,還是有些問(wèn)題沒(méi)弄清楚。所以,今天在此寫(xiě)篇博客,徹底把這個(gè)過(guò)程捋一捋。
2.剛體的位姿變換
2.1 位姿變換的定義
確實(shí),剛體的姿態(tài)變換就兩部分:旋轉(zhuǎn)和平移。先來(lái)看看書(shū)上是怎么介紹旋轉(zhuǎn)和平移的。在《視覺(jué)slam十四講》中,對(duì)于這部分內(nèi)容是這樣將的:
我們?cè)O(shè)某個(gè)單位正交基(e1,e2,e3)(e_{1},e_{2},e_{3})(e1?,e2?,e3?)經(jīng)過(guò)一次旋轉(zhuǎn),變成了 (e1′,e2′,e3′)(e'_{1},e'_{2},e'_{3})(e1′?,e2′?,e3′?)。那么,對(duì)于同一個(gè)向量 aaa(注意該向量并沒(méi)有隨著坐標(biāo)系的旋轉(zhuǎn)而發(fā)生運(yùn)動(dòng)),它在兩個(gè)坐標(biāo)系下的坐標(biāo)為[a1;a2;a3]T[a_{1}; a_{2}; a_{3}]^T[a1?;a2?;a3?]T 和 [a′1;a′2;a′3]T[a′_{ 1}; a′_{ 2}; a′ _{3}]^T[a′1?;a′2?;a′3?]T。根據(jù)坐標(biāo)的定義,有:
為了描述兩個(gè)坐標(biāo)之間的關(guān)系,我們對(duì)上面等式左右同時(shí)左乘[e1T,e2T,e3T]T[e^T_{1},e^T_{2},e^T_{3}]^T[e1T?,e2T?,e3T?]T,那么左邊的系數(shù)變成了單位矩陣,所以
我們把中間的陣拿出來(lái),定義成一個(gè)矩陣 RRR。這個(gè)矩陣由兩組基之間的內(nèi)積組成,刻畫(huà)了旋轉(zhuǎn)前后同一個(gè)向量的坐標(biāo)變換關(guān)系。只要旋轉(zhuǎn)是一樣的,那么這個(gè)矩陣也是一樣的??梢哉f(shuō),矩陣 RRR 描述了旋轉(zhuǎn)本身。因此它又稱為旋轉(zhuǎn)矩陣。
在歐氏變換中,除了旋轉(zhuǎn)之外還有一個(gè)平移??紤]世界坐標(biāo)系中的向量 aaa,經(jīng)過(guò)一次旋轉(zhuǎn)(用RRR 描述)和一次平移 ttt 后,得到了 a′a′a′,那么把旋轉(zhuǎn)和平移合到一起,有:
a′=Ra+ta′= Ra + ta′=Ra+t
其中, ttt 稱為平移向量。相比于旋轉(zhuǎn),平移部分只需把這個(gè)平移量加到旋轉(zhuǎn)之后的坐標(biāo)上,顯得非常簡(jiǎn)潔。
以上內(nèi)容摘自《視覺(jué)slam十四講》第三章中的內(nèi)容。
2.2 旋轉(zhuǎn)矩陣的具體形式
從上面的內(nèi)容可以看到,旋轉(zhuǎn)矩陣是由兩組基向量的內(nèi)積組成。接下來(lái)再看看沿各個(gè)坐標(biāo)軸進(jìn)行旋轉(zhuǎn)的旋轉(zhuǎn)矩陣怎樣寫(xiě)。
2.2.1 二維情況
對(duì)于二維的情況,比較簡(jiǎn)單。旋轉(zhuǎn)矩陣(旋轉(zhuǎn)方向?yàn)槟鏁r(shí)針)為:
R=[cos(θ)?sin(θ)sin(θ)cos(θ)]R= \left[ \begin{matrix} cos(\theta) & -sin(\theta)\\ sin(\theta) & cos(\theta) \end{matrix} \right] R=[cos(θ)sin(θ)??sin(θ)cos(θ)?]
2.2.2 三維情況
繞x軸進(jìn)行旋轉(zhuǎn)(在yz平面逆時(shí)針旋轉(zhuǎn))
R=[1000cos(θ)?sin(θ)0sin(θ)cos(θ)]R= \left[ \begin{matrix} 1& 0& 0\\ 0&cos(\theta) & -sin(\theta)\\ 0&sin(\theta) & cos(\theta) \end{matrix} \right] R=???100?0cos(θ)sin(θ)?0?sin(θ)cos(θ)????
繞y軸進(jìn)行旋轉(zhuǎn)(在xz平面逆時(shí)針旋轉(zhuǎn))
R=[cos(θ)0?sin(θ)010sin(θ)0cos(θ)]R= \left[ \begin{matrix} cos(\theta) & 0& -sin(\theta)\\ 0&1&0 \\ sin(\theta)& 0& cos(\theta) \end{matrix} \right] R=???cos(θ)0sin(θ)?010??sin(θ)0cos(θ)????
繞z軸進(jìn)行旋轉(zhuǎn)(在xy平面逆時(shí)針旋轉(zhuǎn))
R=[cos(θ)?sin(θ)0sin(θ)cos(θ)0001]R= \left[ \begin{matrix} cos(\theta) & -sin(\theta)& 0\\ sin(\theta)& cos(\theta)& 0\\ 0&0&1 \\ \end{matrix} \right] R=???cos(θ)sin(θ)0??sin(θ)cos(θ)0?001????
3.旋轉(zhuǎn)方向
下面來(lái)考慮一個(gè)簡(jiǎn)單的問(wèn)題。
問(wèn)題:將點(diǎn)p=(1,0)p =(1,0)p=(1,0),按照旋轉(zhuǎn)矩陣RRR進(jìn)行旋轉(zhuǎn),旋轉(zhuǎn)后的坐標(biāo)為多少?
R=[cos(θ)?sin(θ)sin(θ)cos(θ)],θ=π/2R = \left[ \begin{matrix} cos(\theta) & -sin(\theta)\\ sin(\theta) & cos(\theta) \end{matrix} \right] ,\theta=\pi/2 R=[cos(θ)sin(θ)??sin(θ)cos(θ)?],θ=π/2
這個(gè)問(wèn)題很簡(jiǎn)單,口算都可以算出答案是p′=(0,1)p'=(0,1)p′=(0,1)。
但這里面有些問(wèn)題需要搞清楚。按照旋轉(zhuǎn)矩陣RRR進(jìn)行旋轉(zhuǎn),我們將點(diǎn)p=(0,1)p =(0,1)p=(0,1)變換為了p′=(1,0)p'=(1,0)p′=(1,0)。相當(dāng)于把點(diǎn)ppp逆時(shí)針旋轉(zhuǎn)了π/2\pi/2π/2。這并沒(méi)有什么問(wèn)題。在上一節(jié)的旋轉(zhuǎn)矩陣的定義中,我們也說(shuō)了這種形式的旋轉(zhuǎn)矩陣是進(jìn)行逆時(shí)針旋轉(zhuǎn)。
但是問(wèn)題在于,很多情況下點(diǎn)的位置是固定的,它并不會(huì)發(fā)生變化。旋轉(zhuǎn)之后發(fā)生變化的是坐標(biāo)系。也就是說(shuō),旋轉(zhuǎn)過(guò)后,點(diǎn)ppp的實(shí)際位置并沒(méi)有變,它還是在那個(gè)位置。但是它的坐標(biāo)變了(p′=(0,1)p'=(0,1)p′=(0,1)),也就是所在的坐標(biāo)系變了。那坐標(biāo)系是怎么旋轉(zhuǎn)的呢?剛好與坐標(biāo)旋轉(zhuǎn)的方向相反——順時(shí)針旋轉(zhuǎn)。
這個(gè)道理同時(shí)適用于三維的情況。
我覺(jué)得,能把這個(gè)問(wèn)題想清楚很重要。
4.平移方向
進(jìn)行平移變換的時(shí)候,同樣存在上面的問(wèn)題。
我們可以考慮一下。將點(diǎn)p=(1,1)p = (1,1)p=(1,1)按向量(1,2)(1,2)(1,2)進(jìn)行平移,很顯然平移后的坐標(biāo)為p′=(2,3)p'=(2,3)p′=(2,3)。如下圖所示:
同樣,很多情況下點(diǎn)的位置是固定的,變化的是坐標(biāo)。所以,如果點(diǎn)的位置不變,在進(jìn)行平移之后點(diǎn)的坐標(biāo)變?yōu)榱?span id="ozvdkddzhkzd" class="katex--inline">p′=(2,3)p'=(2,3)p′=(2,3),那只能是坐標(biāo)系進(jìn)行了平移。那坐標(biāo)系是怎么平移的呢?——與坐標(biāo)平移方向相反,按向量(?1,?2)(-1,-2)(?1,?2)進(jìn)行平移。如下圖所示
總結(jié)一下:關(guān)于旋轉(zhuǎn)和平移,必須要想清楚是對(duì)點(diǎn)(或向量)進(jìn)行旋轉(zhuǎn)平移還是對(duì)坐標(biāo)系進(jìn)行旋轉(zhuǎn)平移。
總結(jié)
以上是生活随笔為你收集整理的关于位姿变换的一点体会的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++:Lambda函数学习
- 下一篇: 最小二乘问题总结