0. 說明
0.1 環(huán)境配置說明
環(huán)境配置: ubuntu18.04, ros1(ros-melodic)
注: 在ros1的kinetic, melodic, noetic(https://github.com/TixiaoShan/LIO-SAM/issues/206)上被測試過;
ros1的github代碼: https://github.com/TixiaoShan/LIO-SAM/tree/master
ros2的github代碼: https://github.com/TixiaoShan/LIO-SAM/tree/ros2
0.2 LIO-SAM
論文:LIO-SAM:Tightly-coupled Lidar Inertial Odometry vis Smoothing and Mapping
是一個 實時激光雷達慣性里程計(lidar-inertial odometry)包。
0.3 系統(tǒng)架構(gòu)
我們設(shè)計了一個系統(tǒng),該系統(tǒng)可以維護兩個圖形,并且運行速度比實時快 10 倍。(比實時快10倍,實時是指的是激光雷達的頻率嗎?)
"mapOptimization.cpp"中的因子圖 (the factor graph) 優(yōu)化了激光雷達里程計因子和 GPS 因子 (lidar odometry factor and GPS factor)。該因子圖在整個測試過程中始終保持不變。
"imuPreintegration.cpp"中的因子圖優(yōu)化了 IMU 和激光雷達里程計因子(IMU and lidar odometry factor)并估計了 IMU 偏差。該因子圖會定期重置,并保證在 IMU 頻率下的實時里程估計。
0.4 LIO-SAM youtube視頻演示:
https://www.youtube.com/watch?v=A0H8CoORZJU
視頻部分截圖如下:
Rotation Dataset:
Walking Dataset:
Park Dataset:
Campus Dataset:
Amsterdam Dataset:
stress test:
1. 編譯與運行
1.1 依賴
ROS相關(guān):
sudo apt-get install -y ros-melodic-navigation
sudo apt-get install -y ros-melodic-robot-localization
sudo apt-get install -y ros-melodic-robot-state-publisher
1.2 gstam
(先不要急著安裝)使用apt方法安裝方式如下:
sudo add-apt-repository ppa:borglab/gtsam-release-4.0
sudo apt install libgtsam-dev libgtsam-unstable-dev
之前用源碼編譯安裝的,如下,這次就先不安裝
https://blog.csdn.net/BIT_HXZ/article/details/127135551
1.2 安裝
cd ~/catkin_ws/src
git clone https://github.com/TixiaoShan/LIO-SAM.git
cd ..
catkin_make
1.3 運行
(1) launch文件:
roslaunch lio_sam run.launch
如果出現(xiàn)報錯:
[lio_sam_imuPreintegration-2] process has died [pid 1671, exit code 127, cmd /home/meng/subject/Lio_sam_ws/devel/lib/lio_sam/lio_sam_imuPreintegration __name:=lio_sam_imuPreintegration __log:=/home/meng/.ros/log/635269ee-46bc-11ed-a61b-1c697af31044/lio_sam_imuPreintegration-2.log].
[lio_sam_mapOptmization-5] process has died [pid 1672, exit code 127, cmd /home/meng/subject/Lio_sam_ws/devel/lib/lio_sam/lio_sam_mapOptmization __name:=lio_sam_mapOptmization __log:=/home/meng/.ros/log/635269ee-46bc-11ed-a61b-1c697af31044/lio_sam_mapOptmization-5.log].
缺少一些庫。它們已安裝但不可用,因為不在 LD_LIBRARY_PATH 環(huán)境變量中。所以將 /usr/local/lib 目錄添加到變量中解決了我的問題。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
(2) 播放數(shù)據(jù)包:
rosbag play your-bag.bag -r 3
2 lidar和imu數(shù)據(jù)準備
2.1 準備lidar數(shù)據(jù)
用戶需要準備正確格式的點云數(shù)據(jù)以進行點云校正(cloud deskewing),這主要在“imageProjection.cpp”中完成。
2.1.1 提供點云的時間戳
LIO-SAM 使用 IMU 數(shù)據(jù)執(zhí)行點云校正. 因此,需要知道掃描中的相對點時間(the relative point time), 最新的 Velodyne ROS 驅(qū)動程序應(yīng)直接輸出此信息。在這里,我們假設(shè)點時間通道被稱為"time"。點類型的定義位于"imageProjection.cpp"的頂部。"deskewPoint()"函數(shù)利用這個相對時間來獲得這個點相對于掃描開始(the beginning of the scan)的變換。當(dāng)激光雷達以 10Hz 旋轉(zhuǎn)時,一個點的時間戳應(yīng)該在 0 到 0.1 秒之間變化。
如果您使用其他激光雷達傳感器,您可能需要更改此時間通道的名稱,并確保它是掃描中的相對時間。
2.1.2 提供點所在環(huán)號(point ring number)
LIO-SAM 使用此信息在矩陣中正確組織點, 環(huán)號表示該點屬于傳感器的哪個通道。點類型的定義位于"imageProjection.cpp"的頂部, 最新的 Velodyne ROS 驅(qū)動程序應(yīng)直接輸出此信息。
同樣,如果您使用其他激光雷達傳感器,您可能需要重命名此信息。請注意,該軟件包目前僅支持機械激光雷達。
2.2 準備imu數(shù)據(jù)
(1)imu準備
與最初的 LOAM 實現(xiàn)一樣,LIO-SAM 僅適用于 9-axis IMU,它提供橫滾、俯仰和偏航估計(roll, pitch, and yaw estimation)。橫滾和俯仰估計主要用于將系統(tǒng)初始化為正確的姿態(tài)。當(dāng)使用 GPS 數(shù)據(jù)時,偏航估計將系統(tǒng)初始化在正確的航向。
從理論上講,像 VINS-Mono 這樣的初始化程序?qū)⑹?LIO-SAM 能夠與 6 軸 IMU 一起工作。系統(tǒng)的性能很大程度上取決于 IMU 測量的質(zhì)量。 IMU 數(shù)據(jù)速率越高,系統(tǒng)精度就越好。
我們使用 Microstrain 3DM-GX5-25,它以 500Hz 的頻率輸出數(shù)據(jù)。我們建議使用至少提供 200Hz 輸出速率的 IMU。注意,Ouster 激光雷達的內(nèi)部 IMU 是一個 6 軸 IMU。
(2)imu對齊alignment
LIO-SAM 將 IMU 原始數(shù)據(jù)從 IMU 幀轉(zhuǎn)換為 Lidar 幀,遵循 ROS REP-105[ROS坐標系] 法則(x - 向前,y - 左,z - 向上)。為了使系統(tǒng)正常運行,需要在"params.yaml"文件中提供正確的外部轉(zhuǎn)換(the correct extrinsic transformation)。之所以有兩個extrinsic(是extrinsicRot和extrinsicRPY嘛?),是因為我的IMU(Microstrain 3DM-GX5-25)加速度(acceleration)和姿態(tài)(attitude)坐標不同。取決于您的 IMU 制造商,您的 IMU 的兩個外在參數(shù)可能相同也可能不同。
以作者的設(shè)置為例:
==>>需要設(shè)置 x-z 加速度(x-z acceleration)和陀螺儀負值(gyro negative)的讀數(shù)來轉(zhuǎn)換激光雷達坐標系(the lidar frame)中的 IMU 數(shù)據(jù),這在 “params.yaml” 中由 “extrinsicRot” 表示。
==>>姿態(tài)讀數(shù)的轉(zhuǎn)變可能略有不同。 IMU的姿態(tài)測量q_wb
通常是指IMU坐標系中的點到世界坐標系(例如ENU)的旋轉(zhuǎn)。但是,該算法需要 q_wl
,即從激光雷達到世界的旋轉(zhuǎn)。所以我們需要從激光雷達到 IMU 的旋轉(zhuǎn) q_bl
,其中 q_wl = q_wb * q_bl
。為方便起見,用戶只需在"params.yaml"中提供q_lb
為"extrinsicRPY"(如果加速度和姿態(tài)坐標相同,則與"extrinsicRot"相同)。
(3)imu調(diào)試
強烈建議用戶取消注釋 “imageProjection.cpp” 的 “imuHandler()” 中的調(diào)試行并測試轉(zhuǎn)換后的 IMU 數(shù)據(jù)的輸出(會在終端打印輸出)。用戶可以旋轉(zhuǎn)傳感器套件以檢查讀數(shù)是否與傳感器的運動相對應(yīng)。可以在此處找到顯示更正 IMU 數(shù)據(jù)的 YouTube 視頻鏈接到 YouTube。
imu與雷達坐標系:
imu調(diào)試:
3 樣例數(shù)據(jù)集
下載鏈接:https://drive.google.com/drive/folders/1gJHwfdHCRdjP7vuT556pv8atqrCJPbUq
3.1 可使用默認設(shè)置運行的數(shù)據(jù)集
(1)數(shù)據(jù)集
步行數(shù)據(jù)集–walking dataset
公園數(shù)據(jù)集–Park dataset
花園數(shù)據(jù)集–Garden dataset
(2)公園數(shù)據(jù)集
公園數(shù)據(jù)集用于使用 GPS 數(shù)據(jù)測試 LIO-SAM。該數(shù)據(jù)集由 Yewei Huang(https://robustfieldautonomylab.github.io/people.html) 收集。
要啟用 GPS 功能,請將"params.yaml"中的"gpsTopic"更改為"odometry/gps"。在 Rviz 中,取消選中"地圖(云)“并選中"地圖(全局)”。還要檢查"Odom GPS",它可以可視化 GPS 里程計。
可以調(diào)整"gpsCovThreshold"以過濾不良 GPS 讀數(shù)。 “poseCovThreshold"可用于調(diào)整將 GPS 因子添加到圖形的頻率。例如,您會注意到 GPS 會不斷修正軌跡,因為您將"poseCovThreshold"設(shè)置為 1.0。由于 iSAM 的重度優(yōu)化(heavy optimization),建議播放速度為”-r 1"。
poseCovThreshold 保持為默認的25m^2時:
點云地圖:
poseCovThreshold 設(shè)置為1m^2,并顯示gps時:
3.2 需要配置參數(shù)的數(shù)據(jù)集
(1)旋轉(zhuǎn)數(shù)據(jù)集–Rotation dataset
(2)校園數(shù)據(jù)集(large)–Campus dataset (large)
(3)校園數(shù)據(jù)集(small)–Campus dataset (small)
在這些數(shù)據(jù)集中,點云主題是"points_raw"。 IMU 主題是"imu_correct",它給出了 ROS REP105 (ros的坐標系參考標準)標準中的 IMU 數(shù)據(jù)。由于此數(shù)據(jù)集不需要 IMU 轉(zhuǎn)換,因此需要更改以下配置才能成功運行此數(shù)據(jù)集:
==>>“config/params.yaml"中的"imuTopic"參數(shù)需要設(shè)置為"imu_correct”。 imuTopic: "imu_raw" # IMU data
==>>"config/params.yaml"中的"extrinsicRot"和"extrinsicRPY"需要設(shè)置為單位矩陣(identity matrices)。
# extrinsicRot: [1, 0, 0,
# 0, 1, 0,
# 0, 0, 1]
# extrinsicRPY: [1, 0, 0,
# 0, 1, 0,
# 0, 0, 1]
3.3 Ouster (OS1-128) 數(shù)據(jù)集–Rooftop dataset
(1)數(shù)據(jù)集描述
如果您使用默認設(shè)置,則無需更改此數(shù)據(jù)集的外部參數(shù)。請按照下面的 Ouster 說明配置包以使用 Ouster 數(shù)據(jù)運行??梢栽?YouTube 上找到該數(shù)據(jù)集的視頻:
(2)準備工作
硬件部分:
==>>使用外部 IMU。 LIO-SAM 不適用于 Ouster 激光雷達的內(nèi)部 6 軸 IMU。您需要將 9 軸 IMU 連接到激光雷達并執(zhí)行數(shù)據(jù)收集(data-gathering)。
==>>配置驅(qū)動程序。將 Ouster 啟動文件中的"timestamp_mode"更改為"TIME_FROM_PTP_1588",這樣您就可以為點云設(shè)置 ROS 格式的時間戳。
Config:
==>>將"params.yaml"中的"sensor"更改為"ouster"。
==>>根據(jù)您的激光雷達更改"params.yaml"中的"N_SCAN"和"Horizo??n_SCAN",即N_SCAN=128,Horizo??n_SCAN=1024。
注:Gen 1 和 Gen 2 Ouster:似乎不同版本的點坐標定義可能不同。請參閱問題 #94 進行調(diào)試。
(3)自己運行
一個終端:roslaunch lio_sam run.launch
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
另一個終端:rosbag play your-bag.bag
運行效果:
全局地圖:
(4)自我體會
可以清楚看出:數(shù)據(jù)集具有樓頂和地面兩個平面,屬于是多個平面了
3.4 Livox Horizon數(shù)據(jù)集–Livox Horizon
(1)說明:
請注意,固態(tài)激光雷達尚未經(jīng)過 LIO-SAM 的廣泛測試。這里也使用外部 IMU,而不是內(nèi)部 IMU。對此類激光雷達的支持基于對機械激光雷達代碼庫的最小更改。需要使用定制的 livox_ros_driver 來發(fā)布 LIO-SAM 可以處理的點云格式。
(2)配置
請更改以下參數(shù)以使 LIO-SAM 與 Livox Horizo??n 激光雷達一起工作:
sensor: livox
N_SCAN: 6
Horizon_SCAN: 4000
edgeFeatureMinValidNum: 1
(3)自己運行
全局(點云)地圖:
(4)自我體會
環(huán)境是不是選的不是很好?點云效果很亂
固態(tài)雷達不能和lio-sam很好地適應(yīng)?
3.5 KITTI 數(shù)據(jù)集–2011_09_30_drive_0028
(1)數(shù)據(jù)集描述
數(shù)據(jù)集包括的話題和話題頻率如下:
要使用其他 KITTI 原始數(shù)據(jù)生成更多包,您可以使用“config/doc/kitti2bag(之前的使用筆記:https://blog.csdn.net/BIT_HXZ/article/details/124319662)”中提供的 python 腳本。
(2)數(shù)據(jù)集外部參數(shù)修改
由于 LIO-SAM 需要高頻 IMU 才能正常運行,因此我們需要使用 KITTI 原始數(shù)據(jù)(kitti raw data)進行測試。一個尚未解決的問題是 IMU 的內(nèi)在特性是未知的,這對 LIO-SAM 的準確性有很大影響。下載提供的示例數(shù)據(jù)并在"params.yaml"中進行以下更改:
extrinsicTrans: [-8.086759e-01, 3.195559e-01, -7.997231e-01]
extrinsicRot: [9.999976e-01, 7.553071e-04, -2.035826e-03, -7.854027e-04, 9.998898e-01, -1.482298e-02, 2.024406e-03, 1.482454e-02, 9.998881e-01]
extrinsicRPY: [9.999976e-01, 7.553071e-04, -2.035826e-03, -7.854027e-04, 9.998898e-01, -1.482298e-02, 2.024406e-03, 1.482454e-02, 9.998881e-01]
N_SCAN: 64
downsampleRate: 2 or 4
loopClosureEnableFlag: true or false
(3)github參考建圖效果
github參考圖:
(4)自己運行
一個終端:roslaunch lio_sam run.launch
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
另一個終端:(注意不要帶上 -r 3,可能是因為kitti數(shù)據(jù)量比較大,帶上的話建圖會亂)rosbag play your-bag.bag
(5)自我體會
可以清楚看出:沒有濾除動態(tài)目標
4 其他說明
4.1 params.yaml
# Export settings
savePCD: true
savePCDDirectory: "/Downloads/LOAM/"
修改輸出參數(shù)為true會在:/Downloads/LOAM/文件夾下生成pcd文件:
終端輸入 pcl_viewer xx.pcd
即可查看
5. github 問題搬運
5.1 [lio_sam_mapOptmization-5] process has died
github 高贊回答:文章來源:http://www.zghlxwxcb.cn/news/detail-415329.html
Okay, I have solved the problem.
Initially, I upzip and move the gtsam folder into my src folder of my workspace. Which I follow the step
mkdir build && cd build
cmake -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF …
sudo make install -j8
I also compile LIO-SAM afterwards.
and I encounter mapoptimization crashing, which is due to gtsam as mentioned by @TixiaoShan in the Readme.
So I rm gtsam from my workspace, put it inside my root folder instead and run
mkdir build && cd build
cmake -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF …
sudo make install -j8
at there.
The problem was resolved.文章來源地址http://www.zghlxwxcb.cn/news/detail-415329.html
到了這里,關(guān)于LIO-SAM學(xué)習(xí)與運行測試數(shù)據(jù)集的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!