SLAM中的坐标系旋转变换以及旋转矩阵的左乘和右乘问题

1,025 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


对于一个变换矩阵 TT,具体的定义因人而异,例如一个变换 TwcT_{wc},代表了从相机坐标系到世界坐标系的变换,但是其基准(base)坐标系有时候定义为 ww,也可以定义为 cc,基准坐标系的不同,直接导致变换相反。

例如对于下图中的三个简单的坐标系,分别为相机坐标系 c1c2c1,c2,世界坐标系 ww,其中点 PP 在坐标系 c1c1 下。接下来定义变换矩阵,为了简化计算,其中三个坐标系没有旋转,只需要考虑平移。

在这里插入图片描述

  1. 对于变换矩阵 TcwT_{cw},理解为worldcamera的变换,如果以 camera 为基准坐标系,所以如果想将点 PP 旋转到 c2c2 坐标系下,那么变换矩阵的定义:
Tc1w=[1000010100100001]Tc2w=[1001010000100001]Tc2c1=[1001010100100001]T_{c_1w} = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & -1 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] T_{c_2w} = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & -1 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] T_{c_2c_1} = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & -1 \\ 0 & 1 & 0 & 1 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right]

那么将一个点从 c1c_1 坐标系转换到 c2c_2 坐标系,需要先转换到世界坐标系。那么如下:

c2P=Tc2wTwc1c1P=Tc2wTc1w1c1P=[1001010000100001][1000010100100001][1001]^{c_2}P=T_{c_2w}T_{wc_1} {^{c_1}P} = T_{c_2w} T^{-1}_{c_1w}{^{c_1}P} = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & -1 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] \left[ \begin{array}{ccc|c} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 1 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] \left[ \begin{array}{cc} 1 \\ 0 \\ 0 \\ \hline 1 \\ \end{array} \right]
=[1001010100100001][1001]=[0101]= \left[ \begin{array}{ccc|c} 1 & 0 & 0 & -1 \\ 0 & 1 & 0 & 1 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] \left[ \begin{array}{cc} 1 \\ 0 \\ 0 \\ \hline 1 \\ \end{array} \right] =\left[ \begin{array}{cc} 0 \\ 1 \\ 0 \\ \hline 1 \\ \end{array} \right]
  1. 那么对于变换矩阵 TcwT_{cw},理解为worldcamera的变换,如果以 world 为基准坐标系,所以如果想将点 PP 旋转到 c2c2 坐标系下,那么变换矩阵的定义:
Tc1w=[1000010100100001]Tc2w=[1001010000100001]Tc2c1=[1001010100100001]T_{c_1w} = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 1 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] T_{c_2w} = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & 1 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] T_{c_2c_1} = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & 1 \\ 0 & 1 & 0 & -1 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right]

对于点P,假设其姿态与c1坐标系一致,则

Tpc1=[1001010000100001]T_{pc_1} = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & 1 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right]

那么可以得到,从c2到P的变换,等于从c2到c1的变换乘c1到P的变换:

Tpc2=Tc1c2Tpc1=[1001010100100001][1001010000100001]=[1000010100100001]T_{pc_2} = T_{c_1c_2}T_{pc_1} = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & -1 \\ 0 & 1 & 0 & 1 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] \left[ \begin{array}{ccc|c} 1 & 0 & 0 & 1 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right] = \left[ \begin{array}{ccc|c} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 1 \\ 0 & 0 & 1& 0 \\ \hline 0 & 0 & 0 & 1 \\ \end{array} \right]

所以在c2坐标系下,P点的坐标为(0,1,0)( 0 , 1 ,0)

对于上面两种定义方式,都可以求得正确的结果,但是定义不同,计算方式就不同。

旋转的左乘与右乘未完待更...