ORBSLAMVIO算法流程图
2017-02-05 11:09:03 0 举报
ORBSLAMVIO算法是一种基于稀疏特征的视觉里程计算法,它通过优化一个关于位姿和地图点的非线性最小二乘问题来估计相机运动。该算法首先使用ORB特征检测器提取图像中的关键点,然后通过匹配相邻帧之间的关键点来建立局部运动模型。接下来,利用这些局部运动模型构建全局运动模型,并通过非线性最小二乘优化方法求解最优位姿。最后,将估计的位姿与地图点进行融合,以实现全局定位。整个过程具有较高的精度和鲁棒性,适用于各种复杂的室内外环境。
作者其他创作
大纲/内容
读取相机类型
生成关键帧Tracking::CreateNewKeyFrame()
筛选mincommons且bow得分大于minscore的关键帧(候选1)/候选1分组根据组评分bestAccScore剔除无组员的相似帧
计算image bounds- Frame::ComputeImageBounds(imGray)
Tracking::Track()
四叉树算法均匀分布角点ORBextractor::DistributOctTree
取出关键帧/将特征点转成bow形式/遍历其生成的所有mappoints
逐层:计算特征点ORBextractor::ComputeKeyPointsOctTree(allKeypoints)
Mappint:System::bLocalMapAcceptKF()
ros_server.cc
从上一个关键帧开始存储一组imu数据
Tracking::TrackLocalMap()
KeyFrameDataBase()::DetectLoopCandidates()在关键帧数据库中找出闭环候选项
遍历这些共视关键帧并找到与其共视的二级关键帧
LocalMapping::DetectLoop()检测闭环
step 2
Frame::ExtractORB()
有
KeyFrame::UpdateConnection()更新Covisibility Graph
时间同步处理-image时间-delaysec=IMU时间-消除传感器响应时间?
读取rosbag数据
vimuData存储IMU
LocalMapping::SearchNeighbors()融合mappoints避免与之前的mappoints有交集或已被其他关键帧找到
最小化投影误差优化位姿Optimizer::PoseOptimization()
im存储image并判断image的延时
从covisibility graph找到共视关键帧
vpLoopCandidates
数据读完|ros::ok()
Tracking::UpdateLocalMap()
im转成灰度图
LocalMapping::CheckNewKeyFrames()检查KeyFrame队列
LocalClosing::Run()
Tracking::IMUTrackWithIMU()使用恒速模型与上一帧匹配;ORBmatcher::SearchByProjection()
Check mode change/Check reset(交互)
Tracking
观测到该mappoints的关键帧3
mlNewKeyFrames(数量多)
每次读取一组IMU和一张图片
ROS入口
获取各层图像金字塔图像ORBextractor::ComputePyramid(image)
Closing
Tracking::UpdateLocalPoints()与当前帧相连的mappoints加进来
10KF才检测/遍历covisibility graph计算当前帧与共视关键帧的Bow最低得分(最小相似度)
利用局部地图重新计算IMU bias/mbRelocBiasPrepare = true
帧帧联系
清除outlier的mappoints
划分gird分配keypoints加速匹配AssignFeaturesToGrid()
相机位姿跟踪
Tracking:System::TrackMonoVI()
订阅话题/ros::Rate(1000)
切边保护即计算keypoints绝对位置/质心法计算方向computeOrientation
框颜色红:client part黑:server part蓝:both
相互更新mappoints
Mapping
获得局部地图与当前帧的匹配/加入当前帧检测的mappointsTracking::SearchLocalPoints()
LocalMapping::KeyFrameCulling()剔除多余关键帧
根据有无初始化执行同名函数Frame::Frame(未初始化特征点是有初始化的两倍)
等待新数据
初始化图像金字塔信息
寻找既不共视又跟当前帧有公共单词的关键帧
局部地图跟踪
System::System
Tracking::Tracking
存储帧pose信息
建立图像金字塔/逐层分配特征数/尺度/pattern/计算patch里面的v的最大u
初始化Tracking::MonocularInitialization
读入设置文件/ORB词典
读取相机参数/ORB参数
KeyFrame::UpdateConnections()/KeyFrame::GetVectorCovisibleKeyFrames()重新构建covisibility graph
设置图像边界/划分grid/逐grid使用两个FAST阈值提取特征点
逐层:分配scale/resize图像
LocalMapping::CreateNewMapPoints()生成新mappoints
是否生成关键帧:长时间没有插入关键帧 / 局部地图空闲 / 跟踪快丢失 | 地图跟踪的MapPoints比例少
mincommons=0.8*与候选帧具有共同单词的最大单词数(相似度)
检测候选帧的连续性
多个共视关键帧联系
逐层:_keypoints和_descriptors存储/对图像进行高斯滤波/计算特征点的32位描述子computeDescriptors() - computeOrbDescriptors()/keypoints恢复到原图的位置
无运动模型或跟踪失败
LocalMapping::MapPointCulling()剔除mappoints
LocalMapping::ProcessNewKeyFrame()处理新关键帧;维护Covisibility Graph(共视图)/SpanningTree(扩展树)/Map/计算该帧的词袋表示确定匹配
Tracking::UpdateLocalKeyFrames()构建共视关键帧
LocalMapping::Run()
ros_client.cc
step 1
Tracking::TrackReferenceKeyFrame()当前帧与最近关键帧匹配
运动过程中和共视程度比较高的关键帧通过三角化恢复出一些mappoints
校正特征点未知Frame::UndistortKeyPoints()
Tracking::SetViewer/SetLocalMapper/SetLoopClosing
将遍历的一级二级共视关键帧的对应mappoints投影到当前帧中(更新)/对当前帧对应mappoints的属性修改/更新covisibility graph和spanning tree
(mpTracker)Tracking::GrabImageMonoVI
mlploopKeyFrameQueue(数量少)
ORBextractor::ORBextractor
焦健浩 2017-02
IncreaseFound/IncreaseVisibie0.25*理论能观测的点
LocalMapping::CorrectLoop()将当前帧对应的mappoints换成闭环帧对应的mappoints
通过3D-2D方式统一尺度;Initializer::initialize()计算累积误差决定使用homograph或fundamental模型
Optimizer::LocalBundleAdjustment()和当前关键帧相连的共视关键帧及mappoints做局部BA(加上mappoints的局部地图
0 条评论
下一页