
做移動機器人和無人機的同行應(yīng)該都對Fast-LIO2不會陌生。它是一款基于激光雷達(dá)和IMU緊耦合的里程計與建圖方案用迭代擴展卡爾曼濾波把點云配準(zhǔn)和狀態(tài)估計放在一個流程里配合增量式ikd-Tree維護地圖在室內(nèi)外、無人機、手持設(shè)備上都能保持不錯的實時性。我最早是拿它跑ROS1后來整個項目遷移到ROS2中間踩了不少編譯和通信的坑。這篇文章我就圍繞Fast-LIO2的代碼結(jié)構(gòu)、ROS2部署、參數(shù)配置和實際避坑經(jīng)驗來寫給正準(zhǔn)備從ROS1轉(zhuǎn)過來或剛開始接觸這套代碼的同學(xué)一份能直接照著操作的手冊。1. Fast-LIO2到底解決了什么問題1.1 為什么需要緊耦合激光慣性里程計在激光SLAM領(lǐng)域激光雷達(dá)慣性里程計大致可以分成兩條技術(shù)路線。一條是先做點云配準(zhǔn)再把配準(zhǔn)結(jié)果交給濾波或者圖優(yōu)化框架典型的代表是LOAM和LIO-SAM。另一條是把原始點云和IMU測量直接放進(jìn)同一個狀態(tài)估計器里求解Fast-LIO系列就是這條路線。前者邏輯容易懂但點云配準(zhǔn)產(chǎn)生的噪聲會被當(dāng)作一個獨立的觀測誤差送入后端誤差傳遞不夠精細(xì)而且LOAM的地圖管理用體素柵格LIO-SAM又引入因子圖優(yōu)化代碼量和參數(shù)個數(shù)都上來了。我最早用LIO-SAM跑一個室內(nèi)小場景回環(huán)檢測確實漂亮但到了長走廊或者弱紋理區(qū)域后端的優(yōu)化反而容易把人帶到溝里CPU占用也不小。Fast-LIO2之所以在無人機、手持掃描槍這類資源受限的設(shè)備上流行核心在于它把精度和效率重新做了平衡。它使用迭代擴展卡爾曼濾波IEKF在每幀點云配準(zhǔn)的過程中同步更新IMU狀態(tài)和位姿不需要單獨的全局后端。你可以把IEKF理解為“每一幀都在做小范圍的非線性優(yōu)化”但它的迭代次數(shù)通常只有幾次計算量遠(yuǎn)小于因子圖。實測下來在同樣一顆Jetson Orin NX上Fast-LIO2跑Livox MID-360CPU占用能控制在單核60%以內(nèi)而LIO-SAM整體要高出不少。這意味著在移動機器人上還能同時跑導(dǎo)航、感知等其他模塊。Fast-LIO2沒有主動回環(huán)檢測它的定位更偏向里程計而非完整的SLAM系統(tǒng)。如果項目需要全局一致的軌跡和地圖可以把Fast-LIO2的輸出作為前端再接一個后端做位姿圖優(yōu)化。很多手持建模設(shè)備就是這么干的。明白這一點再去讀代碼就不會因為“沒有回環(huán)模塊”而擔(dān)心是不是代碼缺了東西。1.2 ikd-Tree給地圖管理帶來的改變傳統(tǒng)激光里程計的地圖管理大多依賴體素柵格voxel map。體素柵格的思路是把空間切成固定大小的小方塊每個方塊里只保留一個點或幾個點的統(tǒng)計結(jié)果。這種方法實現(xiàn)簡單但分辨率固定在點云密度變化劇烈的場景容易丟細(xì)節(jié)而且隨著地圖范圍變大體素數(shù)量會膨脹檢索效率也會下降。普通KD-Tree查詢快但建樹時要求一次性拿到所有點沒法增量更新。做實時里程計時每一秒都在新增幾千個點如果用普通KD-Tree每幀重建一次的代價是災(zāi)難性的。Fast-LIO2使用的ikd-Tree解決了這個問題。ikd-Tree是一種增量式KD-Tree支持在已有樹結(jié)構(gòu)上插入新點、刪除離當(dāng)前位姿太遠(yuǎn)的舊點樹結(jié)構(gòu)只做局部重平衡不需要整體重建。這樣無論地圖規(guī)模怎么增長單幀的更新和最近鄰搜索都能維持在一個可接受的復(fù)雜度內(nèi)。配合局部地圖的管理策略地圖點始終以當(dāng)前位置為中心保留一個動態(tài)范圍超出范圍的點會被標(biāo)記刪除。實際跑起來在室內(nèi)幾個房間連在一起的場景里Fast-LIO2的內(nèi)存占用和CPU占用都要明顯低于LIO-SAM而且測試環(huán)境越復(fù)雜優(yōu)勢越明顯。2. 代碼結(jié)構(gòu)拆解從入口到核心模塊2.1 倉庫目錄與核心文件Fast-LIO2倉庫源碼結(jié)構(gòu)其實非常集中核心基本都在src/laserMapping.cpp里。一個約兩千行的文件包含了主流程的大部分邏輯。很多剛接觸的人第一次打開會有點懵尤其是看到各種狀態(tài)量定義、雅可比矩陣計算、esekfom封裝之后頭會大。我建議不要一開始就逐行讀而是先按文件理解結(jié)構(gòu)include/FAST_LIO/common_lib.h放了常用結(jié)構(gòu)體和常量IMU_processing.hpp里封裝了IMU前向傳播和點云畸變校正laserMapping.hpp定義了laserMapping類成員函數(shù)和核心成員變量都在這里thirdparty/ikfom目錄里則是ikd-Tree的完整實現(xiàn)。config目錄下一個yaml文件控制所有運行參數(shù)。你不需要改代碼去換話題改yaml就行這比早期ROS1版本要方便。src/preprocess.cpp負(fù)責(zé)點云預(yù)處理比如提取有效點、賦予時間戳、按線束分類等。src/IMU_processing.cpp實現(xiàn)IMU數(shù)據(jù)的前向傳播主要是運動和零偏預(yù)測。真正的狀態(tài)更新邏輯在laserMapping.cpp里它調(diào)用esekfom庫完成IEKF的迭代更新??创a時可以先把主要流程畫在紙上再對照看具體函數(shù)。2.2 從回調(diào)函數(shù)看數(shù)據(jù)流程序入口main函數(shù)里主要做三件事讀取參數(shù)、創(chuàng)建節(jié)點句柄、訂閱話題并綁定回調(diào)。訂閱的核心話題有兩個一個是激光點云另一個是IMU。對于Livox雷達(dá)默認(rèn)通常是/livox/lidar和/livox/imu。IMU回調(diào)做的事情很簡單就是把IMU數(shù)據(jù)放隊列里同時更新最新的IMU時間戳。復(fù)雜邏輯全部放在點云回調(diào)里。點云回調(diào)會先調(diào)用preprocess把原始點云轉(zhuǎn)成當(dāng)前幀的點云數(shù)組給每個點附上相對時間。接著進(jìn)入主流程先判斷當(dāng)前幀時間戳和IMU隊列里的時間戳是否同步。如果IMU數(shù)據(jù)落后于點云時間戳節(jié)點會等待得到可以用的IMU后先做前向傳播也就是把IMU預(yù)積分的結(jié)果作為當(dāng)前狀態(tài)預(yù)測值。這個預(yù)測值會告訴系統(tǒng)雷達(dá)大概移動到了哪里。然后用預(yù)測位姿把點云投影到地圖坐標(biāo)系再到ikd-Tree里搜索最近鄰點計算點到平面的殘差運行IEKF更新。更新之后新的位姿會被寫回狀態(tài)量點云也會被加入地圖同時檢查地圖范圍把太遠(yuǎn)的舊點清掉。這里有一個關(guān)鍵點Fast-LIO2不是先單獨配準(zhǔn)再優(yōu)化而是配準(zhǔn)過程本身就在更新狀態(tài)。代碼里關(guān)鍵的預(yù)測和更新調(diào)用大致是esekfom::predict(imu_poses, IMUdata); esekfom::update_iterated_dyn_share_modified(point_cloud);第一行做IMU預(yù)測第二行做迭代更新。如果你只想改運行邏輯只需要理解這兩個調(diào)用之間的關(guān)系如果你想深入數(shù)學(xué)細(xì)節(jié)再去esekfom庫里看協(xié)方差、雅可比的具體計算。2.3 點云配準(zhǔn)與狀態(tài)更新的關(guān)鍵環(huán)節(jié)點云配準(zhǔn)的核心目標(biāo)是讓當(dāng)前幀點云在地圖上找到最合理的位置。Fast-LIO2用的不是ICP或NDT而是點到平面的殘差模型。每一幀選出一部分點根據(jù)當(dāng)前估計位姿投影到地圖搜索最近鄰并擬合成局部平面然后計算當(dāng)前點到平面的距離作為殘差。把殘差對狀態(tài)量的雅可比代入IEKF完成一次迭代更新。更新后再用新的位姿重新投影、重新搜索反復(fù)迭代直到收斂或達(dá)到max_iteration。實際代碼里會有幾個過濾條件距離太近的點會被blind參數(shù)濾掉因為近距離點通常有較大噪聲法向量不穩(wěn)定或離群太遠(yuǎn)的點也會被剔除。這些過濾看似簡單卻直接影響建圖質(zhì)量。我遇到過一個問題把blind設(shè)成5米在室內(nèi)只有一兩米寬的走廊里掃描基本切掉了全部有效點地圖自然建不起來。后來把blind降到0.5米效果立刻正常。所以調(diào)試時如果發(fā)現(xiàn)地圖突然空了先檢查blind和其他過濾閾值是否過大。3. ROS2環(huán)境準(zhǔn)備與依賴安裝3.1 系統(tǒng)版本與ROS2發(fā)行版選型Fast-LIO2從ROS1遷到ROS2最順的路就是Ubuntu22.04加ROS2 Humble。Humble支持周期長官方文檔和社區(qū)教程都比較多Livox的驅(qū)動也同時維護了Foxy和Humble分支。如果是新裝系統(tǒng)建議一步到位不要用太老的ROS發(fā)行版。ROS2的安裝方式官方文檔寫得很清楚先添加apt源和密鑰再安裝ros-humble-desktop即可。如果你只是跑Fast-LIO2裝ros-base也能編但調(diào)試時沒有rviz2很不方便所以我推薦desktop省得后面單獨安裝。裝完ROS2后再裝基礎(chǔ)依賴主要是編譯工具和PCL、Eigen等。我在實際環(huán)境里執(zhí)行的是sudo apt install git build-essential cmake g libeigen3-dev sudo apt install ros-humble-pcl-ros ros-humble-pcl-conversions ros-humble-robot-state-publisherPCL相關(guān)包是編譯Fast-LIO2時由package.xml聲明依賴的即使當(dāng)前節(jié)點不多也建議一次性裝齊。Eigen庫要注意版本太老的版本可能不支持C17的部分特性。裝完可以用pkg-config --modversion eigen3檢查一下版本通常3.4以上問題不大。如果你是剛接觸ROS2先不要把Fast-LIO2的報錯和ROS1的經(jīng)驗完全對應(yīng)起來。ROS2從編譯到運行都與ROS1完全不同比如用colcon代替catkin用ros2 node list代替rostopic list通信中間件也換成了DDS。先花半天時間把ROS2的基本概念比如節(jié)點、話題、服務(wù)、QoS弄明白后面處理Fast-LIO2的問題會輕松很多。3.2 Livox雷達(dá)驅(qū)動的選擇與編譯如果你用的是Livox系列雷達(dá)比如MID-360、Avia必須用livox_ros_driver2。這個名字很多人會看錯以為和ROS1的livox_ros_driver差不多結(jié)果直接把舊包扔進(jìn)工作空間編譯了半天報一堆錯。livox_ros_driver2支持ROS2的話題接口和DDS通信和Fast-LIO2的ROS2分支是配套關(guān)系。clone的時候要選擇ros2分支git clone -b ros2 https://github.com/Livox-SDK/livox_ros_driver2.git把倉庫放到~/fastlio2_ws/src下面后續(xù)和Fast-LIO2一起用colcon build編譯即可。需要注意livox_ros_driver2默認(rèn)發(fā)布的點云和IMU話題名不同版本可能不一樣。有些版本發(fā)布的是/livox/lidar和/livox/imu有些則是/pointcloud。這直接決定了Fast-LIO2的config該怎么配所以編譯完第一次運行前一定要先啟動驅(qū)動執(zhí)行ros2 topic list確認(rèn)實際話題名。3.3 工作空間創(chuàng)建與Fast-LIO2源碼編譯創(chuàng)建工作空間很直接mkdir -p ~/fastlio2_ws/src cd ~/fastlio2_ws colcon build --symlink-install source install/setup.bashROS2用colcon而不是catkin這是很多從ROS1過來的人會踩的第一個坑。Fast-LIO2源碼如果下載的是官方倉庫需要注意分支是否支持ROS2。有些歷史版本只有ROS1的CMakeLists直接colcon build會報package not found或者沒有生成ament相關(guān)的構(gòu)建文件。建議優(yōu)先選擇明確標(biāo)注支持ROS2的fork或者按照官方README去切換分支。編譯過程中最常見的報錯是缺少某個ros-humble-xxx依賴根據(jù)編譯日志的package名去安裝對應(yīng)包就行。編譯完成后可以用ros2 pkg list | grep fast_lio確認(rèn)包是否被識別。如果看不到檢查package.xml里的package名是否和目錄名一致路徑是否真的在src下。ROS2 colcon對包名有嚴(yán)格約束目錄名和package name不一致經(jīng)常導(dǎo)致Unable to find package。4. 從零到跑通的部署實操4.1 config參數(shù)逐項解析Fast-LIO2的config/mid360.yaml是官方提供的一套默認(rèn)參數(shù)。每一行都值得理解參數(shù)名示例值作用使用建議lid_topic/livox/lidar點云話題要與驅(qū)動實際一致imu_topic/livox/imuIMU話題注意大小寫和斜杠lidar_type11表示Livox系列4表示機械旋轉(zhuǎn)雷達(dá)換雷達(dá)必改scan_line4線束相關(guān)參數(shù)機械雷達(dá)按型號設(shè)置blind5.0距離小于該值的點被忽略室內(nèi)可調(diào)小到0.5point_filter_num4每N個點取1個參與計算越大越省CPU但精度下降filter_size_surf0.5地圖點體素降采樣尺寸調(diào)到0.3細(xì)節(jié)更豐富max_iteration3IEKF最大迭代次數(shù)改為5可提升精度pcd_save_enablefalse是否自動保存PCD測試時打開方便回看看到這里可能會覺得配置很簡單。但注意兩個容易忽略的地方一是外參矩陣extrinsic_R和extrinsic_T這代表雷達(dá)相對于IMU的安裝關(guān)系。如果傳感器裝歪了又不改這里地圖會飄得不成樣子。二是time_scale如果為負(fù)或不對點云運動補償就會反著來地圖會出現(xiàn)奇怪的重影。實際調(diào)參時不要同時改多個參數(shù)每次只改一個觀察地圖變化這樣更容易定位問題。4.2 用ros2 bag回放數(shù)據(jù)驗證流程在沒有雷達(dá)或不想把設(shè)備搬到室外的情況下用ros2 bag回放歷史數(shù)據(jù)是最快的驗證方式。先確認(rèn)bag里的話題ros2 bag info recorded_bag如果包含/livox/lidar和/livox/imu直接回放ros2 bag play recorded_bag --rate 1.0如果電腦性能緊張可以加--rate 0.5降速回放給Fast-LIO2留足計算時間。另開一個終端啟動Fast-LIO2ros2 launch fast_lio mapping.launch.py config_file:mid360.yaml這時不要急著看rviz2先看終端打印。正常情況會有里程計更新和地圖規(guī)模的信息如果一直停在等待IMU數(shù)據(jù)的狀態(tài)就要開始排查話題名和QoS?;胤艛?shù)據(jù)這個環(huán)節(jié)是排查系統(tǒng)的利器因為bag是固定的每次改代碼或參數(shù)后的表現(xiàn)是可以復(fù)現(xiàn)的。我建議把一段具有代表性場景的bag保存下來作為基準(zhǔn)數(shù)據(jù)任何改動都用它做回歸測試。4.3 實車部署的外參、時間同步與運動激勵實車部署比回放多出幾個硬條件。首先是外參標(biāo)定。Fast-LIO2要求雷達(dá)相對IMU的位姿已知如果你用的是一體化設(shè)備如MID-360廠商一般會給出初始外參但安裝稍有偏差也會導(dǎo)致建圖偏轉(zhuǎn)。精標(biāo)可以使用kalibr、livox_camera_calib這類工具或者自己設(shè)計一個標(biāo)定板場景。標(biāo)定結(jié)果填進(jìn)config后還需要重啟節(jié)點才生效。其次是時間同步。Fast-LIO2的IMU前向傳播依賴IMU和點云時間戳在同一時間基準(zhǔn)上。如果雷達(dá)用硬件時鐘IMU用系統(tǒng)時間幾十毫秒的偏差就會讓點云去畸變失效。我在一臺工控板上遇到的情況是點云邊緣反復(fù)撕裂后來把IMU和激光都統(tǒng)一到雷達(dá)主時鐘問題才解決。如果是純軟件方案至少要把兩個話題的時間戳改成同一臺主機的時鐘源再檢查是否有固定延遲。運動激勵也容易被忽視啟動時如果設(shè)備完全靜止IMU零偏的初始估計可能不準(zhǔn)確建議啟動后緩慢畫一個“8”字讓狀態(tài)更快收斂。5. 常見問題與排查技巧實錄5.1 編譯報錯的三大類原因編譯期報錯在任何一個開源項目遷移中都很常見Fast-LIO2遷到ROS2最容易遇到三類。第一類是缺依賴比如找不到pcl頭文件或者找不到eigen裝好對應(yīng)ROS2包后重新編譯即可。第二類是C標(biāo)準(zhǔn)版本問題如果CMakeLists沒設(shè)置-stdc14或c17使用新版編譯器時會報錯直接在CMakeLists里加上對應(yīng)選項即可。第三類是colcon識別不到包通常是package.xml缺失或包名不一致把package.xml補齊、保證文件夾名和 一致就行。遇到編譯錯誤時我的經(jīng)驗是先看第一行錯誤而不是最后一行先確認(rèn)是編譯錯誤還是鏈接錯誤。編譯錯誤通常指向某個頭文件或語法而鏈接錯誤常見的是某個庫找不到比如-lstdcfs。ROS2中很多頭文件路徑都經(jīng)過了ament_export如果source環(huán)境不完整明明裝了包卻找不到頭文件的情況也時有發(fā)生。每次新終端記得source install/setup.bash或者把source命令寫進(jìn)~/.bashrc能省掉不少幺蛾子。5.2 話題收不到或QoS不匹配Fast-LIO2啟動后如果沒有進(jìn)入主流程十有八九是話題或QoS問題。ROS2和ROS1一個顯著區(qū)別是QoS策略如果發(fā)布端和訂閱端的reliability、durability不一致數(shù)據(jù)就傳不過去。livox_ros_driver2默認(rèn)可能是best_effortFast-LIO2如果強要求reliable兩邊就匹配不上。檢查方法很簡單ros2 topic info /livox/lidar --verbose輸出里能看到Publisher和Subscription的QoS profile對照一下。不一致時有兩種改法改livox驅(qū)動launch文件里的QoS參數(shù)或者改Fast-LIO2訂閱器的QoS設(shè)置。如果不想深究每個字段最簡單的辦法是讓Fast-LIO2的訂閱器使用SensorDataQoS這個策略是ROS2中為傳感器數(shù)據(jù)設(shè)計的reliability為best_effort、history為keep_last和激光、IMU類話題配合最順。5.3 地圖漂移和抖動怎么定位漂移問題不要一上來就調(diào)濾波參數(shù)先看現(xiàn)象定位。如果地圖整體在某個方向緩慢偏移先懷疑外參如果地圖局部抖動、點云撕裂先懷疑時間戳和運動補償如果地圖完全發(fā)散、軌跡亂飛先懷疑IMU數(shù)據(jù)本身是否正常。一個快速判斷方法把IMU話題echo出來看角速度和加速度是否隨運動合理變化。如果輸出全是0或數(shù)值異常檢查IMU驅(qū)動配置和話題名。另一個常見原因是初始化階段沒有足夠的運動激勵。Fast-LIO2在剛啟動時會嘗試估計IMU零偏如果設(shè)備靜止太長時間零偏估計值可能收斂到一個奇怪的位置導(dǎo)致后續(xù)軌跡漂移。這時可以重新啟動節(jié)點并且在啟動后讓設(shè)備做小幅度的平移和旋轉(zhuǎn)讓可觀性盡快建立。還有一點長時間運行后地圖點會積累很多如果不開啟或調(diào)大filter_size_map地圖點過于密集也可能造成搜索耗時增加和輕微抖動。適當(dāng)增加降采樣能在性能和穩(wěn)定性之間取得平衡。5.4 Rviz2可視化與性能優(yōu)化Rviz2是ROS2的標(biāo)準(zhǔn)可視化工具Fast-LIO2跑通后在rviz2里添加PointCloud2顯示話題選FAST_LIO/map_globalFixed Frame設(shè)為camera_init就能看到實時地圖。如果看不到先檢查話題是否發(fā)布再檢查frame_id是否匹配。Rviz2對大量點云的渲染效率不高尤其當(dāng)?shù)貓D點達(dá)到幾十萬甚至上百萬時會很卡。這個時候與其調(diào)Rviz2的參數(shù)不如回到算法側(cè)降低點云量。point_filter_num這個參數(shù)表示每多少個點取1個參與計算增大它可以直接減少參與建圖的點數(shù)從而降低CPU和地圖規(guī)模。我在機載設(shè)備上常用的組合是point_filter_num8、filter_size_surf0.5精度損失很小但實時性明顯提升。如果是調(diào)試階段還可以把rviz2里的Point Size調(diào)小一點關(guān)閉不必要的網(wǎng)格顯示讓刷新率提上來。6. 進(jìn)階調(diào)優(yōu)不同傳感器適配與地圖復(fù)用6.1 機械旋轉(zhuǎn)雷達(dá)與Livox的切換Fast-LIO2不僅支持Livox系列也支持部分機械旋轉(zhuǎn)雷達(dá)。切換前要看兩個地方config里的lidar_type以及點云預(yù)處理邏輯。lidar_type為1時走Livox專用分支點云去畸變和通道處理方式都不同換成長距離機械雷達(dá)如Velodyne后需要把lidar_type改為對應(yīng)值并重新設(shè)置scan_line等參數(shù)。這個參數(shù)如果不對最直觀的表現(xiàn)就是點云被錯誤投影地圖上出現(xiàn)一圈一圈的錯層。我自己的體會是機械雷達(dá)的角分辨率、雷達(dá)頻率都和Livox不同參數(shù)不能復(fù)用。機械雷達(dá)點云數(shù)量大point_filter_num要相應(yīng)調(diào)大beam號設(shè)置錯誤會導(dǎo)致點云按錯誤線束去畸變。如果你不確定當(dāng)前雷達(dá)對應(yīng)的lidar_type最簡單的方法是直接看Fast-LIO2的README不同雷達(dá)的適配方式寫得比較清楚。不要企圖用一套參數(shù)跑所有傳感器不同傳感器之間的數(shù)據(jù)特性差異很大。6.2 里程計結(jié)果的二次開發(fā)接口Fast-LIO2除了發(fā)布地圖點云之外還會發(fā)布里程計位姿也就是odometry話題通常話題名是/odom或/aft_pcl。這個話題包含位置和四元數(shù)下游的路徑規(guī)劃、導(dǎo)航、避障模塊可以直接訂閱。如果你做的是移動機器人應(yīng)用建議從這個話題獲取當(dāng)前位姿而不是自己再去解析點云。很多激光SLAM方案會同時發(fā)布tf變換Fast-LIO2也一樣可以把雷達(dá)坐標(biāo)系和IMU坐標(biāo)系之間的tf輸出給機器人基礎(chǔ)框架。二次開發(fā)時要注意狀態(tài)協(xié)方差不一定輸出完整。Fast-LIO2重點在里程計精度對協(xié)方差矩陣的維護可能不像其他濾波器那樣完整。如果你需要把不確定性傳給下游規(guī)劃可能得根據(jù)實際應(yīng)用做近似或額外處理。這一點在代碼里可以看到發(fā)布Odometry消息時有時協(xié)方差會被置成常量或單位陣不要依賴它做太高精度的融合。6.3 點云地圖保存與后端復(fù)用Fast-LIO2建出來的地圖可以直接保存成PCD文件。config里把pcd_save_enable設(shè)為true運行結(jié)束后會在指定目錄生成點云地圖。保存下來的地圖可以交給其他模塊做定位比如ndt_scan_matcher或者ICP定位。我自己的流程是先用Fast-LIO2錄一段高質(zhì)量地圖保存PCD然后用這張地圖做后續(xù)的實時定位這樣前端建圖和后端定位可以解耦工程上更穩(wěn)。保存PCD要注意一個問題地圖坐標(biāo)系是camera_init點開始累積的如果設(shè)備移動距離很大PCD文件也會很大。這時候可以用PCL的命令行工具或CloudCompare做降采樣和裁剪只保留有效區(qū)域。保存前先通過rviz2確認(rèn)地圖質(zhì)量如果發(fā)現(xiàn)局部扭曲或重影不要急著保存先修復(fù)參數(shù)或數(shù)據(jù)。地圖是定位的底子底子臟了后面整個系統(tǒng)都會受影響。最后說一句Fast-LIO2這套代碼真正難的不是編譯和使用而是理解它為什么這樣做。建議拿到代碼后先跟著數(shù)據(jù)流走一遍再動手改參數(shù)。跑通之后把默認(rèn)參數(shù)、bag數(shù)據(jù)、外參標(biāo)定結(jié)果都記錄下來以后換環(huán)境能省很多時間。這也是我在多個項目里踩過坑之后最想分享的經(jīng)驗。