- 修改
修改地圖保存的路徑
因為我們現在跑的是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