1、安装运行
1.1 下载&编译
cd catkin_ws/src
git clone https://github.com/rpng/open_vins.git
cd ..
catkin_make
1.2 EUROC 数据集运行
在EUROC数据集上测试,需要指定bag包的路径和设置轨迹保存的位置。
step1: 修改文件
pgeneva_ros_eth.launch 或者 pgeneva_serial_eth.launch中的 path_bag 参数,指定数据集的路径。
<param name="path_bag" type="string" value="/home/vslam/datasets/euroc/V1_01_easy.bag" />
<param name="path_gt" type="string" value="$(find ov_data)/euroc_mav/V1_01_easy.csv" />
step2: 设置轨迹输出
pgeneva_ros_eth.launch 或者 pgeneva_serial_eth.launch中的 dosave 和 dotime参数。
- dosave 表示是否保存轨迹,结果写入到traj_estimate.txt中;
- dotime 表示是否保存跟踪时间,结果写入到 traj_timing.txt文件中。
<!-- saving trajectory path and timing information -->
<arg name="dosave" default="true" />
<arg name="dotime" default="true" />
<arg name="path_est" default="$(find ov_msckf)/../traj_estimate.txt" />
<arg name="path_time" default="$(find ov_msckf)/../traj_timing.txt" />
注意:有和没有ros名称的launch文件只是判断是否是把bag包加载到程序中一起运行,没有ros的launch文件需要手动播放bag包
1.3 open_vins输出轨迹的格式
open_vins输出轨迹的每一行都包含时间戳(1维)、坐标(3维)、姿态四元数(4维)、姿态协方差矩阵(6维)、位置协方差矩阵(6维)共计20个数据
# timestamp(s) tx ty tz qx qy qz qw Pr11 Pr12 Pr13 Pr22 Pr23 Pr33 Pt11 Pt12 Pt13 Pt22 Pt23 Pt33
由于协方差矩阵是对称的因此使用协方差矩阵的上三角或者下三角的6个元素就可以确定协方差矩阵。
2、轨迹评估
open_vins 的轨迹评估脚本放在 ov_eval 文件夹中,主要包含以下三类(数据获取、格式转换、轨迹评估)
2.1 数据获取
从指定的topic上获取位姿数据,并存为txt文件中
支持的消息类型有:PoseWithCovarianceStamped, PoseStamped, TransformStamped, Odometry
<node name="recorder_estimate" pkg="ov_eval" type="pose_to_file" output="screen">
<param name="topic" type="str" value="/ov_msckf/poseimu" />
<param name="topic_type" type="str" value="PoseWithCovarianceStamped" />
<param name="output" type="str" value="/home/user/data/traj_log.txt" />
</node>
2.2 格式转换
提取 csv 文件的前八个字段,time(ns),px,py,pz,qw,qx,qy,qz,转成 time(s) x y z qx qy qz qw(把四元数转换成JPL的格式)
rosrun ov_eval format_convert <file.csv>
rosrun ov_eval format_convert <folder>
这个脚本可以用来转换TUM-VI数据集的真实值,使其符合OpenVINS的格式。OpenVINS只提供了room序列的真实值,剩下的可以通过该脚本进行转换。
2.3 轨迹评估
2.3.1 计算轨迹误差 error_singlerun
命令格式
rosrun ov_eval error_singlerun <align_mode> <file_gt.txt> <file_est.txt>
对单条输出轨迹进行评估,在终端输出轨迹的 ATE, RPE, RMSE, NEES。并绘制误差的3 sigma包络
rosrun ov_eval error_singlerun posyaw src/open_vins/ov_data/euroc_mav/MH_01_easy.txt OpenVINS_result/OpenVINS_traj_estimate_EUROC_MH01_1.txt
align_mode (对齐模式)参数的取值有: posyaw、posyawsingle、se3、se3single、sim3和none类型。
2.3.2 error_dataset
问题:有多个算法运行在数据集上的同一个序列上运行有结果,每个算法对单个序列运行多次,计算每个算法在这个序列上多次运行的平均RMSE,NEES
rosrun ov_eval error_dataset <align_mode> <file_gt.txt> <folder_algorithms>
这里算法输出的轨迹文件,必须要满足以下的命名格式[3] truth 存放轨迹的真实值。open_vins、okvis_stereo是算法的名字,dataset_name_1表示的是数据集中序列的名称,run1-3表示算法在该序列上多次运行的值。
truth/
dateset_name_1.txt
dateset_name_2.txt
algorithms/
open_vins/
dataset_name_1/
run1.txt
run2.txt
run3.txt
dataset_name_2/
run1.txt
run2.txt
run3.txt
okvis_stereo/
dataset_name_1/
run1.txt
run2.txt
run3.txt
dataset_name_2/
run1.txt
run2.txt
run3.txt
vins_mono/
dataset_name_1/
run1.txt
run2.txt
run3.txt
dataset_name_2/
run1.txt
run2.txt
run3.txt
例如:在TUM-VI数据集上的dataset-corridor1_512_16序列上得到了不同算法的结果,则truth文件夹下存有一个名为 dataset-corridor1_512_16.txt 的轨迹真实文件;在 algorithms文件夹中存有 open_vins的文件夹,且 open_vins 文件夹下 又有与 dataset-corridor1_512_16序列同名的文件夹,该文件夹下放的 run1.txt 表示第一次运行的轨迹。
使用实列如下:
rosrun ov_eval error_dataset posyaw src/open_vins/ov_data/tum_vi/dataset-corridor1_512_16.txt algorithms/
2.3.3 error_comparison
多个序列,多个算法,多次运行。这个命令可以理解为 error_dataset 的升级版。用于计算多个算法在多个序列的 ATE和 RPE。文件命名的方式与2.3.2的格式一致。
rosrun ov_eval error_comparison <align_mode> <folder_groundtruth> <folder_algorithms>
2.3.4 绘制轨迹 plot_trajectories
命令格式为:
- file_gt.txt 表示轨迹的真值
- align_mode ( posyaw、 posyawsingle、se3、 se3single、sim3、none、Identity)
rosrun ov_eval plot_trajectories <align_mode> <file_gt.txt> <file_est1.txt> ... <file_est9.txt>
对EUROC数据集运行结果测试:
rosrun ov_eval plot_trajectories posyaw src/open_vins/ov_data/euroc_mav/MH_01_easy.txt OpenVINS_result/OpenVINS_traj_estimate_EUROC_MH01_1.txt
3、时间分析工具 ov-timing
在 launch 文件中有 dotime参数设置是否保存跟踪时间,结果写入到 traj_timing.txt文件中。
<!-- saving trajectory path and timing information -->
<arg name="dosave" default="true" />
<arg name="dotime" default="true" />
<arg name="path_est" default="$(find ov_msckf)/../traj_estimate.txt" />
<arg name="path_time" default="$(find ov_msckf)/../traj_timing.txt" />
在使用该工具时要注意将时间输出打开。
traj_timing文件的输出格式是(每一行8个数据):
# timestamp (sec),tracking,propagation,msckf update,slam update,slam delayed,re-tri & marg,total
3.1 分析单个序列 timing_flamegraph
命令格式
rosrun ov_eval timing_flamegraph <file_times.txt>
实际运行
rosrun ov_eval timing_flamegraph OpenVINS_result/OpenVINS_traj_timing_EUROC_MH01_1.txt
3.2 分析不同算法 timing_comparison
用于比较不同算法的计算耗时
rosrun ov_eval timing_comparison <file_times1.txt> ... <file_timesN.txt>
注意:不同的算法输出的时间格式文件要和open_vins的timing格式文件一致
4、参考资料
[1] OpenVINS Github地址: https://github.com/rpng/open_vins
[2] OpenVINS详细文档: https://docs.openvins.com/
[3] ov-eval工具: https://docs.openvins.com/namespaceov__eval.html
[4] eval-timing 工具: https://docs.openvins.com/eval-timing.html
[5] Open_VINS初试:https://blog.csdn.net/weixin_39752599/article/details/105906652
[6] https://zhuanlan.zhihu.com/p/103593125