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  阅读(104)  评论(0)    收藏  举报