SLAM精度评估—evo

 

evo是一款用于SLAM轨迹精度的评估工具。核心功能是(1)能够绘制(传感器运动)轨迹,(2)评估估计轨迹与真值(ground truth)的误差。evo支持多种数据集的轨迹格式(TUM、KITT、EuRoC MAV、ROS的bag),同时支持这些数据格式之间进行相互转换。在此仅对其基本功能做简要介绍。

目录

1. evo的安装(evo共有两种安装方式)

1.1 采用pip安装,直接安装最新的稳定发行版(在翻墙的情况下可以使用)

1.2 源码安装 ,下载源码进行安装(必须翻墙,要不然装不上)

2. 基础指令

2.1 轨迹对齐

2.2 轨迹尺度缩放

3. 精度测评

3.1 evo_ape

3.2 evo_rpe

3.3 evo_res进行结果比较

3.4 格式互相转换

4. 评价指标和评价工具对比

1. ATE:Absolute Trajectory Error 绝对轨迹误差(使用evo)

参数说明

2. RPE:Relative Pose Error 相对位姿误差(使用evo)

参数说明

3. RPE和RRE(使用 KITTI_odometry_evaluation_tool)

示例命令

参数说明

综述

5. ORB-SLAM2 (Stereo)和DynSLAM (Stereo)中的应用 

1. evo的安装(evo共有两种安装方式)

1.1 采用pip安装,直接安装最新的稳定发行版(在翻墙的情况下可以使用)

输入代码:

# 遇到网络不好中断,就多试几次(但是一定要翻墙)

pip install evo --upgrade --no-binary evo

这个命令来来回回执行了很多次,差不多一个小时才装上。

运行pip安装命令显示pip未安装,用如下代码解决

sudo apt install python-pip

1.2 源码安装 ,下载源码进行安装(必须翻墙,要不然装不上)

首先切换到你的目录

下载evo源码:

git clone https://github.com/MichaelGrupp/evo.git

cd到evo目录下

pip install --user evo --upgrade --no-binary evo //有一个12.8MB的文件下载,要消耗一些时间,也有可能time out(不翻墙不行)

pip install evo --upgrade 如果有提示你的pip版本低,那么就通过下面的指令升级

pip python -m pip install --upgrade pip

安装时会自动安装相关依赖项。

安装完毕后,在命令行输入evo,若显示了相关信息,则表明安装成功。若提示"command not found"也不用惊慌,很多人遇到这种问题,重启电脑即可找到evo相应指令。

2. 基础指令

evo绘制轨迹的指令为:evo_traj,后跟必要参数有:数据的格式(tum / kitti / bag / euroc等)+ 轨迹文件。轨迹文件可以有多个,例如:

evo_traj tum traj1.txt traj2.txt

这个指令只是显示轨迹的基本信息,若要绘制轨迹,则增加可选参数 -p 或 --plot

evo_traj tum traj1.txt –p

2.1 轨迹对齐

我们时常需要将估计轨迹与真实轨迹同时绘制,可采用指令:

evo_traj tum realTraj.txt estTraj.txt -p

存储时轨迹多为相对位置变化,所以绘制出的轨迹在初始位置上存在一定的位置和角度偏移。

这时我们采用对齐指令将两条轨迹进行对齐。为此我们需要通过--ref参数指定参考轨迹,并增加参数-a(或--align)进行对齐(旋转与平移)

evo_traj tum estTraj.txt --ref realTraj.txt -p -a

2.2 轨迹尺度缩放

单目相机会存在尺度的不确定性,evo_traj 支持使用-s(或 --correct_scale)参数进行Sim(3)上的对齐(旋转、平移与尺度缩放)帮助?

可以在命令行通过-h参数查看当前evo指令的参数及相关说明。例如:

evo_traj tum –h

3. 精度测评

3.1 evo_ape

evo_ape  绝对位姿误差(absolute pose error),用于整体评估整条轨迹的全局一致性;

 注意evo_ape默认情况下计算的是ATE(相当于默认加了参数-r tran_part),如果想计算APE,可以加上参数-r full

evo_ape kitti KITTI_00_gt.txt KITTI_00_ORB.txt -va --plot --plot_mode xz --save_results results/ORB.zip

绝对位姿误差,用于比较估计轨迹和参考轨迹并计算整个轨迹的统计数据,常用于评估测试轨迹的全局一致性。这里还是以kitti为例,tum和euroc格式相同。

evo_ape kitti ground_truth.txt tra1.txt -r full -va --plot --plot_mode xyz --save_plot ./tra1plot --save_results ./tra1.zip

kitti表明处理的是kitti数据集的相关结果,这里也可以替换为tum和euroc;

ground_truth.txt代表真实轨迹的数据;

tra1.txt代表估计轨迹的数据;

-r 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);

-va包含两部分;1.-v或--verbose指明输出文件数据的相关信息;2.-a或--align指明对轨迹进行配准; --plot表示画图;

--plot_mode xy表示图像投影在xoy平面上,其余可选参数为:xz,yx,yz,zx,zy,xyz;

--save_plot ./tra1plot表示保存生成的图片,./tra1plot这里写自己保存的地址;

--save_results ./tra1.zip表示保存计算结果,./tra1.zip这里写自己保存的地址;

3.2 evo_rpe

evo_rpe  相对位姿误差(relative pose error),用于评价轨迹局部的准确性。

相对位姿误差不进行绝对位姿的比较,相对位姿误差比较运动(姿态增量)。相对位姿误差可以给出局部精度,例如SLAM系统每米的平移或者旋转漂移量。这里还是以kitti为例,tum和euroc格式相同。

evo_rpe kitti ground_truth.txt tra1.txt -r full -va --plot --plot_mode xyz --save_plot ./tra1plot --save_results ./tra1.zip

kitti表明处理的是kitti数据集的相关结果,这里也可以替换为tum和euroc;

ground_truth.txt代表真实轨迹的数据;

tra1.txt代表估计轨迹的数据;

-r 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);

-va包含两部分;1.-v或--verbose指明输出文件数据的相关信息;2.-a或--align指明对轨迹进行配准;

--plot表示画图;

--plot_mode xy表示图像投影在xoy平面上,其余可选参数为:xz,yx,yz,zx,zy,xyz;

--save_plot ./tra1plot表示保存生成的图片,./tra1plot这里写自己保存的地址;

--save_results ./tra1.zip表示保存计算结果,./tra1.zip这里写自己保存的地址;

3.3 evo_res进行结果比较

在使用evo_ape或evo_rpe将结果保存为.zip文件后,可以利用evo_res对不同的结果进行比较。

evo_res //*/test/.zip -p --save_table ///test/table.csv///test/.zip是之前使用ape或rpe生成的压缩包的地址; -p表示画图; --save_table //*/test/table.csv表示将统计指标保存在csv文件中;

3.4 格式互相转换

example1 EuRoC→TUM,输出为data.tum

evo_traj euroc data.csv --save_as_tum

example1 EuRoC→kitti,输出为data.kitti

evo_traj tum traj_1.txt traj_2.txt traj_3.txt --save_as_kitti

 TUM数据集格式

timestamp tx ty tz qx qy qz qw

(每行有8个元素,结尾没有空格,时间以秒为单位)

EuRoci数据集

timestamp,px,py,pz,qw,qx,qy,qz,vx,vy,vz,bwx,bwy,bwz,bax,bay,baz

(每行17个元素,逗号隔开,时间以纳秒为单位)

 KTTI数据集

r11 r12 r13 tx r21 r22 r23 ty r31 r32 r33 tz

存储变换矩阵的前三行(每行12元素,空格隔开)没有时间

EuRoc的数据格式转化成TUM数据格式

evo_traj euroc data.csv --save_as_tum

TUM数据转换成kitti格式

evo_traj tum traj_1.txt  traj_2.txt  traj_3.txt  --save_as_kitti

TUM数据转换成bag格式

evo_traj tum traj_1.txt traj_2.txt traj_3.txt --save_as_bag

4. 评价指标和评价工具对比

evo

KITTI_odometry_evaluation_tool

ATE [m]

RPE [%]

RRE [deg/m]

1. ATE:Absolute Trajectory Error 绝对轨迹误差(使用evo)

绝对轨迹误差(ATE)是估计位姿和真实位姿的直接差值,可以非常直观地反映算法的精度和轨迹的全局一致性(ATE只包含平移的误差)。在evo中,有关于ATE的指令。注意,evo_ape默认情况下计算的是ATE(相当于默认加了参数-r trans_part),如果想计算APE,可以加上参数-r full

evo_ape kitti ground_truth.txt tra1.txt -r full -va --plot --plot_mode xyz --save_plot ./tra1plot --save_results ./tra1.zip

参数说明

  • kitti:表明处理的是kitti数据集的相关结果,这里也可以替换为tum和euroc。
  • ground_truth.txt:代表真实轨迹的数据。
  • tra1.txt:代表估计轨迹的数据。
  • -r full:表示同时考虑旋转和平移误差得到的ATE,无单位(unit-less)。
    • 另外:
      • -r trans_part:表示仅考虑平移部分得到的ATE,单位为米(m)。
      • -r rot_part:表示仅考虑旋转部分得到的ATE,无单位(unit-less)。
      • -r angle_deg:表示考虑旋转角得到的ATE,单位为度(deg)。
      • -r angle_rad:表示考虑旋转角得到的ATE,单位为弧度(rad)。
  • -va:包含两部分:
    • -v--verbose:指明输出文件数据的相关信息。
    • -a--align:指明对轨迹进行配准。
  • --plot:表示生成图像。
  • --plot_mode xyz:表示图像投影在xoy平面上,其余可选参数为:xz, yx, yz, zx, zy, xyz。
  • --save_plot ./tra1plot:表示保存生成的图片,./tra1plot这里写自己保存的地址。
  • --save_results ./tra1.zip:表示保存计算结果,./tra1.zip这里写自己保存的地址。

2. RPE:Relative Pose Error 相对位姿误差(使用evo)

相对位姿误差(RPE)是为了估计机器人每一步的精度。RPE包含两部分误差:旋转误差和平移误差。通常,使用平移误差进行评价已足够,但如果需要,旋转角的误差也可以进行统计。RPE的整体大小通常使用均方根误差(RMSE,Root Mean Squared Error)进行衡量,即平方后求均值再开根号。

evo_rpe kitti ground_truth.txt tra1.txt -r full -va --plot --plot_mode xyz --save_plot ./tra1plot --save_results ./tra1.zip

参数说明

  • kitti:表明处理的是kitti数据集的相关结果,这里也可以替换为tum和euroc。
  • ground_truth.txt:代表真实轨迹的数据。
  • tra1.txt:代表估计轨迹的数据。
  • -r full:表示同时考虑旋转和平移误差得到的RPE,无单位(unit-less)。
    • 另外:
      • -r trans_part:表示仅考虑平移部分得到的RPE,单位为米(m)。
      • -r rot_part:表示仅考虑旋转部分得到的RPE,无单位(unit-less)。
      • -r angle_deg:表示考虑旋转角得到的RPE,单位为度(deg)。
      • -r angle_rad:表示考虑旋转角得到的RPE,单位为弧度(rad)。
  • -va:包含两部分:
    • -v--verbose:指明输出文件数据的相关信息。
    • -a--align:指明对轨迹进行配准。
  • --plot:表示生成图像。
  • --plot_mode xyz:表示图像投影在xoy平面上,其余可选参数为:xz, yx, yz, zx, zy, xyz。
  • --save_plot ./tra1plot:表示保存生成的图片,./tra1plot这里写自己保存的地址。
  • --save_results ./tra1.zip:表示保存计算结果,./tra1.zip这里写自己保存的地址。

3. RPE和RRE(使用 KITTI_odometry_evaluation_tool)

使用KITTI_odometry_evaluation_tool可以计算相对位姿误差(RPE)和相对旋转误差(RRE)。举例如下:

python evaluation.py --result_dir=./data/ --eva_seqs=09_pred,10_pred

参数说明

  • --result_dir=./data/:指定结果目录。
  • --eva_seqs=09_pred,10_pred:指定要评估的序列。

5. ORB-SLAM2 (Stereo)和DynSLAM (Stereo)中的应用

RPE[%]以及RRE[deg/100m]:定义参考论文VSO: Visual Semantic Odometry

显示轨迹

evo_traj tum GroundTruth.txt OurAlgorithm.txt A_LOAM_Traj.txt -p

evo_traj tum GroundTruth.txt OurAlgorithm.txt A_LOAM_Traj.txt --plot --plot_mode xz

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/669359.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

php之文件操作代码审计

1 PHP文件操作函数 1.1 PHP文件操作函数 文件包含 include/require/include_once/require_once 文件读取 file_get_contents/fread/readfile/file 文件写入 file_put_contents/fwrite/mkdir/fputs 文件删除 unlink/rmdir 文件上传 move_uploaded_file/copy/rename 1.2 文…

Error CREATEing SolrCore ‘new_core‘ Unable to create core [new_core]

Error CREATEing SolrCore new_core: Unable to create core [new_core] Caused by: Cant find resource solrconfig.xml in classpath or F:\Document_Solr.apache.org\solr-8.11.3\server\solr\new_core

VHDL/CPLD硬件描述语言:2022年做的万年历实验

之前接触过一些硬件描述语言以及VHDL/CPLD的单片机的设计实验,那时是2022年了 这里补写一篇笔记,以记录一下那十多个小时 万年历实验 研究中的心得体会: 说明解释都是个人理解,与标准描述有较大出入...... 目录 输入输出器件的编写: 分频器…

年中汇报季?——一文教会你如何进行数据分析

一、常见的数据分析报告类型 数据分析报告通常可以分为三类:日常分析报告、专题型分析报告和综合性分析报告。前两者是以数据结论建议的格式去撰写,综合性分析报告则是:行业环境调研(竞品类产品数据分析)自身产品数据…

张大哥笔记:你卖什么,就反着来卖

普通人打工的一生,就是努力工作,买房,买车,送孩子上好的学校,为了孩子不要输在起跑线上,拼命报各种补习班等,这些都是普通人认为的主流价值观文化,也造就了一批批的赚钱机器&#xf…

深度解析 Spring 源码:探秘 CGLIB 代理的奥秘

文章目录 一、CGLIB 代理简介1.1 CGLIB 代理的基本原理和特点1.2 分析 CGLIB 如何通过字节码技术创建代理类 二、深入分析 CglibAopProxy 类的结构2.1 CglibAopProxy 类结构2.2 CglibAopProxy 类源码 三、CGLIB 代理对象的创建过程3.1 配置 Enhancer 生成代理对象3.2 探讨如何通…

【斯坦福因果推断课程全集】1_随机对照试验1

目录 The average treatment effect Difference-in-means estimation IID Sampling and Population Asymptotics Example: The linear model Regression adjustments with a linear model 随机对照试验(RCT)是统计因果推论的基础。如果有的话&#…

Linux - 文件管理高级 sed

3.处理字符 sed ① sed 默认情况下不会修改原文件内容 ② sed 是一种非交互式的编辑器 3.1 工作原理 将原文件一行一行的进行处理,取出一行,放入“模式空间进行处理”,处理完成之后将结果输出到屏幕上,然后读取下一行&#xf…

瓦罗兰特国际服 外服游玩教程 瓦罗兰特外服下载注册游玩指南

瓦罗兰特国际服 外服游玩教程 瓦罗兰特外服下载注册游玩指南 瓦罗兰特作为当今游戏圈顶流的一款热门FPS。游戏,作为拳头游戏公司划时代的一款游戏。游戏不仅延续了传统FPS游戏的玩法,还添加许多新玩法,这也是游戏可以吸引大批量玩家的原因之…

vulnhub靶场之FunBox-10

一.环境搭建 1.靶场描述 As always, its a very easy box for beginners. This works better on VitualBox rather than VMware 2.靶场下载 Funbox: Under Construction! ~ VulnHub 3.靶场启动 靶场IP地址我们不知道,但是网段我们知道是192.168.2.0/24 二.信息…

Filter和ServletContext和Listener

目录 Filter案例 解决全站乱码问题 登录权限校验 ServletContext对象 Listener(监听器) Filter案例 解决全站乱码问题 我们每次访问每个servlet都要书写处理请求和响应乱码的代码,这样代码十分冗余,所以我们可以在过滤中 We…

python列表的进阶

小结: # 列表的删除小结: # 删除列表的最后一列 punished students.pop() print(被罚站的人是: punished ,同学们引以为戒。)# 根据下标删除 del students[0]#根据名称删除 students.remove(王熙凤)在今天的课程里&#xff0c…

k8s自定义资源你会创建吗

创建自定义资源定义 CustomResourceDefinition 当你创建新的 CustomResourceDefinition(CRD)时,Kubernetes API 服务器会为你所 指定的每一个版本生成一个 RESTful 的 资源路径。CRD 可以是名字空间作用域的,也可以是集群作用域的…

短剧系统源码:构建互动娱乐的新平台

随着数字媒体的兴起,短剧成为了一种新兴的娱乐形式,它以紧凑的叙事和快速的节奏迎合了现代观众的观看习惯。短剧系统源码的开发,为短剧内容的创作、传播和消费提供了一个全面的技术解决方案。本文将探讨短剧系统源码的关键组成部分及其功能。…

如何让 LightRoom 每次导入照片后不自动弹出 SD 卡 LR

如何让 LightRoom 每次导入照片后不自动弹出 SD 卡 LR 在导入窗口左上角有个选项: 导入后弹出 把这个去掉就可以了

FreeRTOS同步互斥与通信

本章简介: 本章是概述性的内容。可以把多任务系统当做一个团队,里面的每一个任务就相当于团队里的一个人。团队成员之间要协调工作进度(同步)、争用会议室(互斥)、沟通(通信)。多任务系统中所涉及的概念,都可以在现实生活中找到例子。 各类RT…

Transformer从0到1的学习【还有2-10,别想太多】

1.高纬度介绍Transformer 1.分为编码Encoders和解码器Decoders:“我爱你”作为编码器Encoders的输入进行编码得到序列码后,作为解码器的输入得到输出即为,“I Love you”。 2.编码器和译码器的具体拆分: 左边的编码器Encoders的…

(函数)判断一句话中最长的单词(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//声明函数&#xff1b; int aiphabetic(char); int longest(char[]);int main() {//初始化变量值&#xff1b;int i;char line[100] { 0 };//获取用户输入字符…

每天写两道(五)合并两个有序链表、最长回文子串

21.合并两个有序链表 . - 力扣&#xff08;LeetCode&#xff09; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] (1)迭代法…

牛客网刷题 | BC105 菱形图案

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 KiKi学习了循环&am…