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包,先尝试第一种方法
主要参考:
但是其中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;
}
其步骤:
- 将向量v转化为四元数q
- 将四元数q转化为3x3的矩阵eigMat
- 再将矩阵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分区内存不足,扩充内存可以看这篇博客:
然而我嫌麻烦,因为这个不是硬需求,所以我果断关闭了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文件夹下存在该二进制文件: