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