参考的其他博主的文章:
记录自己部署LIO-SAM时的问题及解决_liosam部署-CSDN博客https://blog.csdn.net/A_flyup/article/details/136525009
我的环境:vmware安装ubuntu18.04、ROS melodic(鱼香肉丝安装)
gtsam源码及库文件下载:
https://github.com/borglab/gtsam/archive/4.0.2.zip
不知道为什么我在ubuntu中打不开这个文档,但是在windows下可以下载,于是我用共享文件夹传输到了ubuntu系统中,共享文件夹参考:VMware虚拟机-Ubuntu设置共享文件夹(超详细)_vmware ubuntu共享文件夹-CSDN博客
lio-sam源码下载:
TixiaoShan/LIO-SAM: LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping
lio-sam算法部署测试详细步骤
1、安装编译gtsam库
mkdir ~/Downloads
cd ~/Downloads/gtsam-4.0.2/
mkdir build && cd build
cmake -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF ..
sudo make install -j4
在这段命令中,cmake -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF ..
这一行的作用是在编译 GTSAM(Georgia Tech Smoothing and Mapping library)库时,通过 CMake 配置一个特定的编译选项。
让我们分解这个命令:
-
cmake
:是跨平台的自动化构建系统,用于管理编译过程。 -
-DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF
:这是一个编译选项,用于设置 CMake 变量GTSAM_BUILD_WITH_MARCH_NATIVE
的值。-D
选项指定了一个变量的定义,格式为-D<variable>=<value>
。-
GTSAM_BUILD_WITH_MARCH_NATIVE
:这是一个 CMake 变量,用于控制编译器优化选项。 -
OFF
:表示关闭该选项,即不使用编译器的-march=native
优化选项。
-
-
..
:这是相对路径,指向上一级目录,即 GTSAM 源代码的根目录。
2、下载lio-sam源码
3、编译lio-sam
安装编译LIO-SAM成功:
4、运行lio-sam:
创建工作工作空间、src文件夹,放好源码
mkdir -p ~/catkin_lio_ws/src
cd ~/catkin_lio_ws/src
把下载的源码解压后放在src文件夹中
cd ..
catkin_make
运行:
source devel/setup.bash
roslaunch lio_sam run.launch
5、下载数据集播放并测试:(使用rosbag play指令)
LIO-SAM Public Dataset - Google 云端硬盘
出现条纹状激光雷达数据:
可以看到上面的界面没有建图,而且坐标系乱飞,一般这种情况就需要配置/src/config/param.yaml文件中的imu2lidar外参
6、配置/src/config/param.yaml文件中的imu2lidar外参
我最后用的是源代码作者公开的自己用的测试数据集:KIITI数据集
并且给出了外参矩阵:
最终配置好外参之后,可以看到建图效果还是不错的:
看到比较清晰的建图就说明算法部署成功了。
问题记录:
1、编译安装gtsam库显示失败:
报错显示:
c++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-7/README.Bugs> for instructions.
examples/CMakeFiles/ISAM2_SmartFactorStereo_IMU.dir/build.make:62: recipe for target 'examples/CMakeFiles/ISAM2_SmartFactorStereo_IMU.dir/ISAM2_SmartFactorStereo_IMU.cpp.o' failed
make[2]: *** [examples/CMakeFiles/ISAM2_SmartFactorStereo_IMU.dir/ISAM2_SmartFactorStereo_IMU.cpp.o] Error 4
CMakeFiles/Makefile2:21896: recipe for target 'examples/CMakeFiles/ISAM2_SmartFactorStereo_IMU.dir/all' failed
make[1]: *** [examples/CMakeFiles/ISAM2_SmartFactorStereo_IMU.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
[ 82%] Linking CXX executable RangeISAMExample_plaza2
[ 82%] Built target RangeISAMExample_plaza2
[ 82%] Linking CXX executable Pose2SLAMExample_lago
[ 82%] Built target Pose2SLAMExample_lago
[ 82%] Linking CXX executable SFMExampleExpressions
[ 82%] Built target SFMExampleExpressions
[ 82%] Linking CXX executable ISAM2Example_SmartFactor
[ 82%] Built target ISAM2Example_SmartFactor
[ 82%] Linking CXX executable SFMExampleExpressions_bal
[ 82%] Built target SFMExampleExpressions_bal
[ 82%] Linking CXX executable SFMExample_SmartFactor
[ 82%] Built target SFMExample_SmartFactor
[ 82%] Linking CXX executable SFMExample_SmartFactorPCG
[ 82%] Built target SFMExample_SmartFactorPCG
Makefile:162: recipe for target 'all' failed
make: *** [all] Error 2
错误原因:编译过程中出现了 “internal compiler error: Killed (program cc1plus)”,这通常是由于系统资源不足(尤其是内存不足)导致编译器进程被系统杀死。
解决方法:减少编译安装的时候的线程数,将参数-j8修改为-j4或者使用默认参数(单线程编译)
cd ~/Downloads/gtsam-4.0.2/build
make clean
cmake -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF ..
sudo make install -j4 # 或者直接 make install
验证gtsam是否成功安装:编写测试文档测试(写一个test-gtsam.cpp)并且编译
#include <gtsam/geometry/Pose2.h>
#include <iostream>
int main() {
// 创建一个 Pose2 对象
gtsam::Pose2 pose(1.0, 2.0, 0.5);
// 检查是否成功创建对象
if (pose.x() == 1.0 && pose.y() == 2.0 && pose.theta() == 0.5) {
std::cout << "GTSAM is successfully installed and working!" << std::endl;
} else {
std::cout << "Something went wrong with GTSAM installation." << std::endl;
}
return 0;
}
2、lio_sam_imuPreintegration-2以及-5报错;
[lio_sam_imuPreintegration-2] process has died [pid 1671, exit code 127, cmd /home/shuai/subject/catkin_lio_ws/devel/lib/lio_sam/lio_sam_imuPreintegration __name:=lio_sam_imuPreintegration __log:=/home/shuai/.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/shuai/subject/catkin_lio_ws/devel/lib/lio_sam/lio_sam_mapOptmization __name:=lio_sam_mapOptmization __log:=/home/shuai/.ros/log/635269ee-46bc-11ed-a61b-1c697af31044/lio_sam_mapOptmization-5.log].
解决方案:重新移动库文件位置即可:
cd /usr/local/lib/
sudo cp libmetis.so /opt/ros/melodic/lib/ # 注意这里melodic要根据你自己的ros版本调整
3、robot_localization
库文件未安装:
问题原因:未安装robot_localization
解决方案:
sudo apt update
sudo apt install ros-melodic-robot-localization # 注意这里melodic要根据你自己的ros版本调整
4、lio-sam播放测试数据集的时候rviz界面中没有画面显示:(我使用的是rotation数据集)
错误分析原因:坐标系设置错误,以及话题是否对应检查
4.1坐标系设置:
左边点击option更换fix_frame,reference_frame的坐标系(我是从map换到了imu_lilnk),然后左边错误清除了:(下图的baselink会报错,不建议使用,经过测试只有imu_link可以不报错)
4.2话题对应:
(1)先使用rosbag
工具查看.bag
文件中包含的话题名称。可以通过以下命令实现:
rosbag info your_file.bag
将your_file.bag
替换为你的数据包文件名。该命令会输出该.bag
文件的详细信息,包括其中包含的话题名称及其消息数量。
(2)点开config文件夹下的yaml文件检查topic话题与rosbag info中的话题是否对应,我下载的源代码就跟数据集不对应,如图左边播放的测试数据集是imu_correct,右边配置文件中订阅的是imu_raw。解决方案就是把配置文件中的imu_raw修改为imu_correct(与播放的测试数据集发布话题名称相对应)
PS.修改配置文件之前最好有个备份
4.3rviz中订阅点云话题:
完成4.1、4.2两步之后有图像,但是还是没有点云,需要手动定于点云话题,点击左下角的add按钮。
订阅之后,先播放测试数据集,接着订阅原始点云话题,当画面中出现条纹状的激光雷达点云时,证明能收到消息。
5、tony@tony-virtual-machine:~/catkin_lio_ws$ source ./devel/setup.bash tony@tony-virtual-machine:~/catkin_lio_ws$ roslaunch lio-sam run.launch RLException: [run.launch] is neither a launch file in package [lio-sam] nor is [lio-sam] a launch file name The traceback for the exception was written to the log file
问题:无法找到安装包
解决方案:重新编译,进入到src下的launch文件夹去启动
cd ~/catkin_lio_ws
catkin_make
source devel/setup.bash
6、建图的时候点云地图乱晃乱闪乱飞
原因分析:重新看了一遍别人的部署教程,发现lio-sam的外参没有配置,需要配置传感器的外参。
配置外参的重要性:在 LIO-SAM 和 LVI-SAM 算法中,外参是指不同传感器(如 IMU 和 LiDAR)之间的坐标系变换关系。这些参数对于算法的正确运行至关重要,因为它们决定了传感器数据如何在同一个坐标系下进行融合。
解决方法:
6.1:网上寻找比较大型的开源数据集,并且详细阅读其readme文件,查看是否有给出传感器外参,寻找合适的数据集下载。我寻找的是m2dgr数据集:
M2DGR/README.md at main · SJTU-ViSYS/M2DGRhttps://github.com/SJTU-ViSYS/M2DGR/blob/main/README.md找到了作者已经标定好的文件calibration.txt:
根据calibration文件修改lio-sam代码config文件夹下的yaml文件:
需要修改话题名称、imu参数、lidar2imu外参
// Acc误差模型高斯白噪声
imuAccNoise<---------->acc_n = 3.7686306102624571e-02
// Gyro误差模型高斯白噪声
imuGyrNoise<----------> gyr_n =2.3417543020438883e-03
// Acc误差模型随机游走噪声
imuAccBiasN<---------->acc_w =1.1416642385952368e-03
// Gyro误差模型随机游走噪声
imuGyrBiasN<----------> gyr_w =1.4428407712885209e-05
extrinsics: T_lb(lidar -> imu)
extrinsicsTrans: [0.27255, -0.00053, 0.17954]
extrinsicsRot: [
1.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 0.0, 1.0
]
三个矩阵的具体含义:
extrinsicTrans
表示 LIDAR 坐标系的原点在 IMU 坐标系下的坐标值。它是一个 3×1 的向量,用于描述两个传感器之间的空间位置偏移
extrinsicRot
是一个 3×3 的旋转矩阵,用于将 IMU 坐标系下的测量值(如加速度和角速度)转换到 LIDAR 坐标系。它定义了 IMU 和 LIDAR 之间的旋转关系
extrinsicRPY
也是一个 3×3 的旋转矩阵,用于将 IMU 的姿态信息(如欧拉角或四元数)转换到 LIDAR 坐标系。它通常用于处理 IMU 的九轴数据(包括磁力计),尤其是当 IMU 的姿态定义与 LIDAR 不一致时。
报错1:yaml语法错误
解决方法:yaml文件缩进敏感,需要严格检查语法
报错2:
lio_sam_imuPreintegration-2] restaring process
process[lio_sam_imuPreintegration-2]: started with pid [36402]
[lio_sam_mapOptmization-5] restarting process
process[lio_sam_mapOptmization-5]: started with pid [36403]
[lio_sam_imageProjection-3] process has died [pid 36388, exit code -11, cmd /home/tony/catkin_lio_ws/devel/lib/lio_sam/lio_sam_imageProjection __name:=lio_sam_imageProjection __log:=/home/tony/.ros/log/ed990f94-f435-11ef-b319-000c293dfd36/lio_sam_imageProjection-3.log].
log file: /home/tony/.ros/log/ed990f94-f435-11ef-b319-000c293dfd36/lio_sam_imageProjection-3*.log
[lio_sam_featureExtraction-4] process has died [pid 36389, exit code -11, cmd /home/tony/catkin_lio_ws/devel/lib/lio_sam/lio_sam_featureExtraction __name:=lio_sam_featureExtraction __log:=/home/tony/.ros/log/ed990f94-f435-11ef-b319-000c293dfd36/lio_sam_featureExtraction-4.log].
log file: /home/tony/.ros/log/ed990f94-f435-11ef-b319-000c293dfd36/lio_sam_featureExtraction-4*.log
可能原因分析:
(1)内存不足,明天把代码部署到服务器测试一下
服务器端可以播放
报错6(建图乱飞)的解决以及总结:
建图乱飞很大可能就是yaml文件中的imu2lidar外参矩阵没有配置好,或者数据集没有与其采集数据的时候用的imu的外参相对应上。建议在寻找测试用的数据集的时候最好找公开了数据集使用的imu外参的数据集。
我最后就是用的lio-sam源代码作者公开的测试数据集,因为这个数据集公开了imu2lidar的外参矩阵,直接写入配置文件即可(配置文件的位置在上面:安装步骤-6里面有写)。
7、ros报错 Resource not found: lio_sam
Resource not found: lio_sam
ROS path [0]=/opt/ros/noetic/share/ros
ROS path [1]=/opt/ros/noetic/share
The traceback for the exception was written to the log file
解决方法:在同一个mobaxterm窗口下source devel下的setup.bash文件(不能开两个mobaxterm seccsion来操作)并在这个窗口启动roslaunch