VINS-Mono運行


  • 修改

修改地圖保存的路徑
因為我們現在跑的是euroc數據集,所以我們要修改的地方有兩處。

euroc_config.yaml中的pose_graph_save_path項
pose_graph_save_path: "/home/kk/自己的路徑/"


euroc_config.yaml中的output_path項
output_path: "/home/kk/自己的路徑/"
上述""里填寫自己的路徑,先創建好該路徑,注意最后面有個/,代表着是一個文件夾。

修改完之后,記得在ros工作空間中重新編譯一下catkin_make。

  • 保存

運行程序,待地圖跑完之后,在運行 roslaunch vins_estimator euroc.launch 的terminal中,輸入 “s” ,並按下回車鍵Enter,等待地圖保存,我電腦花了20秒左右的時間。

  • ground truth與軌跡同時可見

如果想看到軌跡的同時,看到數據集的ground truth,我們可以再打開一個terminal,執行:

roslaunch benchmark_publisher publish.launch sequence_name:=MH_01_easy

  • 重載地圖

首先要修改兩處地方:

euroc_config.yaml的load_previous_pose_graph,置1
euroc_config.yaml的fast_relocalization,置1
第一項的意思是使能重新加載地圖功能,第二項是快速重定位。(你可以先不改第二項試試看,然后再改,看看有什么不同),修改完之后重新編譯catkin_make。

重新運行程序,會發現先加載了地圖,顏色是黃色的。

  • evo工具

evo工具用過沒?一個評測SLAM的工具,可以比較不同SLAM的算法精度,軌跡等等。evo支持好幾種數據集的格式,tum、euroc等等。怎么裝?github找去。

常見的參數如下:

evo_config:用於保存配置文件,把自己常用的參數保存為.json文件,避免每次輸入。
evo_traj:用於繪制軌跡,支持的格式有kitti,eurco,tum 數據集等,也可以用於驗證數據是否有效,導出為其他格式等。
evo_res:可用於比較指標中的多個結果文件(打印消息和統計消息,繪制結果,將統計信息保存在表內)
evo_ape :計算絕對位姿誤差
evo_rpe:計算相對位姿誤差

另外可以參考https://www.cnblogs.com/liuzhenbo/p/12254844.html

  • 修改

修改數據格式
這邊我只測試了evo_traj,也就是畫出它的軌跡。問題來了,vins-mono保存的軌跡沒法直接用,因為它既不符合tum數據集的格式,又不符合euroc數據集的格式。那怎么辦,改唄。

修改以下文件:

visualization.cpp中pubOdometry()函數

// write result to file
ofstream foutC(VINS_RESULT_PATH, ios::app);
foutC.setf(ios::fixed, ios::floatfield);
foutC.precision(0);
foutC << header.stamp.toSec() * 1e9 << ",";
foutC.precision(5);
foutC << estimator.Ps[WINDOW_SIZE].x() << ","
<< estimator.Ps[WINDOW_SIZE].y() << ","
<< estimator.Ps[WINDOW_SIZE].z() << ","
<< tmp_Q.w() << ","
<< tmp_Q.x() << ","
<< tmp_Q.y() << ","
<< tmp_Q.z() << ","
<< estimator.Vs[WINDOW_SIZE].x() << ","
<< estimator.Vs[WINDOW_SIZE].y() << ","
<< estimator.Vs[WINDOW_SIZE].z() << "," << endl;
write result to file

改為

  ofstream foutC(VINS_RESULT_PATH, ios::app);
        foutC.setf(ios::fixed, ios::floatfield);
        foutC.precision(0);
        foutC << header.stamp.toSec() << " ";
        foutC.precision(5);
        foutC << estimator.Ps[WINDOW_SIZE].x() << " "
              << estimator.Ps[WINDOW_SIZE].y() << " "
              << estimator.Ps[WINDOW_SIZE].z() << " "
              << tmp_Q.x() << " "
              << tmp_Q.y() << " "
              << tmp_Q.z() << " "
              << tmp_Q.w() << endl;

 

pose_graph.cpp中的updatePath()函數

            ofstream loop_path_file(VINS_RESULT_PATH, ios::app);
            loop_path_file.setf(ios::fixed, ios::floatfield);
            loop_path_file.precision(0);
            loop_path_file << (*it)->time_stamp * 1e9 << ",";
            loop_path_file.precision(5);
            loop_path_file  << P.x() << ","
                  << P.y() << ","
                  << P.z() << ","
                  << Q.w() << ","
                  << Q.x() << ","
                  << Q.y() << ","
                  << Q.z() << ","
                  << endl;

改為

  ofstream loop_path_file(VINS_RESULT_PATH, ios::app);
            loop_path_file.setf(ios::fixed, ios::floatfield);
            loop_path_file.precision(0);
            loop_path_file << (*it)->time_stamp << " ";
            loop_path_file.precision(5);
            loop_path_file  << P.x() << " "
                            << P.y() << " "
                            << P.z() << " "
                            << Q.x() << " "
                            << Q.y() << " "
                            << Q.z() << " "
                            << Q.w() << endl;

 

pose_graph.cpp文件中addKeyFrame()函數

        ofstream loop_path_file(VINS_RESULT_PATH, ios::app);
        loop_path_file.setf(ios::fixed, ios::floatfield);
        loop_path_file.precision(0);
        loop_path_file << cur_kf->time_stamp * 1e9 << ",";
        loop_path_file.precision(5);
        loop_path_file  << P.x() << ","
              << P.y() << ","
              << P.z() << ","
              << Q.w() << ","
              << Q.x() << ","
              << Q.y() << ","
              << Q.z() << ","
              << endl;

改為

 ofstream loop_path_file(VINS_RESULT_PATH, ios::app);
        loop_path_file.setf(ios::fixed, ios::floatfield);
        loop_path_file.precision(0);
        loop_path_file << cur_kf->time_stamp << " ";
        loop_path_file.precision(5);
        loop_path_file  << P.x() << " "
                        << P.y() << " "
                        << P.z() << " "
                        << Q.x() << " "
                        << Q.y() << " "
                        << Q.z() << " "
                        << Q.w() << endl;

 

pose_graph_node.cpp中的main()函數
原本是csv文件,改成txt。

        VINS_RESULT_PATH = VINS_RESULT_PATH + "/vins_result_loop.txt";

 

好了,修改完成,重新編譯catkin_make。

 

  • 使用evo繪制軌跡

修改VINS跑出來的軌跡格式在上一步已經完成

重新運行程序,會發現在剛剛保存地圖的路徑,生成了一個文件:vins_result_loop.txt

經過我們上面的修改,該文件是符合tum格式的。

 

修改數據集中的真實軌跡格式

雖然我們使用的是euroc數據集,但evo只支持tum格式的繪制,它提供了euroc格式轉tum格式的工具。首先我們打開數據集的state_groundtruth_estimate0/文件夾,會發現有一個文件:data.csv。這是一個euroc格式的文件,我們首先要把他轉成tum格式。輸入以下命令:

evo_traj euroc data.csv --save_as_tum

生成data.tum

好了,接下來就可以繪制軌跡了!

 

在數據集的state_groundtruth_estimate0/文件夾下輸入

evo_traj tum ../../../../YOUR_MAP_PATH/vins_result_loop.txt  --ref=data.tum -p --plot_mode=xyz --align --correct_scale

記得把YOUR_MAP_PATH修改成你的地圖路徑。

真是beautiful。其中虛線代表ground truth,藍線代表vins的軌跡。

 

  • 與其他系統作對比

與雙目ORB_SLAM2進行對比
ORB_SLAM2的軌跡在每次運行都會生成姿態軌跡,貌似不用修改文件

evo_traj tum VINS_MAP_PATH/vins_result_loop.txt ORB_SLAM2_PATH/ORB_SLAM2-master/CameraTrajectory.txt --ref=data.tum -p --plot_mode=xyz --align --correct_scale

 

參考大神的文章!感謝!鏈接https://blog.csdn.net/Hanghang_/article/details/104535370

 

其他參考

翻譯了github上VINS-Mono的文章https://blog.csdn.net/learning_tortosie/article/details/83182258

大神的文章https://blog.csdn.net/houlianfeng/article/details/79525854

在17.12.29,VINS更新了代碼加入了新的特征,包括map merge( 地圖合並), pose-graph reuse(位姿圖重利用), online temporal calibration function(在線時間校准函數), and support rolling shutter camera(支持卷簾快門相機)

大神的文章https://blog.csdn.net/houlianfeng/article/details/79626657#commentBox

在前一篇博文里介紹了VINS-mono pose_graph reuse功能的使用,這里接着貼出一些延伸的測試,並進行一些探討。

開源方案對比https://blog.csdn.net/whut_chengjun/article/details/103938022

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM