1

问题的整体情况如下:

我从https://github.com/rexdsp/ORB_SLAM3_Windows克隆了 ORB-SLAM3 。它可以构建并且运行良好。然后我尝试用 EuRoC MH_01_easy 评估它的准确度,但发现它在发布模式下至少比论文中报告的准确度差 10 倍。经过几天的调试,我发现原因在下面的函数中:

void EdgeSE3ProjectXYZ::linearizeOplus() {
    g2o::VertexSE3Expmap * vj = static_cast<g2o::VertexSE3Expmap *>(_vertices[1]);
    g2o::SE3Quat T(vj->estimate());
    g2o::VertexSBAPointXYZ* vi = static_cast<g2o::VertexSBAPointXYZ*>(_vertices[0]);
    Eigen::Vector3d xyz = vi->estimate();
    Eigen::Vector3d xyz_trans = T.map(xyz);

    double x = xyz_trans[0];
    double y = xyz_trans[1];
    double z = xyz_trans[2];

    auto projectJac = -pCamera->projectJac(xyz_trans);

    _jacobianOplusXi =  projectJac * T.rotation().toRotationMatrix();
    double* buf = (double*)_jacobianOplusXi.data();

    Eigen::Matrix<double,3,6> SE3deriv;
    SE3deriv << 0.f, z,   -y, 1.f, 0.f, 0.f,
            -z , 0.f, x, 0.f, 1.f, 0.f,
            y ,  -x , 0.f, 0.f, 0.f, 1.f;

    buf = (double*)SE3deriv.data();
    printf("S: %f %f %f %f %f %f\n", buf[0], buf[3], buf[6], buf[9], buf[12], buf[15]);
    printf("S: %f %f %f %f %f %f\n", buf[1], buf[4], buf[7], buf[10], buf[13], buf[16]);
    printf("S: %f %f %f %f %f %f\n", buf[2], buf[5], buf[8], buf[11], buf[14], buf[17]);

    _jacobianOplusXj = projectJac * SE3deriv;
    buf = (double*)_jacobianOplusXj.data();
    printf("j: %f %f %f %f %f %f\n", buf[0], buf[2], buf[4], buf[6], buf[8], buf[10]);
    printf("j: %f %f %f %f %f %f\n", buf[1], buf[3], buf[5], buf[7], buf[9], buf[11]);
}

该函数在release模式下无法正常工作,如日志所示:(Jac是projectJac在其他函数中打印的内容)</p>

江淮汽车:6.586051 0.000000 5.789042

江淮:0.000000 6.566550 -0.414389

S:0.000000 69.640217 -4.394719 1.000000 0.000000 0.000000

S:-69.640217 0.000000 -61.212726 0.000000 1.000000 0.000000

S: 4.394719 61.212726 0.000000 0.000000 0.000000 1.000000

j: 25.478939 354.888530 0.000000 -0.000000 -0.000000 5.797627

j: -2.092870 -29.150968 0.000000 -0.000000 -0.000000 -0.476224

整个系统在Debug模式下正常工作,准确度与论文报告的结果相近。而上述函数的日志如下:

江淮汽车:6.586051 0.000000 5.789042

江淮:0.000000 6.566550 -0.414389

S:0.000000 69.640217 -4.394719 1.000000 0.000000 0.000000

S:-69.640217 0.000000 -61.212726 0.000000 1.000000 0.000000

S: 4.394719 61.212726 0.000000 0.000000 0.000000 1.000000

j: -25.441210 -813.017008 28.943840 -6.586051 -0.000000 -5.789042

j: 459.117113 25.365882 401.956448 0.000000 -6.566550 0.414389

你以前遇到过这种问题吗?你能告诉我这个问题的原因吗?我猜这是由编译器设置引起的。谁能告诉我如何解决这个问题?

非常感谢。

嗨,我更改了 projectJac 的声明,整个系统工作正常。我的更改如下:

原来的:

    auto projectJac = -pCamera->projectJac(xyz_trans);

修改:

    Eigen::Matrix<double, 2, 3> projectJac = -pCamera->projectJac(xyz_trans);

函数projectJac的定义如下:

Eigen::Matrix<double, 2, 3> Pinhole::projectJac(const Eigen::Vector3d &v3D) {
    Eigen::Matrix<double, 2, 3> Jac;
    Jac(0, 0) = mvParameters[0] / v3D[2];
    Jac(0, 1) = 0.f;
    Jac(0, 2) = -mvParameters[0] * v3D[0] / (v3D[2] * v3D[2]);
    Jac(1, 0) = 0.f;
    Jac(1, 1) = mvParameters[1] / v3D[2];
    Jac(1, 2) = -mvParameters[1] * v3D[1] / (v3D[2] * v3D[2]);
    printf("v3D: %f %f %f\n", v3D[0], v3D[1], v3D[2]);
    printf("Jac: %f %f %f %f %f %f\n", Jac(0, 0), Jac(0, 1), Jac(0, 2), Jac(1, 0), Jac(1, 1), Jac(1, 2));
    return Jac;
}

现在很明显该错误是由“自动”引起的。你能告诉我这是什么原因吗?我应该如何更改 Visual Studio 2019 中的设置以使“自动”正常工作?非常感谢。

4

0 回答 0