在 Windows 上的发布模式下,本征矩阵产品在 ORB-SLAM3 中无法正常工作

问题描述

问题的全貌如下:

我从 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,-z,x,y,-x,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[10]);
    printf("j: %f %f %f %f %f %f\n",buf[11]);
}

函数在release模式下无法正常工作,如日志所示:(ja是其他函数打印的projectJac的内容

杰克: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,3> Pinhole::projectJac(const Eigen::Vector3d &v3D) {
    Eigen::Matrix<double,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),1),2),Jac(1,2));
    return Jac;
}

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)