SLAM是一个“鸡生蛋和蛋生鸡”的问题,要定位需要重建,一般通过当前sensor看到到场景跟建好的地图进行匹配确定自身的位置。简单的例子:比如你在平面上,别人问你的座标,那么很显然你得先有座标系。要重建又需要精确的定位信息,如果没有相机位姿,那么当前帧数据无法统一注册到世界座标系下。
在SLAM中,所谓的位姿其实指的是相机在世界座标系中的位姿。位姿包括两方面:位置和姿势,即三维座标和朝向。如下所示,建图的过程就需要知道每一刻相机的位姿,从而将当前相机捕获的点云注册到全局的点云模型中。
常用的变换有:世界座标系 -> 相机座标系 和 相机的位姿 -> 世界座标系
如下所示:世界座标系为wxy, 相机座标系为cx’y’, P在世界座标下的座标为(a,b), P在相机座标系下的座标为(a’b’)。
(1) 已知相机座标系在世界座标系的位姿为:Tcw, 世界座标中的点 Pw, 那么相机座标系的座标为Pc=Tcw−1Pw
(2) 已知相机座标系在世界座标系的位姿为:Tcw, 相机座标中的点 Pc, 那么世界座标系的座标为Pw=TcwPc
Tcw和 Tcw−1均可作为相机位姿, 主流的如ORBSLAM采用后者作为相机的位姿。
可以检验一下:
(1)只包含平移,相机座标系在世界座标下只有平移,平移向量为(2,2), 那么Tcw=⎣⎡100010221⎦⎤, Tcw−1=⎣⎡100010−2−21⎦⎤
已知世界座标系中的座标为 Pw(3,3), 转换到相机座标系下为: Pc=Tcw−1Pw=⎣⎡100010−2−21⎦⎤∗⎣⎡331⎦⎤=⎣⎡111⎦⎤。因此,相机座标系下的座标Pc=(1,1)
反之,已知相机座标系下的座标 Pc(1,1), 转换到世界座标系下为: Pw=TcwPc=⎣⎡100010221⎦⎤∗⎣⎡111⎦⎤=⎣⎡331⎦⎤, 因此,世界座标系下的座标Pw=(3,3)
(2)只包含旋转, 相机座标系在世界座标系中逆时针旋转了180°, 那么位姿矩阵Tcw=⎣⎡−1000−10001⎦⎤, Tcw−1=⎣⎡−1000−10001⎦⎤,
已知世界座标系中的座标为 Pw(3,3), 转换到相机座标系下为Pc=Tcw−1Pw=(−3,−3)
反之,相机座标下的座标为Pc(−3,−3), 转换到世界座标系下为Pw=TcwPc=(3,3)
(3)既包含旋转又包含平移,先逆时针旋转180°, 然后平移(2,2), 因此Tcw=⎣⎡010−100221⎦⎤, Tcw−1=⎣⎡0−10100−221⎦⎤,
已知世界座标系中的座标为 Pw(2,2), 转换到相机座标系下为Pc=Tcw−1Pw=(0,0)
已知世界座标系中的座标为 Pw(3,3), 转换到相机座标系下为Pc=Tcw−1Pw=(1,−1)
反之,已知相机座标系中的座标为 Pc(0,0), 转换到相机座标系下为Pw=TcwPc=(2,2)