博主小白,分享一下自己对于点变换和坐标系变换的理解,不对的地方请大家指出~
坐标系变换
以最简单的坐标系变换为例,如下图
图中有两个坐标系,因为没有旋转,两个坐标系之间的变换关系很显然为
[
X
2
Y
2
]
=
[
0
1
−
1
0
]
[
X
1
Y
1
]
\begin{bmatrix} X_2 \\ Y_2 \end{bmatrix} = \left[ \begin{array}{cccc} 0 & 1 \\ -1 & 0 \end{array} \right ] \begin{bmatrix} X_1 \\ Y_1 \end{bmatrix}
[X2Y2]=[0−110][X1Y1]
将
[
0
1
−
1
0
]
\begin{bmatrix} 0 & 1 \\ -1 & 0 \end{bmatrix}
[0−110]记为
T
r
T_r
Tr, 也就是
[
X
2
Y
2
]
=
T
r
[
X
1
Y
1
]
\begin{bmatrix} X_2 \\ Y_2 \end{bmatrix} = T_r \begin{bmatrix} X_1 \\ Y_1 \end{bmatrix}
[X2Y2]=Tr[X1Y1]
在这个式子中,
T
r
T_r
Tr代表由坐标系2到坐标系1的空间变换,也就是坐标系1相对于坐标系2的位姿
点变换
同理,还是上面这个图,点 P ( a , b ) P(a,b) P(a,b)在坐标系1下的坐标为 P 1 ( a , b ) P_1(a,b) P1(a,b),在坐标系2下的坐标为 P 2 ( b , − a ) P_2(b,-a) P2(b,−a),设 P 1 P_1 P1和 P 2 P_2 P2的坐标变换为 T 1 2 T_1^2 T12代表坐标系2到坐标系1的变换,则有:
P
2
=
T
1
2
∗
P
1
P_2=T_1^2*P_1
P2=T12∗P1
带入
P
1
P_1
P1,
P
2
P_2
P2得:
[
b
−
a
]
=
[
0
1
−
1
0
]
[
a
b
]
\begin{bmatrix} b \\ -a \end{bmatrix} = \left[ \begin{array}{cccc} 0 & 1 \\ -1 & 0 \end{array} \right ] \begin{bmatrix} a \\ b \end{bmatrix}
[b−a]=[0−110][ab]
因此,可以得到
T
1
2
=
[
0
1
−
1
0
]
T_1^2=\left[\begin{array}{cccc} 0 & 1 \\ -1 & 0 \end{array}\right]
T12=[0−110]
通过这个例子可以发现,点的空间变化和坐标系的空间变换是一样的。
KITTI数据集中的坐标系关系
理解了上面的内容(点的空间变化和坐标系的空间变换是一样的),kitti数据集的坐标系变换就很简单了。
kitti坐标系之间的关系如下如图,其中左侧的坐标系是kitti odomtery的真值坐标系,右侧是lidar坐标系,因为A-LOAM计算的到的pose是右侧的,所以要想根据真值进行评价,我们需要将其转换到左侧的真值坐标系(其实就是左相机的坐标系),具体可以参考这篇博客。
记:
lidar to left camera的外参矩阵为 T r T_r Tr,即Tr transform a point from velodyne coordinates into the left camera coordinate system;(这里我感觉这个 T r T_r Tr其实就是camera到lidar的变换矩阵)
第i帧lidar坐标系在其世界坐标系(其世界坐标系就是指的相对于第一帧lidar的pose)的pose(也即transform)为 T i l i d a r w T_i^{lidar_w} Tilidarw;
第i帧camera坐标系在其世界坐标系的pose为 T i c a m e r a w T_i^{camera_w} Ticameraw;
第i帧lidar坐标系下的点云为 P i l i d a r l P_i^{lidar_l} Pilidarl;
第i帧camera坐标系下的点云为 P i c a m e r a l P_i^{camera_l} Picameral;
第i帧点云在lidar世界坐标系(第一帧的坐标系)下的点云为 P i l i d a r w P_i^{lidar_w} Pilidarw;
第i帧camera世界坐标系(第一帧的坐标系)下的点云为 P i c a m e r a w P_i^{camera_w} Picameraw;
有:
P
i
c
a
m
e
r
a
w
=
P
i
c
a
m
e
r
a
w
P_i^{camera_w}=P_i^{camera_w}
Picameraw=Picameraw
T i c a m e r a w ∗ P i c a m e r a l = T r ∗ P i l i d a r w T_i^{camera_w}*P_i^{camera_l}=T_r*P_i^{lidar_w} Ticameraw∗Picameral=Tr∗Pilidarw
T i c a m e r a w ∗ T r ∗ P i l i d a r l = T r ∗ T i l i d a r w ∗ P i l i d a r l T_i^{camera_w}*T_r*P_i^{lidar_l}=T_r*T_i^{lidar_w}*P_i^{lidar_l} Ticameraw∗Tr∗Pilidarl=Tr∗Tilidarw∗Pilidarl
T i c a m e r a w ∗ T r = T r ∗ T i l i d a r w T_i^{camera_w}*T_r=T_r*T_i^{lidar_w} Ticameraw∗Tr=Tr∗Tilidarw
T i c a m e r a w = T r ∗ T i l i d a r w ∗ T r − 1 T_i^{camera_w}=T_r*T_i^{lidar_w}*T_r^{-1} Ticameraw=Tr∗Tilidarw∗Tr−1
其中 T i c a m e r a w T_i^{camera_w} Ticameraw就是kitti的odomtery的真值, T i l i d a r w T_i^{lidar_w} Tilidarw为A-LOAM得到的里程计。