evo评测vioslam步骤
参考博客:http://www.liuxiao.org/2017/11/%e4%bd%bf%e7%94%a8-evo-%e5%b7%a5%e5%85%b7%e8%af%84%e6%b5%8b-vi-orb-slam2-%e5%9c%a8-euroc-%e4%b8%8a%e7%9a%84%e7%bb%93%e6%9e%9c/#comment-3807
一.系统环境
ubuntu16.04
二.安装和更新evo
以下安装步骤均可
1)使用 pip3 安装
执行如下命令:
pip3 install evo --upgrade
2)使用源码进行安装
- git clone https://github.com/MichaelGrupp/evo.git
- cd evo
- pip install . --upgrade
三、修改 System 保存 TUM 观测值
由于 ORB SLAM2 并没有提供单目相机或者 VIO 保存 EuRoC 形式数据的方式,这里我们仍然使用 SaveTrajectoryTUM 方法保存观测值。
不过需要注意的是,由于 SaveTrajectoryTUM 不允许保存单目相机数据,我们修改一下创建一个新的函数 SaveTrajectory 用来保存单目 VIO 数据。
1)在 System.h 中添加函数头:
- void SaveTrajectory(const string &filename);
2)在 System.cc 中添加函数体:
void System::SaveTrajectory(const string &filename) {
cout << endl << "Saving camera trajectory to " << filename << " ..." << endl;
vector<KeyFrame*> vpKFs = mpMap->GetAllKeyFrames();
sort(vpKFs.begin(),vpKFs.end(),KeyFrame::lId);
// Transform all keyframes so that the first keyframe is at the origin.
// After a loop closure the first keyframe might not be at the origin.
cv::Mat Two = vpKFs[0]->GetPoseInverse();
ofstream f;
f.open(filename.c_str());
f << fixed;
// Frame pose is stored relative to its reference keyframe (which is optimized by BA and pose graph).
// We need to get first the keyframe pose and then concatenate the relative transformation.
// Frames not localized (tracking failure) are not saved.
// For each frame we have a reference keyframe (lRit), the timestamp (lT) and a flag
// which is true when tracking failed (lbL).
list<ORB_SLAM2::KeyFrame*>::iterator lRit = mpTracker->mlpReferences.begin();
list<double>::iterator lT = mpTracker->mlFrameTimes.begin();
list<bool>::iterator lbL = mpTracker->mlbLost.begin();
for(list<cv::Mat>::iterator lit=mpTracker->mlRelativeFramePoses.begin(),
lend=mpTracker->mlRelativeFramePoses.end();lit!=lend;lit++, lRit++, lT++, lbL++)
{
if(*lbL)
continue;
KeyFrame* pKF = *lRit;
cv::Mat Trw = cv::Mat::eye(4,4,CV_32F);
// If the reference keyframe was culled, traverse the spanning tree to get a suitable keyframe.
while(pKF->isBad())
{
Trw = Trw*pKF->mTcp;
pKF = pKF->GetParent();
}
Trw = Trw*pKF->GetPose()*Two;
cv::Mat Tcw = (*lit)*Trw;
cv::Mat Rwc = Tcw.rowRange(0,3).colRange(0,3).t();
cv::Mat twc = -Rwc*Tcw.rowRange(0,3).col(3);
vector<float> q = Converter::toQuaternion(Rwc);
f << setprecision(6) << *lT << " " << setprecision(9) << twc.at<float>(0) << " " << twc.at<float>(1) << " " << twc.at<float>(2) << " " << q[0] << " " << q[1] << " " << q[2] << " " << q[3] << endl;
}
f.close();
cout << endl << "trajectory saved!" << endl; }
四.修改ros参数文件
1)修改VIORB的ROS代码
打开/home/lry/LearnVIORB-RT/Examples/ROS/ORB_VIO/src/ros_vio.cc
修改函数为
- SLAM.SaveTrajectory(config._tmpFilePath+“trajectory.txt”);
2)修改VIORB参数文件
打开参数文件/home/lry/LearnVIORB-RT/config/euroc.yaml
修改test.InitVIOTmpPath为运行时轨迹信息的存储路径
- /home/lry/Data/EuRoc/MH_01_easy
修改bagfile为数据集的存储路径
- /home/lry/数据集/MH_01_easy.bag
五.下载euroc数据集真值数据
https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets
到上述网址下载zip后缀文件,解压后的cav后缀文件为groundtruth信息。
其中state_groundtruth_estimate0文件内的data.cav为数据集路径真值。
六.使用evo进行评测
运VIORB系统,等待数据集运行完毕后,crtl+c结束,观测值将会保存在之前设定的文件夹内。
其中trajectory.txt文件为路径观测值
- evo_ape euroc Data/EuRoC/V1_01_easy/state_groundtruth_estimate0/data2.csv
Data/EuRoC/CameraTrajectory.txt -va --plot --save_results results/ORB.zip
运行以上命令即可得到评测数据。
运行过程中出现的问题:
在使用evo评测的过程中,可能会出现numpy的版本过低的问题,解决方法为使用sudo su得到管理员权限后终端输入以下命令完成升级:
- pip install -U numpy
上一篇: 乱七八糟:图像滤波小demo
下一篇: tiny-yoloV3消化之旅(前言)
推荐阅读
-
3D TLC经典之作 三星860 EVO 250GB详细图文评测
-
2018新款X1 Tablet Evo值得买吗?ThinkPad X1 Tablet Evo二合一商务本评测
-
翻转本的巅峰之作!微星高端商务本Summit E13 Flip Evo评测
-
三星970 EVO PLUS和三星970 EVO固态硬盘区别对比评测
-
三星970 EVO Plus怎么样 三星970 EVO Plus体验评测
-
三星860 EVO 1TB SSD怎么样?三星860 EVO 1TB SSD评测:寿命大涨3倍
-
三星970 EVO Plus 1TB版怎么样 三星970 EVO Plus 1TB版评测
-
三星970 EVO Plus和980 PRO哪个好 三星970 EVO Plus对比980 PRO评测
-
小米笔记本Pro 15增强版评测:绝对大师级OED屏幕 Intel Evo认证保证闭眼买买买
-
2018新款X1 Tablet Evo值得买吗?ThinkPad X1 Tablet Evo二合一商务本评测