例子
如下图所示,右边的坐标系是相机坐标系,左边的是世界坐标系。
假设他们只有 x 轴方向上的平移。
相机坐标系原点在相机坐标系下的坐标是 (0,0,0),
假设相机坐标系在世界坐标系沿 x 轴正方向 5 m 外,
则在世界坐标系下,相机坐标系原点的坐标为 (5,0,0)
也就是说针对任意一点 P,它在相机坐标系下的坐标为 (x_c,y_c,z_c)
那么它在世界坐标系下的坐标为 (x_c+5,y_c,z_c)
此时 c2w(camera to world) 矩阵右上角的 平移向量 为 (5,0,0)
也就是说 平移向量跟相机坐标系原点在世界坐标系下的坐标是一样的。
如何取得相机坐标系原点在世界坐标系下的坐标
原理
定义坐标系1、坐标系2,那么向量
a
\mathbf{a}
a 在两个坐标系下的坐标为
a
1
\mathbf{a}_1
a1,
a
2
\mathbf{a}_2
a2,它们之间的关系应该是
a
1
=
R
12
a
2
+
t
12
\mathbf{a}_1 = \mathbf{R}_{12}\mathbf{a}_2+\mathbf{t}_{12}
a1=R12a2+t12
这里的
R
12
\mathbf{R}_{12}
R12
是指“把坐标系2的向量变换到坐标系1”中。由于向量乘在这个矩阵的右边,它的下标是从右读到左的。同理,如果我们要表达“从1到2的旋转矩阵”时,就写成
R
21
\mathbf{R}_{21}
R21
关于平移
t
12
\mathbf{t}_{12}
t12
它实际对应的是坐标系1原点指向坐标系2原点的向量,在坐标系1下取的坐标,所以建议读成“从1到2的向量”。
相反地,
t
21
\mathbf{t}_{21}
t21
即从2指向1的向量在坐标系2下的坐标,却并不等于
−
t
12
-\mathbf{t}_{12}
−t12,而是和两个坐标系的旋转还有关系。
所以,当初学者问“我的坐标在哪里”这样的问题时,我们需要清楚地说明这句话的含义。这里“我的坐标”实际上指的是从世界坐标系指向自己坐标系原点的向量,在世界坐标系下取到的坐标。对应到数学符号上,应该是
t
W
C
\mathbf{t}_{WC}
tWC 的取值。
同理,它并不等于
−
t
C
W
-\mathbf{t}_{CW}
−tCW
代码
ray_o = c2w[:3, 3]
相机原点(光心)在世界坐标系下取到的坐标用上述代码获取。
首先
c
2
w
c2w
c2w 是 相机到 世界坐标系的变换矩阵,对应平移向量可以写成
t
W
C
\mathbf{t}_{WC}
tWC
注意
W
←
C
W\leftarrow C
W←C
自右向左。
为什么
至于为什么是这样,举个例子就很清楚,因为是坐标系的变换,所以刚好和坐标的变换有点相反过来的味道。
参考
《视觉SLAM14讲》第二版,电子工业出版社,p45-p46