问题描述
问题的全貌如下:
我从 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 (将#修改为@)