有关VINS_Fusion的evo测试

这篇具有很好参考价值的文章主要介绍了有关VINS_Fusion的evo测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

配置完VINS_Fusion之后,我们会想要检测真值路径和实际路径之间的差异来判断该路径探索算法的好坏,这时候可以使用到evo测试工具,这一款工具可以测试KITTI、TUM、EUROC、ROS等类型的数据包,相关代码已经在github上开源~

evo传送门🔗https://github.com/MichaelGrupp/evo

配置VINS_Fusion的教程可以参考之前的博客哟!

VINS_Fusion传送门🔗在ubuntu20.04上配置VINS_Fusion(亲测有效,一应俱全)_Waygoer的博客-CSDN博客

此篇博客主要思路参照古月居的相关文章,但是古月居的文章是针对Vins_mono进行配置的,所以这篇博客对古月居的文章进行了一些改动,修正和补充了一些说明。

古月居文章传送门🔗vins-mono保存、重载地图、evo工具测试 - 古月居

-------------------------------------------------------正文开始!----------------------------------------------------------

1、安装evo工具

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

 可以根据自己的pip版本自行选择pip2或者pip3,但是在这里pip也可以正常使用,问题不大。

2、修改vins_ws的相关代码

这里的vins_ws其实就是在之前配置VINS_Fusion时的catkin_ws文件夹,我因为之前在配置别的文件的时候已经有过catkin_ws文件夹,所以在配置VINS_Fusion的时候就把应有的catkin_ws更名为了vins_ws,各位同志只需要根据自己对应的文件名进行更改即可。

这里以MH_01_easy为例,下载的地址链接是kmavvisualinertialdatasets – ASL Datasets,如果不知道这是怎么一回事的,建议回去看配置VINS_Fusion的文章。

vins起始轨迹,vins_fusion,开发语言,linux,github

第一个link下载出来的文件是MH_01_easy.bag文件,第二个link下载出来的是MH_01_easy.zip压缩包文件,解压后获得MH_01_easy文件夹,里面有的文件如下图所示:

vins起始轨迹,vins_fusion,开发语言,linux,github

 我们在比较的时候,比较的是两组数据,一组数据是我们根据MH_01_easy.bag实际跑出来的数据,另一组数据是模拟真值数据,存在state_groundtruth_estimate0这个文件夹里,是一个csv文件,这一点我们后面再提。

根据MH_01_easy.bag实际跑出来的数据应该存放在一个指定位置,但是我们之前在跑的时候没有获得这一个输出文件,为了获得这一个输出文件,我们需要更改一些代码。

(在这里插一句,为了修改代码,我们需要下载vscode,然后右击vins_ws文件夹选择用vscode打开,此时可以对该项目的代码进行修改)

找到vins_ws/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml,这一文件对应的是单目相机,修改output_path为

output_path: "/home/用户名/output/"

找到vins_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml,这一文件对应的是双目相机,操作同上。

修改好后,首先要重新编译一下

catkin_make

同时更新一下文件,使用

source ~/catkin_ws/devel/setup.bash

再重新运行单目或者双目相关指令来跑MH_01_easy的数据集,此时在主目录中我们就可以看到output文件夹中生成了vio.csv文件。

但是,很遗憾,这个文件不是我们想要的,因为它既不符合tum数据集的格式,又不符合euroc数据集的格式。所以我们只能对源代码进行一些修改咯~

----------------------------------------------------代码修改-----------------------------------------------------------------

1、找到vins_ws/src/VINS-Fusion/loop_fusion/src/pose_graph.cpp这个文件,翻到大概180行左右,将

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;

2、还是找到vins_ws/src/VINS-Fusion/loop_fusion/src/pose_graph.cpp这个文件(和上面步骤的文件是同一个),在830行左右,将

        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;

3、找到vins_ws/src/VINS-Fusion/vins_estimator/src/utility/visualization.cpp文件,在155行左右,将

        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;

这部分代码,修改为如下代码:

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;

4、找到vins_ws/src/VINS-Fusion/loop_fusion/src/pose_graph_node.cpp文件,在main()函数中,原本

VINS_RESULT_PATH = VINS_RESULT_PATH + "/vio_loop.csv";

改成

VINS_RESULT_PATH = VINS_RESULT_PATH + "/vio_loop.txt";

5、找到vins_ws/src/VINS-Fusion/vins_estimator/src/estimator/parameters.cpp文件,第111行代码原本为

    VINS_RESULT_PATH = OUTPUT_FOLDER + "/vio.csv";

改为

    VINS_RESULT_PATH = OUTPUT_FOLDER + "/vio.txt";

----------------------------------------------------修改完毕-----------------------------------------------------------------

至此,所有改动已完成,记住将所有改动过的文件进行保存,然后重新编译一下并更新一下文件,即运行

catkin_make
source ~/vins_ws/devel/setup.bash

3、描绘轨迹

运行单目或者双目的相关指令操作,此处以双目相机为例

roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml 
(optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml 
rosbag play YOUR_DATASET_FOLDER/MH_01_easy.bag

待数据集运行完毕后,我们可以在output文件中找到vim.txt文件,将这个文件移动到

MH_01_easy/mav0/state_groundtruth_estimate0中,并且将里面原有的真值数据文件data.csv转化成tum格式,该操作使用下面指令完成:

evo_traj euroc data.csv --save_as_tum

生成完毕后会产生data.tum文件。

接下来就可以绘制轨迹图像咯!(注意在MH_01_easy/mav0/state_groundtruth_estimate0文件夹中运行,否则需要注明对应路径)

evo_traj tum vio.txt  --ref=data.tum -p --plot_mode=xyz --align --correct_scale

生成图像如下,有三种类型:

vins起始轨迹,vins_fusion,开发语言,linux,github

 vins起始轨迹,vins_fusion,开发语言,linux,github

 vins起始轨迹,vins_fusion,开发语言,linux,github

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

至此,使用evo进行轨迹误差测试工作全部完成!

----------------------------------------------------补充-----------------------------------------------------------------------

当然,除了绘制轨迹进行轨迹的误差比较之外,我们还可以借助evo工具完成APE(绝对位姿误差)和RPE(相对位姿误差)的判定,并可以获得一些具体的数值来定量判定VINS_Fusion这个工具的可行性。

绝对位姿误差(APE)——

evo_ape tum data.tum vio.txt -r full -va --plot --plot_mode xyz --save_plot ./VINSplot --save_results ./VINS.zip

运行之后会会显示以下图像:

vins起始轨迹,vins_fusion,开发语言,linux,github

vins起始轨迹,vins_fusion,开发语言,linux,github

同时在终端也会显示一组数据:

vins起始轨迹,vins_fusion,开发语言,linux,github

这组数据表征的就是在进行绝对位姿误差比较时候的相关数据,采用的是无人机的实际运行轨迹和理想轨迹两组数据进行比较,我们可以根据这组数据与当前主流视觉定位算法orb_slam3进行一些比较,来评估VINS_Fusion算法的可行性。

相对位姿误差(RPE)——

evo_rpe tum data.tum vio.txt -r angle_deg --delta 1 --delta_unit m -va --plot --plot_mode xyz --save_plot ./VINSplot --save_results ./VINS.zip

运行之后会会显示以下图像:

 vins起始轨迹,vins_fusion,开发语言,linux,github

 vins起始轨迹,vins_fusion,开发语言,linux,github
同时在终端也会显示一组数据:

vins起始轨迹,vins_fusion,开发语言,linux,github

 具体数据代表的含义以及比较大家可以先自行搜索,经过评估之后VINS_Fusion性能和orb_slam3的性能是旗鼓相当甚至更加好一点的。

有关evo的具体使用方法大家也可以自行再搜索一下~

 文章来源地址https://www.toymoban.com/news/detail-780458.html

 

到了这里,关于有关VINS_Fusion的evo测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Realsence D455标定并运行Vins-Fusion

    1. 标定板准备 1.1 打印标定板 地址:https://github.com/ethz-asl/kalibr/wiki/downloads 下载,然后直接用A4纸就可以打印出来(有条件去淘宝买一个视觉标定板,标出来的误差会更小) 1.2 标定板信息 原始pdf的格子参数是: 调整后的格子参数是: 新建april_6x6_A4.yaml文件,内容展示如下:

    2024年02月08日
    浏览(31)
  • NVIDIA Jetson Xavier NX部署VINS-fusion-GPU

    1、Cuda 10.2的安装 安装好之后,在 .bashrc中配置环境变量。source之后,nvcc – version 即可查看cuda版本。 2、Eigen(用ROS自带的也可以) 3、Ceres solver 4、Opencv 安装 关于Opencv 的安装需要 特别谨慎 ,不建议频繁删除以前的库,因为多个项目使用的版本可能不同,所以可以将 常用的

    2024年01月21日
    浏览(38)
  • Ubuntu 20.04 配置 VINS-Fusion-gpu + OpenCV 4.6.0

    准备工作: (1)电脑装有 NVIDIA 显卡 (2)安装 ROS noetic/Installation/Ubuntu - ROS Wiki (3)安装 cuda Ubuntu安装cuda_GXU_Wang的博客-CSDN博客 (4)安装 ceres 1.14.0 Ubuntu20.04安装Ceres1.14.0_我是你de不死的bug的博客-CSDN博客 下载 opencv 源码,选择所需要的版本 opencv 4.6.0,相应的扩展opencv_cont

    2024年02月12日
    浏览(34)
  • 工程(十一)——NUC11+D435i+VINS-FUSION+ESDF建图(github代码)

    博主创建了一个科研互助群Q:772356582,欢迎大家加入讨论。 博主的合并代码 git@github.com:huashu996/VINS-FUSION-ESDFmap.git 参考我之前的博客,步骤和所遇见的问题已经写的很详细了 Jetson配置realsense D435i SDK以及realsense-ros_桦树无泪的博客-CSDN博客 1、相机内参 通过rostopic的camera/info获

    2024年02月07日
    浏览(30)
  • 【VINS-MONO测试】安卓手机采集mono+imu数据

    上一个vins-mono环境配置测试完成后,初步建立好实验环境,接下来开始进行数据采集(cam+imu)、打包、标定、运行。 记录一下后续要更新的内容吧: *ros打包、另外两种标定方式、手机在线测试、 另一种app的测试情况 、 IMU数据的调参 * 更新一下:2023-05-11,之前有些理解不

    2024年02月11日
    浏览(72)
  • 【安卓手机采集数据(cam+imu)在vins-mono下测试】

    上一个vins-mono环境配置测试完成后,初步建立好实验环境,接下来开始进行数据采集(cam+imu)、打包、标定、运行。 记录一下后续要更新的内容吧: *ros打包、另外两种标定方式、手机在线测试、 另一种app的测试情况 、 IMU数据的调参 * 更新一下:2023-05-11,之前有些理解不

    2023年04月22日
    浏览(25)
  • 【ARM NX环境下】最优雅的配置ego-planner到arm架构的nx机载电脑上(opencv3.4.18-cuda11.4+VINS-Fusion-GPU),并且实机试飞成功实验记录

    我们使用阿木实验室的板载电脑allspark2(arm Orin-NX架构)+Pixhawk6C实机飞行测试ego-planner,文章尾部附arm QGC安装教程 arm机载电脑与Pixhawk6c组合下提高飞控imu频率的方法。 【鸣谢】感谢阿木实验室支持 jetop安装 查看机载电脑当前环境(是否已经配置cuda或者本身含opencv) 如果CUD

    2024年03月21日
    浏览(51)
  • 经典文献阅读之--Dynamic-VINS(动态点滤除VINS)

    现在的SLAM算法在静态环境中表现良好,但在动态环境中很容易失败。最近的工作将基于深度学习的语义信息引入到SLAM系统以减轻动态对象的影响。然而,在资源受限的机器人的动态环境中应用鲁棒定位仍然具有挑战性。所以《RGB-D Inertial Odometry for a Resource-Restricted Robot in Dy

    2024年02月09日
    浏览(45)
  • OpenCV迭代去畸变undistortPoints 与vins的迭代不同 第二章vins前端 第三章imu预积分 第四章vio初始化

    OpenCV去畸变undistortPoints原理解析 不动点迭代法—单变量非线性方程近似根matlab求解 淦VINS-MONO源码 03–openCV与VINS中去畸变方法的不同 这里用的方法和openCV不同,假设现在求A点的去畸变坐标,那么我们将A的坐标直接代入畸变模型中,求得再次畸变的坐标,并求得这个坐标和

    2024年02月09日
    浏览(40)
  • VIO/VINS中关于能观性/可观性的详细讲解

    以前大概写过一下,太烂了。。。也是没什么人写,再详细讲解一下 整体简洁一点尝试主要用文字说明这个比较关键的点,其实整体和多传感器融合也有很大的关联,无论是外感还是内感传感器,无外乎从运动出发或者从观测出发: 这个部分不需要扯到VIO里面非线性优化那

    2024年02月10日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包