// 6 通过将重力旋转到z轴上,得到世界坐标系与摄像机坐标系c0之间的旋转矩阵rot_diff
// 此处解算得到的g是枢纽帧下的重力
// 关于vins是4自由度的理解 四自由度应该指的是 x y z yaw
// yaw的不可观察性质 采集的g 与真实的g(真实的g 与z轴平行 yaw角无论如何变化 g都不会发生变化)相比较 可以直接解算出 pitch roll
// 此处解出的R0 应该是枢纽帧坐标系到世界坐标系的旋转矩阵
Matrix3d R0 = Utility::g2R(g);
// Rs0 是第0帧IMU坐标系到 枢纽帧camera坐标系的旋转矩阵 R0*Rs[0] 表示第0帧body坐标系到世界坐标系的旋转矩阵
//获得body坐标系相对于世界坐标系(第0帧body坐标系)的航向角
// 注意转变思维 作者认为c0(第0帧)的坐标系就是世界坐标系
// Rs[0] Tl_camera_b0 R0:T_world_camera
double yaw = Utility::R2ypr(R0 * Rs[0]).x(); //
// 前面可以看到
R0 = Utility::ypr2R(Eigen::Vector3d{-yaw, 0, 0}) * R0; //此处的R0是枢纽帧相机坐标系到世界坐标系的转换关系
g = R0 * g;
//Matrix3d rot_diff = R0 * Rs[0].transpose();
Matrix3d rot_diff = R0;
for (int i = 0; i <= frame_count; i++)
{
// 那么此处的rot_diff应该是第1帧图片imu坐标系到世界坐标系下的旋转
// ps[i] 表示的是第i帧与第0帧位置在枢纽帧相机坐标系下的 位置差
// 仍然是相对于枢纽帧相机坐标系的变化
Ps[i] = rot_diff * Ps[i]; //将相机坐标系下观察到第k帧 与第零帧的位置差 转换到世界坐标系下
// Rs 最开始是第i帧imu坐标系到枢纽帧camera坐标系的相对旋转
// 那么此处rot_diff应该是 枢纽帧camera坐标系到世界坐标系的旋转
Rs[i] = rot_diff * Rs[i];
// 由于vs所在的坐标系是枢纽帧的camera坐标系 所以此处我认为rot_diff表示的是camera坐标系到世界坐标系下的旋转
Vs[i] = rot_diff * Vs[i];
// 但是若都是这么表示 Ps[i]到底能反应什么呢?
}
重点理解R0 = Utility::ypr2R(Eigen::Vector3d{-yaw, 0, 0}) * R0; 为何需要给R0矩阵补偿一个-yaw角度
上面的注释有些错误的,是之前对于代码的理解,没有改过来,不过对于理解为何R0需要补偿-yaw 下面的视频应该能够完全解释了
我录制了一段视频:讲了对于为何需要补偿的理解 可以参考下Vins_mono重力对齐(为何需要补偿-yaw)