深蓝学院《从零开始手写VIO》作业七

  • 深蓝学院《从零开始手写VIO》作业七

深蓝学院《从零开始手写VIO》作业七

将第二讲中的仿真数据(视觉特征,imu数据)接入VINS系统,并运行出轨迹结果

第一步:将IMU数据传入VINS系统
这部分的代码实现在run_euroc.cpp中的PubSimImuData部分,如下:

void PubSimImuData()
{string sImu_data_file = sConfig_path + "imu_pose_noise.txt"; cout << "1 PubImuData start sImu_data_file: " << sImu_data_file << endl;ifstream fsImu;fsImu.open(sImu_data_file.c_str());if (!fsImu.is_open()){cerr << "Failed to open imu file! " << sImu_data_file << endl;return;}std::string sImu_line;double dStampNSec = 0.0;double tmp;Vector3d vAcc;Vector3d vGyr;while (std::getline(fsImu, sImu_line) && !sImu_line.empty()) // read imu data{std::istringstream ssImuData(sImu_line);ssImuData >> dStampNSec;for(int i=0;i<7;i++)ssImuData>>tmp;   ssImuData>>vGyr.x() >> vGyr.y() >> vGyr.z() >> vAcc.x() >> vAcc.y() >> vAcc.z(); pSystem->PubImuData(dStampNSec, vGyr, vAcc);usleep(5000*nDelayTimes);}fsImu.close();
}

第二步:将特征数据传入VINS系统
读入特征数据的代码实现在run_euroc.cpp中的PubSimImageData部分,如下:

void PubSimImageData()
{string sImage_file = sConfig_path + "cam_pose.txt";  //包含时间戳的文件cout << "1 PubImageData start sImage_file: " << sImage_file << endl;ifstream fsImage;fsImage.open(sImage_file.c_str());if (!fsImage.is_open()){cerr << "Failed to open image file! " << sImage_file << endl;return;}std::string sImage_line;double dStampNSec;string sImgFileName;int n=0;while (std::getline(fsImage, sImage_line) && !sImage_line.empty()){std::istringstream ssImgData(sImage_line);ssImgData >> dStampNSec;   //读入时间戳cout<<"cam time: "<<fixed<<dStampNSec<<endl;string all_points_file_name = sPointData_path + "all_points_" + to_string(n)+ ".txt";  //第n个相机对应的观测数据的文件名cout<<"points_file: "<<all_points_file_name<<endl;pSystem->PubSimImageData(dStampNSec, all_points_file_name);usleep(50000*nDelayTimes);n++;}fsImage.close();
}

第三步:修改System.cpp
通过函数loadPointData传入double时间戳和string文件名,如下:

    TicToc t_r;//trackerData[0].readImage(img, dStampSec);trackerData[0].loadPointData(points_file_name,dStampSec);

第四步:修改feature_tracker.cpp
由于没有图像,并且所有的特征点都在每一个相机中被成功跟踪,所以就不用光流函数追踪。直接读入当前时刻相机对应的观测值并存入forw_pts即可,并将每个特征点的track_cnt++。对于初始时刻,由于cur_pts是空的,需要对该时刻的相机观测值forw_pts进行初始化,将该时刻相机对特征点的观测值(像素坐标)存入n_pts中,然后调用函数addPoints来完成forw_pts,ids,track_cnt的初始化。最后,将forw_pts赋值给cur_pts。并通过函数undistoredSimPoints来计算像素点的速度,如下:

void FeatureTracker::undistortedSimPoints()
{cur_un_pts.clear();cur_un_pts_map.clear();//cv::undistortPoints(cur_pts, un_pts, K, cv::Mat());for (unsigned int i = 0; i < cur_pts.size(); i++){Eigen::Vector2d a(cur_pts[i].x, cur_pts[i].y);cur_un_pts.push_back(cv::Point2f(cur_pts[i].x,cur_pts[i].y));cur_un_pts_map.insert(make_pair(ids[i], cv::Point2f(cur_pts[i].x,cur_pts[i].y)));//printf("cur pts id %d %f %f", ids[i], cur_un_pts[i].x, cur_un_pts[i].y);}// caculate points velocityif (!prev_un_pts_map.empty()){double dt = cur_time - prev_time;pts_velocity.clear();for (unsigned int i = 0; i < cur_un_pts.size(); i++){if (ids[i] != -1){std::map<int, cv::Point2f>::iterator it;it = prev_un_pts_map.find(ids[i]);if (it != prev_un_pts_map.end()){double v_x = (cur_un_pts[i].x - it->second.x) / dt;double v_y = (cur_un_pts[i].y - it->second.y) / dt;pts_velocity.push_back(cv::Point2f(v_x, v_y));}elsepts_velocity.push_back(cv::Point2f(0, 0));}else{pts_velocity.push_back(cv::Point2f(0, 0));}}}else{for (unsigned int i = 0; i < cur_pts.size(); i++){pts_velocity.push_back(cv::Point2f(0, 0));}}prev_un_pts_map = cur_un_pts_map;
}

实验结果
(1)无噪声仿真数据



(2)有噪声数据



其中加速度计的bias随机游走的方差为0.0001,高斯噪声的方差为0.019; 陀螺仪的bias随机游走的方差为为1e-5,高斯噪声的方差为0.015

(3)实验结果对比
a. 带噪声数据



b.不带噪声数据



结论:带噪声的数据比不带噪声的数据效果声好。

深蓝学院《从零开始手写VIO》作业七相关推荐

  1. 深蓝学院《从零开始手写VIO》作业五

    深蓝学院<从零开始手写VIO>作业五 1. 完成Bundle Adjustment求解器 2. 完成测试函数 3. 论文总结 1. 完成Bundle Adjustment求解器 完成单目 ...

  2. 深蓝学院《从零开始手写VIO》作业六

    深蓝学院<从零开始手写VIO>作业五 深蓝学院<从零开始手写VIO>作业六 1. 证明题 2. 代码题 深蓝学院<从零开始手写VIO>作业六 1. 证明题 证明Dy ...

  3. 深蓝学院《从零开始手写VIO》作业四

    深蓝学院<从零开始手写VIO>作业四 深蓝学院<从零开始手写VIO>作业四 1. 信息矩阵分析 2. Bundle Adjustment信息矩阵的计算 深蓝学院<从零开始 ...

  4. 深蓝学院《从零开始手写VIO》作业三

    深蓝学院<从零开始手写VIO>作业三 深蓝学院<从零开始手写VIO>作业三 1. 代码修改 2. 公式推导 3. 公式证明: 深蓝学院<从零开始手写VIO>作业三 ...

  5. 深蓝学院《从零开始手写VIO》作业一

    深蓝学院<从零开始手写VIO>作业一 深蓝学院<从零开始手写VIO>作业一 1. VIO文献阅读 1.1 视觉与IMU进行融合之后有何优势? 1.2 有哪些常见的视觉+IMU融 ...

  6. 《视觉SLAM进阶:从零开始手写VIO》第三讲 基于优化的IMU预积分与视觉信息融合 作业

    <视觉SLAM进阶:从零开始手写VIO>第三讲 基于优化的IMU预积分与视觉信息融合 作业 文章目录 <视觉SLAM进阶:从零开始手写VIO>第三讲 基于优化的IMU预积分与视 ...

  7. 从零开始手写VIO第三章作业(含关键点细节及思维过程)

    文章目录 前言·与同主题博文的不同 1.代码修改 1.1阻尼因子 µ 随着迭代变化的曲线图 1.2完成曲线y = ax^2^ + bx + c的参数估计 1.3实现其他更优秀的阻尼因子策略 2.公式推 ...

  8. 《视觉SLAM进阶:从零开始手写VIO》第二讲作业-IMU仿真、MU imu_utils标定

    <视觉SLAM进阶:从零开始手写VIO>第二讲作业-IMU仿真.MU imu_utils标定 作业题目: 1 仿真代码解析 仿真代码地址:https://github.com/HeYiji ...

  9. 《视觉SLAM进阶:从零开始手写VIO》第一讲作业

    目录 1 视觉与IMU融合之后有何优势? 2 有哪些常见的视觉+IMU融合方案?有没有工业界应用的例子? 3 在学术界,VIO研究有哪些新进展?有没有将学习方法应用到VIO的例子? 4 四元数和李代数 ...

最新文章

  1. UART接口与COM口的区别
  2. nodejs 监控代码变动实现ftp上传
  3. App用户体验的一点思考
  4. 2017面试分享(js面试题记录)
  5. 蓝桥杯第七 java决赛_第七届(16年)蓝桥杯java B组决赛真题
  6. Flask框架项目实例:**租房网站(一)
  7. Springboot 整合mybatis,实现多数据读写分离分库分表
  8. 工作实战: 让 SQL 飞起来
  9. 步步为营-93-MVC+EF简单实例
  10. 羊皮卷的实践-第二十章
  11. c++ regex 替换汉字_C++ - 正则表达式(regex) 替换(replace) 的 详解 及 代码
  12. VMRC开启拷贝粘贴
  13. python下载电影天堂_Python爬虫之《电影天堂》电影详情+下载地址爬取
  14. 实验六 接口、继承和多态
  15. 关于微信8.0.0以下版本登录版本验证的解决办法
  16. 基于资源的权限系统-数据库设计
  17. 4K60帧!RayLink远程控制软件如何帮助设计师远程办公?
  18. java字节流与字符流的区别编码缓冲
  19. 工程伦理第五章习题答案
  20. iphone重启记录_如何阻止您的iPhone记录您的常用位置

热门文章

  1. TensorFlow 合并与分割
  2. 后端必备的200本书,一次性给你!
  3. Java基础提升篇:equals()方法和“==”运算符
  4. 设计模式——开发常用的设计模式梳理
  5. 【JavaSE05】Java中方法与重载、递归
  6. 两个形状不同的长方形周长_“解决问题——怎样围周长最短”教学思考与设计...
  7. C语言核心技术——函数
  8. 笔记 - Ali Cloud OSS 简介 三种常见数据存储类型
  9. 优化MySQL数据类型——《深究MySQL》
  10. html页面加文字横向滚动,js实现文字横向滚动