Ubuntu20.04下编译安装ORBSLAM2_with_pointcloud_map总结

与此物大战六个小时,终于解决所有问题,写此短文记录一下。

一、在github上下载源码后,解压缩,如下

  1. 进行g2o_with_orbslam2的编译

(1)报错信息:

ORBSLAM2_with_pointcloud_map/orbslam2_modified/g2o_with_orbslam2/g2o/types/slam2d/edge_se2_pointxy_bearing.cpp: In member function ‘virtual void g2o::EdgeSE2PointXYBearing::initialEstimate(const VertexSet&, g2o::OptimizableGraph::Vertex*)’:

/home/robot/g2o/g2o/types/slam2d/edge_se2_pointxy_bearing.cpp:50:52: error: no matching function for call to ‘g2o::SE2::setRotation(Eigen::Rotation2D::Scalar)’

t.setRotation(t.rotation().angle()+_measurement);

处理方法:

In g2o/types/slam2d/edge_se2_pointxy_bearing.cpp

change:

t.setRotation(t.rotation().angle()+_measurement);

to

t.setRotation((Eigen::Rotation2Dd)(t.rotation().angle()+_measurement));

(2)报错信息:

/usr/include/eigen3/Eigen/src/Core/util/StaticAssert.h:32: error: static assertion failed: YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY

#define EIGEN_STATIC_ASSERT(X,MSG) static_assert(X,#MSG);

处理方法:

打开g2o/solvers/linear_solver_eigen.h,将以下代码:

template

class LinearSolverEigen: public LinearSolver

{

public:

typedef Eigen::SparseMatrix<double, Eigen::ColMajor> SparseMatrix;

typedef Eigen::Triplet Triplet;

typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic, SparseMatrix::Index> PermutationMatrix;

改成

template

class LinearSolverEigen: public LinearSolver

{

public:

typedef Eigen::SparseMatrix<double, Eigen::ColMajor> SparseMatrix;

typedef Eigen::Triplet Triplet;

typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic, int> PermutationMatrix;

(3)报错信息:

MatrixExponential’ is not a member of ‘Eigen’

处理方法:打开g2o/examples/target/continuous_to_discrete.h

// bigB = expm(bigA)

//Eigen::MatrixExponential me(bigA);

//me.compute(bigB);

bigB = bigA.exp();

前三行代码注释掉,添加最后一行

(4)报错信息:

ORBSLAM2_with_pointcloud_map/orbslam2_modified/g2o_with_orbslam2/g2o/examples/tutorial_slam2d/simulator.cpp:80:39: required from here

/usr/include/eigen3/Eigen/src/Core/util/StaticAssert.h:32:40: error: static assertion failed: FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED

#define EIGEN_STATIC_ASSERT(X,MSG) static_assert(X,#MSG);

处理方法:

打开g2o/g2o/examples/tutorial_slam2d/simulator.cpp:80行

VectorXd probLimits(MO_NUM_ELEMS);

改为

VectorXd probLimits; probLimits.resize(MO_NUM_ELEMS);

到此,g2o编译完成。

二、接着,进行源码编译,进入ORB_SLAM2_modified文件夹

  1. 我在直接执行build.sh时,出现bug(各种库版本问题,如opencv和pcl,按照我的方法可以解决这些问题),所以自行编译安装了

首先需要在Cmakelist。txt里把opencv版本要求注释掉,在添加位C++14编译,在第四行

由于build.sh始终编译不过,故放弃,选择自己编译

mkdir build
cd build
cmake ..
make
  1. 编译过成中出现诸多错误,一一列举出来

(1)g2o编译出错(在src下Optimizer.cc下有三处错误,错误原因一致,一一修改即可)

如error: no matching function for call to ‘g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::BlockSolver(g2o::BlockSolver<g2o::BlockSolverTraits<6, 3> >::LinearSolverType*&)’

解决方法:

(I)

//g2o::BlockSolver_6_3 * solver_ptr = new g2o::BlockSolver_6_3(linearSolver); // line 356

g2o::BlockSolver_6_3 * solver_ptr = new g2o::BlockSolver_6_3(std::unique_ptr<g2o::BlockSolver_6_3::LinearSolverType> (linearSolver));

//g2o::OptimizationAlgorithmLevenberg * solver = new g2o::OptimizationAlgorithmLevenberg(solver_ptr); // line 357

g2o::OptimizationAlgorithmLevenberg * solver = new g2o::OptimizationAlgorithmLevenberg(std::unique_ptr<g2o::BlockSolver_6_3> (solver_ptr));

(II)

//g2o::BlockSolver_7_3 * solver_ptr = new g2o::BlockSolver_7_3(linearSolver); // line 356

g2o::BlockSolver_7_3 * solver_ptr = new g2o::BlockSolver_7_3(std::unique_ptr<g2o::BlockSolver_7_3::LinearSolverType> (linearSolver));

//g2o::OptimizationAlgorithmLevenberg * solver = new g2o::OptimizationAlgorithmLevenberg(solver_ptr); // line 357

g2o::OptimizationAlgorithmLevenberg * solver = new g2o::OptimizationAlgorithmLevenberg(std::unique_ptr<g2o::BlockSolver_7_3> (solver_ptr));

(III)

//g2o::BlockSolverX * solver_ptr = new g2o::BlockSolverX(linearSolver);

g2o::BlockSolverX * solver_ptr = new g2o::BlockSolverX(std::unique_ptr<g2o::BlockSolverX::LinearSolverType> (linearSolver));

//g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg(solver_ptr);

g2o::OptimizationAlgorithmLevenberg* solver = new g2o::OptimizationAlgorithmLevenberg(std::unique_ptr<g2o::BlockSolverX> (solver_ptr));

(2)编译Example下的例程出错,根据提示可知

分别进入各个报错源文件,按照上图所示一一进行修改即可

  1. 到此,编译问题解决,可以直接运行代码看效果了

./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt  Examples/RGB-D/TUM1.yaml data1/rgbd_dataset_freiburg1_xyz/ Examples/RGB-D/associations.txt 

(1)发现viewer界面是黑的,由此,修改代码

在ORB_SLAM2_modified/include/Tracking.h添加

    // Current Frame
    Frame mCurrentFrame;
    cv::Mat mImRGB; //添加这行
    cv::Mat mImGray;
    cv::Mat mImDepth;

在ORB_SLAM2_modified/src/Tracking.cc修改2处

cv::Mat Tracking::GrabImageRGBD(const cv::Mat &imRGB,const cv::Mat &imD, const double &timestamp)
{
    mImRGB = imRGB;//添加这行
    mImGray = imRGB;
    mImDepth = imD;

第二处

    // insert Key Frame into point cloud viewer
    //mpPointCloudMapping->insertKeyFrame( pKF, this->mImGray, this->mImDepth );
    mpPointCloudMapping->insertKeyFrame( pKF, this->mImRGB, this->mImDepth ); //修改地方

如果修改这些还不能显示,可以试着滑动鼠标滚轮,把点云缩小,即可显示

(2)保存彩色点云地图

修改ORB_SLAM2_modified/src/pointcloudmapping.cc,在其中调用 PCL 库的pcl::io::savePCDFileBinary函数就可以保存点云地图了

加入头文件

#include <pcl/io/pcd_io.h>

在 void PointCloudMapping::viewer() 函数中( 123 行附近)加入保存地图的命令,最后样式如下:

...
for ( size_t i=lastKeyframeSize; i<N ; i++ )
{
    PointCloud::Ptr p = generatePointCloud( keyframes[i], colorImgs[i], depthImgs[i] );
    *globalMap += *p;
}
pcl::io::savePCDFileBinary("vslam.pcd", *globalMap);   // 只需要加入这一句
...

修改之后重新编译程序

并且安装相应的工具,就可以查看生成的文件

#安装
sudo apt-get install pcl-tools
#查看
pcl_viewer vslam.pcd

大功告成!!!!

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值