VINS

放两张图片,至于为什么?后面会解释!
程序下载:
数据集制作:
测试:
数据评估:
KITTI数据集00序列times.txt文件
KITTI 数据跑 双目+IMU的问题
一、准备
步骤一、指定输出路径:打开vins-///.yaml 或 /.yaml
(根据数据集选择具体参数文件),第十行 : "/home/tony-ws1//"
这里指明自己需要保存到的地址,本人:: "/home////"
步骤二、修改代码使其输出轨迹文件,原本的是无轨迹文件输出的 .cpp中函数
std::ofstream foutC("/home/tony-ws1/output/vio_global.csv", ios::app);//这里还是文件输出位置foutC.setf(ios::fixed, ios::floatfield);foutC.precision(0);foutC << pose_msg->header.stamp.toSec() * 1e9 << ",";foutC.precision(5);foutC << global_t.x() << ","<< global_t.y() << ","<< global_t.z() << ","<< global_q.w() << ","<< global_q.x() << ","<< global_q.y() << ","<< global_q.z() << endl;foutC.close();
这部分改成如下:
//这里还是文件输出位置,最好和前面位置一样std::ofstream foutC("/home/hltt3838/GPS_Stereo_Ins/output/vio_GPS_global.txt", ios::app);foutC.setf(ios::fixed, ios::floatfield);foutC.precision(0);foutC << pose_msg->header.stamp.toSec() << " ";foutC.precision(5);foutC << global_t.x() << " "<< global_t.y() << " "<< global_t.z() << " "<< global_q.x() << " "<< global_q.y() << " "<< global_q.z() << " "<< global_q.w() << endl;foutC.close();
注意:
这里不仅把数据的保存地址改了,而且把数据的顺序也改了! 1e9 和 “ ,”也改了
二、运行
打开第一个终端
打开第二个终端
进入工作区间内,分别输入:
cd /
//单独一个端口,编译后关闭,没有修改程序不用编译,可以用于检查程序问题
devel/setup.bash
vins .
打开第三个终端
进入工作区间内,分别输入:
cd /
devel/setup.bash
vinssrc/VINS-///.yaml /home////
//rosun 包名 执行文件argv[1] argv[2]
%/home// // 是数据的位置
打开第四个终端
进入工作区间内,分别输入:
cd /
【VINS】 devel/setup.bash
三、处理结果 (1) 进入输出结果的文件夹:
cd /
(2) 使用evo分析结果,这里是tum数据格式,故使用
tum .txt -p
绘图结果如下:
(3)对比真值
真值是12列的kitti轨迹格式,所以要将真值转换成8列格式的tum轨迹格式
.py 00.txt times..txt
转换得到tum格式的真值后,我们可以进行评定,将我们得到的.txt 与这里的真值进行对比
tum .txt .txt -a -p
注意:右图点击上面的map才可以出来这个对比图!
四、出现的问题
问题1:
真值 .txt 怎么生成的?
答:
将KITTI的 pose 里面的 00.txt 加上时间戳 times.txt,转换成TUM格式的; 需要注意的是:pose 是个单独的文件,
不在数据里面,自己从网上下载吧!
在evo文件夹下有一个文件夹,里面有一个.py文件 。
把KITTI数据集下的 00.txt 和 times.txt 文件拷贝到该目录,运行如下命令:
cd evo-/
.py 00.txt times.txt .txt
通过该指令完成转换, 转换得到tum格式的真值后 .txt
我们可以进行评定,将我们得到的 .txt 与这里的真值进行对比
tum .txt-a -p
问题2:
rviz 显示 小车的轨迹和GPS数据垂直!
答:
虽然,轨迹和GPS数据垂直!但在 (3)对比真值 时,两个轨迹是对齐的!
而且去看看程序你就会发现,两条线垂直,一条是 vio的结果,一条是vio转换到世界坐标系下的结果,
转换矩阵 是根据每次的优化值重新求得的结果,本来人家就不应该一样,为啥非让人家重合呢!