evo工具的安装与使用
本文最后更新于 2024年10月15日 上午
本文主要分享了用于评估里程计和SLAM的Python工具包evo的安装与使用。
概述
该软件包提供了可执行文件和一个小型库,用于处理、评估和比较里程计和 SLAM 算法的轨迹输出。
支持的轨迹格式:
- TUM轨迹文件
- KITTI位姿文件
- EuRoC MAV(
*.csv
真值和TUM轨迹文件) - 带有
geometry_msgs/PoseStamped
、geometry_msgs/TransformStamped
、geometry_msgs/PoseWithCovarianceStamped
、geometry_msgs/PointStamped
或nav_msgs/Odometry
主题或 TF 消息的 ROS 和 ROS2 bag文件
安装/升级/卸载
安装/升级
-
如果您只想使用最新发行版本的可执行文件,最简单的方法是运行:
1
2sudo apt install python-pip # python3-pip
pip install evo --upgrade --no-binary evo # 或pip3,需要注意ros只支持python2 -
源码安装,可其中提供的一些工具比如格式转换:
1
2
3
4sudo apt install python-pip # python3-pip
git clone https://github.com/MichaelGrupp/evo.git
cd evo
pip install --editable . --upgrade --no-binary evo # 或pip3,需要注意ros只支持python2
报错处理:
-
报错信息:evo module evo.main_traj crashed - no logfile written (disabled)
解决方法:
1
pip install matplotlib --upgrade
-
问题:加载
matplotlib
包时出现加载的问题1
import matplotlib.pyplot as plt
报错信息:ImportError: No module named '_tkinter', please install the python3-tk package
解决方法:
1
2sudo apt-get update
sudo apt-get install python3-tk如果不想更新的话,stackoverflow上有更好的解决方法:
1
2
3import matplotlib
matplotlib.use("agg")
import matplotlib.pyplot as plt
测试
本地安装路径
/home/lll25655/.local/lib/python2.7/site-packages/evo
/home/lll25655/.local/bin/evo
(存放可执行文件)
安装完毕后,在命令行输入evo,若显示了相关信息,则表明安装成功。若提示"command not found"也不用惊慌,很多人遇到这种问题,重启电脑即可找到evo相应指令。
evo pkg --version
查看evo版本evo pkg --info
查看evo的简要介绍和描述evo pkg --pyversion
查看evo使用的python版本evo pkg --license
查看许可证evo pkg --location
查看evo安装路径evo pkg --logfile
查看日志文件路径evo pkg --open_log
打开日志文件evo pkg --clear_log
清除日志文件
卸载
简单安装evo,虽然下载了源码但并不是通过源码,卸载pip install
的文件步骤如下:
1 |
|
命令行界面
概述
安装后,可以从命令行全局调用以下可执行文件:
指标:
evo_ape
- 绝对位姿误差evo_rpe
- 相对位姿误差
工具:
evo_traj
- 用于分析、绘制或导出一个或多个轨迹的工具evo_res
- 用于比较evo_ape
或evo_rpe
中的一个或多个结果文件的工具evo_fig
- 用于重新打开序列化图的(实验)工具(使用--serialize_plot
保存)evo_config
- 用于全局设置和配置文件操作的工具
使用 --help
调用命令以查看选项,例如 evo_ape --help
。命令行参数的 Tab 补全功能在类 UNIX 系统上可用。
更多文档请查看 GitHub 上的 Wiki。
存储库中还提供了非常简单的命令行应用程序的 Bash 脚本演示,其中显示了不同用例的示例,请参阅此处。
示例工作流程
test/data
的源文件夹中有一些示例轨迹。
绘制多条轨迹
在这里,我们使用 evo_traj
绘制两个 KITTI 位姿文件和真值:
1 |
|
对轨迹运行度量
例如,这里我们使用 evo_ape
( KITTI_00_gt.txt
是参考(真值))计算 ORB-SLAM 和 S-PTAM 的两个轨迹的绝对位姿误差,并绘制和保存 evo_res
的各个结果到 *.zip
文件:
1 |
|
处理一个指标的多个结果
evo_res
可用于比较指标中的多个结果文件,即:
- 打印信息和统计数据(默认)
- 将统计数据保存在表中
在这里,我们使用上面的结果来生成图表和表格:
1 |
|
文件格式
加载轨迹的可执行文件支持不同的格式。您可以指定要与模式开关(第二个参数)一起使用的格式,例如: evo_traj tum ...
或 evo_traj kitti ...
。本文档提供有关这些文件格式的信息。
bag
& bag2
ROS1/ROS2 bag文件。
目前,支持主题包含 geometry_msgs/PoseStamped
、 geometry_msgs/TransformStamped
、 geometry_msgs/PoseWithCovarianceStamped
、 geometry_msgs/PointStamped
和 nav_msgs/Odometry
消息的包文件。 evo 仅读取轨迹,因此不使用协方差或扭曲。
1 |
|
v1.9 以来的新功能:现在也支持 TF 主题。您可以使用说明符 <topic>:<parent_frame>.<child_frame>
在命令行应用程序中加载 TF 变换的轨迹。例如:
1 |
|
euroc
EuRoC MAV 数据集格式(也用于 TUM VI 数据集)。
1 |
|
EuRoC MAV 数据集的每个序列都有包含各种地面实况信息的 .csv
文件。对于我们来说,只有具有真实轨迹的第一列才重要(时间戳、位置和方向)。
您可以在序列文件夹中找到这些文件: <sequence>/mav0/state_groundtruth_estimate0/data.csv
。
这种格式仅对这些真实文件有意义,因为它们具有附加数据(我们不需要)。如果您使用EuRoC数据集,您通常需要将轨迹保存为另一种格式,例如TUM格式(例如ORB-SLAM就是这样做的)。
在 euroc
模式下,evo的指标要求您提供EuRoC格式的参考和TUM格式的估计轨迹。
更多信息:http://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets#the_euroc_mav_dataset
要小心 EuRoC 数据集坐标系(地面实况、IMU、相机...),因为它们具有不同的轴约定。
kitti
1 |
|
这实际上不是真正的轨迹格式,因为它没有时间戳 - 它只包含文本文件中的姿势。这意味着当您想要将此格式的两个文件与度量进行比较时必须小心,因为位姿的数量必须完全相同。
文件的每一行都包含 4x4 齐次位姿矩阵(SE(3) 矩阵)的前 3 行,该矩阵被展平为一行,每个值由空格分隔。例如,这个位姿矩阵:
1 |
|
将在文件中显示为以下行:
1 |
|
更多信息:http://www.cvlibs.net/datasets/kitti/eval_odometry.php
tum
TUM RGB-D 数据集轨迹格式。
每行都有 8 个条目,其中包含时间戳(以秒为单位)、位置和方向(作为四元数),每个值之间用空格分隔:
1 |
|
更多信息:https://vision.in.tum.de/data/datasets/rgbd-dataset/file_formats
注意:TUM 视觉惯性数据集以与 EuRoC MAV 数据集类似的格式提供真实数据。它没有使用 TUM RGB-D 轨迹格式作为基本事实。对于 evo 1.13.4 或更高版本,您也可以对此数据集使用
euroc
模式。
evo_traj
evo_traj
是处理多个轨迹的主要工具,例如:
- 显示一些信息
- 绘图
- 验证数据是否有效
- 导出为其他格式
- 应用变换等
可以在命令行通过-h
或--help
参数查看当前evo指令的参数及相关说明。例如:
1 |
|
注意一定要输入完整的evo指令(
evo_traj
,evo_ape
等),与必选参数,即数据格式(tum
/kitti
/euroc
/bag
)。
基础
evo_traj
可以打开任意数量的轨迹。如果是基于文本的轨迹格式( tum
、 euroc
、 kitti
- 另请参阅文件格式),您可以将轨迹文件作为参数提供,例如:
1 |
|
(在这里,您还可以在类 UNIX 系统上使用 glob 表示法: evo_traj tum traj_*
)
如果是 ROS bagfile,您可以提供文件路径,后跟要使用的主题的名称:
1 |
|
或者,使用 ROS2 包:
1 |
|
您还可以使用 --all_topics
选项加载 bagfile 内的所有轨迹。 TF 主题可以与[此处](#bag
& bag2
)描述的特殊语法一起使用。
参考轨迹可以用 --ref
标记:
1 |
|
您还可以将对齐功能( -a / --align
、 -s / --correct_scale
或 --n_to_align
参数)与 evo_traj
一起使用。
检查轨迹数据
默认情况下, evo_traj
仅打印有关您以这种格式输入的轨迹的一些重要信息:
1 |
|
在详细模式( -v
/ --verbose
)下,输出更改为以下格式:
1 |
|
您可以使用 --full_check
标志获得最详细的输出。这会执行一些数学和逻辑检查 - 例如四元数是否具有单位范数或者时间戳是否升序。还显示了一些速度值( kitti
除外,我们没有时间戳)。
绘图
将 -p
或 --plot
附加到您的命令以绘制轨迹。您可以使用 --plot_mode
指定视图 - 例如 --plot_mode xz
用于 x 和 z 轴的 2D 视图,或 --plot_mode xyz
用于 3D 视图。无论如何,绘图窗口中还有第二个选项卡,其中单独绘制了 x、y 和 z 值,第三个选项卡则显示了横滚角、俯仰角和偏航角(xyz 约定)。
另请参阅此处了解更多信息:定制绘图。
导出
看这里。
对齐与转换
几何对齐
如果使用 --ref
给出参考轨迹,则可以使用 Umeyama 的方法将其他轨迹与参考对齐:
--align
或-a
= SE(3) Umeyama 对齐(旋转、平移)--align --correct_scale
或-as
= Sim(3) Umeyama 对齐(旋转、平移、缩放)--correct_scale
或-s
= 仅比例校正。不加-s
表示默认尺度对齐参数为1.0,即不进行尺度对齐。--n_to_align N_TO_ALIGN
: the number of poses to use for Umeyama alignment, counted from the start (default: all)
v1.5.0 以来的新功能:
--align_origin
提供了可用于漂移/闭环评估的简单原点对齐。这不是基于 Umeyama 算法。
时间对齐
这是通过搜索参考轨迹和其他轨迹之间的最佳匹配时间戳来完成的。然后,所有轨迹都会缩减为最佳匹配时间戳。如果未找到匹配项,则会引发错误。此步骤的选项有:
--t_offset
:添加一个恒定的时间戳偏移量(不添加到 --ref 轨迹) - 默认值:0.0s--t_max_diff
:数据关联的最大时间戳差异 - 默认:0.01s
所有几何对齐方法( --align
、 --correct_scale
)都会自动执行此操作以进行点配准。您还可以仅同步轨迹的时间戳,而无需与 --sync
进行任何几何对齐。
投影变换
您可以将位姿投影到具有 --project_to_plane
和所需平面(xy、xz 或 yz)的平面中。例如, --project_to_plane xy
:
注意:投影是在任何潜在的几何对齐之前完成的。
下采样/过滤
轨迹可以被下采样到固定的最大数量的姿势。例如,如果您有非常大的数据并且想要提高绘图性能,这可能很有用。
1 |
|
一种更智能的过滤类型是运动过滤器。这会过滤掉与之前的姿势相比移动不够的姿势。例如,这可以用于删除没有发生任何有趣的数据的部分,仅保留高于平移或角度阈值的运动。使用 0.5m 和 5 度的阈值进行过滤的示例:
1 |
|
转换
您还可以使用自定义 3D 变换来变换轨迹的姿势。为此,您需要一个 .json 文件,其中包含以下格式的平移向量和旋转四元数:
1 |
|
您也可以使用 numpy 以文本 ( np.savetxt
) 或二进制格式 ( np.save
) 保存 4x4 SE(3) 矩阵,并使用与 JSON 相同的命令行参数加载它们格式。
要从全局框架应用此类转换,请使用 --transform_left <json file>
。要从其自己的本地框架转换每个姿势,请使用 --transform_right <json file>
(如果包含平移,这会更改轨迹的形状!)。
指标
概述
这些内置命令行应用程序可让您根据参考(地面实况)评估估计轨迹:
evo_ape
evo_rpe
从概念上讲,命令语法如下:
1 |
|
其中 format
表示支持的轨迹格式之一 - 有关不同格式的更多信息,请参阅此处。
对于 ROS bagfile,语法略有不同:
1 |
|
还支持 TF 主题,请参阅[此处](#bag&
bag2)。
有关命令行界面的更多详细信息,请使用 --help
标志 - 例如 evo_rpe euroc --help
。
大多数中论文的指标为测量绝对误差, 在进行评估时,若经过了缩放,在命令行中应将真实轨迹(参考轨迹)放在估计轨迹(计算轨迹)前方,避免在缩放时参考轨迹错误而造成误差被错误缩放。
1evo_ape tum groundtruth.txt CameraTrajectory_TUM.txt -p --plot_mode=xy -as
输出指标;
max
:表示最大误差mean
:平均误差median
:误差中位数min
:最小误差rmse
:均方根误差sse
:和方差、误差平方和std
:标准差
evo_ape
绝对位姿误差,常被用作绝对轨迹误差。给定位姿关系,直接比较估计和参考之间的相应位姿。然后,计算整个轨迹的统计数据。这对于测试轨迹的全局一致性很有用。该标准非常适合于评估视觉 SLAM 系统的性能。
1 |
|
将 --help
附加到命令以查看所有可用选项。
-r(--pose_relation) full
表示同时考虑旋转和平移误差得到的ape,无单位(unit-less)- (默认)
-r trans_part
表示考虑平移部分得到的ape,单位为m -r rot_part
表示考虑旋转部分得到的ape,衡量旋转精度,无单位(unit-less)-r angle_deg
表示考虑旋转角得到的ape,单位°(deg)-r angle_rad
表示考虑旋转角得到的ape,单位弧度(rad)
1 |
|
evo_rpe
相对位姿误差不是直接比较绝对位姿,而是比较运动(“位姿增量”)。该指标提供了有关局部精度(即漂移)的见解。例如,可以评估每米的平移或旋转漂移:
1 |
|
除非指定
--all_pairs
,否则相对姿势对是连续的。然后,使用重叠的相对姿势对。当在命令中加上
--all_pairs
,则计算rpe时使用位置数据中所有的对而不是仅连续对,此时,可以通过-t
/--delta_tol
控制–-all_pairs
模式下的相对增量的容差(relative delta tolerance)。需要注意--all_pairs
下不能使用–-plot
函数。
将 --help
附加到命令以查看所有可用选项。
–d
/-–delta
表示相对位姿之间的增量,–u
/-–delta_unit
表示增量的单位,可选参数为[f, d, r, m],分别表示[frames, deg, rad, meters]。–d
/-–delta
与-u
/-–delta_unit
合起来表示衡量局部精度的单位,如每米,每弧度,每百米等。其中-–delta_unit
为f
时,–-delta
的参数必须为整形,其余情况下可以为浮点型。–-delta
默认为1
,–-delta_unit
默认为f
。
1 |
|
对齐
与evo_traj
相同,您可以使用 Umeyama 对齐作为预处理步骤。单目 SLAM 通常需要比例或 Sim(3) 对齐,其中通常具有随机比例。如果您想尽可能最好地测量轨迹的形状相似度,SE(3) 对齐对于绝对位姿误差 ( evo_ape
) 很有用。
投影
在计算误差之前,可以将 3D 轨迹投影到 2D。这与通过 --project_to_plane {xy, xz, yz}
在 evo_traj
中的工作方式相同,有关详细信息,请参阅那里的部分。
下采样和过滤
数据可以被下采样和运动过滤。这与 evo_traj
中的工作方式相同,有关详细信息,请参阅那里的部分。
结果比较
evo_ape
和evo_rpe
旨在将一条轨迹与参考进行比较。虽然这简化了使用,但不同结果的比较通常也很有趣。
对于 evo,结果比较是一个单独的步骤。这样做的优点是,您可以将 SLAM 算法 X 的结果与另一个算法 Y 的结果进行比较,而无需重新运行指标。并且比较与原始轨迹文件格式无关。
--save_results
工作流程是,您为每个轨迹运行指标,并通过在指标应用程序中指定 --save_results
参数将结果单独保存在文件中。查看 README.md 的示例。
1 |
|
“结果文件”是以 zip 格式存储的序列化 Result
对象,可以由 evo_res
读取。
这些由带有 --save_results
选项的指标生成的文件包含将不同结果与 evo_res
进行比较所需的数据。它们只是包含一些 .json
文件和用于存储更大的 numpy 数组的 .npy
文件的 .zip
文件。
如果需要,您还可以在 .zip
文件中存储用于生成结果的轨迹的备份。要在使用 --save_results
时自动执行此操作,请更改设置:
1 |
|
请注意,这会增加文件的大小。
evo_res
您可以使用 evo_res
加载多个结果文件来比较不同的结果。为了避免错误的比较,如果它认为您比较由不同指标生成的文件(除非指定了 --no_warnings
),它会向您发出警告。
在使用evo_ape
或evo_rpe
将结果保存为*.zip
文件后,可以利用evo_res
对不同的结果进行比较:
1 |
|
--save_table ape_result.csv
表示将统计指标保存在csv
文件中–-save_plot ape_result.pdf
表示将误差分析图保存在pdf
文件中
综合使用
1 |
|
定制绘图
有多种设置可让您更改绘图的外观。
在命令行应用程序中,查看 --plot
、 --plot_mode
等参数。
–-plot_mode xz
表示图像投影在xoz平面上,其余可选参数为:xy,yx,yz,zx,zy,xyz
更一般的,可以通过 evo_config set
设置包范围的设置(请参阅“配置”部分)。查看 evo_config show
以查看所有可用设置及其当前值。
打印质量图的配置示例
这是一个示例演练,说明如何从理论上更改绘图设置以生成用于打印(论文)的高质量绘图。
-
设置绘图网格和背景。默认绘图设置具有深色背景。这在屏幕上看起来不错,但不适合打印。我们可以通过更改 Seaborn 的 style 参数来将背景更改为白色背景的网格:
1
evo_config set plot_seaborn_style whitegrid
-
设置字体类型和比例。默认字体并不真正适合我们论文的其余部分,它使用衬线字体。图中文本标签的相对大小也可以增加,以获得更好的可读性。我们可以通过调用以下命令切换到更大尺寸的衬线字体:
1
evo_config set plot_fontfamily serif plot_fontscale 1.2
为了匹配较小的字体,我们还减小了线宽:
1
evo_config set plot_linewidth 1.0
您还可以更改其他一些内容,例如参考轨迹的线条样式:
1
evo_config set plot_reference_linestyle -
-
设置默认图形尺寸。您也可以调整默认绘图尺寸。例如,宽度为 5,高度为 4.5:
1
evo_config set plot_figsize 5 4.5
-
使用LaTeX渲染器。因为我们使用 LaTeX 来写论文,所以我们也想用 LaTeX 渲染绘图的字体:
1
evo_config set plot_usetex
如果第一次尝试不起作用,您可能需要将
plot_texsystem
参数更改为计算机上安装的 LaTeX 系统,请参阅evo_config show
。高级:绘图也可以以 pgf 格式导出 (
--save_plot plot.pgf
)。 -
(可选)恢复默认设置
1
evo_config reset
坐标轴标记
可以通过将 plot_axis_marker_scale
设置为非零值来激活坐标轴标记,例如:
1 |
|
参考轨迹有一个单独的参数 plot_reference_axis_marker_scale
:
1 |
|
您可能需要调整此比例值以将其调整为轨迹的大小。如果不再需要,请再次将其设置为 0
。
开始和结束标记
起点用圆圈标记,终点用十字标记:
1 |
|
位姿对应标记
您可以启用将参考轨迹的位姿与其他轨迹中的相应位姿连接起来的标记。此设置适用于 evo_ape
和 evo_rpe
,如果您指定 --ref
引用并且其他轨迹已同步或已同步,则也适用于 evo_traj
对齐。
1 |
|
更改长度单位
您可以将轨迹图的轴刻度缩放为不同的长度单位。如果您的数据规模非常小( cm
、 mm
;例如来自手机)或规模非常大( km
;例如来自汽车),这会很有用)。请注意,这不会改变数据,只会改变绘图外观。
1 |
|
2D ROS 地图
略。详情。
自定义配置文件
有时,将实验参数存储在专用文件中而不是每次都手动将它们作为命令行参数键入是有用的。 evo 的大多数命令行工具都可以使用 -c
或 --config
参数加载 .json
配置文件。
假设您针对相对位姿误差运行此命令:
1 |
|
evo_config generate
可以将任意命令行参数转换为 --out
指定的 .json
文件:
1 |
|
这将输出一个包含以下内容的文件 rpe_config.json
:
1 |
|
下次您想使用这些参数运行 evo_rpe
时,您只需调用:
1 |
|
出于技术原因,您需要将
evo_config generate
与“长”选项(如果可用)一起使用 - 例如:--plot
而不是-p
配置文件中的参数具有优先级(您不能通过等效的命令行选项覆盖它们)
保存/导出为其他格式
保存当前结果
-–save_plot pngname
:表示保存生成的图片名--save_results results/ORB.zip
:表示保存计算结果
导出为其他格式
一般来说,您可以使用 evo_traj
使用 --save_as_<other_format>
选项将轨迹导出为其他格式。
可能有以下组合:
--save_as_bag |
--save_as_kitti |
--save_as_tum |
--save_as_bag2 |
|
---|---|---|---|---|
bag |
yes | yes | yes | yes |
euroc |
yes | yes | yes | yes |
kitti |
no (no timestamps) | yes | no (no timestamps)* | no (no timestamps) |
tum |
yes | yes | yes | yes |
bag2 |
yes | yes | yes | yes |
*:但是您可以将此脚本与 KITTI 数据集的时间戳文件一起使用
导出的 ROS 包文件将包含
geometry_msgs/PoseStamped
消息
1 |
|
License
如果您使用此包进行研究,则可以使用带有此存储库链接的脚注: github.com/MichaelGrupp/evo
。
或者,用 BibTeX 引用:
1 |
|
参考链接
- https://github.com/MichaelGrupp/evo
- 轨迹评估工具使用总结(一) evo从安装到入门
- SLAM 轨迹评估工具——EVO安装、使用介绍
- 用evo工具分析ORB-SLAM2运行TUM,KITTI,EuRoC数据集轨迹
- SLAM精度测评——EVO
- evo评测VINS-MONO---指标解析、算法精度分析(数据集)
- evo测试工具错误: evo module evo.main_traj crashed - no logfile written (disabled)
- 解决:ImportError: No module named '_tkinter', please install the python3-tk package
- ubuntu18.04安装evo,踩坑无数经验所得。