設(shè)計(jì)與多地圖合并)
1. 為什么有人愿意花時(shí)間啃ORB-SLAM3這篇論文如果你正在做視覺SLAM方向的研究或者工程落地ORB-SLAM3這個(gè)名字你一定繞不開。它是目前開源視覺慣性SLAM系統(tǒng)里公認(rèn)的標(biāo)桿之一支持單目、雙目、RGB-D以及各種慣性組合模式還能做多地圖合并和重定位。但問題在于原論文寫得非常緊湊公式密度高很多關(guān)鍵設(shè)計(jì)一筆帶過直接讀英文原文對不少人來說門檻不低。我自己第一次讀ORB-SLAM3論文的時(shí)候光是搞清楚它和ORB-SLAM2的區(qū)別就來回翻了好幾遍。后來我決定干脆做一次比較完整的翻譯和梳理把論文主體部分逐段吃透跳過相關(guān)研究綜述和實(shí)驗(yàn)精度驗(yàn)證那些偏“論文八股”的章節(jié)專注于系統(tǒng)架構(gòu)、算法原理和關(guān)鍵公式的解讀。這篇博文就是那次工作的整理成果適合正在入門視覺SLAM、需要快速理解ORB-SLAM3核心設(shè)計(jì)的朋友也適合已經(jīng)用過ORB-SLAM3但想回頭補(bǔ)理論基礎(chǔ)的開發(fā)者。需要提前說明的是我翻譯和解讀的重點(diǎn)放在論文的方法論部分也就是系統(tǒng)怎么設(shè)計(jì)的、每個(gè)模塊解決什么問題、公式背后的直覺是什么。相關(guān)研究部分主要是羅列前人工作精度驗(yàn)證部分是一堆表格和曲線這兩塊對理解系統(tǒng)本身幫助有限所以直接略過。下面我會按照論文的邏輯順序把核心內(nèi)容拆開來講同時(shí)補(bǔ)充一些論文里沒寫但實(shí)際理解時(shí)很關(guān)鍵的經(jīng)驗(yàn)。2. 系統(tǒng)總覽ORB-SLAM3到底在解決什么問題2.1 從ORB-SLAM2到ORB-SLAM3的核心跨越ORB-SLAM2已經(jīng)是一個(gè)很成熟的系統(tǒng)了支持單目、雙目和RGB-D有完整的跟蹤、局部建圖、回環(huán)檢測和重定位能力。但它有一個(gè)明顯的短板沒有慣性融合而且在跟蹤丟失之后重建地圖的能力有限。ORB-SLAM3要解決的核心問題就是兩個(gè)第一把IMU數(shù)據(jù)真正用起來讓系統(tǒng)在視覺退化或者快速運(yùn)動時(shí)依然穩(wěn)定第二支持多地圖系統(tǒng)當(dāng)跟蹤丟失時(shí)不是簡單重啟而是新建一個(gè)子地圖等條件合適時(shí)再和之前的地圖合并。這兩個(gè)目標(biāo)聽起來簡單但實(shí)現(xiàn)起來涉及大量細(xì)節(jié)。慣性融合不是簡單地把IMU預(yù)積分結(jié)果加到優(yōu)化里就行還要處理初始化、尺度估計(jì)、重力方向?qū)R、偏置估計(jì)等一系列問題。多地圖合并也不是把兩個(gè)點(diǎn)云拼在一起那么簡單需要做地圖對齊、位姿圖優(yōu)化、融合重復(fù)地圖點(diǎn)還要保證合并后的地圖在后續(xù)跟蹤中能正常使用。論文里把系統(tǒng)分成了幾個(gè)主要模塊跟蹤線程、局部建圖線程、回環(huán)檢測與地圖合并線程以及一個(gè) Atlas 地圖集結(jié)構(gòu)。Atlas 是ORB-SLAM3比較有特色的設(shè)計(jì)它允許系統(tǒng)同時(shí)維護(hù)多個(gè)子地圖每個(gè)子地圖有自己的關(guān)鍵幀和地圖點(diǎn)子地圖之間通過共視關(guān)系或者慣性信息建立連接。2.2 Atlas地圖集的設(shè)計(jì)邏輯Atlas 這個(gè)名字聽起來很唬人其實(shí)它的核心思想不復(fù)雜。你可以把它理解成一個(gè)“地圖的容器”里面可以裝多個(gè)獨(dú)立的地圖。每個(gè)地圖有自己的原點(diǎn)、關(guān)鍵幀集合、地圖點(diǎn)集合和共視圖。系統(tǒng)在正常跟蹤時(shí)所有新關(guān)鍵幀和地圖點(diǎn)都加到當(dāng)前活躍地圖里。一旦跟蹤丟失系統(tǒng)不會像ORB-SLAM2那樣直接進(jìn)入重定位模式然后可能徹底失敗而是把當(dāng)前地圖標(biāo)記為非活躍然后新建一個(gè)空地圖從當(dāng)前幀重新開始跟蹤和建圖。這個(gè)設(shè)計(jì)的好處在于系統(tǒng)不會因?yàn)橐淮胃櫴【蛠G掉之前建好的所有地圖信息。當(dāng)相機(jī)重新回到之前建過圖的區(qū)域時(shí)系統(tǒng)可以通過重定位或者地圖合并把新舊地圖連起來。論文里提到Atlas 還支持地圖的保存和加載這對于長期運(yùn)行的機(jī)器人或者AR應(yīng)用來說很實(shí)用。不過這里有一個(gè)容易忽略的細(xì)節(jié)多地圖系統(tǒng)里的尺度問題。單目SLAM本身尺度不確定不同子地圖的尺度可能不一致。ORB-SLAM3通過慣性信息來估計(jì)尺度并且在合并地圖時(shí)會做尺度對齊。如果沒有IMU純單目情況下多地圖合并的尺度一致性會比較麻煩論文里也提到這種情況下的處理方式相對保守。2.3 慣性融合在系統(tǒng)中的位置IMU數(shù)據(jù)在ORB-SLAM3里不是簡單地和視覺結(jié)果做濾波融合而是通過預(yù)積分理論嵌入到因子圖優(yōu)化里。具體來說系統(tǒng)會在關(guān)鍵幀之間對IMU測量做預(yù)積分得到相對旋轉(zhuǎn)、速度和位置的變化量然后把這些預(yù)積分量作為約束加入到局部BA或者全局BA中。這樣做的好處是IMU的高頻信息被壓縮成了關(guān)鍵幀之間的約束既保留了運(yùn)動信息又不會讓優(yōu)化變量爆炸。論文里用了大量篇幅推導(dǎo)預(yù)積分的公式包括旋轉(zhuǎn)、速度、位置的預(yù)積分項(xiàng)以及偏置更新時(shí)的雅可比矩陣。這些公式看起來嚇人但核心思想就是把IMU測量從“原始數(shù)據(jù)”變成“相對運(yùn)動約束”然后讓優(yōu)化器去調(diào)整關(guān)鍵幀位姿和IMU偏置使得視覺觀測和慣性約束同時(shí)滿足。實(shí)際使用中IMU的初始化和偏置估計(jì)對系統(tǒng)穩(wěn)定性影響很大。論文里提到系統(tǒng)會在啟動階段用一段時(shí)間做慣性初始化估計(jì)重力方向、尺度和初始偏置。如果這段時(shí)間內(nèi)相機(jī)運(yùn)動不夠充分初始化可能會失敗或者估計(jì)不準(zhǔn)。我在實(shí)際測試中發(fā)現(xiàn)手持設(shè)備做初始化時(shí)最好有比較明顯的平移和旋轉(zhuǎn)運(yùn)動不要只是原地轉(zhuǎn)動否則尺度估計(jì)容易出問題。3. 跟蹤線程每一幀進(jìn)來之后發(fā)生了什么3.1 幀的預(yù)處理與特征提取每一幀圖像進(jìn)入系統(tǒng)后首先做的是ORB特征提取。ORB特征本身是Oriented FAST加旋轉(zhuǎn)BRIEF描述子計(jì)算速度快適合實(shí)時(shí)應(yīng)用。論文里提到系統(tǒng)會根據(jù)圖像金字塔做多尺度特征提取保證在不同距離下都能找到足夠的匹配點(diǎn)。特征提取之后系統(tǒng)會做初始位姿估計(jì)。如果是雙目或者RGB-D模式可以直接通過特征匹配和三角化得到深度信息位姿估計(jì)相對直接。如果是單目模式就需要依賴之前的地圖點(diǎn)或者慣性信息來估計(jì)位姿。論文里特別提到在慣性模式下系統(tǒng)會用IMU預(yù)積分結(jié)果作為初始位姿猜測然后再用視覺觀測做優(yōu)化。這里有一個(gè)實(shí)操中容易踩的坑特征提取的數(shù)量和質(zhì)量對跟蹤穩(wěn)定性影響很大。論文里默認(rèn)每幀提取1000到2000個(gè)特征點(diǎn)但在紋理較弱的場景下這個(gè)數(shù)量可能不夠。我試過在白色墻面或者空曠走廊里跑ORB-SLAM3特征點(diǎn)經(jīng)常掉到幾百個(gè)跟蹤很容易丟失。后來我調(diào)整了特征提取參數(shù)增加了每幀提取數(shù)量同時(shí)降低了FAST角點(diǎn)的閾值情況有所改善但代價(jià)是計(jì)算量上升。3.2 位姿估計(jì)與局部地圖跟蹤初始位姿估計(jì)之后系統(tǒng)會把當(dāng)前幀和局部地圖里的關(guān)鍵幀做匹配進(jìn)一步優(yōu)化位姿。局部地圖里包含了當(dāng)前幀附近的關(guān)鍵幀以及它們觀測到的地圖點(diǎn)。匹配過程會用到描述子距離、極線約束和尺度一致性檢查剔除誤匹配。論文里提到系統(tǒng)會維護(hù)一個(gè)共視圖記錄關(guān)鍵幀之間的共視關(guān)系。共視圖的作用是快速找到和當(dāng)前幀有共同觀測的關(guān)鍵幀避免全局搜索。這個(gè)設(shè)計(jì)在ORB-SLAM2里就有ORB-SLAM3繼續(xù)沿用并做了優(yōu)化。位姿優(yōu)化的目標(biāo)函數(shù)是重投影誤差也就是把地圖點(diǎn)投影到當(dāng)前幀上最小化投影位置和實(shí)際觀測位置之間的距離。如果慣性模式開啟還會加入IMU預(yù)積分約束。優(yōu)化變量包括當(dāng)前幀位姿、地圖點(diǎn)位置有時(shí)還包括IMU偏置和速度。實(shí)際運(yùn)行中局部地圖跟蹤的魯棒性很大程度上取決于地圖點(diǎn)的質(zhì)量。如果之前建圖時(shí)引入了錯誤的地圖點(diǎn)后續(xù)跟蹤就會被帶偏。論文里提到系統(tǒng)有地圖點(diǎn)剔除機(jī)制會移除那些重投影誤差過大或者被觀測次數(shù)太少的地圖點(diǎn)。但我在實(shí)際使用中發(fā)現(xiàn)有些錯誤地圖點(diǎn)會存活比較久尤其是在紋理重復(fù)的場景里。這時(shí)候可能需要手動干預(yù)或者調(diào)整剔除策略的參數(shù)。3.3 跟蹤失敗后的處理策略跟蹤失敗在SLAM里是常態(tài)關(guān)鍵是怎么處理。ORB-SLAM3的策略比ORB-SLAM2更靈活。當(dāng)跟蹤失敗時(shí)系統(tǒng)會先嘗試重定位在當(dāng)前活躍地圖里找相似的關(guān)鍵幀。如果重定位成功就繼續(xù)跟蹤如果失敗系統(tǒng)會把當(dāng)前地圖標(biāo)記為非活躍然后新建一個(gè)地圖從當(dāng)前幀重新開始。這個(gè)過程中Atlas 的作用就體現(xiàn)出來了。新建的地圖會獨(dú)立運(yùn)行直到系統(tǒng)檢測到它和某個(gè)舊地圖有足夠的共視關(guān)系或者慣性一致性才會觸發(fā)地圖合并。論文里提到地圖合并會在回環(huán)檢測線程里處理合并時(shí)會做位姿圖優(yōu)化把兩個(gè)地圖的坐標(biāo)系對齊。我在測試中發(fā)現(xiàn)跟蹤失敗后新建地圖的策略在大多數(shù)情況下是有效的但有一個(gè)問題如果相機(jī)一直在同一個(gè)區(qū)域來回運(yùn)動系統(tǒng)可能會頻繁新建地圖導(dǎo)致Atlas里堆積很多小地圖。這些地圖之間的合并需要時(shí)間而且合并過程中可能會引入誤差。所以實(shí)際使用時(shí)如果場景比較固定可以考慮調(diào)整跟蹤失敗的判定閾值避免過于敏感。4. 局部建圖與關(guān)鍵幀管理4.1 關(guān)鍵幀的插入策略關(guān)鍵幀是SLAM系統(tǒng)里的核心概念它決定了地圖的密度和優(yōu)化的計(jì)算量。ORB-SLAM3的關(guān)鍵幀插入策略和ORB-SLAM2類似主要看當(dāng)前幀和上一個(gè)關(guān)鍵幀之間的共視點(diǎn)數(shù)量、平移距離和旋轉(zhuǎn)角度。如果共視點(diǎn)太少或者運(yùn)動超過一定閾值就插入新關(guān)鍵幀。論文里提到在慣性模式下關(guān)鍵幀插入還會考慮IMU預(yù)積分的時(shí)間間隔。如果兩個(gè)關(guān)鍵幀之間時(shí)間太長IMU預(yù)積分的誤差會累積所以系統(tǒng)會限制最大時(shí)間間隔超過就強(qiáng)制插入關(guān)鍵幀。這個(gè)策略在實(shí)際使用中需要根據(jù)場景調(diào)整。比如在快速運(yùn)動的場景里如果關(guān)鍵幀插入太稀疏跟蹤容易丟失如果太密集局部BA的計(jì)算量會很大。我一般會根據(jù)相機(jī)的運(yùn)動速度和計(jì)算平臺的性能適當(dāng)調(diào)整關(guān)鍵幀插入的閾值。在嵌入式平臺上跑的時(shí)候我會把閾值調(diào)大一些減少關(guān)鍵幀數(shù)量保證實(shí)時(shí)性。4.2 局部BA的優(yōu)化變量與邊緣化局部建圖線程的核心任務(wù)是做局部BA優(yōu)化最近一段時(shí)間內(nèi)的關(guān)鍵幀位姿和地圖點(diǎn)位置。論文里提到局部BA的優(yōu)化窗口包含當(dāng)前關(guān)鍵幀、它的共視關(guān)鍵幀以及這些關(guān)鍵幀觀測到的地圖點(diǎn)。優(yōu)化變量包括關(guān)鍵幀位姿、地圖點(diǎn)位置慣性模式下還包括速度和偏置。局部BA的規(guī)模不能太大否則計(jì)算量會爆炸。所以系統(tǒng)會限制優(yōu)化窗口的大小把那些和當(dāng)前關(guān)鍵幀共視關(guān)系較弱的關(guān)鍵幀排除在外。論文里提到系統(tǒng)會固定一些關(guān)鍵幀不參與優(yōu)化只優(yōu)化最近的關(guān)鍵幀和地圖點(diǎn)。這個(gè)策略在ORB-SLAM2里就有ORB-SLAM3繼續(xù)沿用。邊緣化是局部BA里的一個(gè)關(guān)鍵操作。當(dāng)優(yōu)化窗口滑動時(shí)舊的關(guān)鍵幀和地圖點(diǎn)需要被移除但它們提供的約束不能直接丟掉否則會丟失信息。論文里用了舒爾補(bǔ)來做邊緣化把舊變量的信息壓縮成先驗(yàn)約束加到后續(xù)優(yōu)化里。這個(gè)過程涉及大量矩陣運(yùn)算論文里給了公式推導(dǎo)但實(shí)際實(shí)現(xiàn)時(shí)需要注意數(shù)值穩(wěn)定性。我在閱讀這部分時(shí)最大的體會是邊緣化的理論看起來很優(yōu)雅但實(shí)際實(shí)現(xiàn)時(shí)很容易出問題。比如先驗(yàn)信息的構(gòu)建如果處理不好會導(dǎo)致優(yōu)化結(jié)果有偏。論文里沒有詳細(xì)講實(shí)現(xiàn)細(xì)節(jié)但如果你要自己復(fù)現(xiàn)或者修改代碼這部分需要特別小心。4.3 地圖點(diǎn)的創(chuàng)建與剔除地圖點(diǎn)的創(chuàng)建主要靠三角化。當(dāng)新關(guān)鍵幀插入后系統(tǒng)會嘗試用新關(guān)鍵幀和之前的關(guān)鍵幀做三角化生成新的地圖點(diǎn)。三角化的條件是兩個(gè)關(guān)鍵幀之間有足夠的基線匹配點(diǎn)的視差角足夠大三角化后的重投影誤差在合理范圍內(nèi)。地圖點(diǎn)的剔除則是一個(gè)持續(xù)的過程。系統(tǒng)會定期檢查所有地圖點(diǎn)移除那些被觀測次數(shù)太少、重投影誤差過大、或者被多個(gè)關(guān)鍵幀觀測到但一直不更新的點(diǎn)。論文里提到剔除策略還會考慮地圖點(diǎn)的尺度一致性如果某個(gè)地圖點(diǎn)在多個(gè)尺度下的觀測不一致也會被移除。實(shí)際使用中地圖點(diǎn)的質(zhì)量直接決定了跟蹤和建圖的精度。我遇到過一種情況在紋理重復(fù)的場景里三角化會產(chǎn)生很多錯誤的地圖點(diǎn)這些點(diǎn)雖然重投影誤差不大但位置是錯的。這種點(diǎn)很難通過常規(guī)的剔除策略移除因?yàn)樗鼈冊谀承┮暯窍驴雌饋硎呛侠淼?。后來我通過增加極線約束的嚴(yán)格程度以及引入慣性信息做一致性檢查才把這類錯誤點(diǎn)壓下去。5. 回環(huán)檢測與地圖合并的完整鏈路5.1 基于詞袋模型的位置識別回環(huán)檢測的第一步是位置識別也就是判斷當(dāng)前幀是否回到了之前去過的地方。ORB-SLAM3用的是DBoW2詞袋模型把ORB描述子量化成視覺單詞然后通過倒排索引快速檢索相似的關(guān)鍵幀。論文里提到系統(tǒng)會維護(hù)一個(gè)關(guān)鍵幀數(shù)據(jù)庫每個(gè)關(guān)鍵幀用詞袋向量表示。當(dāng)新關(guān)鍵幀插入時(shí)系統(tǒng)會在數(shù)據(jù)庫里搜索相似的關(guān)鍵幀如果相似度超過閾值就認(rèn)為是候選回環(huán)。候選回環(huán)還需要經(jīng)過幾何驗(yàn)證也就是用特征匹配和位姿估計(jì)確認(rèn)兩個(gè)關(guān)鍵幀確實(shí)觀測到了同一個(gè)場景。詞袋模型的好處是檢索速度快適合大規(guī)模地圖。但它也有局限性如果場景里有大量重復(fù)紋理詞袋模型容易產(chǎn)生誤匹配。論文里提到系統(tǒng)會用時(shí)間一致性檢查和共視關(guān)系檢查來過濾誤匹配但實(shí)際使用中還是需要調(diào)參。5.2 回環(huán)校正與位姿圖優(yōu)化確認(rèn)回環(huán)之后系統(tǒng)會做回環(huán)校正。校正的過程是先計(jì)算當(dāng)前關(guān)鍵幀和回環(huán)關(guān)鍵幀之間的相對位姿然后把這個(gè)位姿作為約束加入到全局位姿圖優(yōu)化里。位姿圖優(yōu)化的變量是所有關(guān)鍵幀的位姿約束包括相鄰關(guān)鍵幀之間的相對位姿和回環(huán)約束。論文里提到ORB-SLAM3的位姿圖優(yōu)化用的是萊文貝格-馬夸特方法優(yōu)化目標(biāo)是最小化所有約束的誤差。優(yōu)化完成后系統(tǒng)會根據(jù)優(yōu)化后的位姿調(diào)整地圖點(diǎn)位置完成回環(huán)校正。這里有一個(gè)細(xì)節(jié)值得注意回環(huán)校正之后系統(tǒng)還需要做地圖點(diǎn)的融合。因?yàn)榛丨h(huán)意味著兩個(gè)關(guān)鍵幀觀測到了同一個(gè)場景它們各自的地圖點(diǎn)可能是重復(fù)的。系統(tǒng)會把重復(fù)的地圖點(diǎn)合并更新共視關(guān)系保證地圖的一致性。這個(gè)過程在論文里沒有展開講但實(shí)際實(shí)現(xiàn)時(shí)很關(guān)鍵處理不好會導(dǎo)致地圖里出現(xiàn)大量重復(fù)點(diǎn)影響后續(xù)跟蹤。5.3 多地圖合并的觸發(fā)條件與執(zhí)行過程多地圖合并是ORB-SLAM3相對ORB-SLAM2的一個(gè)重大升級。當(dāng)系統(tǒng)在某個(gè)子地圖里檢測到回環(huán)而這個(gè)回環(huán)的關(guān)鍵幀屬于另一個(gè)子地圖時(shí)就會觸發(fā)地圖合并。合并的過程分幾步首先系統(tǒng)會計(jì)算兩個(gè)子地圖之間的相對位姿通常是通過回環(huán)關(guān)鍵幀的位姿關(guān)系來估計(jì)。然后系統(tǒng)會把兩個(gè)子地圖的關(guān)鍵幀和地圖點(diǎn)合并到一個(gè)地圖里同時(shí)做位姿圖優(yōu)化把兩個(gè)地圖的坐標(biāo)系對齊。最后系統(tǒng)會更新共視圖和地圖點(diǎn)觀測關(guān)系保證合并后的地圖可以正常用于跟蹤。論文里提到地圖合并的觸發(fā)條件除了回環(huán)檢測還可以通過慣性信息來判斷。如果兩個(gè)子地圖的慣性測量顯示它們在同一重力方向下運(yùn)動系統(tǒng)會認(rèn)為它們可能屬于同一個(gè)物理空間從而嘗試合并。我在實(shí)際測試中發(fā)現(xiàn)地圖合并的成功率很大程度上取決于回環(huán)檢測的質(zhì)量。如果回環(huán)檢測誤報(bào)地圖合并會把兩個(gè)不相關(guān)的地圖強(qiáng)行拼在一起導(dǎo)致后續(xù)跟蹤徹底崩潰。所以實(shí)際使用時(shí)回環(huán)檢測的閾值不能設(shè)得太松寧可漏檢也不要誤檢。6. 慣性初始化與尺度估計(jì)的實(shí)操細(xì)節(jié)6.1 慣性初始化的三個(gè)階段ORB-SLAM3的慣性初始化分三個(gè)階段視覺初始化、慣性初始化和聯(lián)合優(yōu)化。視覺初始化就是先用純視覺跑一段時(shí)間建立初始地圖和關(guān)鍵幀位姿。慣性初始化則是在視覺初始化完成后用IMU數(shù)據(jù)估計(jì)重力方向、尺度和初始偏置。聯(lián)合優(yōu)化是把視覺和慣性約束放在一起做BA進(jìn)一步優(yōu)化所有狀態(tài)量。論文里提到慣性初始化需要足夠的運(yùn)動激勵。如果相機(jī)在初始化階段運(yùn)動太少IMU的偏置和尺度估計(jì)會不準(zhǔn)。具體來說系統(tǒng)需要相機(jī)在多個(gè)軸上都有旋轉(zhuǎn)和平移才能充分觀測到重力方向和尺度信息。我在實(shí)際使用中總結(jié)了一個(gè)經(jīng)驗(yàn)初始化階段最好讓相機(jī)做“8字形”運(yùn)動也就是同時(shí)有平移和旋轉(zhuǎn)這樣IMU的各個(gè)軸都能被激勵到。如果只是平推或者只是原地旋轉(zhuǎn)初始化很容易失敗或者估計(jì)出的尺度偏差很大。6.2 尺度估計(jì)與重力方向?qū)R單目SLAM的尺度是不確定的ORB-SLAM3通過IMU來恢復(fù)尺度。具體來說系統(tǒng)會把IMU預(yù)積分得到的位置變化和視覺估計(jì)的位置變化做對比通過最小化兩者之間的差異來估計(jì)尺度因子。同時(shí)系統(tǒng)還會估計(jì)重力方向把視覺地圖的坐標(biāo)系對齊到重力坐標(biāo)系。論文里給了尺度估計(jì)的公式核心思想是IMU預(yù)積分的位置變化和視覺位置變化之間差一個(gè)尺度因子和旋轉(zhuǎn)矩陣。通過求解一個(gè)最小二乘問題可以得到尺度因子和重力方向。這個(gè)過程聽起來簡單但實(shí)際實(shí)現(xiàn)時(shí)有很多坑。比如IMU的偏置如果沒有估計(jì)準(zhǔn)尺度估計(jì)會有系統(tǒng)偏差。再比如重力方向的估計(jì)對加速度計(jì)的噪聲很敏感如果IMU質(zhì)量不好重力方向會估計(jì)得不準(zhǔn)導(dǎo)致地圖傾斜。我在測試中發(fā)現(xiàn)用低成本的IMU做初始化時(shí)重力方向的誤差可能達(dá)到幾度這時(shí)候需要更長時(shí)間的初始化或者更好的濾波。6.3 慣性模式下的跟蹤穩(wěn)定性調(diào)優(yōu)慣性模式開啟后系統(tǒng)的跟蹤穩(wěn)定性會明顯提升尤其是在快速運(yùn)動或者視覺退化的場景里。但慣性模式也引入了新的調(diào)參需求。比如IMU預(yù)積分的噪聲參數(shù)、偏置隨機(jī)游走的參數(shù)、以及視覺和慣性約束的權(quán)重這些都會影響跟蹤效果。論文里給了一組默認(rèn)參數(shù)但實(shí)際使用時(shí)需要根據(jù)IMU的質(zhì)量和場景特點(diǎn)調(diào)整。我一般會先跑一段數(shù)據(jù)觀察跟蹤誤差和IMU預(yù)積分的殘差然后調(diào)整噪聲參數(shù)。如果IMU噪聲大就增大預(yù)積分的噪聲參數(shù)讓優(yōu)化器更依賴視覺觀測如果視覺退化嚴(yán)重就減小噪聲參數(shù)讓優(yōu)化器更依賴慣性約束。還有一個(gè)容易忽略的點(diǎn)IMU和相機(jī)之間的時(shí)間同步。如果兩者時(shí)間戳有偏差預(yù)積分結(jié)果會和視覺觀測對不上導(dǎo)致跟蹤精度下降。論文里假設(shè)IMU和相機(jī)已經(jīng)做了時(shí)間同步但實(shí)際硬件上這個(gè)同步往往需要額外處理。我在一個(gè)項(xiàng)目里遇到過時(shí)間戳偏差幾毫秒的情況跟蹤誤差明顯增大后來通過離線標(biāo)定做了時(shí)間對齊才解決。7. 論文里沒寫但實(shí)際復(fù)現(xiàn)時(shí)容易卡住的地方7.1 代碼結(jié)構(gòu)與論文的對應(yīng)關(guān)系ORB-SLAM3的代碼量不小剛上手時(shí)容易迷失。我的建議是先看論文的系統(tǒng)總覽圖把幾個(gè)主要線程和數(shù)據(jù)結(jié)構(gòu)搞清楚然后再去代碼里找對應(yīng)的類。比如跟蹤線程對應(yīng)Tracking類局部建圖對應(yīng)LocalMapping類回環(huán)檢測對應(yīng)LoopClosing類Atlas對應(yīng)Atlas類。論文里的公式和代碼里的實(shí)現(xiàn)往往有差異。比如論文里寫的預(yù)積分公式是理論形式代碼里為了效率做了很多近似和優(yōu)化。如果你要改代碼最好先確認(rèn)論文里的公式和代碼里的實(shí)現(xiàn)是不是一致的不一致的地方以代碼為準(zhǔn)但理解論文有助于你知道代碼為什么這么寫。7.2 數(shù)據(jù)集與傳感器配置的匹配問題ORB-SLAM3支持多種傳感器配置但不同數(shù)據(jù)集和實(shí)際硬件的配置差異很大。論文里用的數(shù)據(jù)集主要是EuRoC和TUM VI這些數(shù)據(jù)集的IMU頻率、噪聲特性、時(shí)間同步質(zhì)量都比較好。如果你用自己的硬件跑需要先確認(rèn)IMU和相機(jī)的參數(shù)是否標(biāo)定準(zhǔn)確時(shí)間戳是否同步。我見過不少人直接拿論文的配置文件跑自己的數(shù)據(jù)結(jié)果跟蹤效果很差然后懷疑是算法問題。其實(shí)很多時(shí)候是傳感器標(biāo)定或者時(shí)間同步的問題。建議在跑ORB-SLAM3之前先單獨(dú)驗(yàn)證IMU和相機(jī)的標(biāo)定參數(shù)確保重投影誤差在合理范圍內(nèi)。7.3 參數(shù)調(diào)整的優(yōu)先級與常見誤區(qū)ORB-SLAM3的配置文件里有大量參數(shù)剛上手時(shí)容易不知道從哪調(diào)起。我的經(jīng)驗(yàn)是先調(diào)特征提取相關(guān)的參數(shù)比如每幀特征數(shù)、FAST閾值、金字塔層數(shù)。這些參數(shù)直接影響跟蹤的魯棒性。然后再調(diào)關(guān)鍵幀插入和地圖點(diǎn)剔除的參數(shù)這些影響地圖的密度和質(zhì)量。最后調(diào)慣性相關(guān)的參數(shù)這些影響慣性融合的效果。一個(gè)常見的誤區(qū)是很多人一上來就調(diào)慣性參數(shù)覺得慣性融合是核心。但實(shí)際上如果視覺跟蹤本身就不穩(wěn)定慣性融合也救不回來。所以先把視覺部分調(diào)穩(wěn)再調(diào)慣性部分效果會好很多。還有一個(gè)誤區(qū)是過度追求精度而忽略實(shí)時(shí)性。ORB-SLAM3的默認(rèn)參數(shù)在桌面平臺上可以實(shí)時(shí)運(yùn)行但在嵌入式平臺上可能需要降頻或者減少特征數(shù)。我一般會先保證實(shí)時(shí)性再在實(shí)時(shí)性滿足的前提下盡量提高精度。如果實(shí)時(shí)性都保證不了精度再高也沒意義。8. 我個(gè)人在翻譯和復(fù)現(xiàn)過程中的幾點(diǎn)體會翻譯ORB-SLAM3論文的過程其實(shí)也是重新學(xué)習(xí)一遍視覺慣性SLAM的過程。論文里的很多公式第一次看的時(shí)候覺得懂了但真正動手復(fù)現(xiàn)或者改代碼的時(shí)候才發(fā)現(xiàn)理解得不夠深。比如預(yù)積分的雅可比矩陣論文里給了推導(dǎo)但實(shí)際實(shí)現(xiàn)時(shí)需要考慮數(shù)值穩(wěn)定性和計(jì)算效率這些論文里不會講。另外ORB-SLAM3的多地圖系統(tǒng)雖然強(qiáng)大但實(shí)際使用時(shí)需要根據(jù)場景權(quán)衡。如果你的應(yīng)用場景比較固定相機(jī)不會跑出建圖區(qū)域那么多地圖系統(tǒng)的優(yōu)勢不明顯反而增加了系統(tǒng)復(fù)雜度。但如果你的應(yīng)用需要長期運(yùn)行或者大范圍移動多地圖系統(tǒng)就很有價(jià)值。最后說一點(diǎn)關(guān)于論文閱讀的方法。ORB-SLAM3的論文信息密度很高第一遍讀的時(shí)候不要糾結(jié)每個(gè)公式的推導(dǎo)先把握系統(tǒng)架構(gòu)和每個(gè)模塊的作用。第二遍再深入看公式結(jié)合代碼理解。第三遍可以針對自己關(guān)心的部分精讀比如你做慣性融合就重點(diǎn)看預(yù)積分和初始化部分。這樣分層次閱讀效率會高很多。