参考
世界坐标系下标为w,相机坐标系为c(有些资料以机器人坐标系r)
在SLAM十四讲中,
R
12
R_{12}
R12表示“坐标系2的向量变换到坐标系1中”,t_12表示“坐标系1原点指向坐标系2原点的向量,在坐标系1下取的坐标”,记为“从1到2的向量”
向量a在12两个坐标系下的坐标为a1 ,a2,有
a
1
=
R
12
∗
a
2
+
t
12
a_1=R_{12} * a_2 + t_{12}
a1=R12∗a2+t12
a
1
=
T
12
∗
a
2
a_1 = T_{12} * a_2
a1=T12∗a2
T
12
T_{12}
T12表示把2坐标系下的点变换到1坐标系中
R 12 、 T 12 、 t 12 R_{12}、T_{12}、t_{12} R12、T12、t12都表示向量之间的变换,只是当用于机器人或相机时,可以直接用其来表示相机位姿
如果1为世界坐标系,2为相机坐标系,有
a
w
=
T
w
c
∗
a
c
a_w = T_{wc} * a_c
aw=Twc∗ac
T w c T_{wc} Twc中的 t w c t_{wc} twc实际上就是相机在世界坐标系W下的位置, R w c R_{wc} Rwc直接表示相机在世界坐标系W下的姿态
因此,虽然实践当中使用 T c w T_{cw} Tcw 来表示相机位姿更加常见,由于 T w c T_{wc} Twc来表示相机位姿更为直观,在可视化程序里,轨迹存储文件一般存储 T w c T_{wc} Twc
例如 相机原点 坐标
O
c
O_c
Oc 为零向量
O
w
=
R
w
c
∗
O
c
+
t
w
c
=
t
w
c
O_w = R_{wc} * O_c + t_{wc} = t_{wc}
Ow=Rwc∗Oc+twc=twc
可以看出
T
w
c
T_{wc}
Twc的平移变量
t
w
c
t_{wc}
twc直接就是相机在世界坐标系下的位置
而其
R
w
c
R_{wc}
Rwc就是相机的旋转角度
坐标系之间的变换
SLAM十四讲中的3.6.2
slambook2/ch3/examples/coordinateTransform.cpp代码中用的是
T
c
w
T_{cw}
Tcw,如果要画轨迹的画,应该用
T
w
c
T_{wc}
Twc
例如slam仿真环境的AirSim,其API记录的是车辆位姿T_world_car与相机位姿T_world_camera,要求相机在车辆坐标系下的坐标
Vector3d O_cam_zero(0, 0, 0);
auto t_rel = T_world_car.inverse() * T_world_camera*O_cam_zero;
计算结果表明坐标t_rel基本不变,由于车俩运动与帧率原因,x值会有误差(虽然误差可能有点大)