ov_eval说明

2023-05-16

目录

  • ov_eval
    • pose_to_file
    • format_converter
    • error_comparison
    • error_dataset
    • error_singlerun
    • error_simulation
    • timing_singlerun
    • timing_comparison
    • plot_trajectories
    • reference

ov_eval

open_vins/ov_eval 中评估工具的简单用法说明

阅读之前应该先过一遍[1],并且最好将轨迹数据组织成 [1] 中建议的形式,不然 error_* 几个包用起来会比较麻烦

pose_to_file

作用:收集算法计算结果存储到 txt 文件中

订阅算法输出位姿的 topic 转成 asl 格式存储,目前支持的 topic 消息类型包括:PoseWithCovarianceStamped, PoseStamped, TransformStamped, Odometry

usage:

<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>

format_converter

作用:将 csv 格式的 ground truth 转成 txt 格式存储(直接提取 csv 文件的前八个字段,一般是 time(ns),px,py,pz,qw,qx,qy,qz,转成 time(s) x y z qx qy qz qw)

目前不支持指定输出文件名

usage:

rosrun ov_eval format_convert <file.csv>
rosrun ov_eval format_convert <folder>

error_comparison

作用:读取每个 algo 在各个 dataset 中的多次运行结果,分别计算 ATE 和 RPE 并进行平均以减少算法随机性的影响

# 伪代码
for (algo: folder_algorithms):
  for (datasets: folder_groundtruth):
    for (entry: est_runs):
      calc ATE, RPE for this run
    calc avg ATE, RPE
    plot RPE

usage:

rosrun ov_eval error_comparison <align_mode> <folder_groundtruth> <folder_algorithms>

example:

这里图方便,用的数据是 plot_trajectories example 中不同参数配置运行两次的轨迹数据,实际使用时应该是算法相同参数配置的多次运行结果,然后计算算法在不同数据集上的平均 ATE 和 RPE

#:~/workspace/evaluation$ rosrun ov_eval error_comparison se3 truth/ algorithm/
[ INFO] [1576766051.044753308]: [COMP]: 2895 poses in V1_01_easy.txt => length of 88.86 meters
[ INFO] [1576766051.044834098]: ======================================
[ INFO] [1576766051.044844135]: [COMP]: processing openvins algorithm
[ INFO] [1576766051.044866408]: [COMP]: processing openvins algorithm => V1_01_easy dataset
[ INFO] [1576766051.062312797]: [TRAJ]: q_ESTtoGT = -0.002, -0.007, 0.012, 1.000 | p_ESTinGT = -0.057, -0.006, 0.061 | s = 1.00
[ INFO] [1576766051.113728335]: [TRAJ]: q_ESTtoGT = -0.001, -0.003, 0.006, 1.000 | p_ESTinGT = -0.001, 0.017, 0.032 | s = 1.00
[ INFO] [1576766051.150436822]: 	ATE: mean_ori = 0.789 | mean_pos = 0.064
[ INFO] [1576766051.150457502]: 	ATE: std_ori  = 0.344 | std_pos  = 0.015
[ INFO] [1576766051.150875183]: 	RPE: seg 8 - median_ori = 0.5668 | median_pos = 0.0733 (5056 samples)
[ INFO] [1576766051.151253228]: 	RPE: seg 16 - median_ori = 0.6465 | median_pos = 0.0802 (4762 samples)
[ INFO] [1576766051.151601656]: 	RPE: seg 24 - median_ori = 0.6177 | median_pos = 0.0798 (4532 samples)
[ INFO] [1576766051.151922544]: 	RPE: seg 32 - median_ori = 0.6442 | median_pos = 0.0803 (4248 samples)
[ INFO] [1576766051.152224301]: 	RPE: seg 40 - median_ori = 0.5605 | median_pos = 0.0793 (4056 samples)
[ INFO] [1576766051.152525008]: 	RPE: seg 48 - median_ori = 0.6697 | median_pos = 0.0992 (4002 samples)
[ INFO] [1576766051.152628426]: ============================================
[ INFO] [1576766051.152639002]: ATE LATEX TABLE
[ INFO] [1576766051.152647772]: ============================================
 & \textbf{V1\_01\_easy} & \textbf{Average} \\\hline
openvins & 0.825 / 0.065 & 0.825 / 0.065 \\
[ INFO] [1576766051.152724334]: ============================================
[ INFO] [1576766051.152748060]: ============================================
[ INFO] [1576766051.152755649]: RPE LATEX TABLE
[ INFO] [1576766051.152763121]: ============================================
 & \textbf{8m} & \textbf{16m} & \textbf{24m} & \textbf{32m} & \textbf{40m} & \textbf{48m} \\\hline
openvins & 0.567 / 0.073 & 0.647 / 0.080 & 0.618 / 0.080 & 0.644 / 0.080 & 0.561 / 0.079 & 0.670 / 0.099 \\
[ INFO] [1576766051.154778380]: ============================================

error_dataset

作用:读取每个 algo 在数据集 file_gt 上的多次运行结果,计算平均 RMSE, NEES 并 plot 出来

# 伪代码
for (algo: folder_algorithms):
  for (entry: file_gt_est_runs):
    calc ATE, RMSE, NEES, RPE for this run
  calc avg ATE, RMSE, NEES, RPE

usage:

rosrun ov_eval error_dataset <align_mode> <file_gt.txt> <folder_algorithms>

example:

#:~/workspace/evaluation$ rosrun ov_eval error_dataset se3 truth/V1_01_easy.txt algorithm/
[ INFO] [1576770212.761728847]: [COMP]: 2895 poses in V1_01_easy => length of 88.86 meters
[ INFO] [1576770212.761802180]: ======================================
[ INFO] [1576770212.761811845]: [COMP]: processing openvins algorithm
[ INFO] [1576770212.778955461]: [TRAJ]: q_ESTtoGT = -0.002, -0.007, 0.012, 1.000 | p_ESTinGT = -0.057, -0.006, 0.061 | s = 1.00
[ INFO] [1576770212.824914368]: [TRAJ]: q_ESTtoGT = -0.001, -0.003, 0.006, 1.000 | p_ESTinGT = -0.001, 0.017, 0.032 | s = 1.00
[ INFO] [1576770212.854617295]: 	ATE: mean_ori = 0.789 | mean_pos = 0.064
[ INFO] [1576770212.854633071]: 	ATE: std_ori  = 0.34366 | std_pos  = 0.01492
[ INFO] [1576770212.855156461]: 	RPE: seg 7 - mean_ori = 0.625 | mean_pos = 0.079 (5056 samples)
[ INFO] [1576770212.855710004]: 	RPE: seg 14 - mean_ori = 0.703 | mean_pos = 0.089 (4866 samples)
[ INFO] [1576770212.856209657]: 	RPE: seg 21 - mean_ori = 0.648 | mean_pos = 0.082 (4562 samples)
[ INFO] [1576770212.856619918]: 	RPE: seg 28 - mean_ori = 0.788 | mean_pos = 0.086 (4404 samples)
[ INFO] [1576770212.856968166]: 	RPE: seg 35 - mean_ori = 0.806 | mean_pos = 0.081 (4114 samples)
[ INFO] [1576770212.857712285]: 	RMSE: mean_ori = 0.785 | mean_pos = 0.062
[ INFO] [1576770212.858345127]: 	NEES: mean_ori = 249.988 | mean_pos = 3.516
[ INFO] [1576770213.600225289]: ============================================

在这里插入图片描述
在这里插入图片描述

error_singlerun

作用:计算算法单次运行的 ATE, RPE, RMSE, NEES, pose error(3 σ \sigma σ) 并 plot 出来

usage:

rosrun ov_eval error_singlerun <align_mode> <file_gt.txt> <file_est.txt>

example:

#:~/workspace/evaluation$ rosrun ov_eval error_singlerun se3 truth/V1_01_easy.txt algorithm/openvins/V1_01_easy/V1_01_easy_with_fej.txt [ INFO] [1576771884.967577101]: [COMP]: 2895 poses in V1_01_easy => length of 88.86 meters
[ INFO] [1576771884.986044187]: [TRAJ]: q_ESTtoGT = -0.001, -0.003, 0.006, 1.000 | p_ESTinGT = -0.001, 0.017, 0.032 | s = 1.00
[ INFO] [1576771884.987516831]: ======================================
[ INFO] [1576771884.987530199]: Absolute Trajectory Error
[ INFO] [1576771884.987537555]: ======================================
[ INFO] [1576771884.987545627]: rmse_ori = 0.546 | rmse_pos = 0.053
[ INFO] [1576771884.987552179]: mean_ori = 0.500 | mean_pos = 0.049
[ INFO] [1576771884.987562900]: min_ori  = 0.088 | min_pos  = 0.007
[ INFO] [1576771884.987587484]: max_ori  = 1.170 | max_pos  = 0.114
[ INFO] [1576771884.987614409]: std_ori  = 0.219 | std_pos  = 0.021
[ INFO] [1576771885.016880370]: ======================================
[ INFO] [1576771885.016918771]: Relative Pose Error
[ INFO] [1576771885.016927608]: ======================================
[ INFO] [1576771885.016958790]: seg 8 - median_ori = 0.477 | median_pos = 0.061 (2537 samples)
[ INFO] [1576771885.016967589]: seg 16 - median_ori = 0.490 | median_pos = 0.063 (2390 samples)
[ INFO] [1576771885.016973352]: seg 24 - median_ori = 0.401 | median_pos = 0.055 (2275 samples)
[ INFO] [1576771885.016991515]: seg 32 - median_ori = 0.524 | median_pos = 0.068 (2133 samples)
[ INFO] [1576771885.016996569]: seg 40 - median_ori = 0.485 | median_pos = 0.072 (2037 samples)
[ INFO] [1576771885.738522828]: ======================================
[ INFO] [1576771885.738555197]: Normalized Estimation Error Squared
[ INFO] [1576771885.738569322]: ======================================
[ INFO] [1576771885.738587745]: mean_ori = 116.577 | mean_pos = 2.144
[ INFO] [1576771885.738601671]: min_ori  = 0.133 | min_pos  = 0.032
[ INFO] [1576771885.738615847]: max_ori  = 602.480 | max_pos  = 8.555
[ INFO] [1576771885.738630077]: std_ori  = 105.535 | std_pos  = 1.730
[ INFO] [1576771885.738642262]: ======================================

在这里插入图片描述

error_simulation

TODO: simulation run 还没看

usage:

rosrun ov_eval error_simulation <file_est.txt> <file_std.txt> <file_gt.txt>

timing_singlerun

作用:将 pid_ros.py 记录的 node 资源占用情况 plot 出来

usage:

rosrun ov_eval timing_singlerun <file_times.txt>

example:

#:~/workspace/evaluation$ rosrun ov_eval timing_singlerun algorithm/openvins/V1_01_easy/time_12201241.txt 
[ INFO] [1576774538.772421057]: [TIME]: loaded 46 timestamps from file!!

在这里插入图片描述

timing_comparison

TODO: 还没用过,看代码应该是读取多个 algo 的多次运行结果并计算平均资源占用

usage:

rosrun ov_eval timing_comparison <timings_folder>

plot_trajectories

作用:将 ground truth 与 file_est 轨迹对齐之后把轨迹 plot 出来,目前是两个 2d 图(x-y, t-z)

usage:

rosrun ov_eval plot_trajectories <align_mode> <file_gt.txt> <file_est1.txt> ...  <file_est9.txt>

看代码目前应该只支持 5 个 file_est,因为画路径的颜色只定义了 6 种。。

align_mode:

  1. posyaw
  2. posyawsingle
  3. se3
  4. se3single
  5. sim3
  6. none:Identity

example:

在这里插入图片描述
在这里插入图片描述

reference

  1. Estimator Evaluation Methods
  2. open_vins/ov_eval
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ov_eval说明 的相关文章

  • JavaScript 中 eval 的替代方案是什么?

    我有一些代码 看起来像这样 function StrippedExample i1 i2 i3 i4 i5 i6 i7 i8 this i for var i 1 j 0 i lt 9 i var k eval i i if k gt 0
  • 动态代码执行:字符串 -> 运行时代码 VB.net

    我正在尝试在运行时执行字符串内的一些代码 IE Dim code As String IIf 1 2 True False 我如何运行里面的代码code细绳 正如 ElektroStudios 所说 正确的方法是使用CodeDom编译器 h
  • 在 Clojure 中执行动态绑定函数

    我想在数据结构中预先存储一堆函数调用 然后从另一个函数中评估 执行它们 对于在命名空间级别定义的函数 这按计划工作defn 即使函数定义是在我创建数据结构之后出现的 但不适用于由let name fn or letfn函数内部 这是我的一个
  • 使用 preg_replace 修改 HTML 和 PHP [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有这个 HTML PHP 内容 作
  • PHP 的 create_function() 与仅使用 eval()

    在 PHP 中 您有 create function 函数 它创建一个唯一的命名 lambda 函数 如下所示 myFunction create function foo return foo myFunction bar Returns
  • “eval() uating”条件的替代方法

    在我正在处理的遗留代码库中 有一个条件评估器 它接受用户输入来构建条件 然后使用 php eval 在运行时评估此条件 在不使用 eval 的情况下解决此问题的最佳方法是什么 例如我有一个用户在 UI 中输入的条件 1 gt 0 必须对此进
  • python eval 函数中的 \r\n 与 \n

    为什么 eval 函数不能与 r n 一起使用 而可以与 n 一起使用 例如 eval for i in range 5 r n print hello 不起作用 eval for i in range 5 n print hello 有效
  • 在 Python 中根据不安全的用户输入评估数学方程

    我有一个网站 用户在其中输入数学方程 表达式 然后根据网站提供的数据 常数 评估这些方程 需要的数学运算包括符号 算术运算 min max 以及其他一些基本功能 示例方程可以是 max a b 100 a b 200 人们可以简单地eval
  • 如何在不使用 eval 的情况下动态包含 Perl 模块?

    我需要动态包含 Perl 模块 但如果可能的话 由于工作编码标准 我希望远离 eval 这有效 module My module eval use module 但我需要一种方法来做到这一点 而不需要eval如果可能的话 所有谷歌搜索都会导
  • 是否有与 eval("function(arg1, arg2)") 等效的 C/C++?

    它需要一种方法来调用名称存储在类似于 eval 的字符串中的函数 你能帮我吗 C 没有反射 所以你必须破解它 i 即 include
  • 来自字符串的 PHP 变量值

    如何从字符串变量中获取值 Member Student 3600 selectedItem Member Student price selectedItem print r price prints Member Student inst
  • Javascript eval() 和附加脚本标签之间的区别

    我想知道是否有人可以解释使用 Javascript 的 eval 和另一种方法之间的区别 例如使用 JQuery 创建脚本标签 然后将该元素附加到页面 eval somecode vs appendTo head 不确定这是否相关 但上下文
  • 我可以使用“eval”在 Python 中定义函数吗? [复制]

    这个问题在这里已经有答案了 我想使用 eval 定义一个 Python 函数 func obj eval def foo a b return a b 但它返回无效语法错误 我怎样才能做到呢 顺便说一句 如何在 Python 中将函数 ob
  • PHP 评估 $a="$a"?

    我正在查看一些工作代码 并发现了这一行 eval element element 我真的很困惑为什么 PHP 开发人员会写这行代码 除了为自身设置一个变量之外 这还有什么目的 幸运的是 该行所在的函数从未被调用 上面的例子将输出 This
  • 如何从 AS3 代码调用 Tamarin ESC 编译器?

    我正在尝试从 AS3 代码调用 Tamarin 的 ESC 编译器 我已经在 Flash Player 中加载了 ESC 编译器字节代码 但是当我调用它时 ESC 编译器总是返回相同的不执行任何操作的字节代码 无论我提供什么源代码 人类可读
  • 上下文保留评估

    我们正在构建一个小型 REPL 来评估 使用eval 用户输入的 JavaScript 表达式 由于整个事情是事件驱动的 因此评估必须在单独的函数中进行 但必须在调用之间保留上下文 即所有声明的变量和函数 我想出了以下解决方案 functi
  • R: Knit 给出 SQL-chunk 错误

    我想编织 R markdown 的输出 其中包括几个 SQL 块 但是 如果我开始编织 就会收到错误消息 Line 65 Error in eval expr envir enclos object pp dataset not found
  • DBI:在 eval 中引发错误

    这个问题参考了池上的评论 But if you re going to put an eval around every statement just use RaiseError gt 0 in this thread https sta
  • eval 列表理解失败[重复]

    这个问题在这里已经有答案了 考虑以下假设代码 class B object def init self self b 2 def foo self out1 eval self b ok print out1 prints 2 out2 e
  • 如何在 ClojureScript 中运行 eval 并访问调用 eval 的命名空间?

    我有一个函数库 我想让用户在浏览器中使用它 所以我想设置这样的情况 我正在使用 Figwheel 和 devcards 进行开发 在主要的 core cljs 我require我的库中的各种函数 所以它们都在范围内 现在我想让用户输入一些调

随机推荐