目录
1.函数作用
在跟踪得到当前帧初始姿态后,现在对local map进行跟踪得到更多的匹配,并优化当前位姿。
前面只是跟踪一帧得到初始位姿,这里搜索局部关键帧、局部地图点,和当前帧进行投影匹配,得到更多匹配的MapPoints后进行Pose优化。
2.函数步骤
@brief 用局部地图进行跟踪,进一步优化位姿
1. 更新局部地图,包括局部关键帧和关键点
2. 对局部MapPoints进行投影匹配
3. 根据匹配对估计当前帧的姿态
4. 根据姿态剔除误匹配
@return true if success
Step 1:更新局部关键帧mvpLocalKeyFrames和局部地图点mvpLocalMapPoints
Step 2:在局部地图中查找与当前帧匹配的MapPoints, 其实也就是对局部地图点进行跟踪
Step 3:更新局部所有MapPoints后对位姿再次优化
Step 4:更新当前帧的MapPoints被观测程度,并统计跟踪局部地图的效果
Step 5:决定是否跟踪成功
3.code
-
bool Tracking::TrackLocalMap()
-
{
-
// We have an estimation of the camera pose and some map points tracked in the frame.
-
// We retrieve the local map and try to find matches to points in the local map.
-
-
// Update Local KeyFrames and Local Points
-
// Step 1:更新局部关键帧 mvpLocalKeyFrames 和局部地图点 mvpLocalMapPoints
-
UpdateLocalMap();
-
-
// Step 2:筛选局部地图中新增的在视野范围内的地图点,投影到当前帧搜索匹配,得到更多的匹配关系
-
SearchLocalPoints();
-
-
// Optimize Pose
-
// 在这个函数之前,在 Relocalization、TrackReferenceKeyFrame、TrackWithMotionModel 中都有位姿优化,
-
// Step 3:前面新增了更多的匹配关系,BA优化得到更准确的位姿
-
Optimizer::
PoseOptimization(&mCurrentFrame);
-
mnMatchesInliers =
0;
-
-
// Update MapPoints Statistics
-
// Step 4:更新当前帧的地图点被观测程度,并统计跟踪局部地图后匹配数目
-
for(
int i=
0; i<mCurrentFrame.N; i++)
-
{
-
if(mCurrentFrame.mvpMapPoints[i])
-
{
-
// 由于当前帧的地图点可以被当前帧观测到,其被观测统计量加1
-
if(!mCurrentFrame.mvbOutlier[i])
-
{
-
// 找到该点的帧数mnFound 加 1
-
mCurrentFrame.mvpMapPoints[i]->
IncreaseFound();
-
//查看当前是否是在纯定位过程
-
if(!mbOnlyTracking)
-
{
-
// 如果该地图点被相机观测数目nObs大于0,匹配内点计数+1
-
// nObs: 被观测到的相机数目,单目+1,双目或RGB-D则+2
-
if(mCurrentFrame.mvpMapPoints[i]->
Observations()>
0)
-
mnMatchesInliers++;
-
}
-
else
-
// 记录当前帧跟踪到的地图点数目,用于统计跟踪效果
-
mnMatchesInliers++;
-
}
-
// 如果这个地图点是外点,并且当前相机输入还是双目的时候,就删除这个点
-
// ?单目就不管吗
-
else
if(mSensor==System::STEREO)
-
mCurrentFrame.mvpMapPoints[i] =
static_cast<MapPoint*>(
NULL);
-
-
}
-
}
-
-
// Decide if the tracking was succesful
-
// More restrictive if there was a relocalization recently
-
// Step 5:根据跟踪匹配数目及重定位情况决定是否跟踪成功
-
// 如果最近刚刚发生了重定位,那么至少成功匹配50个点才认为是成功跟踪
-
if(mCurrentFrame.mnId<mnLastRelocFrameId+mMaxFrames && mnMatchesInliers<
50)
-
return
false;
-
-
//如果是正常的状态话只要跟踪的地图点大于30个就认为成功了
-
if(mnMatchesInliers<
30)
-
return
false;
-
else
-
return
true;
-
}
4.函数解释
首先更新局部关键帧 mvpLocalKeyFrames 和局部地图点 mvpLocalMapPoints:
ORB-SLAM2 --- Tracking::UpdateLocalKeyFrames函数https://blog.csdn.net/qq_41694024/article/details/128307627
ORB-SLAM2 --- Tracking::UpdateLocalPoints函数https://blog.csdn.net/qq_41694024/article/details/128321282ORB-SLAM2 --- Tracking::SearchLocalPoints函数解析https://blog.csdn.net/qq_41694024/article/details/128334584 根据先前得到的更多的匹配关系,优化当前帧的位姿。
更新当前帧的地图点被观测程度,并统计跟踪局部地图后匹配数目。
最后判断匹配的地图点是否足够。
转载:https://blog.csdn.net/qq_41694024/article/details/128307565