VINS-Mono运行

摘要:
固定;&lt:header.stamp.toSec()*1e9<估计器.Ps[WINDOW_SIZE].y()<估计器.Ps[WINDOW_SIZE].z()<tmp_ Q.w()<tmp_Q.y()<tmp_Q.z()<估计器.Vs[WINDOW_SIZE].x()<
  • 修改

修改地图保存的路径
因为我们现在跑的是euroc数据集,所以我们要修改的地方有两处。

euroc_config.yaml中的pose_graph_save_path项
pose_graph_save_path: "/home/kk/自己的路径/"


euroc_config.yaml中的output_path项
output_path: "/home/kk/自己的路径/"
上述""里填写自己的路径,先创建好该路径,注意最后面有个/,代表着是一个文件夹。

修改完之后,记得在ros工作空间中重新编译一下catkin_make。

  • 保存

运行程序,待地图跑完之后,在运行 roslaunch vins_estimator euroc.launch 的terminal中,输入 “s” ,并按下回车键Enter,等待地图保存,我电脑花了20秒左右的时间。

  • ground truth与轨迹同时可见

如果想看到轨迹的同时,看到数据集的ground truth,我们可以再打开一个terminal,执行:

roslaunch benchmark_publisher publish.launch sequence_name:=MH_01_easy

  • 重载地图

首先要修改两处地方:

euroc_config.yaml的load_previous_pose_graph,置1
euroc_config.yaml的fast_relocalization,置1
第一项的意思是使能重新加载地图功能,第二项是快速重定位。(你可以先不改第二项试试看,然后再改,看看有什么不同),修改完之后重新编译catkin_make。

重新运行程序,会发现先加载了地图,颜色是黄色的。

  • evo工具

evo工具用过没?一个评测SLAM的工具,可以比较不同SLAM的算法精度,轨迹等等。evo支持好几种数据集的格式,tum、euroc等等。怎么装?github找去。

常见的参数如下:

evo_config:用于保存配置文件,把自己常用的参数保存为.json文件,避免每次输入。
evo_traj:用于绘制轨迹,支持的格式有kitti,eurco,tum 数据集等,也可以用于验证数据是否有效,导出为其他格式等。
evo_res:可用于比较指标中的多个结果文件(打印消息和统计消息,绘制结果,将统计信息保存在表内)
evo_ape :计算绝对位姿误差
evo_rpe:计算相对位姿误差

另外可以参考https://www.cnblogs.com/liuzhenbo/p/12254844.html

  • 修改

修改数据格式
这边我只测试了evo_traj,也就是画出它的轨迹。问题来了,vins-mono保存的轨迹没法直接用,因为它既不符合tum数据集的格式,又不符合euroc数据集的格式。那怎么办,改呗。

修改以下文件:

visualization.cpp中pubOdometry()函数

// write result to file
ofstream foutC(VINS_RESULT_PATH, ios::app);
foutC.setf(ios::fixed, ios::floatfield);
foutC.precision(0);
foutC << header.stamp.toSec() * 1e9 << ",";
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;
write result to file

改为

  ofstream foutC(VINS_RESULT_PATH, ios::app);
        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.x() << " "
              << tmp_Q.y() << " "
              << tmp_Q.z() << " "
              << tmp_Q.w() << endl;

pose_graph.cpp中的updatePath()函数

            ofstream loop_path_file(VINS_RESULT_PATH, ios::app);
            loop_path_file.setf(ios::fixed, ios::floatfield);
            loop_path_file.precision(0);
            loop_path_file << (*it)->time_stamp * 1e9 << ",";
            loop_path_file.precision(5);
            loop_path_file  << P.x() << ","
                  << P.y() << ","
                  << P.z() << ","
                  << Q.w() << ","
                  << Q.x() << ","
                  << Q.y() << ","
                  << Q.z() << ","
                  << endl;

改为

  ofstream loop_path_file(VINS_RESULT_PATH, ios::app);
            loop_path_file.setf(ios::fixed, ios::floatfield);
            loop_path_file.precision(0);
            loop_path_file << (*it)->time_stamp << " ";
            loop_path_file.precision(5);
            loop_path_file  << P.x() << " "
                            << P.y() << " "
                            << P.z() << " "
                            << Q.x() << " "
                            << Q.y() << " "
                            << Q.z() << " "
                            << Q.w() << endl;

pose_graph.cpp文件中addKeyFrame()函数

        ofstream loop_path_file(VINS_RESULT_PATH, ios::app);
        loop_path_file.setf(ios::fixed, ios::floatfield);
        loop_path_file.precision(0);
        loop_path_file << cur_kf->time_stamp * 1e9 << ",";
        loop_path_file.precision(5);
        loop_path_file  << P.x() << ","
              << P.y() << ","
              << P.z() << ","
              << Q.w() << ","
              << Q.x() << ","
              << Q.y() << ","
              << Q.z() << ","
              << endl;

改为

 ofstream loop_path_file(VINS_RESULT_PATH, ios::app);
        loop_path_file.setf(ios::fixed, ios::floatfield);
        loop_path_file.precision(0);
        loop_path_file << cur_kf->time_stamp << " ";
        loop_path_file.precision(5);
        loop_path_file  << P.x() << " "
                        << P.y() << " "
                        << P.z() << " "
                        << Q.x() << " "
                        << Q.y() << " "
                        << Q.z() << " "
                        << Q.w() << endl;

pose_graph_node.cpp中的main()函数
原本是csv文件,改成txt。

        VINS_RESULT_PATH = VINS_RESULT_PATH + "/vins_result_loop.txt";

好了,修改完成,重新编译catkin_make。

  • 使用evo绘制轨迹

修改VINS跑出来的轨迹格式在上一步已经完成

重新运行程序,会发现在刚刚保存地图的路径,生成了一个文件:vins_result_loop.txt

经过我们上面的修改,该文件是符合tum格式的。

修改数据集中的真实轨迹格式

虽然我们使用的是euroc数据集,但evo只支持tum格式的绘制,它提供了euroc格式转tum格式的工具。首先我们打开数据集的state_groundtruth_estimate0/文件夹,会发现有一个文件:data.csv。这是一个euroc格式的文件,我们首先要把他转成tum格式。输入以下命令:

evo_traj euroc data.csv --save_as_tum

生成data.tum

好了,接下来就可以绘制轨迹了!

在数据集的state_groundtruth_estimate0/文件夹下输入

evo_traj tum ../../../../YOUR_MAP_PATH/vins_result_loop.txt  --ref=data.tum -p --plot_mode=xyz --align --correct_scale

记得把YOUR_MAP_PATH修改成你的地图路径。

真是beautiful。其中虚线代表ground truth,蓝线代表vins的轨迹。

  • 与其他系统作对比

与双目ORB_SLAM2进行对比
ORB_SLAM2的轨迹在每次运行都会生成姿态轨迹,貌似不用修改文件

evo_traj tum VINS_MAP_PATH/vins_result_loop.txt ORB_SLAM2_PATH/ORB_SLAM2-master/CameraTrajectory.txt --ref=data.tum -p --plot_mode=xyz --align --correct_scale

参考大神的文章!感谢!链接https://blog.csdn.net/Hanghang_/article/details/104535370

其他参考

翻译了github上VINS-Mono的文章https://blog.csdn.net/learning_tortosie/article/details/83182258

大神的文章https://blog.csdn.net/houlianfeng/article/details/79525854

在17.12.29,VINS更新了代码加入了新的特征,包括map merge( 地图合并), pose-graph reuse(位姿图重利用), online temporal calibration function(在线时间校准函数), and support rolling shutter camera(支持卷帘快门相机)

大神的文章https://blog.csdn.net/houlianfeng/article/details/79626657#commentBox

在前一篇博文里介绍了VINS-mono pose_graph reuse功能的使用,这里接着贴出一些延伸的测试,并进行一些探讨。

开源方案对比https://blog.csdn.net/whut_chengjun/article/details/103938022

免责声明:文章转载自《VINS-Mono运行》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇跨平台响应式开发框架DevExtreme——支持Vue 3C#编程(四)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#调用java类、jar包方法。

一、将已经编译后的java中Class文件进行打包;打包命令JAR 如:将某目录下的所有class文件夹全部进行打包处理; 使用的命令:jar cvf test.jar -C com/ . 其中test.jar为要生成的jar包;com/ . 为指定的当前目录下的文件夹,该文件夹包括子文件夹及class文件; 二、到IKVM官方网站下载IKVM需要的组件 ...

WPF DispatcherTimer(定时器应用) 无人触摸60s自动关闭窗口

如果无人触摸:60s自动关闭窗口 xmal:部分 <s:SurfaceWindow x:Class="SurfaceApplication1.SurfaceWindow1"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://s...

基于openresty的https配置实践

最近机器人项目的子项目,由于和BAT中的一家进行合作,人家要求用HTTPS连接,于是乎,我们要改造我们的nginx的配置,加添HTTPS的支持。 当然了,HTTPS需要的证书,必须是认证机构颁发的,这里的配置实践,也是从技术路线上的一次操作,证书是基于openssl生成的。没有谁颁发,自建得之! 不多说,开始实践!!!! 1. openssl的版本信息 [...

php发送get、post请求的几种方法

方法1: 用file_get_contents 以get方式获取内容 1 <?php 2 $url='http://www.domain.com/'; 3 $html = file_get_contents($url); 4 echo $html; 5 ?> 方法2: 用fopen打开url, 以get方式获取内容 1 &l...

HTML5--Range对象的基本操作(5)

前言:   这节课主要学习HTML5中关于Range对象的常用API。   1.Range对象初识     作用:一个Range对象代表页面上的一段连续区域。通过Range对象,可以获取或修改网页上的任何区域。     Rnage对象示例: <body> Range对象初识</br> <input id="bt...

MapXtreme 2005学习(6):两种方法实现动态轨迹

在GIS中,动态轨迹的实现是非常有用的,可用GPS定位,热点跟踪等。在本例中,先创建一个用于呈现动态轨迹的临时图层,并在图层上添加一个点表示位体的位置。代码如下:     /**//// <summary>    /// 创建动态轨迹图层    /// Glacier    /// 2008年8月7日    /// <param nam...