izhengfan / se2lam

(ICRA 2019) Visual-Odometric On-SE(2) Localization and Mapping
https://github.com/izhengfan/se2lam
MIT License
404 stars 108 forks source link

odometry term using covariance instead of information matrix #38

Closed cy-goh closed 3 months ago

cy-goh commented 3 years ago

In track.cpp, you are defining the odometry constraint's noise,

    Matrix3d Ak = Matrix3d::Identity();
    Matrix3d Bk = Matrix3d::Identity();
    Ak.block<2, 1>(0, 2) = Phi_ik * Vector2d(-odork[1], odork[0]);
    Bk.block<2, 2>(0, 0) = Phi_ik;
    Eigen::Map<Matrix3d, RowMajor> Sigmak(preSE2.cov);
    Matrix3d Sigma_vk = Matrix3d::Identity();
    Sigma_vk(0, 0) = (Config::ODO_X_NOISE * Config::ODO_X_NOISE);
    Sigma_vk(1, 1) = (Config::ODO_Y_NOISE * Config::ODO_Y_NOISE);
    Sigma_vk(2, 2) = (Config::ODO_T_NOISE * Config::ODO_T_NOISE);
    Matrix3d Sigma_k_1 = Ak * Sigmak * Ak.transpose() + Bk * Sigma_vk * Bk.transpose();
    Sigmak = Sigma_k_1;

and when loading the graph into g2o at map.cpp, you used covariance instead of information matrix

            Eigen::Map<Eigen::Matrix3d, RowMajor> info(meas.cov);
            addEdgeSE2(optimizer, Vector3D(meas.meas), i, id1, info); 

In my opinion, the following changes should be made

Sigmak = Sigma_k_1.inverse();