ORB-SLAM3测试TUM-VI数据集

        这是一个专门用于VI里程计评估的数据集,提供了多样化场景的序列。视觉里程计是一种 仅依靠摄像头获取的图像序列来估计相机自身在环境中的运动轨迹的技术。在不使用GPS或其他定位传感器的情况下,仅用摄像头就能跟踪自身位置和姿态变化。

1.数据集下载

下面是TUM-VI数据集的下载链接:

https://cvg.cit.tum.de/data/datasets/visual-inertial-dataset       

        为了评估视觉-惯性里程计(VI odometry)算法,数据集提供了多种类型的序列:包括全程都有真值的室内房间序列,以及在走廊、大厅、室外和滑道等场景中,只在序列开始和结束段提供真值的位置轨迹。这些序列覆盖了从常规室内环境到光照极差的封闭滑道等具有挑战性的场景。

        所有序列都经过处理,保证相机、IMU和真值数据在时间戳上的一致性,IMU进行了正确缩放和坐标对齐,并将真值坐标变换到IMU坐标系中,同时用中值滤波去除了部分异常值,确保数据质量。

       进入界面后找到下面的具体数据集下载,一定要找到正确的数据集序列,Dataset Sequences(数据集序列),Calibration Sequences(标定序列)。       

        同样的第一列代表着不同的应用场景,第二列和第三列就是上一章讲过的rosbag格式,适用于ros rgb-slam3,他们的区别是图片的大小不一样。第三,四列则为我们需要下载的。我是下载的corridor1的1024x1024大小的数据集。同样的下载好后将其解压到前面我们创建过的dataset文件夹里面。

        点进数据集后我们可以看见两个子文件夹,分别是dso和mav0。mav0 是 TUM VI 数据集的官方标准目录结构,包含 cam0, cam1, imu0 等子文件夹,适用于大多数基于视觉惯性里程计(VIO)的SLAM算法,比如 ORB-SLAM3、VINS-Mono 等。dso 是为了适配特定SLAM算法(如 DSO、DVSO)而整理的一个非官方的简化目录结构,通常只包含图像和少量文件,结构更简单但不完全兼容官方格式。所以我们通常选择使用mav0文件夹。

        在我们下载的序列文件中,本身就支持单目、双目、单目惯性和立体惯性等多种SLAM方法,关键在于SLAM系统如何调用数据:仅使用cam0文件夹为单目,使用cam0和cam1为双目,使用cam0、cam1和imu为立体惯性,使用cam0和imu为单目惯性。所以后续根据我们的需求去进行选择就可以了。

2.数据集测试

        TUM-VI数据集和euroc数据集不一样,mono_inertial_euroc 和 stereo_inertial_euroc 例子里显式创建了 Pangolin 窗口用于可视化,但 mono_tum_vi 例子里,作者默认关闭了可视化(即不创建Viewer)。如果我们想要实时的观察相机和点云的状态就需要对mono_tum_vi.cc文件进行修改,首先在/home/wgl/ORB_SLAM3/Examples/Monocular路径下找到mono_tum_vi.cc,进入后大概在92行左右找到下图代码,将MONOCULAR,false修改为true。

        然后我们需要重新编译让修改生效:

cd ~/ORB_SLAM3/build
cmake ..
make -j4

        完成上述步骤以后,我们在进行测试时就可以实时可视化界面了。

2.1单目相机(Monocular)

        我们直接从ORB_SLAM3文件夹进入终端(或者从根目录进入终端,再输入cd ORB_SLAM3),输入以下指令:

./Examples/Monocular/mono_tum_vi \
Vocabulary/ORBvoc.txt \
Examples/Monocular/TUM-VI.yaml \
/home/wgl/datasets/tum-vi/dataset-corridor1_512_16/mav0/cam0/data \##修改为自己的数据集存放路径
Examples/Monocular/TUM_TimeStamps/dataset-corridor1_512.txt \
dataset-corridor1_512_mono

        要注意的是,需要替换为自己的路径,最后一行的dataset-corridor1_512_mono会在运行结束以后,自动生成一个文件夹用来储存SLAM 运行过程中保存轨迹、地图和关键帧信息的二进制数据库。下图就是运行成功的截图,图中内容和个参数含义与上一章所讲解的euroc数据集一样就不再赘述,有需要可以去看上一章。

2.2 双目相机(Stereo)

        首先我们需要对yaml进行修改,ORB-SLAM3 Stereo 要求的参数名是:它期望的参数是以 Camera1. 开头,而不是 Camera.。在/home/wgl/ORB_SLAM3/Examples/Stereo路径下找到TUM-VI.yaml文件,找到第48,49行,将前面的Camera.修改为Camera1.。下图为我已经修改后的。

        完成上述步骤以后,还是从ORB_SLAM3进入终端,输入下列指令:

./Examples/Stereo/stereo_tum_vi Vocabulary/ORBvoc.txt \
Examples/Stereo/TUM-VI.yaml \
/home/wgl/datasets/tum-vi/dataset-corridor1_512_16/mav0/cam0/data \
/home/wgl/datasets/tum-vi/dataset-corridor1_512_16/mav0/cam1/data \
Examples/Stereo/TUM_TimeStamps/dataset-corridor1_512.txt \
dataset-corridor1_512_stereo

        同样的需要修改路径,分别指出左目和右目的路径,最后一行为自动生成一个文件夹用来储存SLAM 运行过程中保存轨迹、地图和关键帧信息的二进制数据库。

        下图为运行成功截图,会将左右视图都展示出来

2.3 单目-惯性(Monocular-Inertial)

        输入下列指令,只需要修改为自己的路径,即可运行。

./Examples/Monocular-Inertial/mono_inertial_tum_vi \
    Vocabulary/ORBvoc.txt \
    Examples/Monocular-Inertial/TUM-VI.yaml \
    /home/wgl/datasets/tum-vi/dataset-corridor1_512_16/mav0/cam0/data \
    Examples/Monocular-Inertial/TUM_TimeStamps/dataset-corridor1_512.txt \
    Examples/Monocular-Inertial/TUM_IMU/dataset-corridor1_512.txt \
    dataset-corridor1_512_monoi

2.4双目-惯性(Stereo-Inertial)

./Examples/Stereo-Inertial/stereo_inertial_tum_vi Vocabulary/ORBvoc.txt Examples/Stereo-Inertial/TUM-VI.yaml \
/home/wgl/datasets/tum-vi/dataset-corridor1_512_16/mav0/cam0/data \
/home/wgl/datasets/tum-vi/dataset-corridor1_512_16/mav0/cam1/data \
Examples/Stereo-Inertial/TUM_TimeStamps/dataset-corridor1_512.txt \
Examples/Stereo-Inertial/TUM_IMU/dataset-corridor1_512.txt \
dataset-corridor1_512_stereoi

        本次的数据集测试就结束了,后续可能会更新rosbag格式的数据集测试,以及ROS2和ORB-SLAM3的学习记录。

以下是使用 ORBSLAM3TUM 数据集并输出对齐后轨迹文件的 C++ 代码示例: ```c++ #include <iostream> #include <fstream> #include <sstream> #include <string> #include <iomanip> #include <opencv2/core/core.hpp> #include "System.h" using namespace std; int main(int argc, char **argv) { if(argc != 4) { cerr << endl << "Usage: ./mono_tum path_to_vocabulary path_to_settings path_to_dataset" << endl; return 1; } ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM3::System::MONOCULAR,true); ifstream fGroundTruth; fGroundTruth.open(argv[3] + string("/groundtruth.txt")); if(!fGroundTruth.is_open()) { cerr << endl << "Failed to open file: " << argv[3] + string("/groundtruth.txt") << endl; return 1; } ofstream fTrajectory; fTrajectory.open("trajectory.txt"); if(!fTrajectory.is_open()) { cerr << endl << "Failed to open file: trajectory.txt" << endl; return 1; } string sLine; int nLineNum = 0; while(getline(fGroundTruth,sLine)) { if(sLine.empty() || sLine[0] == &#39;#&#39;) continue; nLineNum++; double t; float tx, ty, tz, qx, qy, qz, qw; stringstream ss; ss << sLine; ss >> t >> tx >> ty >> tz >> qx >> qy >> qz >> qw; cv::Mat Tcw = SLAM.TrackMonocular(cv::Mat(),cv::Mat(),t); if(!Tcw.empty()) { cv::Mat Rwc = Tcw.rowRange(0,3).colRange(0,3).t(); cv::Mat twc = -Rwc*Tcw.rowRange(0,3).col(3); float x = twc.at<float>(0); float y = twc.at<float>(1); float z = twc.at<float>(2); float roll, pitch, yaw; ORB_SLAM3::Converter::QuaternionToEuler(qw,qx,qy,qz,roll,pitch,yaw); float scale = 1.0f; if(nLineNum > 1) { getline(fGroundTruth,sLine); double tPrev; float txPrev, tyPrev, tzPrev, qxPrev, qyPrev, qzPrev, qwPrev; stringstream ssPrev; ssPrev << sLine; ssPrev >> tPrev >> txPrev >> tyPrev >> tzPrev >> qxPrev >> qyPrev >> qzPrev >> qwPrev; cv::Mat Twc = cv::Mat::eye(4,4,CV_32F); ORB_SLAM3::Converter::QuaternionToMat(qxPrev,qyPrev,qzPrev,qwPrev,Twc.rowRange(0,3).colRange(0,3)); Twc.at<float>(0,3) = txPrev; Twc.at<float>(1,3) = tyPrev; Twc.at<float>(2,3) = tzPrev; cv::Mat Ow = Twc.rowRange(0,3).col(3); cv::Mat OwPrev = cv::Mat(3,1,CV_32F); OwPrev.at<float>(0) = txPrev; OwPrev.at<float>(1) = tyPrev; OwPrev.at<float>(2) = tzPrev; cv::Mat v = Ow - OwPrev; scale = cv::norm(v); } fTrajectory << fixed << setprecision(6) << t << " " << x << " " << y << " " << z << " " << roll << " " << pitch << " " << yaw << " " << scale << endl; } } fGroundTruth.close(); fTrajectory.close(); SLAM.Shutdown(); return 0; } ``` 注意事项: 1. 代码中的 `path_to_vocabulary` 和 `path_to_settings` 分别表示 ORB_SLAM3 的词汇文件和配置文件路径,需要根据实际情况进行修改。 2. 代码中的 `path_to_dataset` 表示 TUM 数据集所在的文件夹路径,需要根据实际情况进行修改。 3. 输出的对齐轨迹文件为 `trajectory.txt`,每行数据包括时间戳、位置坐标、欧拉角和尺度因子,用空格分隔。 4. 代码中使用了 Ground Truth 数据进行轨迹对齐,需要保证 TUM 数据集中的 `groundtruth.txt` 文件是存在并且格式正确的。如果没有 Ground Truth 数据,可以使用其它方法进行轨迹对齐。 希望对你有帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值