z@z:~/lio_sam_ws$ source devel/setup.bash
z@z:~/lio_sam_ws$ roslaunch lio_sam run.launch
創建包鏈接:
鏈接1:Ubuntu20.04成功運行LIO-SAM_ubuntu20.04運行liosam-CSDN博客
鏈接2:ubuntu 20.04 ROS 編譯和運行 lio-sam,并且導出PCD文件運行_ubuntu20.04 編譯lio-sam-CSDN博客
z@z:~/lio_sam_ws$ source devel/setup.bash
z@z:~/lio_sam_ws$ roslaunch lio_sam run.launch
在bag包所在的位置打開新的終端運行程序代碼:
rosbag play l1_cooperation_2023-12-21-15-44-16_velodyne.bag
rosbag play l1_cooperation_2023-12-21-15-44-16_velodyne.bag
最后得到三維點云圖像
補充:
根據z@z:~/lio_sam_ws/src/LIO-SAM$ rosbag info l1_cooperation_2023-12-21-15-44-16_velodyne.bag
path: l1_cooperation_2023-12-21-15-44-16_velodyne.bag
version: 2.0
duration: 10:12s (612s)
start: Mar 28 2024 14:18:30.89 (1711606710.89)
end: Mar 28 2024 14:28:43.88 (1711607323.88)
size: 15.4 GB
messages: 73561
compression: none [12163/12163 chunks]
types: sensor_msgs/Imu [6a62c6daae103f4ff57a132d6f95cec2]sensor_msgs/PointCloud2 [1158d486dd51d683ce2f1be655c3c181]
topics: /back/velodyne_points 6130 msgs : sensor_msgs/PointCloud2/imu/data 61304 msgs : sensor_msgs/Imu /velodyne_points 6127 msgs : sensor_msgs/PointCloud2
怎么修改yaml文件里面的topic lio_sam:# TopicspointCloudTopic: "sensor_msgs/PointCloud2" # Point cloud dataimuTopic: "sensor_msgs/Imu" # IMU data#odomTopic: "odometry/imu" # IMU pre-preintegration odometry, same frequency as IMU#gpsTopic: "odometry/gpsz" # GPS odometry topic from navsat, see module_navsat.launch file# FrameslidarFrame: "base_link"baselinkFrame: "base_link"odometryFrame: "odom"mapFrame: "map"# GPS SettingsuseImuHeadingInitialization: true # if using GPS data, set to "true"useGpsElevation: false # if GPS elevation is bad, set to "false"gpsCovThreshold: 2.0 # m^2, threshold for using GPS dataposeCovThreshold: 25.0 # m^2, threshold for using GPS data# Export settingssavePCD: false # https://github.com/TixiaoShan/LIO-SAM/issues/3savePCDDirectory: "/Downloads/LOAM/" # in your home folder, starts and ends with "/". Warning: the code deletes "LOAM" folder then recreates it. See "mapOptimization" for implementation# Sensor Settingssensor: velodyne # lidar sensor type, 'velodyne' or 'ouster' or 'livox'N_SCAN: 16 # number of lidar channel (i.e., Velodyne/Ouster: 16, 32, 64, 128, Livox Horizon: 6)Horizon_SCAN: 1800 # lidar horizontal resolution (Velodyne:1800, Ouster:512,1024,2048, Livox Horizon: 4000)downsampleRate: 1 # default: 1. Downsample your data if too many points. i.e., 16 = 64 / 4, 16 = 16 / 1lidarMinRange: 1.0 # default: 1.0, minimum lidar range to be usedlidarMaxRange: 1000.0 # default: 1000.0, maximum lidar range to be used# IMU SettingsimuAccNoise: 3.9939570888238808e-03imuGyrNoise: 1.5636343949698187e-03imuAccBiasN: 6.4356659353532566e-05imuGyrBiasN: 3.5640318696367613e-05imuGravity: 9.80511imuRPYWeight: 0.01# Extrinsics: T_lb (lidar -> imu)extrinsicTrans: [0.0, 0.0, 0.0]# extrinsicRot: [-1, 0, 0,# 0, 1, 0,# 0, 0, -1]# extrinsicRPY: [0, -1, 0,# 1, 0, 0,# 0, 0, 1]extrinsicRot: [1, 0, 0,0, 1, 0,0, 0, 1]extrinsicRPY: [1, 0, 0,0, 1, 0,0, 0, 1]# LOAM feature thresholdedgeThreshold: 1.0surfThreshold: 0.1edgeFeatureMinValidNum: 10surfFeatureMinValidNum: 100# voxel filter papramsodometrySurfLeafSize: 0.4 # default: 0.4 - outdoor, 0.2 - indoormappingCornerLeafSize: 0.2 # default: 0.2 - outdoor, 0.1 - indoormappingSurfLeafSize: 0.4 # default: 0.4 - outdoor, 0.2 - indoor# robot motion constraint (in case you are using a 2D robot)z_tollerance: 1000 # metersrotation_tollerance: 1000 # radians# CPU ParamsnumberOfCores: 4 # number of cores for mapping optimizationmappingProcessInterval: 0.15 # seconds, regulate mapping frequency# Surrounding mapsurroundingkeyframeAddingDistThreshold: 1.0 # meters, regulate keyframe adding thresholdsurroundingkeyframeAddingAngleThreshold: 0.2 # radians, regulate keyframe adding thresholdsurroundingKeyframeDensity: 2.0 # meters, downsample surrounding keyframe poses surroundingKeyframeSearchRadius: 50.0 # meters, within n meters scan-to-map optimization (when loop closure disabled)# Loop closureloopClosureEnableFlag: trueloopClosureFrequency: 1.0 # Hz, regulate loop closure constraint add frequencysurroundingKeyframeSize: 50 # submap size (when loop closure enabled)historyKeyframeSearchRadius: 15.0 # meters, key frame that is within n meters from current pose will be considerd for loop closurehistoryKeyframeSearchTimeDiff: 30.0 # seconds, key frame that is n seconds older will be considered for loop closurehistoryKeyframeSearchNum: 25 # number of hostory key frames will be fused into a submap for loop closurehistoryKeyframeFitnessScore: 0.3 # icp threshold, the smaller the better alignment# VisualizationglobalMapVisualizationSearchRadius: 1000.0 # meters, global map visualization radiusglobalMapVisualizationPoseDensity: 10.0 # meters, global map visualization keyframe densityglobalMapVisualizationLeafSize: 1.0 # meters, global map visualization cloud densityNavsat (convert GPS coordinates to Cartesian)
navsat:frequency: 50wait_for_datum: falsedelay: 0.0magnetic_declination_radians: 0yaw_offset: 0zero_altitude: truebroadcast_utm_transform: falsebroadcast_utm_transform_as_parent_frame: falsepublish_filtered_gps: falseEKF for Navsat
ekf_gps:publish_tf: falsemap_frame: mapodom_frame: odombase_link_frame: base_linkworld_frame: odomfrequency: 50two_d_mode: falsesensor_timeout: 0.01# -------------------------------------# External IMU:# -------------------------------------imu0: imu_correct# make sure the input is aligned with ROS REP105. "imu_correct" is manually transformed by myself. EKF can also transform the data using tf between your imu and base_linkimu0_config: [false, false, false,true, true, true,false, false, false,false, false, true,true, true, true]imu0_differential: falseimu0_queue_size: 50 imu0_remove_gravitational_acceleration: true# -------------------------------------# Odometry (From Navsat):# -------------------------------------odom0: odometry/gpsodom0_config: [true, true, true,false, false, false,false, false, false,false, false, false,false, false, false]odom0_differential: falseodom0_queue_size: 10# x y z r p y x_dot y_dot z_dot r_dot p_dot y_dot x_ddot y_ddot z_ddotprocess_noise_covariance: [ 1.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 1.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 10.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0.03, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0.03, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0.1, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0.25, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0.25, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0.04, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0.01, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.01, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.01, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.01, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.015]
解答
根據您的ROS Bag文件中的Topic信息,需要將YAML配置文件中的 LiDAR點云Topic 和 IMU Topic 與實際錄制的話題名稱對齊。以下是具體修改步驟:---**一、關鍵Topic配置修改**
**1. LiDAR點云Topic**
原始配置錯誤地將點云Topic定義為消息類型,需改為實際Topic名稱:
```yaml
lio_sam:# TopicspointCloudTopic: "/velodyne_points" # 修改前:"sensor_msgs/PointCloud2"# 或根據需求選擇多雷達:# pointCloudTopic: "/back/velodyne_points"
```**2. IMU Topic**
IMU Topic需匹配Bag文件中的實際名稱:
```yamlimuTopic: "/imu/data" # 修改前:"sensor_msgs/Imu"
```---**二、其他相關配置驗證**
**1. 傳感器類型與參數**
檢查LiDAR型號參數是否匹配(Velodyne/Ouster/Livox):
```yaml# Sensor Settingssensor: velodyne # 確保與使用的LiDAR型號一致N_SCAN: 16 # Velodyne 16線雷達配置Horizon_SCAN: 1800 # Velodyne的水平分辨率
```**2. 坐標系對齊**
驗證雷達與IMU的坐標系關系(若存在外參偏移需修改):
```yaml# Extrinsics: T_lb (lidar -> imu)extrinsicTrans: [0.0, 0.0, 0.0] # 若無偏移可保持默認extrinsicRot: [1, 0, 0,0, 1, 0,0, 0, 1] # 單位矩陣表示坐標系對齊
```**3. 導航衛星配置**
如果使用GPS數據,確保`navsat`部分Topic與Bag一致:
```yaml
navsat:# 若有GPS數據需配置對應Topic# odom0: "odometry/gps" # 取消注釋并驗證Topic名稱
```---**三、修改后完整配置示例**
```yaml
lio_sam:# TopicspointCloudTopic: "/velodyne_points" # 或 "/back/velodyne_points"imuTopic: "/imu/data"# FrameslidarFrame: "base_link"baselinkFrame: "base_link"odometryFrame: "odom"mapFrame: "map"# Sensor Settingssensor: velodyneN_SCAN: 16Horizon_SCAN: 1800downsampleRate: 1lidarMinRange: 1.0lidarMaxRange: 1000.0# IMU噪聲參數(根據傳感器標定結果填寫)imuAccNoise: 3.9939570888238808e-03imuGyrNoise: 1.5636343949698187e-03imuGravity: 9.80511
```---**四、驗證與調試**
1. 啟動LIO-SAM:```bashroslaunch lio_sam run.launch```2. 回放Bag文件:```bashrosbag play l1_cooperation_2023-12-21-15-44-16_velodyne.bag \--topics /velodyne_points /imu/data # 限定必要Topic```3. 檢查Topic連通性:```bashrostopic list | grep -E "velodyne_points|imu/data" # 確認Topic已發布```---**五、常見問題解決**
1. Topic未接收:? 使用`rostopic hz /velodyne_points`檢查發布頻率? 在`launch`文件中添加重映射:```xml<node pkg="lio_sam" type="lio_sam_imuPreintegration" name="imuPreintegration"><remap from="/imu/data" to="/your_custom_imu_topic"/></node>```2. 時間同步問題:```bashrosbag play --clock bag_file.bag # 啟用模擬時間```---通過以上配置,您的LIO-SAM將正確訂閱Bag文件中的傳感器數據。若需進一步優化建圖效果,可調整`mappingCornerLeafSize`等點云降采樣參數(參見原始配置第25-27行)。
問題2:
為什么修改之后運行重新打開一個終端,輸入roslaunch lio_sam run.launch和rosbag play 包在rviz里面沒有顯示呀,是需要添加什么話題嗎
---**原因分析與解決方案**
根據圖片中的 RViz報錯信息 和 終端日志,修改后運行未顯示數據的原因可能是以下幾點:---**1. 坐標系(TF)未正確發布**
圖片中的關鍵錯誤是 `Fixed Frame [map] does not exist`,說明ROS系統中未發布 `map` 坐標系,導致所有依賴該坐標系的顯示內容(點云、軌跡等)無法渲染。
原因:
? LIO-SAM的核心節點未正常啟動(如 `mapOptimization` 節點崩潰)。 ? YAML參數配置錯誤(如 `mapFrame` 與其他節點沖突)。 解決方案:
1. 檢查YAML配置:確保 `lio_sam` 部分的 `mapFrame` 和 `odometryFrame` 與其他節點(如 `ekf_gps`)的配置一致: ```yaml# lio_sam/config/params.yamllio_sam:mapFrame: "map" # 必須與其他節點的map_frame一致odometryFrame: "odom" # 必須與ekf_gps的odom_frame一致``````yaml# ekf_gps配置(若有)ekf_gps:map_frame: "map"odom_frame: "odom"base_link_frame: "base_link"```2. 驗證節點啟動狀態: ? 在終端日志中,確認 `lio_sam_mapOptmization` 節點是否啟動(如日志中出現 `[lio_sam_mapOptmization-4] process started`)。 ? 若節點崩潰,檢查 `mapOptmization.cpp` 的依賴項(如GTSAM版本、PCL配置)。---**2. 話題未正確訂閱**
RViz中未顯示點云或軌跡,可能是因為 話題名稱未匹配 或 數據未發布。
原因:
? YAML中的 `pointCloudTopic` 或 `imuTopic` 與Bag文件中的實際話題名稱不一致。 ? 數據未同步(如Bag文件播放時未指定時鐘)。 解決方案:
1. 修改YAML話題名稱: 根據Bag文件中的實際話題名稱調整參數: ```yaml# lio_sam/config/params.yamllio_sam:pointCloudTopic: "/velodyne_points" # 修改為Bag中的實際名稱imuTopic: "/imu/data" # 修改為Bag中的實際名稱```2. 指定時鐘同步播放Bag: ```bashrosbag play --clock your_data.bag # 啟用模擬時鐘```---**3. RViz顯示配置錯誤**
即使數據已發布,若RViz未正確配置顯示類型或話題,仍無法可視化。
解決方案:
1. 添加顯示插件: ? 在RViz中點擊 Add → By Topic → 選擇以下話題: ? PointCloud2:訂閱 `/lio_sam/mapping/cloud_registered` ? Path:訂閱 `/lio_sam/mapping/path` ? TF:勾選所有坐標系 ? 設置 Fixed Frame 為 `map`(若不存在則設為 `odom` 臨時測試)。2. 驗證話題存在性: ```bashrostopic list | grep -E "cloud_registered|path|imu|odom" # 確認關鍵話題已發布```---**4. 進程依賴沖突**
終端日志顯示 `robot_state_publisher` 和 `ekf_gps` 進程異常退出,可能是 節點依賴沖突 或 參數重復定義。
解決方案:
1. 關閉沖突節點: 在 `run.launch` 中注釋或刪除重復節點定義(如 `robot_state_publisher` 或 `ekf_gps`)。 ```xml<!-- 注釋沖突節點 --><!-- <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" /> -->```2. 檢查launch文件依賴: 確保所有節點依賴的包已安裝(如 `robot_state_publisher` 需安裝 `ros-noetic-robot-state-publisher`)。---**操作流程驗證**
1. 啟動LIO-SAM: ```bashsource devel/setup.bash # 確保環境生效roslaunch lio_sam run.launch```2. 播放數據包: ```bashrosbag play --clock your_data.bag --topics /velodyne_points /imu/data # 限定必要話題```3. RViz配置檢查: ? 打開RViz并加載LIO-SAM的默認配置(通常位于 `config/rviz.rviz`)。 ? 手動添加顯示插件并訂閱話題(見上文步驟)。---**常見問題排查**
? 終端無地圖輸出:檢查 `mapOptmization` 節點的日志,確認GTSAM優化是否收斂。 ? TF樹不完整:運行 `rosrun tf view_frames` 生成TF關系圖,驗證 `map → odom → base_link` 是否存在。 ? 數據延遲:調整Bag播放速率 `rosbag play -r 0.8`(降速80%)。通過以上步驟,可解決坐標系缺失和數據顯示問題。若仍無法解決,請提供完整終端日志和 `params.yaml` 文件進一步分析。
最后得到的三維點云圖像如下: