flowchart TB
%% ========== 1. 入口 & 初始化检测 ==========
T0"Track() 入口"
T1{{mState == NO_IMAGES_YET?}}
T2"mState ← NOT_INITIALIZED"
%% ========== 2. 获取地图互斥锁 ==========
LOCK"unique_lock(mpMap-\>mMutexMapUpdate)"
%% ========== 3. 尚未初始化 ==========
INIT_CHK{{mState == NOT_INITIALIZED?}}
STEREO_INIT"StereoInitialization() / MonocularInitialization()"
DRAW_INIT"mpFrameDrawer-\>Update(this)"
RET_NOT_OK{{初始化后 mState != OK?}}
RET_EARLY"return (等待下一帧)"
%% ========== 4. 系统已初始化 ==========
MAIN"-- 进入正常跟踪流程 --"
ONLY_TRACK{{mbOnlyTracking?}}
REPLACED"CheckReplacedInLastFrame()"
MM_EMPTY{{mVelocity.empty()?}}
TRACK_MM"TrackWithMotionModel()"
RELOC"Relocalization()"
BOOL_OR"bOK = bOK_MM ∥ bOK_Reloc"
SET_REF"若缺失, mpReferenceKF → mCurrentFrame.mpReferenceKF"
%% ========== 5. 局部地图跟踪 ==========
LOCAL_TRACK_CHK{{可调用 TrackLocalMap?}}
LOCAL_TRACK"bOK = TrackLocalMap()"
%% ========== 6. 跟踪结果判定 ==========
SET_STATE"mState = (bOK ? OK : LOST)"
DRAW_FRAME"mpFrameDrawer-\>Update(this)"
%% ========== 7. 跟踪成功后的更新 ==========
OK_CHK{{bOK?}}
UPDATE_VEL"mVelocity ← Tcw_now × (Tcw_last)\^-1"
SET_CAMPOSE"mpMapDrawer-\>SetCurrentCameraPose()"
CLEAN_VO"清空仅 VO 匹配点"
DEL_TEMP"删除 mlpTemporalPoints"
NEEDKF{{NeedNewKeyFrame()?}}
NEWKF"CreateNewKeyFrame()"
%% ========== 8. 跟踪失败后的处理 ==========
LOST_CHK{{mState == LOST ∧ Map KFs ≤ 5?}}
SYS_RESET"mpSystem-\>Reset(); return"
%% ========== 9. 收尾:更新 mLastFrame 等 ==========
FILL_REFKF"若仍缺失 → mCurrentFrame.mpReferenceKF = mpReferenceKF"
SAVE_LAST"mLastFrame = Frame(mCurrentFrame)"
STORE_POSE"记录相对位姿 / 时间戳向量"
%% ---------- 连线 ----------
T0 --> T1
T1 -- 是 --> T2 --> LOCK
T1 -- 否 --> LOCK
LOCK --> INIT_CHK
INIT_CHK -- 是 --> STEREO_INIT --> DRAW_INIT --> RET_NOT_OK
RET_NOT_OK -- 是 --> RET_EARLY
RET_NOT_OK -- 否 --> MAIN
INIT_CHK -- 否 --> MAIN
%% ---- 正常跟踪主干 ----
MAIN --> ONLY_TRACK
ONLY_TRACK -- 否 -->|LocalMapping 开启| \
REPLACED --> MM_EMPTY
ONLY_TRACK -- 是 -->|仅跟踪模式| MM_EMPTY
MM_EMPTY -- 否 --> TRACK_MM
MM_EMPTY -- 是 --> TRACK_MM
TRACK_MM --> RELOC
RELOC --> BOOL_OR
BOOL_OR --> SET_REF
SET_REF --> LOCAL_TRACK_CHK
LOCAL_TRACK_CHK -- 可调用 --> LOCAL_TRACK --> SET_STATE
LOCAL_TRACK_CHK -- 不可调用 --> SET_STATE
SET_STATE --> DRAW_FRAME --> OK_CHK
%% ---- 跟踪成功路径 ----
OK_CHK -- 是 --> UPDATE_VEL --> SET_CAMPOSE --> CLEAN_VO --> DEL_TEMP --> NEEDKF
NEEDKF -- 是 --> NEWKF --> LOST_CHK
NEEDKF -- 否 --> LOST_CHK
%% ---- 跟踪失败路径 ----
OK_CHK -- 否 --> LOST_CHK
LOST_CHK -- 是 --> SYS_RESET
LOST_CHK -- 否 --> FILL_REFKF --> SAVE_LAST --> STORE_POSE