EVO进行轨迹评估
文章目录
1 前言
1.1 轨迹对齐
“对齐”(Alignment)通常指的是将两组数据(观测轨迹和真值)进行匹配的过程。这样做的目的是为了量化它们之间的差异,或者调整它们以使它们在空间或时间上更加一致。以下是几种常见的对齐方法和概念:
- 时间对齐:
- 如果轨迹数据在时间上不同步,时间对齐可能涉及重新采样或插值,以确保两个轨迹在相同的时间点上有对应的数据。
- 空间对齐:
- **空间对齐可能涉及平移、旋转或缩放(尺度)**操作,以使两个轨迹在空间位置上更加吻合。
- 特征对齐:
- 在某些情况下,可能需要提取轨迹的关键特征(如拐点、速度峰值等),并对这些特征进行对齐,以便更容易地比较它们的动态特性。
evo中还提到了投影、下采样以及滤波
1.2 尺度变换
实际上就是尺度的一个对齐,比如单目相机只有一个相对的尺度,而没有绝对尺度!
网上找一组图,表示对齐、尺度变换的作用!
1.3 绝对轨迹误差ATE和相对轨迹误差RTE
- 绝对轨迹误差计算的每一个点对(待评估轨迹的点与真值轨迹的点)的绝对值误差。
A T E a l l = 1 N ∑ i = 1 N ∣ log ( T g t , i − 1 T e s t i , i ) ∨ ∥ 2 2 , \mathrm{ATE}_{\mathrm{all}}=\sqrt{\frac{1}{N}\sum_{i=1}^{N}|\log(T_{\mathrm{gt},i}^{-1}T_{\mathrm{esti},i})^{\vee}\|_{2}^{2}}, ATEall=N1i=1∑N∣log(Tgt,i−1Testi,i)∨∥22,
- 相对轨迹误差计算的是,针对两条轨迹,分别计算第 k时刻和 k+Δ时刻的误差,然后这两个误差间再计算绝对值误差。
R P E a l l = 1 N − Δ t ∑ i = 1 N − Δ t ∥ log ( ( T g t , i − 1 T g t , i + Δ t ) ) − 1 ( T e s t i , i − 1 T e s t i , i + Δ t ) ) ∨ ∥ 2 2 , \mathrm{RPE}_{\mathrm{all}}=\sqrt{\frac{1}{N-\Delta t}\sum_{i=1}^{N-\Delta t}\|\log\left(\left(T_{\mathrm{gt},i}^{-1}T_{\mathrm{gt},i+\Delta t})\right)^{-1}\left(T_{\mathrm{esti},i}^{-1}T_{\mathrm{esti},i+\Delta t}\right)\right)^{\vee}\|_{2}^{2}}, RPEall=N−Δt1i=1∑N−Δt∥log((Tgt,i−1Tgt,i+Δt))−1(Testi,i−1Testi,i+Δt))∨∥22,
描述上面两种误差ATE、RTE的结果,evo一般会给出下面几种不同的标准,以绝对姿态误差为例,计算了最大误差、最小误差等等
max:最大误差
mean:平均误差
median:误差中位数
rmse:均方根误差
sse:和方差、误差平方和
std:标准差
1.4 绝对姿态误差APE和相对姿态误差RPE
这两个和上面两个的区别:计算ATE和RTE之前,需要进行轨迹对齐!如计算ATE需要对每一个姿态进行一个APE的计算。如果不对齐,那么误差就会很大!所以说,APE和RPE就像是ATE和RTE基础或原子操作!
2 安装evo
2.1 evo安装
- 查看
python
版本,用于安装不同版本的evo
# ubuntu18自带的
python --vesion
>>Python 2.7.17 # 根据GitHub提示,支持Python 2.7 的最后一个evo 版本是1.12.0
# ubuntu20自带,python2、3检查命令不一样
python3 --version
>>Python 3.8.10
- 源码编译(推荐)
git clone https://github.com/MichaelGrupp/evo.git # 选择1.27那个版本
cd evo
pip install --editable . --upgrade --no-binary evo -i https://pypi.tuna.tsinghua.edu.cn/simple # 源码编译的话,不需要自己安装依赖,依赖写在setup.py中,终端执行当前命令即可自动下载。
# 验证表明还是需要安装依赖,比如matplotlib
2.2 相关报错
- 可能会出现的报错,比如
matplotlib
没有安装成功,脚本路径问题
ERROR: seaborn 0.13.2 has requirement matplotlib!=3.6.1,>=3.4, but you'll have matplotlib 3.1.2 which is incompatible.
Installing collected packages: argcomplete, natsort, numpy, numexpr, pytz, python-dateutil, tzdata, pandas, zstandard, ruamel.yaml.clib, ruamel.yaml, rosbags, seaborn, evo
WARNING: The script natsort is installed in '/home/pj/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
WARNING: The scripts f2py, f2py3 and f2py3.8 are installed in '/home/pj/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
WARNING: The script rosbags-convert is installed in '/home/pj/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
2.2.1 版本不兼容问题
需要 Matplotlib
的版本在 3.4
以上,且不能是 3.6.1
。系统中安装的是 Matplotlib 3.1.2
,所以需要升级 Matplotlib
。
你可以使用以下命令来升级 Matplotlib
:
pip install --upgrade matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
如果你只想安装与 Seaborn 兼容的版本,可以这样做:
pip install "matplotlib!=3.6.1,>=3.4" -i https://pypi.tuna.tsinghua.edu.cn/simple
2.2.2 解决PATH警告
当安装的脚本不在 PATH 中时,可以将 ~/.local/bin
添加到你的 PATH 环境变量中。这可以通过修改 shell
配置文件 .bashrc
来实现 。
以下是步骤:
-
打开你的 shell 配置文件
gedit ~/.bashrc
-
在文件末尾添加以下行:
export PATH="$HOME/.local/bin:$PATH"
-
保存文件并关闭编辑器。
-
使修改生效:
source ~/.bashrc
2.3 测试
命令行输入evo
ubuntu@ubuntu:~/evo/evo-1.12.0$ evo
Initialized new /home/wheeltec-client/.evo/settings.json # 初始化
usage: evo [-h] {pkg,cat_log} ... # 使用方法
Python package for the evaluation of odometry and SLAM
Supported trajectory formats: # 支持数据格式
* TUM trajectory files
* KITTI pose files
* ROS bagfile with geometry_msgs/PoseStamped, geometry_msgs/TransformStamped,
geometry_msgs/PoseWithCovarianceStamped or nav_msgs/Odometry topics
* EuRoC MAV dataset groundtruth files
The following executables are available:
Metrics:
evo_ape - absolute pose error # 绝对姿态误差
evo_rpe - relative pose error # 相对姿态误差
Tools: # 几种常用工具
evo_traj - tool for analyzing, plotting or exporting multiple trajectories
evo_res - tool for processing multiple result files from the metrics
evo_ipython - IPython shell with pre-loaded evo modules
evo_fig - (experimental) tool for re-opening serialized plots
evo_config - tool for global settings and config file manipulation
3 evo指令
3.1 evo_traj
tum
evo_traj tum 0819_circle_01.txt 0819_circle_50.txt 0819_circle.txt --ref=0819_circle_enu_data.txt -p
-p
后面默认是--plot_mode=xyz
kitti
evo_traj kitti
euroc
evo_traj euroc MH_data1.csv MH_data3.csv -v --full_check
-v
: 以详细模式显示--full_check
: 对轨迹进行检查
3.2 evo_ape
-
用途:计算绝对位姿误差
-
绝对位姿误差常被用作比较估计轨迹和参考估计并计算整个轨迹误差的统计数据, 适用于测试轨迹的全局一致性。
-
命令语法: evo_ape 数据格式 参考轨迹 估计轨迹 可选项
- 数据格式:
euroc, tum, kitti
等
- 数据格式:
-
常用命令示例:
evo_ape tum 0819_circle_enu_data.txt 0819_circle_01.txt -v -as --plot --plot_mode xyz --save_plot ./I_W --save_results ./1.zip
命令含义: 考虑平移和旋转部分误差的ape, 进行平移和旋转对齐,以详细模式显示,画图并保存计算结果。
-
参数说明:
-r
: 即-pose_relation
, 此参数可选, 若不添加此参数,则默认为 trans_part。 有如下可选项:
可选项 含义 full
表示同时考虑旋转和平移误差得到的ape,无单位(unit-less) trans_part
考虑平移部分得到的ape,单位为m rot_part
考虑旋转部分得到的ape,无单位(unit-less) angle_deg
考虑旋转角得到的ape,单位°(deg) angle_rad
考虑旋转角得到的ape,单位弧度(rad) -
-v
: 表示verbose mode
, 详细模式 -
-a
:即-align
, 表示采用SE(3) Umeyama
对齐。 除了-a
外,其他可选项如下
命令 含义 -a/–align
采用 SE(3) Umeyama
对齐,只处理平移和旋转-as/–align --correct_scale
采用 Sim(3) Umeyama
对齐,同时处理平移旋转和尺度-s/–correct_scale
仅对齐尺度 -
-plot
: 表示画图--plot_mode
: 选择画图模式, 二维图或三维图,默认为xyz
, 可选项有[xy, xz, yz, zx, zy, xyz].
--save_plot
: 后跟保存图像的文件路径, 可以通过evo_config
命令设置, 常见的可以保存为png, pdf
等
-
-save_results
: 后跟存储结果的压缩文件路径, 如./VINS.zip
, 是一个压缩文件。 -
--help
: 显示帮助信息, 格式为: evo_ape 格式 --help , 如 evo_ape euroc --help
3.3 evo_rpe
-
用途:计算相对位子误差
-
相对位姿误差不进行绝对位姿的比较,相对位姿误差比较运动(姿态增量)。相对位姿误差可以给出局部精度,例如slam系统每米的平移或者旋转漂移量。
-
命令语法:
evo_ape
数据格式 参考轨迹 估计轨迹 可选项- 数据格式:
euroc, tum, kitti
等
- 数据格式:
-
常用命令示例:
evo_rpe euroc MH_data3.csv pose_graphloop.txt -r angle_deg \ --delta 1 --delta_unit m -va --plot --plot_mode xyz \ --save_plot ./VINSplot --save_results ./VINS.zip
命令含义: 求每米的旋转角的rpe,以详细模式显示,画图并保存计算结果。
-
参数说明:
-r
: 即 -pose_relation, 此参数可选, 若不添加此参数,则默认为 trans_part。具体参数选项内容 同 evo_ape,具体项可参见前一章节说明.-d/--delta
: 表示相对位姿之间的增量,后跟数值,默认为1, 然后通过 -u/–delta_unit 指定单位;-u/--delta_unit
: 表示增量的单位,可选参数为 f, d, r, m 分别表示 frames, deg, rad, meters 。默认为f。 当此参数为 f 时,则 -d/–delta必须为整型, 其余情况可谓浮点型;-d/–delta 和 -u/–delta_unit 联合起来表示衡量局部精度的单位,如 每米、每弧度、每百米等。-v --plot --plot_mode xyz --save_results results/VINS.zip --save_plot
: 这些参数同 evo_ape, 具体可参见前一章节说明。
3.4 evo_res
evo_res 1.zip 5.zip --save_table results_compare.csv
1.zip 5.zip
分别是两种不同算法的一个比较结果,通过上面算法的对比结果就可以得到其他的对比图!
处理多个轨迹
evo_res results/*.zip -p --save_table results/table.csv
evo_ape tum 0714_circle_enu_data.txt 0714_circle_01.txt -v -as --plot --plot_mode xyz --save_plot ./imu_wheel --save_results ./R1.zip
evo_ape tum 0714_circle_enu_data.txt 0714_circle_05.txt -v -as --plot --plot_mode xyz --save_plot ./imu_wheel_r5 --save_results ./R5.zip
evo_res *.zip -p --save_table 0714_circle.csv
3.5 evo_config 命令详解
- 用途:全局设置和配置文件的操作
命令 | 说明 |
---|---|
evo_config show | 查看设计文件中的参数配置 |
evo_config set | 进行参数设置 |
evo_config generate | 导出配置到指定的json文件 |
evo_config reset | 将参数还原到默认值 |
evo_config show|set|generate|reset help | 将参数还原到默认值 |
evo_config set
命令最为常用,下面是几个常用的参数,其含义以及可选项
参数 | 含义 | 可选项 |
---|---|---|
plot_export_format | 输出图像时图像存储格式 | 常用png,pdf等 |
plot_linewidth | 作图时线的宽度 | matplotlib支持的宽度,默认1.5 |
plot_reference_color | 图像中参考轨迹的颜色 | black,red,green等 |
plot_reference_linestyle | 参考轨迹的线型 | matplotlib支持的线型,默认– |
plot_seaborn_style | 图像背景和网格 | whitegrid,darkgrid,white,dark |
plot_split | 是否分开显示/存储图像 | false/true |
plot_figsize | 画图的图像大小 | 默认宽高均为6,可使用其他值 |
table_export_format | 表格数据输出格式 | 常用 csv,excel,latex,json |
-
命令示例
# 将画图背景更改成白色网格 evo_config set plot_seaborn_style whitegrid # 将字体改为衬线型并调为1.2倍大小 evo_config set plot_fontfamily serif plot_fontscale 1.2 # 将画图所使用的线型改为 evo_config set plot_reference_linestyle - # 将所画图的图像大小调整为10 9(宽 高) evo_config set plot_figsize 10 9 # 将参数还原到默认值 evo_config reset # 导出配置 evo_config generate --pose_relation angle_deg --delta 1 --delta_unit m --verbose --plot --out rpe_config.json # 导入配置 evo_rpe euroc MH_data3.csv pose_graphloop.txt -c rpe_config.json
4 evo支持数据格式
实际上对于原点来讲,画出它的轨迹,只需要知道平移即可。
4.1 KITTI
a b c d
e f g h
i j k l
0 0 0 1
# 保存轨迹的文件保留了变换矩阵T的前3行,即旋转和平移,每一个T在最终的轨迹文件中作为1行,如下顺序
a b c d e f g h i j k l
4.2 TUM
timestamp x y z q_x q_y q_z q_w # 每行都有 8 个数,其中包含时间戳(以秒为单位)、位置(平移)和方向(作为四元数),每个值之间用空格分隔:
4.3 euroc
# 有很多信息,只关注前面即可
timestamp x y z q_w q_x q_y q_z
4.4 将轨迹保存其它格式
--save_as_bag | --save_as_kitti | --save_as_tum | --save_as_bag2 | |
---|---|---|---|---|
bag | 是 | 是 | 是 | 是 |
euroc | 是 | 是 | 是 | 是 |
kitti | 否(无时间戳) | 是 | 否(无时间戳)* | 否(无时间戳) |
tum | 是 | 是 | 是 | 是 |
bag2 | 是 | 是 | 是 | 是 |
eg
# export a EuRoC groundtruth file to a TUM trajectory
evo_traj euroc data.csv --save_as_tum
# (will be saved as data.tum)
# export TUM trajectories to KITTI format
evo_traj tum traj_1.txt traj_2.txt traj_3.txt --save_as_kitti
# (will be saved as *.kitti)
# export TUM trajectories to ROS bagfile
evo_traj tum traj_1.txt traj_2.txt traj_3.txt --save_as_bag
# (will be saved as <timestamp>.bag with topics traj_1, traj_2 and traj_3)
# and so on...
本文参考如下链接:
SLAM轨迹精度评价工具evo简介与使用 (zhaoxuhui.top)
SLAM中的位姿与轨迹评价指标:APE、RPE、ATE、RTE (zhaoxuhui.top)
evo/notebooks/metrics.py_API_Documentation.ipynb at master · MichaelGrupp/evo (github.com)