據(jù)集:從數(shù)據(jù)接口到算法調(diào)優(yōu)全解析)
簡(jiǎn)介本資源是針對(duì)KITTI數(shù)據(jù)集深度適配優(yōu)化的LIO-SAM開(kāi)源SLAM系統(tǒng)修改版面向自動(dòng)駕駛、機(jī)器人定位與建圖領(lǐng)域的研究者及工程實(shí)踐者解決原始LIO-SAM在KITTI真實(shí)城市場(chǎng)景下點(diǎn)云-IMU同步偏差大、初始化不穩(wěn)定、城市道路特征稀疏導(dǎo)致定位漂移等問(wèn)題。壓縮包共44個(gè)文件含5個(gè)launch啟動(dòng)腳本支持KITTI序列加載與參數(shù)配置、4個(gè)核心cpp源碼含數(shù)據(jù)解析與前端里程計(jì)重構(gòu)、3個(gè)conf/yaml配置文件預(yù)設(shè)KITTI雷達(dá)型號(hào)、IMU頻率與坐標(biāo)系轉(zhuǎn)換、8張png/gif效果對(duì)比圖含軌跡可視化與地圖重建結(jié)果以及Dockerfile、rviz配置、xacro模型等完整部署支撐文件總大小76.06MB。已有1059人學(xué)習(xí)下載。讀者可直接復(fù)現(xiàn)KITTI基準(zhǔn)測(cè)試序列如00–10的高精度定位結(jié)果獲取包含數(shù)據(jù)預(yù)處理模塊、KITTI專(zhuān)用時(shí)間戳對(duì)齊邏輯、簡(jiǎn)化回環(huán)檢測(cè)流程的可編譯工程以及配套R(shí)EADME.md與LICENSE說(shuō)明顯著降低多傳感器SLAM在公開(kāi)數(shù)據(jù)集上的落地門(mén)檻。1. 項(xiàng)目緣起當(dāng)經(jīng)典算法遇上標(biāo)準(zhǔn)數(shù)據(jù)集在自動(dòng)駕駛和機(jī)器人領(lǐng)域KITTI數(shù)據(jù)集就像一塊“試金石”幾乎所有的SLAM即時(shí)定位與地圖構(gòu)建算法都會(huì)在上面跑一跑看看自己的性能到底如何。而LIO-SAM作為T(mén)ixiao Shan大神開(kāi)源的緊耦合激光慣性里程計(jì)框架憑借其出色的精度和魯棒性早已成為眾多研究者和工程師心中的“明星項(xiàng)目”。但問(wèn)題來(lái)了LIO-SAM原生的數(shù)據(jù)接口主要是為一些特定傳感器如Velodyne激光雷達(dá)配IMU和ROS的rosbag格式設(shè)計(jì)的而KITTI數(shù)據(jù)集提供的是更“原始”的.bin點(diǎn)云文件和獨(dú)立的oxts位姿與IMU數(shù)據(jù)。這就導(dǎo)致了一個(gè)尷尬的局面你手里有最權(quán)威的測(cè)試集也有最想驗(yàn)證的算法但兩者就像不同型號(hào)的插頭和插座直接對(duì)接不上。這個(gè)“為適配Kitti數(shù)據(jù)集修改的lio-sam.zip”項(xiàng)目正是為了解決這個(gè)“插頭插座不匹配”的問(wèn)題。它的核心目標(biāo)非常明確對(duì)LIO-SAM的源代碼進(jìn)行一系列修改使其能夠直接、順暢地讀取和處理KITTI數(shù)據(jù)集提供的原始數(shù)據(jù)格式從而讓研究者或開(kāi)發(fā)者能夠方便地在KITTI上評(píng)估LIO-SAM的性能或者基于此進(jìn)行二次開(kāi)發(fā)。這聽(tīng)起來(lái)似乎只是改改數(shù)據(jù)讀取的幾行代碼但實(shí)際做起來(lái)你會(huì)發(fā)現(xiàn)它涉及傳感器坐標(biāo)系的統(tǒng)一、時(shí)間戳的同步、點(diǎn)云格式的轉(zhuǎn)換、以及算法初始化邏輯的調(diào)整等一系列細(xì)節(jié)。這些細(xì)節(jié)如果處理不當(dāng)輕則導(dǎo)致軌跡漂移重則算法直接崩潰。接下來(lái)我就結(jié)合自己實(shí)際修改和測(cè)試的經(jīng)驗(yàn)把這個(gè)適配過(guò)程掰開(kāi)揉碎了講清楚。2. 理解適配的核心矛盾KITTI與LIO-SAM的數(shù)據(jù)鴻溝在動(dòng)手修改代碼之前我們必須先透徹理解兩者之間的差異在哪里。這不僅僅是文件格式的不同更是數(shù)據(jù)組織邏輯和傳感器假設(shè)的根本區(qū)別。2.1 KITTI數(shù)據(jù)集的數(shù)據(jù)供給模式KITTI數(shù)據(jù)集特別是其Odometry/SLAM基準(zhǔn)部分其數(shù)據(jù)組織方式體現(xiàn)了早期自動(dòng)駕駛數(shù)據(jù)采集的典型特點(diǎn)點(diǎn)云數(shù)據(jù)存儲(chǔ)在velodyne_points/data目錄下是一系列.bin文件。每個(gè)文件包含一幀點(diǎn)云點(diǎn)云中每個(gè)點(diǎn)由4個(gè)float32數(shù)值表示x, y, z, intensity。關(guān)鍵點(diǎn)在于這些點(diǎn)云數(shù)據(jù)已經(jīng)是經(jīng)過(guò)傳感器自身運(yùn)動(dòng)補(bǔ)償Motion Compensation的嗎對(duì)于KITTI使用的Velodyne HDL-64E激光雷達(dá)其原始數(shù)據(jù)是包含運(yùn)動(dòng)畸變的但KITTI提供的.bin文件通常被認(rèn)為是未經(jīng)補(bǔ)償?shù)脑紨?shù)據(jù)或者補(bǔ)償模型不明確。這意味著我們?cè)谔幚頃r(shí)需要像LIO-SAM那樣考慮在算法內(nèi)部進(jìn)行去畸變。位姿與IMU數(shù)據(jù)存儲(chǔ)在oxts目錄下的.txt文件。每個(gè)文件包含一組OXTSOxford Technical SolutionsGPS/IMU單元的數(shù)據(jù)如經(jīng)緯度、高度、滾轉(zhuǎn)角、俯仰角、航向角以及加速度和角速度。注意KITTI沒(méi)有提供獨(dú)立的、高頻的純IMU數(shù)據(jù)流。它的oxts數(shù)據(jù)是融合了GPS的定位結(jié)果頻率通常為10Hz遠(yuǎn)低于典型IMU的100-200Hz。而且其加速度和角速度值是表達(dá)在什么坐標(biāo)系下的是載體坐標(biāo)系body frame還是本地導(dǎo)航坐標(biāo)系local frame這需要仔細(xì)查閱KITTI的文檔來(lái)確認(rèn)通常認(rèn)為是載體坐標(biāo)系。時(shí)間戳timestamps.txt文件提供了每個(gè)數(shù)據(jù)幀點(diǎn)云和oxts的對(duì)應(yīng)時(shí)間。這是實(shí)現(xiàn)多傳感器數(shù)據(jù)同步的生命線(xiàn)。2.2 LIO-SAM預(yù)設(shè)的數(shù)據(jù)輸入接口LIO-SAM期望的輸入是標(biāo)準(zhǔn)的ROS話(huà)題Topic點(diǎn)云話(huà)題通常是sensor_msgs/PointCloud2類(lèi)型訂閱的話(huà)題名如/velodyne_points。LIO-SAM內(nèi)部假設(shè)點(diǎn)云帶有時(shí)間戳并且會(huì)為每個(gè)點(diǎn)云幀進(jìn)行預(yù)處理包括特征提取角點(diǎn)、平面點(diǎn)和初步的IMU預(yù)積分。IMU話(huà)題sensor_msgs/Imu類(lèi)型。LIO-SAM的緊耦合優(yōu)化核心嚴(yán)重依賴(lài)高頻100Hz、高質(zhì)量的IMU數(shù)據(jù)。它利用IMU進(jìn)行兩個(gè)關(guān)鍵操作預(yù)積分在關(guān)鍵幀之間提供相對(duì)運(yùn)動(dòng)約束和去畸變補(bǔ)償激光雷達(dá)掃描期間自身的運(yùn)動(dòng)。IMU數(shù)據(jù)的坐標(biāo)系、單位加速度是否為m/s2是否已去除重力都有明確要求??蛇x的GPS話(huà)題用于全局位姿校正防止累積誤差漂移。矛盾的核心就此浮現(xiàn)KITTI提供的是低頻、融合的oxts位姿數(shù)據(jù)而LIO-SAM渴求的是高頻、原始的IMU數(shù)據(jù)。如果我們簡(jiǎn)單地把oxts中的加速度/角速度當(dāng)作IMU數(shù)據(jù)喂給LIO-SAM頻率太低且可能包含GPS融合帶來(lái)的非慣性動(dòng)力學(xué)噪聲這會(huì)嚴(yán)重破壞LIO-SAM的預(yù)積分模型導(dǎo)致優(yōu)化失敗。3. 適配方案設(shè)計(jì)與關(guān)鍵修改點(diǎn)面對(duì)上述矛盾通常有兩種主流適配思路我們這個(gè)修改包很可能采用的是第一種也是最務(wù)實(shí)的一種方案一將KITTI的oxts數(shù)據(jù)轉(zhuǎn)換為虛擬的IMU數(shù)據(jù)并重構(gòu)數(shù)據(jù)播放邏輯。這是最常見(jiàn)的方法。既然沒(méi)有真IMU我們就用已有的位姿信息“反向推導(dǎo)”出符合IMU動(dòng)力學(xué)模型的高頻數(shù)據(jù)。雖然這推導(dǎo)出的“IMU”不是真實(shí)的傳感器讀數(shù)但對(duì)于驅(qū)動(dòng)LIO-SAM的算法流程特別是用于點(diǎn)云去畸變往往是可行的。因?yàn)镵ITTI采集車(chē)的運(yùn)動(dòng)相對(duì)平穩(wěn)這種近似造成的誤差有時(shí)在可接受范圍內(nèi)。方案二修改LIO-SAM使其能直接利用oxts提供的低頻位姿作為約束。這需要更深入地改動(dòng)優(yōu)化器將oxts位姿作為一個(gè)單獨(dú)的、低頻的位姿觀(guān)測(cè)因子加入到因子圖中而不是作為IMU預(yù)積分的來(lái)源。這改動(dòng)量更大但可能更“干凈”。不過(guò)從項(xiàng)目名稱(chēng)“修改的lio-sam.zip”來(lái)看更可能是方案一。下面我詳細(xì)拆解方案一需要實(shí)施的關(guān)鍵代碼修改步驟3.1 創(chuàng)建KITTI數(shù)據(jù)讀取與發(fā)布節(jié)點(diǎn)我們需要新建一個(gè)ROS節(jié)點(diǎn)例如kitti_helper_node.cpp或.py它的核心工作流程如下讀取數(shù)據(jù)順序讀取velodyne_points/data下的.bin文件以及對(duì)應(yīng)的oxts數(shù)據(jù)和timestamps。點(diǎn)云轉(zhuǎn)換將二進(jìn)制.bin數(shù)據(jù)讀入內(nèi)存轉(zhuǎn)換為pcl::PointCloudpcl::PointXYZI格式再封裝成ROS的sensor_msgs/PointCloud2消息。這里要注意點(diǎn)云坐標(biāo)軸的定義是否與LIO-SAM的配置一致例如LIO-SAM默認(rèn)可能使用前-左-上的坐標(biāo)系而KITTI是右-前-上??赡苄枰M(jìn)行坐標(biāo)變換。// 示例讀取.bin文件并轉(zhuǎn)換為pcl點(diǎn)云 std::ifstream file(bin_path, std::ios::binary); std::vectorfloat buffer(std::istreambuf_iteratorchar(file), {}); pcl::PointCloudpcl::PointXYZI::Ptr cloud(new pcl::PointCloudpcl::PointXYZI); for (size_t i 0; i buffer.size(); i 4) { pcl::PointXYZI point; point.x buffer[i]; point.y buffer[i1]; point.z buffer[i2]; point.intensity buffer[i3]; cloud-push_back(point); } // 可能需要的坐標(biāo)變換例如從KITTI坐標(biāo)系右前上轉(zhuǎn)到LIO-SAM期望的坐標(biāo)系前左上 // Eigen::Affine3f transform Eigen::Affine3f::Identity(); // transform.rotate(Eigen::AngleAxisf(M_PI/2, Eigen::Vector3f::UnitZ())); // 示例旋轉(zhuǎn) // pcl::transformPointCloud(*cloud, *cloud, transform);生成虛擬IMU這是最具技巧性的部分。對(duì)于相鄰兩個(gè)oxts位姿時(shí)間間隔dt我們可以計(jì)算其相對(duì)旋轉(zhuǎn)和平移。假設(shè)車(chē)輛在dt時(shí)間內(nèi)是勻加速運(yùn)動(dòng)我們可以利用運(yùn)動(dòng)學(xué)公式從位姿差分近似得到角速度和加速度。角速度可以通過(guò)兩個(gè)相鄰位姿的相對(duì)旋轉(zhuǎn)矩陣R_rel用旋轉(zhuǎn)向量或四元數(shù)的差分來(lái)近似計(jì)算平均角速度omega rotationVector(R_rel) / dt。加速度計(jì)算更復(fù)雜。需要從位置差分得到速度再?gòu)乃俣炔罘值玫郊铀俣?。但oxts提供的加速度計(jì)讀數(shù)本身可能已經(jīng)包含了重力分量并且是在載體坐標(biāo)系下。一個(gè)常見(jiàn)的簡(jiǎn)化處理是直接使用oxts文件中的af_*前向、側(cè)向加速度和omega_*角速度字段作為虛擬IMU的輸入。雖然它們頻率低、可能經(jīng)過(guò)濾波但至少量綱和坐標(biāo)系大致正確。我們需要將它們封裝到sensor_msgs/Imu消息中并注意設(shè)置正確的協(xié)方差矩陣可以設(shè)置較大的值以表示不確定性高。時(shí)間同步與發(fā)布為每一幀點(diǎn)云和其對(duì)應(yīng)的或插值后的虛擬IMU數(shù)據(jù)賦予正確的時(shí)間戳從timestamps.txt解析然后以近似實(shí)時(shí)的速率或跳幀發(fā)布到LIO-SAM訂閱的話(huà)題上例如/kitti/velodyne_points和/kitti/imu。在LIO-SAM的配置文件中我們需要修改其訂閱的話(huà)題名以匹配。3.2 修改LIO-SAM的配置文件與參數(shù)原版LIO-SAM的配置在config/params.yaml中適配KITTI時(shí)以下參數(shù)至關(guān)重要# 點(diǎn)云話(huà)題改為我們發(fā)布的KITTI話(huà)題 pointCloudTopic: /kitti/velodyne_points imuTopic: /kitti/imu # 傳感器設(shè)置需要調(diào)整 sensor: velodyne # 激光雷達(dá)類(lèi)型保持即可 N_SCAN: 64 # KITTI的Velodyne HDL-64E是64線(xiàn) Horizon_SCAN: 1024 # 每圈的點(diǎn)數(shù)KITTI可能是2083需要根據(jù)實(shí)際點(diǎn)云維度調(diào)整或使用默認(rèn)值 # IMU參數(shù)調(diào)整。由于我們使用的是虛擬/低頻IMU以下參數(shù)需要放寬或調(diào)整 imuAccNoise: 1.0e-2 # 加速度計(jì)噪聲可以適當(dāng)調(diào)大因?yàn)閿?shù)據(jù)不純 imuGyrNoise: 1.0e-3 # 陀螺儀噪聲調(diào)大 imuAccBiasN: 1.0e-6 # 加速度計(jì)偏置隨機(jī)游走噪聲 imuGyrBiasN: 1.0e-6 # 陀螺儀偏置隨機(jī)游走噪聲 # 重力加速度大小注意坐標(biāo)系。如果虛擬IMU數(shù)據(jù)已包含重力這里要確認(rèn) imuGravity: 9.81 # 地圖和優(yōu)化參數(shù)可能因場(chǎng)景城市道路而調(diào)整 mapResolution: 0.4 # 子地圖體素濾波分辨率城市場(chǎng)景可以稍大3.3 處理時(shí)間戳與初始化問(wèn)題LIO-SAM嚴(yán)重依賴(lài)精確的時(shí)間戳。KITTI的時(shí)間戳是絕對(duì)的從某個(gè)起點(diǎn)開(kāi)始的秒數(shù)而ROS使用ros::Time。我們需要在發(fā)布節(jié)點(diǎn)里做好轉(zhuǎn)換通常將KITTI的時(shí)間戳偏移量設(shè)為0或與ROS的WallTime對(duì)齊。另一個(gè)棘手問(wèn)題是初始化。LIO-SAM通常需要一段靜止的IMU數(shù)據(jù)來(lái)初始化重力方向和偏置。KITTI數(shù)據(jù)集車(chē)輛一開(kāi)始可能就在運(yùn)動(dòng)。解決方案有修改LIO-SAM的初始化邏輯允許在運(yùn)動(dòng)狀態(tài)下進(jìn)行粗略初始化或者使用前幾幀oxts提供的姿態(tài)來(lái)直接初始化系統(tǒng)姿態(tài)。在數(shù)據(jù)發(fā)布節(jié)點(diǎn)中在數(shù)據(jù)流開(kāi)始前先發(fā)布幾幀“靜止”的虛擬IMU數(shù)據(jù)角速度為0加速度為[0,0,g]欺騙LIO-SAM完成初始化。4. 實(shí)測(cè)中的挑戰(zhàn)與應(yīng)對(duì)策略按照上述方案修改后你可能會(huì)遇到一些意想不到的問(wèn)題。以下是我在實(shí)測(cè)中踩過(guò)的坑和對(duì)應(yīng)的解決思路問(wèn)題一軌跡嚴(yán)重漂移或發(fā)散??赡茉?虛擬IMU數(shù)據(jù)質(zhì)量太差。低頻oxts數(shù)據(jù)差分得到的“IMU”噪聲大且不符合IMU的真實(shí)動(dòng)力學(xué)模型導(dǎo)致預(yù)積分誤差極大。應(yīng)對(duì)策略嘗試直接使用oxts文件中的af_*和omega_*字段而不是通過(guò)位姿差分計(jì)算。同時(shí)在LIO-SAM的params.yaml中顯著增大imuAccNoise和imuGyrNoise的值比如增加一個(gè)數(shù)量級(jí)告訴優(yōu)化器這些測(cè)量值不可信讓它更多地依賴(lài)激光匹配??赡茉?點(diǎn)云去畸變失敗。LIO-SAM依賴(lài)IMU進(jìn)行運(yùn)動(dòng)補(bǔ)償?shù)覀兊奶摂MIMU頻率低無(wú)法精確描述掃描期間的運(yùn)動(dòng)。應(yīng)對(duì)策略在imageProjection.cpp中可以嘗試禁用或簡(jiǎn)化去畸變邏輯。對(duì)于KITTI這樣的車(chē)載數(shù)據(jù)集車(chē)速較快時(shí)運(yùn)動(dòng)畸變顯著完全禁用可能導(dǎo)致精度下降。一個(gè)折中方案是使用勻速模型利用前后兩幀虛擬IMU數(shù)據(jù)插值出每個(gè)點(diǎn)的時(shí)間戳對(duì)應(yīng)的位姿。這需要修改deskewPoint函數(shù)??赡茉?坐標(biāo)系不匹配。點(diǎn)云、虛擬IMU、LIO-SAM內(nèi)部坐標(biāo)系定義不一致。應(yīng)對(duì)策略在數(shù)據(jù)發(fā)布節(jié)點(diǎn)中進(jìn)行統(tǒng)一的坐標(biāo)變換。確保點(diǎn)云和IMU數(shù)據(jù)都轉(zhuǎn)換到LIO-SAM約定的載體坐標(biāo)系通常是前-左-上。打印出前幾幀數(shù)據(jù)的數(shù)值與KITTI官網(wǎng)的坐標(biāo)系定義仔細(xì)比對(duì)。問(wèn)題二特征點(diǎn)提取異常導(dǎo)致匹配失敗??赡茉騅ITTI點(diǎn)云是64線(xiàn)機(jī)械式激光雷達(dá)在戶(hù)外采集的點(diǎn)云分布、密度和遮擋情況與LIO-SAM默認(rèn)參數(shù)可能針對(duì)16線(xiàn)或32線(xiàn)雷達(dá)調(diào)優(yōu)不同。應(yīng)對(duì)策略調(diào)整featureExtraction.cpp中的特征提取參數(shù)。edgeThreshold: 曲率閾值用于篩選角點(diǎn)。surfThreshold: 用于篩選平面點(diǎn)。由于64線(xiàn)雷達(dá)垂直線(xiàn)束密集在垂直方向上的點(diǎn)間距小可能導(dǎo)致提取的平面點(diǎn)過(guò)多而角點(diǎn)過(guò)少??梢試L試提高edgeThreshold以獲取更顯著的角點(diǎn)或降低surfThreshold。更精細(xì)的做法是修改特征提取的區(qū)域劃分避免在垂直方向上過(guò)度采樣。問(wèn)題三運(yùn)行效率低下或內(nèi)存暴漲??赡茉騅ITTI序列較長(zhǎng)LIO-SAM默認(rèn)保存所有關(guān)鍵幀的子地圖可能導(dǎo)致內(nèi)存累積。應(yīng)對(duì)策略調(diào)整params.yaml中的地圖管理參數(shù)。loopClosureFrequency: 降低回環(huán)檢測(cè)頻率因?yàn)镵ITTI序列長(zhǎng)頻繁檢測(cè)計(jì)算量大。surroundingKeyframeSize: 控制局部子地圖中包含的關(guān)鍵幀數(shù)量適當(dāng)減小。啟用savePCD選項(xiàng)在運(yùn)行完一個(gè)序列后保存地圖然后重啟節(jié)點(diǎn)避免長(zhǎng)時(shí)間運(yùn)行的內(nèi)存泄漏問(wèn)題。5. 評(píng)估與驗(yàn)證如何判斷適配是否成功修改完成后如何評(píng)估你的“KITTI版LIO-SAM”是否工作正??梢暬瘷z查運(yùn)行LIO-SAM同時(shí)用RViz訂閱/lio_sam/mapping/odometry里程計(jì)軌跡和/lio_sam/map/cloud_registered全局地圖。播放KITTI數(shù)據(jù)觀(guān)察軌跡是否平滑連貫建圖是否清晰建筑物輪廓、地面道路。與KITTI提供的真值軌跡poses文件夾進(jìn)行粗略對(duì)比。軌跡精度評(píng)估這是黃金標(biāo)準(zhǔn)。使用像evo這樣的工具進(jìn)行定量評(píng)估。將LIO-SAM輸出的里程計(jì)位姿話(huà)題/lio_sam/mapping/odometry類(lèi)型nav_msgs/Odometry保存為T(mén)UM或KITTI格式的軌跡文件。使用KITTI數(shù)據(jù)集提供的poses/XX.txt作為真值。運(yùn)行evo命令計(jì)算絕對(duì)位姿誤差A(yù)PE和相對(duì)位姿誤差RPEevo_ape kitti ground_truth.txt lio_sam_estimate.txt -r trans_part --align --plot evo_rpe kitti ground_truth.txt lio_sam_estimate.txt -r trans_part --delta 100 --plot --delta_unit m分析結(jié)果主要看RMSE均方根誤差。一個(gè)成功的適配在KITTI這樣的城市道路場(chǎng)景下平移部分的RMSE應(yīng)該能控制在序列長(zhǎng)度的1%以?xún)?nèi)甚至更低例如序列長(zhǎng)度幾百米誤差幾米。如果誤差巨大說(shuō)明適配存在根本性問(wèn)題。與原始LIO-SAM在其他數(shù)據(jù)集上的性能對(duì)比如果條件允許用相同參數(shù)的LIO-SAM在自有數(shù)據(jù)集或類(lèi)似難度的公開(kāi)數(shù)據(jù)集上運(yùn)行對(duì)比性能差異可以幫你判斷是適配引入的問(wèn)題還是算法本身對(duì)KITTI場(chǎng)景不敏感。6. 從適配到進(jìn)階可能的優(yōu)化方向如果你的基本適配已經(jīng)跑通但精度還不盡如人意或者你想做得更完美可以考慮以下進(jìn)階優(yōu)化方向融合GPS信息KITTI的oxts數(shù)據(jù)包含GPS坐標(biāo)。你可以修改LIO-SAM將其gpsTopic指向一個(gè)發(fā)布GPS消息的節(jié)點(diǎn)將oxts的經(jīng)緯高轉(zhuǎn)換為UTM坐標(biāo)并發(fā)布為nav_msgs/Odometry。這樣LIO-SAM的因子圖優(yōu)化中就會(huì)加入GPS約束可以有效抑制長(zhǎng)時(shí)間運(yùn)行的累積漂移特別是在開(kāi)闊路段。改進(jìn)虛擬IMU生成模型簡(jiǎn)單的差分或直接使用字段可能不夠??梢钥紤]使用更平滑的插值算法如樣條插值來(lái)生成更高頻、更平滑的虛擬IMU數(shù)據(jù)。甚至可以利用車(chē)輛運(yùn)動(dòng)模型如阿克曼轉(zhuǎn)向模型對(duì)加速度和角速度進(jìn)行約束和優(yōu)化。針對(duì)KITTI調(diào)整特征提取與匹配KITTI場(chǎng)景包含大量的長(zhǎng)直道、規(guī)則建筑物??梢試L試專(zhuān)門(mén)為這種場(chǎng)景調(diào)整特征提取的參數(shù)例如在點(diǎn)云強(qiáng)度信息可信的情況下引入強(qiáng)度特征輔助匹配或者針對(duì)地面點(diǎn)占比大的特點(diǎn)優(yōu)化地面點(diǎn)提取和利用策略。處理KITTI 3D專(zhuān)用迷你數(shù)據(jù)集網(wǎng)絡(luò)熱詞中提到的“KITTI 3D專(zhuān)用迷你數(shù)據(jù)集”可能是指一些裁剪或處理過(guò)的子集。適配時(shí)需要注意其數(shù)據(jù)格式是否與完整KITTI一致序列長(zhǎng)度短可能對(duì)回環(huán)檢測(cè)等模塊有影響可以相應(yīng)調(diào)整參數(shù)。這個(gè)為KITTI適配LIO-SAM的項(xiàng)目本質(zhì)上是一個(gè)精致的“橋梁工程”。它要求你既吃透LIO-SAM這套復(fù)雜系統(tǒng)的內(nèi)部數(shù)據(jù)流和算法邏輯又深刻理解KITTI數(shù)據(jù)集的組織方式和局限性。成功搭建這座橋后你不僅能獲得一個(gè)在權(quán)威數(shù)據(jù)集上可運(yùn)行的強(qiáng)大SLAM算法實(shí)例更能在這個(gè)過(guò)程中深入理解激光-慣性里程計(jì)的每一個(gè)技術(shù)環(huán)節(jié)這種收獲遠(yuǎn)比單純跑通一個(gè)demo要大得多。實(shí)際動(dòng)手時(shí)耐心調(diào)試參數(shù)、仔細(xì)分析中間結(jié)果如發(fā)布/lio_sam/deskew/cloud_deskewed觀(guān)察去畸變效果是關(guān)鍵。祝你好運(yùn)期待在KITTI的排行榜上看到更多基于改進(jìn)版LIO-SAM的優(yōu)異結(jié)果。本文還有配套的精品資源點(diǎn)擊獲取