orbslam3_docker 实践 EuRoC 数据集

git clone https://github.com/jahaniam/orbslam3_docker.git
cd orbslam3_docker
./download_dataset_sample.sh

├── Datasets
│   └── EuRoC
│   └── MH01
│   └── mav0
│   ├── cam0
│   │   └── data
│   ├── cam1
│   │   └── data
│   ├── imu0
│   ├── leica0
│   └── state_groundtruth_estimate0

./build_container_cuda.sh
docker ps
docker exec -it container_id bash

cd /ORB_SLAM3/Examples
# 单目+IMU
./Monocular-Inertial/mono_inertial_euroc ../Vocabulary/ORBvoc.txt ./Monocular-Inertial/EuRoC.yaml /Datasets/EuRoC/MH01 ./Monocular-Inertial/EuRoC_TimeStamps/MH01.txt dataset-MH01_monoi

单目

./Monocular/mono_euroc ../Vocabulary/ORBvoc.txt ./Monocular/EuRoC.yaml /Datasets/EuRoC/MH01 ./Monocular/EuRoC_TimeStamps/MH01.txt dataset-MH01_mono

但是没有任何可视化,因此修改了代码:

https://github.com/jahaniam/orbslam3_docker/issues/21#issuecomment-1887284443

false 改为 true

cd /ORB_SLAM3/build
make -j8
cd /ORB_SLAM3/Examples
./Monocular/mono_euroc ../Vocabulary/ORBvoc.txt ./Monocular/EuRoC.yaml /Datasets/EuRoC/MH01 ./Monocular/EuRoC_TimeStamps/MH01.txt dataset-MH01_mono

跑自己的数据集

./Monocular/mono_dji ../Vocabulary/ORBvoc.txt ./Monocular/Dji.yaml /Datasets/DJI6-phantom3-village-unified ./Monocular/Dji_TimeStamps/DJI6-phantom3-village-unified.txt dataset-Dji-village_mono

增加保存点云的代码:

ORB_SLAM3/include/System.h:160:

void SavePointCloud(const string &filename);

ORB_SLAM3/src/System.cc:1175:

void System::SavePointCloud(const string &filename){
// Code is based on MapDrawer::DrawMapPoints()
cout << endl << "Saving map point coordinates to " << filename << " ..." << endl;
cout << endl << "Number of maps is: " << mpAtlas->CountMaps() << endl;

// TODO Get all maps or is the current active map is enough?
// vector<Map*> vpAllMaps = mpAtlas->GetAllMaps()

Map* pActiveMap = mpAtlas->GetCurrentMap();
if(!pActiveMap) {
cout << endl << "There is no active map (pActiveMap is null)" << endl;
return;
}

// Vectors containing pointers to MapPoint objects contained in the maps
// Vector of pointers for Map Points -- vpMPs
// Vector of pointers for Reference Map Points -- vpRefMPs
// TODO figure out the difference between Reference Map Points and normal Map Points
const vector<MapPoint> &vpMPs = pActiveMap->GetAllMapPoints();
const vector<MapPoint
> &vpRefMPs = pActiveMap->GetReferenceMapPoints();

if(vpMPs.empty()){
cout << endl << "Vector of map points vpMPs is empty!" << endl;
return;
}

// Use a set for fast lookup of reference frames
set<MapPoint*> spRefMPs(vpRefMPs.begin(), vpRefMPs.end());

// Get the output file stream in fixed-point format for map points
ofstream f;
f << "pos_x, pos_y, pos_z";
f.open(filename.c_str());
f << fixed;

// TODO figure out if we need to consider whether the presence of IMU
// requires some transforms/exceptions

// Iterate over map points, skip "bad" ones and reference map points
for (size_t i=0, iend=vpMPs.size(); i<iend;i++)
{
if (vpMPs[i]->isBad() || spRefMPs.count(vpMPs[i])){
continue;
}
Eigen::Matrix<float,3,1> pos = vpMPs[i]->GetWorldPos();
f << pos(0) << ", " << pos(1) << ", " << pos(2) << endl;
}

// Close the output stream
f.close();

// Get the output file stream in fixed-point format for reference map points
f.open(("ref_" + filename).c_str());
f << "pos_x, pos_y, pos_z" << endl;
f << fixed;

// Iterate over reference map points, skip if bad
for (set<MapPoint>::iterator sit=spRefMPs.begin(), send=spRefMPs.end(); sit!=send; sit++)
{
if((
sit)->isBad()){
continue;
}
Eigen::Matrix<float,3,1> pos = (*sit)->GetWorldPos();
f << pos(0) << ", " << pos(1) << ", " << pos(2) << endl;
}

// Close the output stream
f.close();
}

posted @ 2025-02-27 14:10  Zenith_Hugh  阅读(329)  评论(0)    收藏  举报