SLAM實戰(zhàn):從環(huán)境部署到算法調(diào)優(yōu)的完整指南)
簡介本資源是一個基于ROS2的激光雷達(dá)SLAM實踐項目面向機(jī)器人方向本科生及研究生適用于畢業(yè)設(shè)計、課程設(shè)計與期末大作業(yè)等綜合實踐場景聚焦同步定位與地圖構(gòu)建這一核心導(dǎo)航能力的工程實現(xiàn)。壓縮包共40個文件含11個Python節(jié)點腳本負(fù)責(zé)LIDAR數(shù)據(jù)接收、rf2o里程計計算、自驅(qū)動控制等、2個C/hpp算法模塊、3個XML配置與2個MD文檔含README說明輔以launch啟動腳本、colcon構(gòu)建配置及環(huán)境適配的zsh/bash腳本整體僅43KB輕量易部署。已有52人學(xué)習(xí)下載資源結(jié)構(gòu)清晰對應(yīng)ROS2工作空間標(biāo)準(zhǔn)布局ros2_ws/src下含self_drive_controller、rf2o_laser_odometry等獨立功能包涵蓋從傳感器數(shù)據(jù)接入、濾波定位、柵格建圖到可視化調(diào)試的完整鏈路特別適合初學(xué)者理解節(jié)點通信、話題訂閱發(fā)布、參數(shù)動態(tài)配置等ROS2核心機(jī)制并可直接復(fù)用于實車或仿真平臺驗證。1. 項目概述從零到一構(gòu)建ROS2激光雷達(dá)SLAM系統(tǒng)最近在整理硬盤翻出來一個老項目壓縮包名字就叫“ROS2激光雷達(dá)SLAM項目.zip”。這讓我想起了當(dāng)初從ROS1遷移到ROS2并嘗試用新框架搭建一個穩(wěn)定、可用的2D激光SLAM即時定位與地圖構(gòu)建系統(tǒng)的全過程。對于剛接觸機(jī)器人感知與導(dǎo)航的朋友來說SLAM就像機(jī)器人的“眼睛”和“記憶”它讓機(jī)器人在未知環(huán)境中一邊移動一邊描繪出周圍的地圖同時確定自己在這張地圖中的位置。而ROS2作為機(jī)器人操作系統(tǒng)的新一代標(biāo)準(zhǔn)以其改進(jìn)的實時性、跨平臺支持和更現(xiàn)代化的通信架構(gòu)正在成為機(jī)器人開發(fā)的主流選擇。這個項目本質(zhì)上是一個完整的、可運行的工程示例它整合了ROS2的通信框架、激光雷達(dá)驅(qū)動、SLAM算法以及可視化工具。無論你是正在學(xué)習(xí)《ROS2機(jī)器人開發(fā)從入門到實踐》這類書籍的在校學(xué)生還是需要在真實機(jī)器人如Jetson、RK3576等嵌入式平臺上部署導(dǎo)航功能的工程師這個項目都能提供一個清晰的起點。它解決的問題非常具體給你一個搭載了2D激光雷達(dá)比如常見的RPLIDAR、Hokuyo甚至是Velodyne 16線雷達(dá)的2D剖面的移動機(jī)器人或小車如何讓它自主地探索一個室內(nèi)環(huán)境并實時構(gòu)建出一張可用于導(dǎo)航的柵格地圖。接下來我將拆解這個項目的每一個核心環(huán)節(jié)分享從環(huán)境搭建、算法選型、參數(shù)調(diào)試到實際部署中的種種細(xì)節(jié)與坑點。2. 環(huán)境基石ROS2 Humble的穩(wěn)定部署與避坑指南任何ROS2項目的起點都是一個穩(wěn)定、干凈的ROS2環(huán)境。網(wǎng)上教程很多從“魚香ROS2一鍵安裝”到官方步驟但實際操作中尤其是在Ubuntu 22.04上安裝ROS2 Humble時有幾個關(guān)鍵細(xì)節(jié)決定了后續(xù)所有環(huán)節(jié)的順暢度。2.1 系統(tǒng)準(zhǔn)備與源配置超越官方教程的細(xì)節(jié)官方教程會告訴你設(shè)置軟件源和密鑰。但第一步我強(qiáng)烈建議先執(zhí)行sudo apt update sudo apt upgrade并重啟一次。這能避免因系統(tǒng)包版本滯后帶來的底層庫沖突。接著在設(shè)置ROS2倉庫源時不要僅僅添加主倉庫。對于SLAM項目我們很可能需要一些尚未進(jìn)入主倉庫的第三方包或最新算法。因此除了packages.ros.org還應(yīng)考慮添加ros-testing倉庫并學(xué)會使用rosdep來管理非ROS的系統(tǒng)依賴。一個常見的坑是語言環(huán)境和字符集問題。如果系統(tǒng)語言設(shè)置非英文在編譯某些包時可能會報奇怪的編碼錯誤。我通常會在~/.bashrc中提前設(shè)置export LANGC.UTF-8和export LC_ALLC.UTF-8然后重新打開終端。這能消除絕大多數(shù)因本地化設(shè)置導(dǎo)致的編譯失敗。2.2 工作空間與依賴管理Colcon的正確打開方式ROS2使用colcon作為構(gòu)建工具。創(chuàng)建好工作空間如ros2_ws/src后常見的操作是克隆項目代碼然后colcon build。但這里有一個效率技巧對于大型項目或網(wǎng)絡(luò)不佳時先單獨構(gòu)建核心依賴。例如SLAM常用的navigation2、slam_toolbox等可以單獨克隆到src下先編譯通過。這樣在編譯你自己的項目時這些依賴已經(jīng)就位能減少整體編譯時間。colcon build有幾個關(guān)鍵參數(shù)決定了開發(fā)體驗--symlink-install創(chuàng)建符號鏈接而非拷貝文件到install目錄。這意味著你在src里修改Python腳本后無需重新編譯即可運行極大提升調(diào)試效率。--packages-select pkg_name只編譯指定的包。當(dāng)你的工作空間有多個包但只修改了其中一個時使用此參數(shù)能節(jié)省大量時間。--cmake-args -DCMAKE_BUILD_TYPERelease對于最終部署使用Release模式編譯可以獲得更好的性能。調(diào)試階段則可以使用Debug。編譯完成后務(wù)必source install/setup.bash。我習(xí)慣將這一行直接寫入~/.bashrc但注明是用于特定工作空間避免多個工作空間source沖突。2.3 可視化工具RViz2與Gazebo的集成要點SLAM離不開可視化。RViz2是ROS2中的3D可視化工具用于顯示激光雷達(dá)數(shù)據(jù)、地圖、機(jī)器人模型等。安裝通常通過ros-humble-rviz2這個包。需要注意的是RViz2的插件機(jī)制與ROS1有所不同。如果你發(fā)現(xiàn)某些自定義的顯示類型Display無法加載可能需要檢查插件描述文件plugin_description.xml的格式是否符合ROS2規(guī)范。對于仿真我們常用Gazebo。ROS2 Humble官方推薦的是Gazebo Harmonic或Fortress。這里有一個大坑Gazebo版本與ROS2發(fā)行版的兼容性。如果使用ros-humble-gazebo-ros-pkgs安裝它會嘗試安裝默認(rèn)版本的Gazebo可能與你的系統(tǒng)或其他依賴不兼容。我的經(jīng)驗是先通過apt安裝一個確定可用的Gazebo版本如gazebo11然后再安裝ROS2的Gazebo橋接包并在安裝時指定Gazebo版本路徑這樣可以避免許多詭異的鏈接錯誤。3. 感知核心激光雷達(dá)驅(qū)動、數(shù)據(jù)接口與標(biāo)定實踐激光雷達(dá)是SLAM的“眼睛”如何正確地拿到干凈、準(zhǔn)確的激光掃描數(shù)據(jù)是整個流程的第一步也是問題最多的一步。3.1 雷達(dá)驅(qū)動選型與數(shù)據(jù)解析雷達(dá)驅(qū)動主要分兩類官方SDK封裝和通用協(xié)議驅(qū)動如ros2_driver_lidar。對于像RPLIDAR A1/A2、YDLIDAR這類常見型號通常有社區(qū)維護(hù)的ROS2驅(qū)動包如rplidar_ros2。安裝后啟動對應(yīng)的launch文件你應(yīng)該能在/scan話題上看到sensor_msgs/msg/LaserScan類型的數(shù)據(jù)。使用ros2 topic echo /scan --no-arr可以快速查看數(shù)據(jù)頭和信息。關(guān)鍵字段是ranges距離數(shù)組和angle_min、angle_max、angle_increment角度范圍與分辨率。你需要確認(rèn)這些參數(shù)與雷達(dá)物理規(guī)格一致。例如一個360度掃描的雷達(dá)angle_max - angle_min應(yīng)接近2*PI。對于Velodyne等3D雷達(dá)我們有時只使用其一個水平面的數(shù)據(jù)來模擬2D雷達(dá)。這時需要用到pointcloud_to_laserscan這個包將sensor_msgs/msg/PointCloud2點云數(shù)據(jù)轉(zhuǎn)換為LaserScan。這個過程涉及坐標(biāo)變換和平面提取需要仔細(xì)設(shè)置target_frame和高度閾值參數(shù)否則轉(zhuǎn)換出的“假2D”數(shù)據(jù)會包含天花板或地面的點嚴(yán)重干擾SLAM。3.2 坐標(biāo)變換TF樹SLAM數(shù)據(jù)的骨架ROS中所有傳感器數(shù)據(jù)、機(jī)器人部件的位置關(guān)系都通過TF樹來管理。一個正確的TF樹是SLAM能工作的前提。對于典型的差分驅(qū)動機(jī)器人TF樹應(yīng)至少包含以下關(guān)系map - odom - base_footprint - base_link - lasermap-odom由SLAM算法發(fā)布表示從地圖坐標(biāo)系到里程計坐標(biāo)系的變換用于修正里程計的累積誤差。odom-base_footprint通常由輪式編碼器積分里程計發(fā)布表示機(jī)器人從啟動位置開始的運動估計。base_link機(jī)器人本體的中心坐標(biāo)系。laser激光雷達(dá)的安裝位置。你需要一個robot_state_publisher節(jié)點根據(jù)你的機(jī)器人URDF模型發(fā)布base_link到laser等固定部件的靜態(tài)TF變換。同時里程計節(jié)點需要發(fā)布o(jì)dom到base_footprint的動態(tài)TF??梢允褂胷os2 run tf2_tools view_frames生成TF樹圖或用RViz2的TF顯示功能直觀檢查所有坐標(biāo)系是否按預(yù)期連接。3.3 激光雷達(dá)標(biāo)定提升建圖精度的關(guān)鍵一步很多人會忽略標(biāo)定直接使用雷達(dá)出廠參數(shù)或默認(rèn)安裝位置。這會導(dǎo)致建圖出現(xiàn)重影、扭曲或尺度錯誤。標(biāo)定主要分兩步內(nèi)參標(biāo)定角度與距離校正對于消費級雷達(dá)這一步通常不是必須的出廠已校準(zhǔn)。但對于精度要求高的場合或懷疑雷達(dá)數(shù)據(jù)有系統(tǒng)誤差時可以通過在已知距離放置標(biāo)定板對比雷達(dá)測量值與真實值來進(jìn)行校正。社區(qū)有像lidar_calibration這樣的工具包但過程較為復(fù)雜。外參標(biāo)定安裝位置標(biāo)定這是最實用也最易出錯的環(huán)節(jié)。你需要準(zhǔn)確知道雷達(dá)相對于base_link的安裝位置x, y, z, roll, pitch, yaw。一個簡單有效的方法是“墻角法”將機(jī)器人正對房間的一個內(nèi)墻角在RViz2中觀察激光掃描點。理論上兩個垂直墻面的點應(yīng)該交匯在墻角一點。如果發(fā)現(xiàn)兩條線不垂直或交點偏移就調(diào)整你在URDF或靜態(tài)TF廣播器中設(shè)置的laser相對于base_link的x, y, yaw參數(shù)直到在RViz2中看到完美的直角交匯。這個過程需要耐心反復(fù)調(diào)整。4. 算法實戰(zhàn)SLAM工具箱slam_toolbox的深度配置與調(diào)優(yōu)在ROS2生態(tài)中slam_toolbox是目前最活躍、功能最全面的2D激光SLAM方案它基于Karto SLAM算法并進(jìn)行了大量優(yōu)化支持同步定位與建圖SLAM、純定位Localization以及持續(xù)建圖Continous Mapping等多種模式。4.1 算法模式選擇與啟動配置slam_toolbox提供了多個啟動文件對應(yīng)不同模式online_async_launch.py在線異步建圖模式。這是最常用的模式機(jī)器人移動時實時構(gòu)建地圖。它采用“掃描匹配-圖優(yōu)化”的流程新建的掃描幀會與局部子圖匹配并定期進(jìn)行全局位姿圖優(yōu)化以消除累積誤差。offline_launch.py離線建圖模式。如果你已經(jīng)錄制了激光雷達(dá)和里程計的ROS2 bag數(shù)據(jù)包可以使用此模式進(jìn)行后處理建圖它能進(jìn)行更耗時的全局優(yōu)化得到更精確的地圖。localization_launch.py純定位模式。當(dāng)有一張預(yù)先構(gòu)建好的地圖時此模式讓機(jī)器人在已知地圖中實時定位不修改地圖。這是導(dǎo)航的前提。啟動時關(guān)鍵是要傳遞正確的參數(shù)文件。通常需要修改config目錄下的mapper_params_online_async.yaml。以下是一些核心參數(shù)解析slam_toolbox: ros__parameters: # 地圖分辨率單位米/像素。0.05表示5厘米一個像素。值越小地圖越精細(xì)但內(nèi)存消耗越大。 resolution: 0.05 # 地圖最大范圍像素。例如8000像素 * 0.05米/像素 400米見方的地圖。 max_map_size: 8000 # 是否使用里程計信息。強(qiáng)烈建議開啟能為掃描匹配提供良好的初始位姿估計加速收斂。 use_odom: true # 是否使用imu慣性測量單元數(shù)據(jù)。如果機(jī)器人有IMU開啟可以改善旋轉(zhuǎn)運動的估計。 use_imu: false # 最小掃描距離和最大掃描距離。過濾掉雷達(dá)太近可能是機(jī)器人自身和太遠(yuǎn)可能噪聲大的點。 range_min: 0.1 range_max: 25.0 # 掃描匹配的搜索窗口大小位置和角度。如果里程計不準(zhǔn)或機(jī)器人運動劇烈需要調(diào)大這些窗口。 position_search_window: 1.0 orientation_search_window: 0.54.2 參數(shù)調(diào)優(yōu)實戰(zhàn)解決建圖過程中的典型問題調(diào)參是SLAM工程中的藝術(shù)。以下是幾種常見問題及對應(yīng)的調(diào)優(yōu)思路問題地圖出現(xiàn)重影或“鬼影”。可能原因1里程計誤差過大導(dǎo)致掃描匹配的初始位姿偏差太大。解決檢查并改善里程計編碼器的標(biāo)定。在slam_toolbox參數(shù)中可以嘗試增大position_search_window和orientation_search_window讓算法在更大范圍內(nèi)搜索匹配。也可以稍微調(diào)低transform_timeout默認(rèn)為0.2秒確保使用的TF變換是最新的??赡茉?動態(tài)物體如走動的人被計入地圖。解決slam_toolbox有簡單的動態(tài)物體過濾機(jī)制但效果有限。更可靠的做法是在雷達(dá)驅(qū)動層或預(yù)處理節(jié)點中通過統(tǒng)計濾波或基于距離/角度的突變檢測來濾除動態(tài)點。問題建圖時地圖扭曲特別是長走廊或大回環(huán)時。可能原因閉環(huán)檢測Loop Closure不夠靈敏或參數(shù)不當(dāng)累積誤差未能及時校正。解決調(diào)整閉環(huán)檢測相關(guān)參數(shù)。降低loop_search_distance搜索閉環(huán)的最大距離和loop_search_angle角度閾值讓算法更積極地尋找閉環(huán)。同時可以減小minimum_travel_for_loop_closure觸發(fā)閉環(huán)搜索的最小移動距離讓機(jī)器人多嘗試閉環(huán)。但要注意過于激進(jìn)的閉環(huán)檢測可能導(dǎo)致錯誤閉環(huán)將地圖“壓扁”。這是一個平衡過程。問題算法計算資源占用高實時性差??赡茉驋呙椟c數(shù)太多或優(yōu)化頻率過高。解決首先確保雷達(dá)的angle_increment設(shè)置合理不要發(fā)布過于密集的掃描點例如0.25度分辨率已經(jīng)足夠精細(xì)。其次調(diào)整slam_toolbox的優(yōu)化頻率。參數(shù)optimization_frequency控制全局位姿圖優(yōu)化的頻率默認(rèn)1.0每秒一次。在資源受限的平臺如Jetson上可以適當(dāng)降低此值如0.5。參數(shù)transform_publish_period控制TF發(fā)布頻率也可以適當(dāng)降低以節(jié)省CPU。4.3 地圖保存、加載與純定位模式切換當(dāng)建圖滿意后可以通過服務(wù)調(diào)用保存地圖ros2 service call /slam_toolbox/save_map slam_toolbox/srv/SaveMap {name: /home/user/map}這會生成一個.pgm圖像文件和一個.yaml地圖元數(shù)據(jù)文件。切換到純定位模式時需要修改啟動命令并加載先前的地圖。關(guān)鍵是在定位模式的參數(shù)文件中設(shè)置mode: localization和提供地圖文件路徑。啟動定位節(jié)點后你需要通過RViz2的2D Pose Estimate工具給機(jī)器人一個大致初始位置點擊地圖上機(jī)器人應(yīng)該在的位置并拖拽方向。之后算法就會根據(jù)當(dāng)前的激光掃描與加載的地圖進(jìn)行匹配持續(xù)輸出精確的map-odom變換。5. 進(jìn)階集成與性能優(yōu)化在嵌入式平臺與仿真中的實踐將SLAM系統(tǒng)部署到真實的嵌入式機(jī)器人如NVIDIA Jetson、瑞芯微RK3576或進(jìn)行Gazebo仿真測試會遇到另一層挑戰(zhàn)。5.1 嵌入式平臺部署資源約束下的適配在Jetson等平臺上CPU和內(nèi)存資源相對有限。除了前面提到的算法參數(shù)調(diào)優(yōu)還有以下系統(tǒng)級優(yōu)化點使用性能更好的SLAM算法變體slam_toolbox的online_sync_launch模式比online_async計算量稍小因為它以固定頻率處理數(shù)據(jù)。可以嘗試對比。調(diào)整ROS2執(zhí)行器Executor默認(rèn)的SingleThreadedExecutor可能成為瓶頸。對于有多個傳感器節(jié)點的系統(tǒng)可以考慮使用MultiThreadedExecutor并合理設(shè)置回調(diào)組Callback Group避免高頻率的激光回調(diào)阻塞其他低頻率但重要的任務(wù)。內(nèi)核與電源管理在Jetson上使用sudo jetson_clocks命令鎖定CPU/GPU到最高頻率可以確保計算性能但會增加功耗和發(fā)熱。需要根據(jù)機(jī)器人續(xù)航要求權(quán)衡。交叉編譯如果開發(fā)機(jī)是x86架構(gòu)而目標(biāo)平臺是ARM如RK3576最好在開發(fā)機(jī)上為ARM平臺交叉編譯整個ROS2工作空間而不是在目標(biāo)平臺上直接編譯后者會非常耗時。5.2 Gazebo仿真構(gòu)建理想的測試環(huán)境仿真是在無實體機(jī)器人時開發(fā)和調(diào)試算法的利器。使用Gazebo搭建一個簡單的差分驅(qū)動機(jī)器人模型并為其添加一個模擬的激光雷達(dá)插件如libgazebo_ros_ray_sensor.so。仿真的優(yōu)勢在于環(huán)境完全可控。你可以構(gòu)建一個包含長廊、環(huán)形走廊、動態(tài)障礙物的世界文件系統(tǒng)地測試SLAM算法的閉環(huán)檢測能力、動態(tài)物體處理能力。在Gazebo中還可以人為地給里程計添加噪聲測試SLAM算法在里程計不準(zhǔn)情況下的魯棒性。一個常見的問題是仿真時間與ROS時間。確保在啟動Gazebo時使用-s參數(shù)掛載libgazebo_ros_init.so系統(tǒng)插件并在你的機(jī)器人URDF或啟動文件中正確使用use_sim_timetrue/use_sim_time這樣ROS2節(jié)點才能從/clock話題獲取仿真的時間而不是系統(tǒng)真實時間。5.3 多傳感器融合初探融合輪速計與IMU雖然slam_toolbox主要依賴激光雷達(dá)但它也支持融合里程計和IMU數(shù)據(jù)。融合輪速計通過use_odom: true是基本操作。融合IMU通過use_imu: true則能顯著改善機(jī)器人在快速旋轉(zhuǎn)或顛簸路面上的姿態(tài)估計因為激光雷達(dá)在劇烈運動時會產(chǎn)生點云畸變。要融合IMU你需要一個發(fā)布sensor_msgs/msg/Imu話題的節(jié)點并確保其坐標(biāo)系通常是imu_link正確連接到TF樹上。在slam_toolbox參數(shù)中可以設(shè)置imu_topic和imu_upside_down等參數(shù)。融合的效果取決于IMU數(shù)據(jù)的質(zhì)量和標(biāo)定特別是零偏和噪聲參數(shù)。一個未經(jīng)標(biāo)定的低質(zhì)量IMU其數(shù)據(jù)可能還不如不用。6. 調(diào)試、問題排查與經(jīng)驗沉淀即使按照步驟操作在實際運行中依然會遇到各種問題。一套有效的調(diào)試和排查方法論至關(guān)重要。6.1 數(shù)據(jù)流健康檢查清單當(dāng)SLAM不工作或效果很差時請按以下順序檢查話題數(shù)據(jù)ros2 topic list和ros2 topic echo /scan --no-arr | head -n 5。確保/scan話題存在并且數(shù)據(jù)中的ranges數(shù)組不為空距離值在合理范圍內(nèi)非inf或nan。TF樹ros2 run tf2_tools view_frames生成PDF檢查map-odom-base_link-laser鏈條是否完整、連續(xù)。特別注意時間戳使用ros2 run tf2_ros tf2_monitor可以查看TF延遲延遲過大0.1秒會導(dǎo)致數(shù)據(jù)同步問題。坐標(biāo)系朝向在RViz2中顯示LaserScan時確保點云的方向與機(jī)器人實際朝向一致。如果點云是反的或旋轉(zhuǎn)了90度檢查雷達(dá)的安裝角度roll, pitch, yaw在TF中是否正確設(shè)置。一個快速驗證方法讓機(jī)器人正對一面墻在RViz2中看到的點云應(yīng)該是一條水平的直線。算法內(nèi)部狀態(tài)slam_toolbox提供了/slam_toolbox/scan_visualization、/slam_toolbox/graph_visualization等話題可以在RViz2中訂閱查看算法內(nèi)部的匹配情況、位姿圖節(jié)點和約束邊這對于理解算法為何失效非常有幫助。6.2 常見錯誤與解決方案速查表現(xiàn)象可能原因排查步驟與解決方案RViz2中看不到激光點云1. 雷達(dá)驅(qū)動未啟動或話題名不對。2. RViz2中LaserScan話題設(shè)置錯誤。3. 坐標(biāo)系frame_id不匹配。1.ros2 topic list確認(rèn)/scan存在。2. 檢查RViz2中LaserScan的Topic是否為/scan。3. 檢查LaserScan消息中的header.frame_id與RViz2Global Options的Fixed Frame是否一致。地圖完全不更新或機(jī)器人位置不動1. TF樹斷裂或延遲高。2.use_odom為true但未收到里程計數(shù)據(jù)。3. 激光數(shù)據(jù)被過濾光距離閾值設(shè)錯。1. 運行tf2_monitor和view_frames檢查。2.ros2 topic echo /odom檢查里程計話題。3. 檢查range_min和range_max參數(shù)是否合理覆蓋了實際距離。建圖出現(xiàn)大量雜亂噪點1. 雷達(dá)鏡面臟污或處于強(qiáng)光直射下。2. 環(huán)境中存在大量透明或高反光物體。3. 雷達(dá)驅(qū)動或串口通信不穩(wěn)定。1. 清潔雷達(dá)罩避免陽光直射。2. 在參數(shù)中增大range_min過濾近處噪點嘗試啟用scan_filter_chain插件。3. 降低雷達(dá)發(fā)布頻率檢查串口波特率設(shè)置。回環(huán)后地圖發(fā)生劇烈跳變錯誤閉環(huán)檢測。算法誤將兩個相似但不相同的地點識別為同一處。1. 增加loop_search_distance和minimum_travel_for_loop_closure讓閉環(huán)檢測更保守。2. 檢查環(huán)境特征是否過于單一如長走廊無特征考慮增加其他傳感器如視覺特征。算法節(jié)點CPU占用率100%1. 掃描點數(shù)過多。2. 優(yōu)化頻率過高。3. 位姿圖節(jié)點數(shù)爆炸式增長。1. 降低雷達(dá)發(fā)布頻率或角度分辨率。2. 降低optimization_frequency。3. 啟用slam_toolbox的keep_only_last_n_nodes參數(shù)限制位姿圖大小。6.3 項目工程化與經(jīng)驗記錄最后當(dāng)你的SLAM系統(tǒng)能夠穩(wěn)定運行時考慮項目工程化。將所有的啟動文件、參數(shù)配置文件、URDF模型、地圖文件等組織在一個清晰的目錄結(jié)構(gòu)中。使用launch文件來編排多個節(jié)點的啟動順序和參數(shù)傳遞。對于參數(shù)調(diào)優(yōu)我習(xí)慣為不同的機(jī)器人或場景創(chuàng)建不同的參數(shù)YAML文件并在launch文件中通過arguments來動態(tài)選擇。建立一個簡單的測試流程在仿真中測試新參數(shù)在實車上進(jìn)行小范圍驗證最后進(jìn)行大場景長時運行測試。每次測試后記錄下參數(shù)配置、環(huán)境條件和出現(xiàn)的問題。這個習(xí)慣長期積累下來會成為你解決SLAM相關(guān)問題的寶貴知識庫。這個“ROS2激光雷達(dá)SLAM項目.zip”里除了代碼最重要的可能就是這些伴隨項目產(chǎn)生的調(diào)試日志和參數(shù)筆記了。本文還有配套的精品資源點擊獲取