Vins-Fusion运行kitti,euroc和tum数据集并使用evo评估

2023-05-16

基于ubuntu18.04

VIns-Fusion

1.修改程序输出位姿信息修改为TUM格式

为了方便评估,先将程序的输出位姿信息修改为tum格式,需要做如下改动

1.1 回环输出位姿文件pose_graph.cpp

updatePath()函数中,下面一段修改为

        if (SAVE_LOOP_PATH)
        {
            ofstream loop_path_file(VINS_RESULT_PATH, ios::app);
            loop_path_file.setf(ios::fixed, ios::floatfield);
            loop_path_file.precision(9);
            loop_path_file << (*it)->time_stamp  << " ";
            loop_path_file.precision(5);    //为进行评估,这里修改 x,y,z,w
            loop_path_file  << P.x() << " "
                  << P.y() << " "
                  << P.z() << " "
                  << Q.x() << " "
                  << Q.y() << " "
                  << Q.z() << " "
                  << Q.w() << endl;
            loop_path_file.close();
        }

addKeyFrame()函数中,下面一段修改为

        if (SAVE_LOOP_PATH)
        {
            ofstream loop_path_file(VINS_RESULT_PATH, ios::app);
            loop_path_file.setf(ios::fixed, ios::floatfield);
            loop_path_file.precision(9);
            loop_path_file << cur_kf->time_stamp  << " ";
            loop_path_file.precision(5);    //为进行评估,这里修改 x,y,z,w
            loop_path_file  << P.x() << " "
                  << P.y() << " "
                  << P.z() << " "
                  << Q.x() << " "
                  << Q.y() << " "
                  << Q.z() << " "
                  << Q.w() << endl;
            loop_path_file.close();
        }

1.2 里程计位姿输出visualization.cpp

如果还要分析纯里程计的位姿信息,还需要修改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;
 // foutC.close();

 // write result to file   这里写入的是no_loop.csv
 ofstream foutC(VINS_RESULT_PATH, ios::app);
 foutC.setf(ios::fixed, ios::floatfield);
 foutC.precision(5);
 foutC << header.stamp.toSec() << " "<< 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;
 foutC.close();

1.3 修改配置文件的输出路径

修改每个数据集对应的yaml文件中的输出路径,这个看自己需求习惯

output_path: "~/catkin_ws_vinsFusion/src/VINS-Fusion/output/"

以上修改中一定要注意时间戳的精度,对很大影响evo评估的精度

2.安装evo工具

安装

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

这样就可以使用相关命令

evo_traj tum myslam.txt -p
evo_ape tum data.txt vins_data.txt  -va -p
--save_as_tum         save trajectories in TUM format (as *.tum)
--save_as_kitti          save poses in KITTI format (as *.kitti)
--save_as_bag         save trajectories in ROS bag as <date>.bag
--save_plot “保存的路径”

详细使用可参考https://blog.csdn.net/CSDNhuaong/article/details/101909888

但是为了对数据集中的groundTruth进行处理,最好下载一下evo的源码,其中有些脚本需要使用
git地址https://github.com/MichaelGrupp/evo.git

3.运行kitti_odometry数据集

下载地址http://www.cvlibs.net/datasets/kitti/eval_odometry.php,groundTruth也可以在这个页面下载。

3.1 使用evo工具转换格式

首先把kitti的groundTruth文件转为TUM格式,在下载的evo源代码路径下,进入contrib文件夹,打开终端运行,注意修改为自己的路径

python kitti_poses_and_timestamps_to_trajectory.py kitti路径/data_odometry_gray/dataset/KITTIOdometry_data_odometry_poses/dataset/poses/05.txt kitti路径/data_odometry_gray/dataset/sequences/05/times.txt kitti_05_gt.txt

以上命令结合kitti的时间戳和位姿生成轨迹文件kitti_05_gt.txt,这个文件接下来作为groundTruth与VinsFusion得到的轨迹进行评估。

3.2 运行Vins_Fusion

一下三个命令在对应工作空间的三个终端启动,假设运行kitti05,注意修改为自己的路径
注意每次要source devel/setup.bash

roslaunch vins vins_rviz.launch
rosrun loop_fusion loop_fusion_node ~/catkin_ws_vinsFusion/src/VINS-Fusion/config/kitti_odom/kitti_config04-12.yaml
rosrun vins kitti_odom_test src/VINS-Fusion/config/kitti_odom/kitti_config04-12.yaml kitti路径/data_odometry_gray/dataset/sequences/05

运行结束即可在设定的路径下得到vio_loop.csv

3.3 evo评估

根据上面得到的两个文件,计算轨迹误差

evo_ape tum vio_loop.csv ~/下载/evo/contrib/kitti_05_gt.txt -va --plot --plot_mode xyz
evo_rpe tum vio_loop.csv ~/下载/evo/contrib/kitti_05_gt.txt -r full -va --plot --plot_mode xyz

回环的groundTruth文件可以在https://github.com/ZhangXiwuu/KITTI_GroundTruth下载,不过这里用不到。

4.运行euroc数据集

下载地址https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets

4.1 使用evo工具转换格式

将euroc数据集本身的groundTruth改为TUM格式,在数据集的groundTruth路径下,打开终端运行

evo_traj euroc data.csv --save_as_tum

即可得到data.tum文件,作为groundTruth

4.2 运行Vins_Fusion

以MH_01为例子,注意修改路径以及 source devel/setup.bash,在对应工作空间,每个命令使用一个终端运行

roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/catkin_ws_Fine/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml
rosrun loop_fusion loop_fusion_node ~/catkin_ws_Fine/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml
rosbag play ~/euroc/MH_01_easy.bag

运行结束可以在指定的输出路径下得到vio_loop.csv

4.3 evo评估

根据上面得到的两个文件,计算轨迹误差

evo_ape tum vio_loop.csv ~/euroc/MH_01_easy/mav0/state_groundtruth_estimate0/data.tum -va --plot --plot_mode xyz
evo_rpe tum vio_loop.csv ~/euroc/MH_01_easy/mav0/state_groundtruth_estimate0/data.tum -r full -va --plot --plot_mode xyz

5. 运行TUM VI数据集

下载地址:https://vision.in.tum.de/data/datasets/visual-inertial-dataset

5.1 使用evo工具转换格式

TUM数据集的GroundTruth在对应的tar文件中 即~/TUM/dataset-room1_512_16/dso/gt_imu.csv
在这个路径下,打开终端执行

evo_traj euroc gt_imu.csv --save_as_tum

得到gt_imu.tum,作为接下来评估的groundTruth

5.2 运行Vins_Fusion

以room1为例,注意修改路径以及 source devel/setup.bash,在对应工作空间,每个命令使用一个终端运行

roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/catkin_ws_vinsFusion/src/VINS-Fusion/config/TUM/tum_mono_imu.yaml
rosrun loop_fusion loop_fusion_node ~/catkin_ws_vinsFusion/src/VINS-Fusion/config/TUM/tum_mono_imu.yaml
rosbag play ~/TUM/dataset-room1_512_16.bag

tum_mono_imu.yaml写法如下(可参考vinsmono的)

%YAML:1.0
 
imu: 1         
num_of_cam: 1  
 
#common parameters
imu_topic: "/imu0"
image0_topic: "/cam0/image_raw"
output_path: "/home/sch/catkin_ws_vinsFusion/src/VINS-Fusion/output/"
 
cam0_calib: "cam0.yaml"
image_width: 512
image_height: 512
 
# Extrinsic parameter between IMU and Camera.
estimate_extrinsic: 0   # 0  Have an accurate extrinsic parameters. We will trust the following imu^R_cam, imu^T_cam, don't change it.
                        # 1  Have an initial guess about extrinsic parameters. We will optimize around your initial guess.
                        # 2  Don't know anything about extrinsic parameters. You don't need to give R,T. We will try to calibrate it. Do some rotation movement at beginning.                        
#If you choose 0 or 1, you should write down the following matrix.
#Rotation from camera frame to imu frame, imu^R_cam
body_T_cam0: !!opencv-matrix
   rows: 4
   cols: 4
   dt: d
   data: [ -9.9951465899298464e-01, 7.5842033363785165e-03, -3.0214670573904204e-02, 4.4511917113940799e-02,
            2.9940114644659861e-02, -3.4023430206013172e-02, -9.9897246995704592e-01, -7.3197096234105752e-02,
            -8.6044170750674241e-03, -9.9939225835343004e-01, 3.3779845322755464e-02 ,-4.7972907300764499e-02,
            0,   0,    0,    1]
 
#Multiple thread support
multiple_thread: 1
 
#feature traker paprameters
max_cnt: 150            # max feature number in feature tracking
min_dist: 15            # min distance between two features 
freq: 10                # frequence (Hz) of publish tracking result. At least 10Hz for good estimation. If set 0, the frequence will be same as raw image 
F_threshold: 1.0        # ransac threshold (pixel)
show_track: 1           # publish tracking image as topic
equalize: 1             # if image is too dark or light, trun on equalize to find enough features
fisheye: 1              # if using fisheye, trun on it. A circle mask will be loaded to remove edge noisy points
 
#optimization parameters
max_solver_time: 0.04  # max solver itration time (ms), to guarantee real time
max_num_iterations: 8   # max solver itrations, to guarantee real time
keyframe_parallax: 10.0 # keyframe selection threshold (pixel)
 
#imu parameters       The more accurate parameters you provide, the better performance
acc_n: 0.04          # accelerometer measurement noise standard deviation. #0.2   0.04
gyr_n: 0.004         # gyroscope measurement noise standard deviation.     #0.05  0.004
acc_w: 0.0004         # accelerometer bias random work noise standard deviation.  #0.02
gyr_w: 2.0e-5       # gyroscope bias random work noise standard deviation.     #4.0e-5
g_norm: 9.80766     # gravity magnitude
 
#unsynchronization parameters
estimate_td: 0                      # online estimate time offset between camera and imu
td: 0.0                             # initial value of time offset. unit: s. readed image clock + td = real image clock (IMU clock)
 
#rolling shutter parameters
rolling_shutter: 0                  # 0: global shutter camera, 1: rolling shutter camera
rolling_shutter_tr: 0               # unit: s. rolling shutter read out time per frame (from data sheet). 
 
#loop closure parameters
load_previous_pose_graph: 0        # load and reuse previous pose graph; load from 'pose_graph_save_path'
pose_graph_save_path: "/home/tony-ws1/output/pose_graph/" # save and load path
save_image: 1                   # save image in pose graph for visualization prupose; you can close this function by setting 0 

min_dist不能太大,否则会跑飞,这个参数控制的是提取角点进行光流追踪的密度,代表角点之间的最近距离,值越小表示提取角点数量越大。
cam0.yaml写法如下

%YAML:1.0
---
model_type: KANNALA_BRANDT
camera_name: camera
image_width: 512
image_height: 512
mirror_parameters:
   xi: 3.6313355285286337e+00
   gamma1: 2.1387619122017772e+03
projection_parameters:
   k2: 0.0034823894022493434
   k3: 0.0007150348452162257
   k4: -0.0020532361418706202
   k5: 0.00020293673591811182
   mu: 190.97847715128717
   mv: 190.9733070521226
   u0: 254.93170605935475
   v0: 256.8974428996504

5.3 evo评估

根据上面得到的两个文件,计算轨迹误差

evo_ape tum vio_loop.csv ~/TUM/dataset-room1_512_16/dso/gt_imu.tum  -va --plot --plot_mode xyz
evo_rpe tum vio_loop.csv ~/TUM/dataset-room1_512_16/dso/gt_imu.tum -r full -va --plot --plot_mode xyz
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vins-Fusion运行kitti,euroc和tum数据集并使用evo评估 的相关文章

  • 【SLAM】VINS-MONO解析——前端

    各个部分的讲解如下链接 xff1a SLAM VINS MONO解析 综述 SLAM VINS MONO解析 feature tracker SLAM VINS MONO解析 IMU预积分 SLAM VINS MONO解析 vins est
  • 【SLAM】VINS-Fusion解析——流程

    VINS Fusion分析 因为时间原因 xff0c 没有像vins mono看的和写的那么具体 有时间的话我会补充完整版 vins fusion不像mono那样有三个node xff0c 它只有一个node xff0c 在rosNodeT
  • 2 用D435i运行VINS-fusion

    文章目录 1 VINS fusion的安装1 1 环境和依赖的安装1 2 编译VINS Fusion1 3 编译错误解决方法 2 VINS Fusion跑数据集3 用相机运行VINS Fusion 环境 xff1a Ubuntu20 04
  • VINS-Mono 加rgbd

    通过对比VINS Mono与其RGBD版本 xff0c 分析其改动思路 一 feature tracker feature tracker node cpp 头文件加入了ros的多传感器时间戳 include lt message filt
  • vins 解读_代码解读 | VINS_Mono中的鱼眼相机模型

    本文作者是计算机视觉life公众号成员蔡量力 xff0c 由于格式问题部分内容显示可能有问题 xff0c 更好的阅读体验 xff0c 请查看原文链接 xff1a 代码解读 VINS Mono中的鱼眼相机模型 VINS Mono中的鱼眼相机模
  • ubuntu18.04 安装ros与运行vins-mono

    Ubuntu18 04 安装环境及运行Vins mono xff08 2022年 xff09 AI技术聚合 安装 sudo apt get install ros melodic desktop full 正在解包 ros melodic
  • realsense d435i 自制Euroc数据集

    参考 提取bag Python程序地址 span class token operator span home span class token operator span yang span class token operator sp
  • Mac上vmware fusion装的ubuntu不能与主机复制粘贴的问题

    解决方法一 xff1a 安装vmware tools 依次点击 xff1a 虚拟机 gt 安装vmware tools 会在ubuntu桌面上出现vmware tools xff0c 双击打开 解压tar gz包 xff0c 执行解压命令t
  • 关于VINS-MONO与VIO轨迹漂移问题定位的一些方向

    整个VINS MONO系统 xff0c 较容易在系统静止或外力给予较大冲击时产生轨迹漂移 xff0c 原因是imu的bias在预积分中持续发散 xff0c 视觉重投影误差产生的约束失效 如静止 xff0c 先验约束可能会在LM的线性求解器中
  • VINS-Mono

    文章目录 初始化框架缺点ORB SLAM的Local Map VINS的滑窗 逐次逼近式去畸变给后端提供的特征点信息光流追踪对极约束F去除外点 rejectWithF 特征点均匀化预积分系统初始化初始化时不校正bias a误差卡尔曼滤波误差
  • 在ubuntu20.04上配置VINS_Fusion(亲测有效,一应俱全)

    最近在做科研训练的时候配置了HKUST Aerial Robotics实验室的VINS Fusion代码项目 xff0c 经历了一些编译报错的问题 xff0c 在网上查找的时候博客内容良莠不齐 xff0c 且实质针对性意见不多 xff0c
  • VINS-FUSION-GPU在jetson nx上的实现

    需要安装经过修改的Ubuntu18系统 https span class token operator span span class token comment developer nvidia com zh cn embedded do
  • VINS-mono 位姿图 重利用测试

    在前一篇博文里介绍了VINS mono pose graph reuse功能的使用 xff0c 这里接着贴出一些延伸的测试 xff0c 并进行一些探讨 延伸测试 一般来说 xff0c 加载地图是进行非GPS定位必要的一步 这里根据新的VIN
  • vins中的坐标系变换及g2r函数

    slam中经常会需要表示一个刚体的位姿 例如imu的位姿 xff0c 相机的位姿 首先我们需要在一个刚体上架上一个坐标系 这个坐标系为本体坐标系 怎么架一个坐标系 xff1f imu本身就有规定其本身的x y z轴的方向 相机一般认为 xf
  • vins-fusion代码解读[五] imu在vins里的理解

    SLAM新手 xff0c 欢迎讨论 IMU作用 vins中 xff0c IMU只读取IMU六轴的信息 xff0c 3轴线加速度 xff08 加速度计 xff09 和3轴角速度 xff08 陀螺仪 xff09 通过对陀螺仪的一次积分 xff0
  • 运行相机与vins_Fusion

    安装相机的SDK git clone https github com slightech MYNT EYE D SDK git cd MYNT EYE D SDK make init make all 这里由于没有添加依赖 xff0c O
  • VINS-Mono学习(二)——松耦合初始化

    初始化 xff1a 如何当好一个红娘 xff1f 图解SfM 视觉和IMU的羁绊 怎么知道发生了闭环 xff1f 位姿图优化与滑窗优化都为哪般 xff1f 闭环优化 xff1a 拉扯橡皮条 整体初始化流程如下 xff1a 1 SFM纯视觉估
  • VINS-Mono学习(五)——闭环优化4DoF

    这里再重写一边VINS开启的新线程 xff1a 前端图像跟踪后端非线性优化闭环检测闭环优化 闭环优化是跟在闭环检测之后步骤 首先回顾闭环检测的过程 xff1a 1 pose graph node cpp开启process闭环检测线程 xff
  • Ubuntu 18.04 ———(Intel RealSense D435i)运行VINS-Mono

    Intel RealSense D435i 一 准备工作二 修改参数rs camera launchrealsense color config yaml 参考文献 一 准备工作 1 Intel Realsense D435i Ubuntu
  • fusion 能看穿新型包装吗?

    Given newtype MyVec MyVec unVec Data Vector deriving Functor etc 这将创建 类似于 instance Functor MyVec where fmap f MyVec Data

随机推荐

  • STM32 PCB设计

    看了自己2018年2月画的PCB和现在2019年7月画的PCB xff0c 不多说了 不多说了 不多说了上图 96 2018年2月 96 2019年7月 大家可以明显看到第一块板子简直就是惨不忍睹 说几点PCB设计注意事项和自己的感想 xf
  • Java 调用第三方接口方法

    Java 调用第三方接口方法 一 通过JDK网络类Java net HttpURLConnection 1 java net包下的原生java api提供的http请求 使用步骤 xff1a 1 通过统一资源定位器 xff08 java n
  • docker基本命令及使用实例

    docker基本命令 特别鸣谢 xff1a B站up主 狂神说java的视频 xff0c 让我能短时间了解docker docker文件系统 docker镜像为分层设计 xff0c 相比于全量的虚拟机镜像 xff0c 少了引导程序bootf
  • ubantu 系统分区介绍

    假设分区有40个G 1 500M引导分区 2 10个G的swap分区 swap是一个内存交换空间 xff0c 当内存溢出 xff0c 或者计算机打算休眠的时候 会将数据存在swap分区中 在windows系统中是三个文件 swap的大小通常
  • H3C交换机常用命令(初学)

    一 显示交换机当前的一些配置信息 1 display current configuration 显示当前的一些配置信息 xff0c 如vlan xff0c 端口详细信息 2 display saved configuration 显示下次
  • Linux下的Tcp通信项目范例【demo】

    一 适合阅读对象 2 4个月的初学者 C语言编程方向 xff09 二 项目内容 xff1a 设计一个可以符合多用户进行线上查阅乐器的商城 xff0c 要求可以多个用户查看 xff0c 管理员可随时修改内容 xff0c 普通用户仅可查看 xf
  • 平衡小车之陀螺仪调参

    一 平衡小车 平衡小车作为控制进阶 xff0c 成为每个学习PID控制算法者的必经之路 xff0c 可难可易 xff0c 找到方法则非常容易 xff0c 找不到方法可能盲调数天也没有收获 要让小车平衡 xff0c 我认为需要掌握的技能有几点
  • 常用的字符函数和字符串函数

    一 分类 求字符串长度 xff1a strlen长度不受限制的字符串函数 xff1a strcpy strcat strcmp长度受限制的字符串函数 xff1a strncpy strncat strncmp字符串查找 xff1a strs
  • 成功解决Command &quot;python setup.py egg_info&quot; failed with error code 1 in C:\Users\AppData\

    成功解决Command amp quot python setup py egg info amp quot failed with error code 1 in C Users AppData 目录 解决问题 解决方法 解决问题 Com
  • 解决JetPack4.2 自制载板无法开机

    使用下面方法会导致无法连接显示器 xff01 xff01 xff01 1 源码下载 https developer nvidia com embedded downloads 选择 L4T Sources 下载 L4T JAX and TX
  • Android开发技巧 (五) —— Lambda表达式

    Lambda表达式本质是一种匿名方法 xff0c 它既没有方法名 xff0c 也没有访问修饰符和返回值类型 xff0c 用它来写代码更简洁 xff0c 更易懂 Lambda是Java8的新特性 xff0c 所以要在app build gar
  • 树莓派4B安装ubuntu mate20 +putty和vncsever远程登录+安装ROS

    新买了树莓派4B xff0c 安装环境费了好大功夫 xff0c 终于找到一套可以用的方案 xff0c 记录一下 基本 xff1a 树莓派4B一块64G内存卡电源 显示器 鼠标 键盘 安装系统和换软件源 参考树莓派4B安装Ubuntu Mat
  • jsp医疗辅助诊断管理系统servlet开发mysql数据库web结构java编程计算机网页项目

    一 源码特点 JSP医疗辅助诊断管理系统是一套完善的java web信息管理系统 xff0c 对理解JSP java编程开发语言有帮助serlvet 43 dao 43 bean 模式开发 xff0c 系统具有完整的源代码和数据库 xff0
  • MATLAB2019a中文设置的一些说明

    MATLAB2019a中文设置的一些说明 问题 xff1a 今天打开matlab发现是英文的 xff0c 想要修改成中文 网上方法 xff1a preferences xff08 预设项 xff09 General xff08 常规 xff
  • ERROR: Could not install packages due to an EnvironmentError: [Errno 13] 权限不够的解决办法

    关于错误 xff1a ERROR Could not install packages due to an OSError Errno 13 Permission denied 39 usr local label cn txt 39 Co
  • 每天进步一点点(一)

    1 说一下sram xff0c flash memory xff0c 及dram的区别 xff1f sram xff1a 静态随机存储 这里的静态是指这种存储器只需要保持通电 xff0c 里面的数据就可以永远保持 但是当断电之后 xff0c
  • GPS载频信号简述(L1、L2、L3、L5)

    L1 1575 42 1 023MHzL2 1227 60 1 023MHz L3 用途和频率暂未公开 资料显示其用于发现核爆炸或其他高能量红外辐射事件的核爆炸侦察系统 NDS 平台提供通讯联系 L5 1176 45 1 023MHz xf
  • Ajax详解及使用Ajax时的返回值类型有哪些?

    Ajax详解 Ajax 61 异步 JavaScript 和 XML Ajax 是一种用于创建快速动态网页的技术 通过在后台与服务器进行少量数据交换 xff0c Ajax 可以使网页实现异步更新 这意味着可以在不重新加载整个网页的情况下 x
  • ubuntu20.04双系统分区

    一 分四个区 xff0c 记录下 主分区和逻辑分区目前感觉没啥影响 但是有的电脑可能数量会有限制 boot引导分区 500M 交换分区 xff0c 16G及以下与内存大小一致 根目录 xff0c 如果要安装cuda之类的尽量50G以上吧 其
  • Vins-Fusion运行kitti,euroc和tum数据集并使用evo评估

    基于ubuntu18 04 VIns Fusion 1 修改程序输出位姿信息修改为TUM格式 为了方便评估 xff0c 先将程序的输出位姿信息修改为tum格式 xff0c 需要做如下改动 1 1 回环输出位姿文件pose graph cpp