Vins_mono重力对齐理解

   // 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)

你可能感兴趣的:(自动驾驶,slam)