VINS ---初始化
来源:互联网 发布:投资软件靠谱吗 编辑:程序博客网 时间:2024/06/08 19:23
通过匹配的视觉特征点 对极约束获取本质矩阵E,再分解本质矩阵获得相机的R,T
详细的原理解释看这里 http://blog.csdn.net/aichipmunk/article/details/48157369
bool MotionEstimator::solveRelativeRT(const vector<pair<Vector3d, Vector3d>> &corres, Matrix3d &Rotation, Vector3d &Translation){ if (corres.size() >= 15) { vector<cv::Point2f> ll, rr; for (int i = 0; i < int(corres.size()); i++) { ll.push_back(cv::Point2f(corres[i].first(0), corres[i].first(1))); rr.push_back(cv::Point2f(corres[i].second(0), corres[i].second(1))); } cv::Mat mask; //根据匹配点求取本征矩阵,使用RANSAC,进一步排除失配点 cv::Mat E = cv::findFundamentalMat(ll, rr, cv::FM_RANSAC, 0.3 / 460, 0.99, mask); //double feasible_count = countNonZero(mask); //cout << (int)feasible_count << " -in- " << p1.size() << endl; cv::Mat cameraMatrix = (cv::Mat_<double>(3, 3) << 1, 0, 0, 0, 1, 0, 0, 0, 1); cv::Mat rot, trans; //分解本征矩阵,获取相对变换 int inlier_cnt = cv::recoverPose(E, ll, rr, cameraMatrix, rot, trans, mask); //cout << "inlier_cnt " << inlier_cnt << endl; Eigen::Matrix3d R; Eigen::Vector3d T; for (int i = 0; i < 3; i++) { T(i) = trans.at<double>(i, 0); for (int j = 0; j < 3; j++) R(i, j) = rot.at<double>(i, j); } Rotation = R.transpose(); Translation = -R.transpose() * T; if(inlier_cnt > 12) return true; else return false; } return false;}}通过imu预积分陀螺仪和视觉特征匹配分解Fundamental矩阵获取rotationMatrix之间的约束关系,联立方程组可以求得外参旋转矩阵;
接下来会检测当前frame_count是否达到WINDOW_SIZE,确保有足够的frame参与初始化;
bool Estimator::initialStructure();
1. 保证imu充分运动,只需要考察线加速度的变化,计算窗口中加速度的标准差,标准差大于0.25则代表imu充分激励,足够初始化(这一部分在ios版本实现中被注释掉了,不知道为什么):
{ map<double, ImageFrame>::iterator frame_it; Vector3d sum_g; for (frame_it = all_image_frame.begin(), frame_it++; frame_it != all_image_frame.end(); frame_it++) { double dt = frame_it->second.pre_integration->sum_dt; Vector3d tmp_g = frame_it->second.pre_integration->delta_v / dt; sum_g += tmp_g; } Vector3d aver_g; aver_g = sum_g * 1.0 / ((int)all_image_frame.size() - 1); // Standard deviation of linear_acceleration double var = 0; for (frame_it = all_image_frame.begin(), frame_it++; frame_it != all_image_frame.end(); frame_it++) { double dt = frame_it->second.pre_integration->sum_dt; Vector3d tmp_g = frame_it->second.pre_integration->delta_v / dt; var += (tmp_g - aver_g).transpose() * (tmp_g - aver_g); //cout << "frame g " << tmp_g.transpose() << endl; } var = sqrt(var / ((int)all_image_frame.size() - 1)); //ROS_WARN("IMU variation %f!", var); if(var < 0.25) { ROS_INFO("IMU excitation not enouth!"); //return false; } }2. 纯视觉初始化,对Sliding Window中的图像帧和相机姿态求解sfm问题:
a. 首先通过FeatureManeger获取特征匹配,考察最新的keyFrame和sliding window中某个keyFrame之间有足够feature匹配和足够大的视差(id为l),这两帧之间通过五点法恢复出R,t并且三角化出3D的feature point:
relativePose(relative_R, relative_T, l)
b. 3D的feature point和sliding window中的keyFrame的2D feature求解PnP,并且使用ceres优化:
sfm.construct(frame_count + 1, Q, T, l, relative_R, relative_T, sfm_f, sfm_tracked_points)
c. 所有的frame求解PnP
cv::solvePnP(pts_3_vector, pts_2_vector, K, D, rvec, t,1)
3. imu与视觉对齐,获取绝对尺度
bool Estimator::visualInitialAlign()
a. 求解陀螺仪零偏metric scale,这里的metric scale指的是imu和sfm结果进行对齐需要的比例:
bool result = VisualIMUAlignment(all_image_frame, Bgs, g, x);bool VisualIMUAlignment(map<double, ImageFrame> &all_image_frame, Vector3d* Bgs, Vector3d &g, VectorXd &x){ solveGyroscopeBias(all_image_frame, Bgs); if(SolveScale(all_image_frame, g, x)) return true; else return false;}b. 初始化成功,则对于imu数据需要repropogate,也就是从当前时刻开始预积分;同时通过三角化和上一步计算的scale可以获得每个feature的深度;
至此,视觉和imu已经对齐
参考:
http://www.cnblogs.com/shang-slam/p/7147095.html
阅读全文
0 0
- VINS ---初始化
- VINS(三)初始化与相机IMU外参标定
- 港科VINS-Mono系统学习(3) 初始化
- VINS理论与代码详解4——初始化
- VINS基础
- VINS-MONO学习
- VINS 系统总结
- VINS-Mono 代码解读
- vins资料网址
- VINS-初探(一)
- VINS分析(上)
- VINS 代码介绍资料
- 【VINS算法分析之一】VINS-Mono(草稿)
- vins-mono slam刚开始接触
- vins mono 刚开始学习 一
- VINS mono 系统学习 二
- VINS mono 系统学习 三
- VINS mono 系统学习 四
- FILTER:progid:DXImageTransform.Microsoft.Gradient使用
- Kali Linux进行内网攻击--》使用arpspoof
- java基于StringBuilder自己实现myArrayList
- 对SSH(Struct、Spring、Hibernate)框架的理解
- Java后台之路(19)-MyBatis之xml配置
- VINS ---初始化
- 二叉搜索树详解链式与数组式实现
- nyoj-58 最少步数
- JSTL核心标签库中的用法
- 转载-Android运行时异常“Binary XML file line # : Error inflating class”
- Kubernetes 核心原理 之一
- <machine learning traning> KNN
- java list对元素进行指定多个字段属性按多种排序方式进行排序
- C++ 调用打印机 打印一段文字
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
上师大附小对口小区
小升初对口中学
对口升学报名
对口高考志愿填报
计算机对口专业
对口高考考试时间
对口升学考什么
对口高考是什么
大学生就业对口率
对口高考和普通高考的区别
对口高职考试
农科院附小对口中学
医学类对口升学
对口高职是什么
高校对口支援
对口升学试卷
对口相声剧本
人大附小对口中学
光谷一小对口中学
师大附小对口中学
昆明小升初划片对口表
统招专升本专业必须对口吗
专升本专业必须对口吗
大学生就业专业不对口
二级建造师专业不对口
对号
对号怎么打
对号函数
word对号
对号图标
对号是什么牌子
对号怎么输入
电脑对号怎么打出来
对号在电脑上怎么输入
对号符号怎么打出来
对号函数的性质及图像
wps怎么打出对号
表格中对号怎么打出来
word如何打对号
情歌对唱
山歌对唱