这几天想用ORBSLAM3评估一下车载环境VIO的精度,但是ORBSLAM3没有适配KITTI数据集(你们懂的~)。

然后在网上搜了一下还没搜到,只好自己来适配。在此记录一下的走过的辛酸历程,希望能给大家带来帮助。

——————————分割线———————————

1.KITTI数据格式

KITTI提供两种数据:

odometry:标定图像calib、彩色图像color、灰度图像gray、轨迹真值poses、激光数据velodyne;
raw:相机、激光、IMU的原始数据。分sync和extract两种,sync是已对齐和矫正的数据,它的IMU数据为10HZ,extract未对齐未校正的原始数据 ,它的IMU数据为100HZ。
做VIO的精度评估肯定需要轨迹真值、图像序列、IMU数据。所以需要raw中的IMU数据与odometry的lolor和poses对齐。

2.数据对齐

以odometry的07序列为例,其对应raw里的2011_09_30_drive_0027数据包,这个对应关系来自KITTI开发工具包devkit_odometry的readme.txt文件:

Nr.     Sequence name     Start   End
---------------------------------------
00: 2011_10_03_drive_0027 000000 004540
01: 2011_10_03_drive_0042 000000 001100
02: 2011_10_03_drive_0034 000000 004660
03: 2011_09_26_drive_0067 000000 000800
04: 2011_09_30_drive_0016 000000 000270
05: 2011_09_30_drive_0018 000000 002760
06: 2011_09_30_drive_0020 000000 001100
07: 2011_09_30_drive_0027 000000 001100
08: 2011_09_30_drive_0028 001100 005170
09: 2011_09_30_drive_0033 000000 001590
10: 2011_09_30_drive_0034 000000 001200

因为图像数据是10HZ的,通常1帧图像需要10次IMU记录,即IMU数据需要100HZ,所以我们的目标是将2011_09_30_drive_0027_extract的IMU数据与odometry-07的图像数据通过同一个格式的时间联系起来,具体做法就是把extract中的IMU时间减去sync中图像的第一帧时间。
PS:00序列对应rawdata的imu数据出现了几次持续1秒左右的缺失。

3.IMU参数

首先是外参,ORBSLAM3需要相机到IMU的外参,KITTI提供的是IMU到激光和激光到相机的外参,可以通过MATLAB计算:

Rvi=[9.999976e-01 7.553071e-04 -2.035826e-03 -7.854027e-04 9.998898e-01 -1.482298e-02 2.024406e-03 1.482454e-02 9.998881e-01];
Rvi=reshape(Rvi,3,3)';
tvi=[-8.086759e-01 3.195559e-01 -7.997231e-01]';
Tvi=[Rvi tvi;0 0 0 1];
Rcv=[7.027555e-03 -9.999753e-01 2.599616e-05 -2.254837e-03 -4.184312e-05 -9.999975e-01 9.999728e-01 7.027479e-03 -2.255075e-03];
Rcv=reshape(Rcv,3,3)';
tcv=[-7.137748e-03 -7.482656e-02 -3.336324e-01]';
Tcv=[Rcv tcv;0 0 0 1];
Tci=Tcv*Tvi

其次是IMU噪声和随机游走,KITTI使用的IMU型号为oxts R3003,参考oxts官网的技术手册可知:
IMU.GyroWalk: 0.003491
IMU.AccWalk: 5.0000e-3
技术手册没提供噪声,用EuRoC的噪声代替:
IMU.NoiseGyro: 1.6968e-04
IMU.NoiseAcc: 2.0000e-3

4.ORBSLAM3读取KITTI数据的代码实现

读KITTI数据其实很简单参照stereo_kitti.cc和stereo_inertial_euroc.cc就可以了,代码占篇幅有点大就不贴了,懒癌重症患者请移步:
stereo_inertial_kitti.cc下载

5.精度评估

评估工具:evo

因为OBRSLAM3的VIO需要IMU由足够的加速度才会开始,所以跑出来的轨迹会少了刚开始的几帧,需要把真值的前n-1帧删除再同时左乘inv(Tn)。用MATLAB计算:

poseOri=load('D:\poses.txt');
[m,n]=size(poseOri);
n_del=23;     %跑出来的轨迹比真值少的帧数
Tinv=[reshape(poseOri(n_del+1,:),4,3)';0 0 0 1];
R=Tinv(1:3,1:3);
for i = 1:10
    R = 0.5 * (inv(R') + R);
end
R=R';
t=Tinv(1:3,4);
tnew=-R*t;
Tinv=[R tnew;0 0 0 1]
for i=1:m-n_del
    Ti=[reshape(poseOri(i+n_del,:),4,3)';0 0 0 1];
    temp=Tinv*Ti;
    T_total(i,:)=reshape(temp(1:3,1:4)',1,12);
end

然后用evo评估:
evo_ape kitti poses.txt traj_kitti.txt -p

SLAM_ORB-SLAM3(VIO/IMU)适配KITTI数据集,并评估!!!奶妈级教程!!!相关推荐

  1. kitti数据集转换bag包——图文教程

    前言:在做实验言过程中遇到了想要使用kitti数据集,而我想要的输入数据为bag包文件,故而需要将kitti数据集转化为rosbag包,经过查找相关资料终于实现,现分享出来yon供大家一起交流使用,如 ...

  2. LVI-SAM坐标系外参分析与代码修改,以适配各种数据集

    文章目录 0.前言 1.原作者传感器件坐标系定义与外参修改 1.1.博客作者的讲解(仅供参考) 1.2.LIO-SAM的README中作者对其传感器配置的解释 1.3.IMU坐标系详解 1.4.par ...

  3. 「Self-driving: KITTI」KITTI数据集简介

    背景 KITTI数据集建立前,前人的实验在米德尔伯里等既定基准上排名靠前的方法在从实验室转移到现实世界时表现低于平均水平. 除了向社区提供具现实世界数据以减少实验偏差,KITTI在补充现有基准的情况下 ...

  4. 多相机坐标转换_使用KITTI数据集实现坐标转换

    本文的主要内容,是讨论如何将KITTI激光雷达的点云数据,映射到图像中去. KITTI数据集是怎么采集的 下面这幅图是车的俯视图,可以看到,用到了2个彩色相机,2个灰度相机,1个激光雷达.1个GPS/ ...

  5. 周末学习总结(LIO标定+kitti数据集的使用+evo工具的使用+开源数据集+ssh的使用)

    周末学习总结 LIO标定 lidar_IMU_calib lidar_align kitti数据集的使用 开源数据集 evo工具的使用 ssh 的使用 LIO标定 网上开源的标定包,用的比较多的是浙江 ...

  6. KITTI数据集详解和评价标准

    from: https://blog.csdn.net/Solomon1558/article/details/70173223 摘要:本文融合了Are we ready for Autonomous ...

  7. 数据集:KITTI数据集分析

    摘要:本文融合了Are we ready for Autonomous Driving? The KITTI Vision Benchmark Suite和Vision meets Robotics: ...

  8. 使用开源激光SLAM方案LIO-SAM运行KITTI数据集,如有用,请评论雷锋

    第一次写博客~ LIOSAM作为优秀的激光slam方案,当然想尝试着运行更多数据啦,然而没有发现类似的方法分享到底如何实现,在B站看到有伙伴发布了测试视频,但是仍然没有写出方法.所以我跑通了之后记录一 ...

  9. 【MMDetection3D】环境搭建,使用PointPillers训练测试可视化KITTI数据集

    文章目录 前言 3D目标检测概述 KITTI数据集简介 MMDetection3D 环境搭建 数据集准备 训练 测试及可视化 绘制损失函数曲线 参考资料 前言 2D卷不动了,来卷3D,之后更多地工作会 ...

  10. KITTI数据集--参数

    一.kitti数据集,label解析 16个数代表的含义: 第1个字符串:代表物体类别 'Car', 'Van', 'Truck','Pedestrian', 'Person_sitting', 'C ...

最新文章

  1. MongoDB探索之路(二)——系统设计之CRUD
  2. 如何获取服务器上文件的hashcode,java获取文件hashcode
  3. Hibernate之对象关系映射
  4. 用sort()方法随机打乱数组
  5. kafka自定义序列化器
  6. 集成学习—随机森林原理(理解与论文研读)
  7. ab flash player 8_八年级上册英语同步练测考和AB卷听力链接(福建版)
  8. PyQt5教程(七)——实现QQ登录界面(一、Qt Designer创建界面,Eric6创建项目)
  9. dcs world f15c教学_视频教学知识归纳 | 广东中考必备英语:中考语法知识 冠词
  10. iOS手机模拟器配置
  11. 眼图观测实验报告_通信原理实验报告 -
  12. STM32F4图像识别
  13. 编程将数字“翻译”成英文。例35706“翻译”成three-five-seven-zero-six。
  14. win10变win7bios如何设置?
  15. OpenSSL安全特征问题漏洞(CVE-2022-2068)版本1.0.2k-fips升级到3.0.5
  16. 百度地图商家标注,查询附近3000米内的商家并标到地图上
  17. 图片+css实现波浪
  18. pscp使用详解 Win与Linux文件互传工具
  19. TransUNet阅读笔记与训练尝试
  20. qbo odom数据的获取

热门文章

  1. [Bzoj1911][Apio2010]特别行动队(斜率优化)
  2. 强烈推荐 | 百度、阿里、腾讯 40 道面试题超全面总结
  3. Shell 批量复制文件名相近的文件到指定文件名中
  4. androidpn环境搭建
  5. 如何让ClickOnce进行手动更新(含代码)
  6. 流媒体服务器架设(转载)
  7. 借助Sigar API获取内存信息
  8. C++ 字节序测试代码
  9. 查找算法之一 顺序查找
  10. C++ 哪些不能为虚函数