ORB-SLAM2地图保存

ORB-SLAM2地图保存

ORB-SLAM2没有提供保存地图的接口函数,因此无法实现地图的保存

// Save camera trajectory in the TUM RGB-D dataset format.
// Only for stereo and RGB-D. This method does not work for monocular.
// Call first Shutdown()
// See format details at: http://vision.in.tum.de/data/datasets/rgbd-dataset
void SaveTrajectoryTUM(const string &filename);

// Save keyframe poses in the TUM RGB-D dataset format.
// This method works for all sensor input.
// Call first Shutdown()
// See format details at: http://vision.in.tum.de/data/datasets/rgbd-dataset
void SaveKeyFrameTrajectoryTUM(const string &filename);

// Save camera trajectory in the KITTI dataset format.
// Only for stereo and RGB-D. This method does not work for monocular.
// Call first Shutdown()
// See format details at: http://www.cvlibs.net/datasets/kitti/eval_odometry.php
void SaveTrajectoryKITTI(const string &filename);

// TODO: Save/Load functions
// SaveMap(const string &filename);
// LoadMap(const string &filename);

目前了解到有两种解决方法,第一种就是自己写接口函数,第二种就是用GitHub上的orb_slam2_ros包,先尝试第一种方法

主要参考:

https://blog.csdn.net/qq_40216084/article/details/115229031

但是其中static cv::Mat Converter::toCvMat(const std::vector& v)函数明显有误

cv::Mat toCvMat(const std::vector<float>& v)
{
    Eigen::Quaterniond q;
    q.x() = v[0];
    q.y() = v[1];
    q.z() = v[2];
    q.w() = v[3];
 
    Eigen::Matrix<double,3,3> eigMat(q);
    cv::Mat M = toCvMat(eigMat);
    return M;
}

其步骤:

  1. 将向量v转化为四元数q
  2. 将四元数q转化为3x3的矩阵eigMat
  3. 再将矩阵eigMat作为参数传入toCvMat( )函数????

所以这部分我自己做了修改,其实就加了双层循环而已,如下:

cv::Mat Converter::toCvMat(const std::vector<float>& v)
{
    Eigen::Quaterniond q;
    q.x() = v[0];
    q.y() = v[1];
    q.z() = v[2];
    q.w() = v[3];
 
    Eigen::Matrix<double,3,3> eigMat(q);
    cv::Mat M;
    for(int i=0;i<3;++i)
    {
        for(int j=0;j<3;++j)
        {
            M.at<double>(i,j)=eigMat(i,j);
        }    
    }    
    return M;
}

我是在mono_tum.cc里面添加的

SLAM.SaveMap("MPandKF.bin");

因此要编译这个.cc文件

gcc -std=c++11 mono_tum.cc

然而报错:

请添加图片描述

说没有System.h这个文件,可是Structure里面明明有这个文件啊,Goole了一下,有人也遇到了这个问题

https://github.com/raulmur/ORB_SLAM2/issues/107

题主说是rebuild了一下,所以我就在ORB-SLAM2目录下重新运行:

./build.sh

结果却报错:

virtual memory exhausted: Cannot allocate memory

是由于Linux虚拟内存不足造成的,或者说是swap分区内存不足,扩充内存可以看这篇博客:

https://blog.csdn.net/cliukai/article/details/93988721

然而我嫌麻烦,因为这个不是硬需求,所以我果断关闭了VS Code,再次build,编译成功

后来发现./build.sh有点蠢,读了CMakeLists.txt文件,发现只要在build文件夹下:

cmake ..
make -j8

进行常规的编译操作就行

OK,进行最后一步,在ORB-SLAM2目录下打开终端,运行:

./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml ../rgbd_dataset_freiburg1_desk

一切顺利,地图保存成功

请添加图片描述

在ORB-SLAM2文件夹下存在该二进制文件:

请添加图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值