博主小白,分享一下自己对于点变换和坐标系变换的理解,不对的地方请大家指出~
目录
坐标系变换点变换KITTI数据集中的坐标系关系参考坐标系变换
以最简单的坐标系变换为例,如下图
图中有两个坐标系,因为没有旋转,两个坐标系之间的变换关系很显然为
[X2Y2]=[01−10][X1Y1]\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]
将
[01−10]\begin{bmatrix} 0 & 1 \\ -1 & 0 \end{bmatrix} [0−110]记为 TrT_rTr, 也就是
[X2Y2]=Tr[X1Y1]\begin{bmatrix} X_2 \\ Y_2 \end{bmatrix} = T_r \begin{bmatrix} X_1 \\ Y_1 \end{bmatrix} [X2Y2]=Tr[X1Y1]
在这个式子中,TrT_rTr代表由坐标系2到坐标系1的空间变换,也就是坐标系1相对于坐标系2的位姿
点变换
同理,还是上面这个图,点P(a,b)P(a,b)P(a,b)在坐标系1下的坐标为P1(a,b)P_1(a,b)P1(a,b),在坐标系2下的坐标为P2(b,−a)P_2(b,-a)P2(b,−a),设P1P_1P1和P2P_2P2的坐标变换为T12T_1^2T12代表坐标系2到坐标系1的变换,则有:
P2=T12∗P1P_2=T_1^2*P_1P2=T12∗P1
带入P1P_1P1,P2P_2P2得:
[b−a]=[01−10][ab]\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]
因此,可以得到T12=[01−10]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的外参矩阵为TrT_rTr,即Tr transform a point from velodyne coordinates into the left camera coordinate system;(这里我感觉这个TrT_rTr其实就是camera到lidar的变换矩阵)
第i帧lidar坐标系在其世界坐标系(其世界坐标系就是指的相对于第一帧lidar的pose)的pose(也即transform)为TilidarwT_i^{lidar_w}Tilidarw;
第i帧camera坐标系在其世界坐标系的pose为TicamerawT_i^{camera_w}Ticameraw;
第i帧lidar坐标系下的点云为PilidarlP_i^{lidar_l}Pilidarl;
第i帧camera坐标系下的点云为PicameralP_i^{camera_l}Picameral;
第i帧点云在lidar世界坐标系(第一帧的坐标系)下的点云为PilidarwP_i^{lidar_w}Pilidarw;
第i帧camera世界坐标系(第一帧的坐标系)下的点云为PicamerawP_i^{camera_w}Picameraw;
有:
Picameraw=PicamerawP_i^{camera_w}=P_i^{camera_w} Picameraw=Picameraw
Ticameraw∗Picameral=Tr∗PilidarwT_i^{camera_w}*P_i^{camera_l}=T_r*P_i^{lidar_w} Ticameraw∗Picameral=Tr∗Pilidarw
Ticameraw∗Tr∗Pilidarl=Tr∗Tilidarw∗PilidarlT_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
Ticameraw∗Tr=Tr∗TilidarwT_i^{camera_w}*T_r=T_r*T_i^{lidar_w} Ticameraw∗Tr=Tr∗Tilidarw
Ticameraw=Tr∗Tilidarw∗Tr−1T_i^{camera_w}=T_r*T_i^{lidar_w}*T_r^{-1} Ticameraw=Tr∗Tilidarw∗Tr−1
其中TicamerawT_i^{camera_w}Ticameraw就是kitti的odomtery的真值,TilidarwT_i^{lidar_w}Tilidarw为A-LOAM得到的里程计。
参考
[1] LOAM笔记及A-LOAM源码阅读