使用EVO测评时对数据文件的处理

针对VINS-Mono

在使用evo工具对SLAM-Mono、IC-GVINS进行测评时,会因为其生成的EuRoC文件或Tum文件格式存在问题无法正常运行,需要先对输出文件格式进行调整。

针对SLAM-Mono代码的修改可参考:Ubuntu 18.04 ——— VINS-Mono运行与EVO的评测与使用_vinsmono 轨迹_@曾记否的博客-CSDN博客

 以VINS-Fusion为例理解修改处的代码:

//原代码:
ofstream foutC(VINS_RESULT_PATH, ios::app);
//ios::app表示文件以追加模式打开,即如果文件已经存在,新的数据将添加到文件末尾而不是覆盖文件内容
foutC.setf(ios::fixed, ios::floatfield);
//设置输出流的格式标志,将浮点数以固定小数点表示法输出。这意味着小数点后的位数将是固定的,不会根据数字的大小而变化
foutC.precision(0);
//设置浮点数输出的精度为0,这意味着浮点数将被截断为整数。
foutC << header.stamp.toSec() * 1e9 << ",";
//将时间戳乘以1e9,并将结果以逗号分隔写入文件。

foutC.precision(5);//下面这些信息为精度为5的浮点数
//位置信息
foutC << estimator.Ps[WINDOW_SIZE].x() << ","
      << estimator.Ps[WINDOW_SIZE].y() << ","
      << estimator.Ps[WINDOW_SIZE].z() << ","
//姿态信息
      << tmp_Q.w() << ","
      << tmp_Q.x() << ","
      << tmp_Q.y() << ","
      << tmp_Q.z() << ","
//速度信息
      << estimator.Vs[WINDOW_SIZE].x() << ","
      << estimator.Vs[WINDOW_SIZE].y() << ","
      << estimator.Vs[WINDOW_SIZE].z() << "," << endl;
foutC.close();
//修改后的代码
ofstream foutC(VINS_RESULT_PATH, ios::app);//修改“VINS_RESULT_PATH”为自己的路径
foutC.setf(ios::fixed, ios::floatfield);
//foutC.precision(0);
foutC << header.stamp.toSec() << " ";
//foutC.precision(5);//实际信息有六位
foutC << estimator.Ps[WINDOW_SIZE].x() << " "
      << estimator.Ps[WINDOW_SIZE].y() << " "
      << estimator.Ps[WINDOW_SIZE].z() << " "
      << tmp_Q.w() << " "
      << tmp_Q.x() << " "
      << tmp_Q.y() << " "
      << tmp_Q.z() << " "
      << estimator.Vs[WINDOW_SIZE].x() << " "
      << estimator.Vs[WINDOW_SIZE].y() << " "
      << estimator.Vs[WINDOW_SIZE].z() << " " << endl;
foutC.close();

其余修改部分参考:Ubuntu 18.04 ——— VINS-Fusion运行与EVO的评测与使用_evo评测vins-fusion mh_数据集_@曾记否的博客-CSDN博客

格式转换命令(注意:只支持euroc格式转tum格式

evo_traj euroc data.csv --save_as_tum// 将euroc格式的文件data.csv转成tum格式。生成data.tum

由这两组报错可知Tum格式文件与EuRoC格式文件的不同,一个文件属于哪种类型与后缀是.csv还是.txt无关,得根据文件内容的格式来判断在命令行中使用tum还是euroc。

[ERROR] TUM trajectory files must have 8 entries per row and no trailing delimiter at the end of the rows (space)
//大意为:每行必须有8个条目,并且行末尾没有尾随分隔符(空格)
[ERROR] EuRoC MAV state ground truth must have 17 entries per row and no trailing delimiter at the end of the rows (comma)
//大意为:每行必须有17个条目,并且行末尾没有尾随分隔符(逗号)

针对IC-GVINS

针对IC-GVINS的输出文件进行处理时,以urban39ROS包为例,其包含的truth_traj.csv文件时标准的tum格式,无需修改,而IC-GVINS生成的trajectory.csv文件中包含了大量空格符,需要进行修改才能运行。

使用此命令删除文件中多余分割符,此处需要删除的是space,并生成新的.csv文件 trajectory_new.csv

cat trajectory.csv | tr -s [:space:] > trajectory_new.csv

打开新的文件发现依然存在问题:行末还是存在一个空格符,这明显不符合tum格式的要求。

这里的原因是

  ...
     << estimator.Vs[WINDOW_SIZE].y() << " "
     << estimator.Vs[WINDOW_SIZE].z() << " " << endl;

输出z的速度信息后又加了一个空格,导致每行数据后都有一个空格符。可以将其删除。

继续使用以下命令进行处理:

cut --delimiter " " --fields 1-8 trajectory_new.csv > clean.csv

最后生成的文件可正常使用。

By the way,

在运行IC-GVINS时,需要将config中的.yaml文件移到数据集的文件目录下,并修改.yaml文件中的输出路径,编译此配置文件才能正常运行,否则就会出现如下情况:

在这里插入图片描述

tr命令符学习

 tr用来从标准输入中通过替换或删除操作进行字符转换。

主要用于删除文件中控制字符或进行字符转换。

使用tr时要转换两个字符串:字符串1用于查询,字符串2用于处理各种转换。

tr刚执行时,字符串1中的字符被映射到字符串2中的字符,然后转换操作开始。

带有最常用选项的t r命令格式为:
tr -c -d -s ["string1_t o_translate_from"]  ["string2_to_triannpsulta_te_to"]  Input-file
这里:
-c 用字符串1中字符集的补集替换此字符集,要求字符集为A S C I I。
-d 删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。(这可能是行末还存在一个空格符的原因???
Input-file是转换文件名。虽然可以使用其他格式输入,但这种格式最常用。

大小写转换:

除了删除控制字符,转换大小写是t r最常用的功能。为此需指定即将转换的小写字符[ a - z ]
和转换结果[ A - Z ]。
第一个例子,tr从一个包含大小写字母的字符串中接受输入。

echo "May Day,May Day,Going Down...."|tr "[a-z]" "[A-Z]"
[输出]
MAY DAY,MAY DAY,GOING DOWN....

同样,也可以使用字符类[:l o w e r:]和[:u p p e r:]

echo "May Day,May Day,Going Down...."|tr "[:lower:]" "[:upper:]"
[输出]
MAY DAY,MAY DAY,GOING DOWN....

将文本文件大写转换为小写并输出至一个新文件,格式为:

echo "Look for the route,or make"|tr "[a-z]" "[A-Z]">new-file-name
cat new-file-name 
//cat指令:用于显示或连接文件并打印到标准输出(屏幕或终端窗口)
[输出]
LOOK FOR THE ROUTE,OR MAKE

参考:linux shell编程指南第十二章------------tr 用法_shell tr删除12_NS西北风的博客-CSDN博客

cut命令符学习

cut以每一行为一个处理对象,在文件中负责剪切数据。

cut命令主要是接受三个定位方法:

第一,字节(bytes),用选项-b

第二,字符(characters),用选项-c

第三,域(fields),用选项-f

例:

一,按字节cut:

注意:一个空格算一个字节,一个汉字算三个字节

# date
[输出]
2011年08月11日 星期四20:44:52 EDT

# date |cut -b 1-4                取前四个字节
[输出]
2011

# date |cut -b 1-6
[输出]
2011

# date |cut -b 1-7           一个汉字算三个字节
[输出]
2011年

二,按字符cut:

按字符cut相对比较简单,中文字符和空格都算一个字符。

# date |cut -c 1-5
[输出]
2011年

# date |cut -c 5,9,13
[输出]
年月日

具体可参考:Linux 命令之 cut -- 分割字符串,显示或删除指定字段的内容,合并文件内容_cut -d: -f2_liaowenxiong的博客-CSDN博客

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值