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