TUM evaluate_ate.py评测工具

2023-11-11 06:10
文章标签 工具 评测 py evaluate ate tum

本文主要是介绍TUM evaluate_ate.py评测工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

绝对轨迹误差脚本直接测量真实轨迹和估计轨迹的点之间的差异。

作为预处理步骤,我们使用时间戳将估计的姿势与地面真实姿势相关联。 基于此关联,我们使用奇异值分解来对齐真实轨迹和估计轨迹。

最后,我们计算每对姿势之间的差异,并输出这些差异的均值/中值/标准差。

此外,脚本还可以将两个轨迹绘制到png或pdf文件,这样一来可以更加直观的看到差异。

接下来,我们分别看一下相应的脚本执行命令

注:需要将evaluate_ate.py、groundtruth.txt、CameraTrajectory.txt、associate.py放在同一位置

(1)仅输出RMSE/cm误差,执行如下命令:

python evaluate_ate.py groundtruth.txt CameraTrajectory.txt

(2)输出真实轨迹和预测轨迹以及误差,并直观显示,执行如下命令:

 python evaluate_ate.py groundtruth.txt CameraTrajectory.txt --plot result.png

(3)输出所有误差,包含平均值,中值等, 执行如下命令:

 python evaluate_ate.py groundtruth.txt CameraTrajectory.txt --verbose

主要功能:
修改轨迹名称,修改图例位置,修改图例字体大小,
下图参考:https://blog.csdn.net/wannna/article/details/102751689
在这里插入图片描述下面代码图例位置设置为 右上角:

plt.legend(loc="upper right")   # 与plt.legend(loc=1)等价

下面代码图例位置设置为 右下角:

ax.legend(loc="lower right")

设置图例文字大小

ax.legend(loc="lower right",fontsize=12)

设置图片保存分辨率:

plt.savefig(args.plot,dpi=800)

以及取消图中difference计算,修改见下面代码

#!/usr/bin/python
"""
This script computes the absolute trajectory error from the ground truth
trajectory and the estimated trajectory.
"""import sys
import numpy
import argparse
import associatedef align(model,data):"""Align two trajectories using the method of Horn (closed-form).Input:model -- first trajectory (3xn)data -- second trajectory (3xn)Output:rot -- rotation matrix (3x3)trans -- translation vector (3x1)trans_error -- translational error per point (1xn)"""numpy.set_printoptions(precision=3,suppress=True)model_zerocentered = model - model.mean(1)data_zerocentered = data - data.mean(1)W = numpy.zeros( (3,3) )for column in range(model.shape[1]):W += numpy.outer(model_zerocentered[:,column],data_zerocentered[:,column])U,d,Vh = numpy.linalg.linalg.svd(W.transpose())S = numpy.matrix(numpy.identity( 3 ))if(numpy.linalg.det(U) * numpy.linalg.det(Vh)<0):S[2,2] = -1rot = U*S*Vhtrans = data.mean(1) - rot * model.mean(1)model_aligned = rot * model + transalignment_error = model_aligned - datatrans_error = numpy.sqrt(numpy.sum(numpy.multiply(alignment_error,alignment_error),0)).A[0]return rot,trans,trans_errordef plot_traj(ax,stamps,traj,style,color,label):"""Plot a trajectory using matplotlib. Input:ax -- the plotstamps -- time stamps (1xn)traj -- trajectory (3xn)style -- line stylecolor -- line colorlabel -- plot legend"""stamps.sort()interval = numpy.median([s-t for s,t in zip(stamps[1:],stamps[:-1])])x = []y = []last = stamps[0]for i in range(len(stamps)):if stamps[i]-last < 2*interval:x.append(traj[i][0])y.append(traj[i][1])elif len(x)>0:ax.plot(x,y,style,color=color,label=label)label=""x=[]y=[]last= stamps[i]if len(x)>0:ax.plot(x,y,style,color=color,label=label)def plot_traj3D(ax,stamps,traj,style,color,label):"""Plot a trajectory using matplotlib. Input:ax -- the plotstamps -- time stamps (1xn)traj -- trajectory (3xn)style -- line stylecolor -- line colorlabel -- plot legend"""stamps.sort()interval = numpy.median([s-t for s,t in zip(stamps[1:],stamps[:-1])])x = []y = []z = []last = stamps[0]for i in range(len(stamps)):if stamps[i]-last < 2*interval:x.append(traj[i][0])y.append(traj[i][1])z.append(traj[i][2])elif len(x)>0:ax.plot(x,y,z,style,color=color,label=label)label=""x=[]y=[]z=[]last= stamps[i]if len(x)>0:ax.plot(x,y,z,style,color=color,label=label)          if __name__=="__main__":# parse command lineparser = argparse.ArgumentParser(description='''This script computes the absolute trajectory error from the ground truth trajectory and the estimated trajectory. ''')parser.add_argument('first_file', help='ground truth trajectory (format: timestamp tx ty tz qx qy qz qw)')parser.add_argument('second_file', help='estimated trajectory (format: timestamp tx ty tz qx qy qz qw)')parser.add_argument('--offset', help='time offset added to the timestamps of the second file (default: 0.0)',default=0.0)parser.add_argument('--scale', help='scaling factor for the second trajectory (default: 1.0)',default=1.0)parser.add_argument('--max_difference', help='maximally allowed time difference for matching entries (default: 0.02)',default=0.02)parser.add_argument('--save', help='save aligned second trajectory to disk (format: stamp2 x2 y2 z2)')parser.add_argument('--save_associations', help='save associated first and aligned second trajectory to disk (format: stamp1 x1 y1 z1 stamp2 x2 y2 z2)')parser.add_argument('--plot', help='plot the first and the aligned second trajectory to an image (format: png)')parser.add_argument('--plot3D', help='plot the first and the aligned second trajectory to as interactive 3D plot (format: png)', action = 'store_true')parser.add_argument('--verbose', help='print all evaluation data (otherwise, only the RMSE absolute translational error in meters after alignment will be printed)', action='store_true')args = parser.parse_args()first_list = associate.read_file_list(args.first_file)second_list = associate.read_file_list(args.second_file)matches = associate.associate(first_list, second_list,float(args.offset),float(args.max_difference))    if len(matches)<2:sys.exit("Couldn't find matching timestamp pairs between groundtruth and estimated trajectory! Did you choose the correct sequence?")first_xyz = numpy.matrix([[float(value) for value in first_list[a][0:3]] for a,b in matches]).transpose()second_xyz = numpy.matrix([[float(value)*float(args.scale) for value in second_list[b][0:3]] for a,b in matches]).transpose()rot,trans,trans_error = align(second_xyz,first_xyz)second_xyz_aligned = rot * second_xyz + transfirst_stamps = first_list.keys()first_stamps.sort()first_xyz_full = numpy.matrix([[float(value) for value in first_list[b][0:3]] for b in first_stamps]).transpose()second_stamps = second_list.keys()second_stamps.sort()second_xyz_full = numpy.matrix([[float(value)*float(args.scale) for value in second_list[b][0:3]] for b in second_stamps]).transpose()second_xyz_full_aligned = rot * second_xyz_full + transif args.verbose:print "compared_pose_pairs %d pairs"%(len(trans_error))print "absolute_translational_error.rmse %f m"%numpy.sqrt(numpy.dot(trans_error,trans_error) / len(trans_error))print "absolute_translational_error.mean %f m"%numpy.mean(trans_error)print "absolute_translational_error.median %f m"%numpy.median(trans_error)print "absolute_translational_error.std %f m"%numpy.std(trans_error)print "absolute_translational_error.min %f m"%numpy.min(trans_error)print "absolute_translational_error.max %f m"%numpy.max(trans_error)else:print "%f"%numpy.sqrt(numpy.dot(trans_error,trans_error) / len(trans_error))if args.save_associations:file = open(args.save_associations,"w")file.write("\n".join(["%f %f %f %f %f %f %f %f"%(a,x1,y1,z1,b,x2,y2,z2) for (a,b),(x1,y1,z1),(x2,y2,z2) in zip(matches,first_xyz.transpose().A,second_xyz_aligned.transpose().A)]))file.close()if args.save:file = open(args.save,"w")file.write("\n".join(["%f "%stamp+" ".join(["%f"%d for d in line]) for stamp,line in zip(second_stamps,second_xyz_full_aligned.transpose().A)]))file.close()if args.plot:import matplotlibmatplotlib.use('Agg')import matplotlib.pyplot as pltimport matplotlib.pylab as pylabfrom matplotlib.patches import Ellipsefig = plt.figure()ax = fig.add_subplot(111)#修改轨迹名称plot_traj(ax,first_stamps,first_xyz_full.transpose().A,'-',"black","Ours")plot_traj(ax,second_stamps,second_xyz_full_aligned.transpose().A,'-',"blue","VINS-Mono")
#注释下面,取消difference计算#       label="difference"#      for (a,b),(x1,y1,z1),(x2,y2,z2) in zip(matches,first_xyz.transpose().A,second_xyz_aligned.transpose().A):#          ax.plot([x1,x2],[y1,y2],'-',color="red",label=label)#         label=""#    修改图例位置ax.legend(loc="lower right")ax.set_xlabel('x [m]')ax.set_ylabel('y [m]')
#dpi 修改图片分辨率plt.savefig(args.plot,dpi=800)if args.plot3D:import matplotlib as mplmpl.use('Qt4Agg')from mpl_toolkits.mplot3d import Axes3Dimport numpy as npimport matplotlib.pyplot as pltfig = plt.figure()ax = fig.gca(projection='3d')
#        ax = fig.add_subplot(111)plot_traj3D(ax,first_stamps,first_xyz_full.transpose().A,'-',"black","ground truth")plot_traj3D(ax,second_stamps,second_xyz_full_aligned.transpose().A,'-',"blue","estimated")label="difference"for (a,b),(x1,y1,z1),(x2,y2,z2) in zip(matches,first_xyz.transpose().A,second_xyz_aligned.transpose().A):ax.plot([x1,x2],[y1,y2],[z1,z2],'-',color="red",label=label)label=""            ax.legend()ax.set_xlabel('x [m]')ax.set_ylabel('y [m]')print "Showing"plt.show(block=True)plt.savefig("./test.png",dpi=90)
#        answer = raw_input('Back to main and window visible? ')
#        if answer == 'y':
#            print('Excellent')
#        else:
#            print('Nope')#plt.savefig(args.plot,dpi=90)

这篇关于TUM evaluate_ate.py评测工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/388066

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

超强的截图工具:PixPin

你是否还在为寻找一款功能强大、操作简便的截图工具而烦恼?市面上那么多工具,常常让人无从选择。今天,想给大家安利一款神器——PixPin,一款真正解放双手的截图工具。 想象一下,你只需要按下快捷键就能轻松完成多种截图任务,还能快速编辑、标注甚至保存多种格式的图片。这款工具能满足这些需求吗? PixPin不仅支持全屏、窗口、区域截图等基础功能,它还可以进行延时截图,让你捕捉到每个关键画面。不仅如此

免费也能高质量!2024年免费录屏软件深度对比评测

我公司因为客户覆盖面广的原因经常会开远程会议,有时候说的内容比较广需要引用多份的数据,我记录起来有一定难度,所以一般都用录屏工具来记录会议内容。这次我们来一起探索有什么免费录屏工具可以提高我们的工作效率吧。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  录屏软件录屏功能就是本职,这款录屏工具在录屏模式上提供了多种选项,可以选择屏幕录制、窗口

PR曲线——一个更敏感的性能评估工具

在不均衡数据集的情况下,精确率-召回率(Precision-Recall, PR)曲线是一种非常有用的工具,因为它提供了比传统的ROC曲线更准确的性能评估。以下是PR曲线在不均衡数据情况下的一些作用: 关注少数类:在不均衡数据集中,少数类的样本数量远少于多数类。PR曲线通过关注少数类(通常是正类)的性能来弥补这一点,因为它直接评估模型在识别正类方面的能力。 精确率与召回率的平衡:精确率(Pr

husky 工具配置代码检查工作流:提交代码至仓库前做代码检查

提示:这篇博客以我前两篇博客作为先修知识,请大家先去看看我前两篇博客 博客指路:前端 ESlint 代码规范及修复代码规范错误-CSDN博客前端 Vue3 项目开发—— ESLint & prettier 配置代码风格-CSDN博客 husky 工具配置代码检查工作流的作用 在工作中,我们经常需要将写好的代码提交至代码仓库 但是由于程序员疏忽而将不规范的代码提交至仓库,显然是不合理的 所

10个好用的AI写作工具【亲测免费】

1. 光速写作 传送入口:http://u3v.cn/6hXWYa AI打工神器,一键生成文章&ppt 2. 讯飞写作 传送入口:http://m6z.cn/5ODiSw 3. 讯飞绘文 传送入口:https://turbodesk.xfyun.cn/?channelid=gj3 4. AI排版助手 传送入口:http://m6z.cn/6ppnPn 5. Kim

分享5款免费录屏的工具,搞定网课不怕错过!

虽然现在学生们不怎么上网课, 但是对于上班族或者是没有办法到学校参加课程的人来说,网课还是很重要的,今天,我就来跟大家分享一下我用过的几款录屏软件=,看看它们在录制网课时的表现如何。 福昕录屏大师 网址:https://www.foxitsoftware.cn/REC/ 这款软件给我的第一印象就是界面简洁,操作起来很直观。它支持全屏录制,也支持区域录制,这对于我这种需要同时录制PPT和老师讲

生信圆桌x生信分析平台:助力生物信息学研究的综合工具

介绍 少走弯路,高效分析;了解生信云,访问 【生信圆桌x生信专用云服务器】 : www.tebteb.cc 生物信息学的迅速发展催生了众多生信分析平台,这些平台通过集成各种生物信息学工具和算法,极大地简化了数据处理和分析流程,使研究人员能够更高效地从海量生物数据中提取有价值的信息。这些平台通常具备友好的用户界面和强大的计算能力,支持不同类型的生物数据分析,如基因组、转录组、蛋白质组等。