文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、三维激光SLAM总结
1.LOAM:Lidar Odometry and Mapping in Real-time
LOAM为清华自动化本科毕业的Zhang Ji博士在CMU读博期间,于2014年在RSS期刊发表的关于三维激光传感器的SLAM算法。
LOAM存在的问题:
- 没有回环检测;
- 计算时间复杂度较高,基于三维空间中的位姿进行优化;
- 户外可能受到各种噪声影响,例如树上摇晃的树叶,地上的杂草。而这些点未必会重复出现在前后两帧激光中。而错误的特征点将会影响位姿精度。
- LOAM需要提取平面点和边缘点,由于车体上下颠簸,竖直维度提取的平面点很容易造成误差。
2.LeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain .
Lego-LOAM是TiXiao Shan发表在IROS2018的文章,文章叫:可变地形下的轻量级和地面优化的雷达里程计与建图。
其是以LOAM为框架衍生出的新算法,主要在于两点提升:轻量级 和 地面优化。
Lego-LOAM的contribution:1.着重于解决一些非城市化道路或非平整道路上LOAM存在的问题。2.轻量化,改进算法,使其在TX2上也可以实时运行。
Lego-LOAM有一个显著的缺陷——依赖地面。
3.LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping
LIO-SAM是TixiaoShan在2020年IROS发表的Lego-LOAM续作。 实际上也是Lego-LOAM的扩展版本,添加了IMU预积分因子和GPS因子。
LOAM使用多传感器(三维激光、IMU、GPS)融合的方法,利用因子图优化,计算位姿;
特点:
-
Odometry 以IMU的frequency(要收到雷达里程计信息后才发出),这样前端频率更高;
-
IMU odometry提供初始估计值并做了预积分处理,同时IMU原始数据进行雷达进行运动补偿;
-
后端因子图优化包括四个因子,IMU预积分结合雷达里程计的帧间约束因子在预积分节点维护,其他三个在后端节点维护,分别是GPS因子、雷达里程计因子和回环检测因子。
-
紧耦合:IMU的零偏可以被估计,利用雷达里程计的帧间约束进行反馈,使IMU解算更加准确,提供更好的初值。
二、LIO-SAM算法安装
1.环境配和搭建
运行环境ubuntu18.04和ROS(melodic)
依赖1:下载GTSAM(也可以在github里面直接下载)
wget -O ~/Downloads/gtsam.zip https://github.com/borglab/gtsam/archive/4.0.2.zip
cd ~/Downloads/ && unzip gtsam.zip -d ~/Downloads/
cd ~/Downloads/gtsam-4.0.2/
mkdir build && cd build
cmake -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF ..
sudo make install -j4
安装过程若出现编译报错时,需将build文件删除,重新编译。
依赖2:下载Ceres(也可以在github里面直接下载)
sudo apt-get install -y libgoogle-glog-dev
sudo apt-get install -y libatlas-base-dev
wget -O ~/Downloads/ceres.zip https://github.com/ceres-solver/ceres-solver/archive/1.14.0.zip
cd ~/Downloads/ && unzip ceres.zip -d ~/Downloads/
cd ~/Downloads/ceres-solver-1.14.0
mkdir ceres-bin && cd ceres-bin
cmake ..
sudo make install -j4
2.lio-sam安装并运行
1. 下载源代码:(也可以在github里面直接下载)
cd ~/slam_ws/src
git clone https://ghproxy.com/https://github.com/TixiaoShan/LIO-SAM.git
cd ..
catkin_make
这里如果编译不通过,应该是环境配置问题,或者库版本问题
makdir -p ~/catkin_ws/src
cd ~/slam_ws
catkin_make
echo "source ~/slam_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
2. 进行lio-sam算法
LIO-SAM的作者提供了几个数据集进行测试,这里下载其中的walk数据集。作者提供地址是google云端硬盘,其下载速度感人,我这里只有十几kb/s,而这个数据集有3.7G。可以到我这里分享的百度网盘链接下载:https://pan.baidu.com/s/1cMc0EXhbiY2HWqkKlspzDg 提取码 gz7i
运行launch文件并播放数据包
roslaunch lio-sam run.launch
rosbag play ~/catkin_ws/src/data/casual_walk.bag
开始播放数据包后,rviz即可自动显示当前动态建图画面。
3. 保存pcd建图结果
首先,需要修改params.yaml中的参数。params.yaml在~/catkin_ws/src/LIO-SAM/config文件夹下。修改该文件中SavePCD:true 和保存地址。
然后,为了避免保存还没完成,ros就已经关闭了节点,需要设置_TIMEOUT_SIGINT的值。按如下命令打开文件:
sudo gedit /opt/ros/melodic/lib/python2.7/dist-packages/roslaunch/nodeprocess.py
在文件中找到_TIMEOUT_SIGINT,并设置为100秒。
这样,在命令窗口中按下Ctrl+C来结束run.launch的运行时,便会自动将pcd文件保存到指定地址。
最后打开最终点云地图
再次roslaunch lio-sam,等待bag跑完全程,系统会自动生成一个1210.pcd文件,这就是最终的点云地图。
pcl_viewer 1210.pcd
3.ALIOM安装及运行
- ALIOM安装
cd ~/slam_ws/src
git clone https://github.com/HKUST-Aerial-Robotics/A-LOAM.git
cd ..
catkin_make
source ~/.bashrc
-
使用NSH indoor outdoor数据集运行项目
nsh_indoor_outdoor.bag下载地址
链接: https://pan.baidu.com/s/1psN_qIht28uyyks5AVnhmA密码: tec7 -
使用Kitti数据集运行项目
Kitti数据下载路径(请将以下文件下载下来)
链接: https://pan.baidu.com/s/1ruXQ0pfifktpoU-Fr_x0QQ 密码: o2jl
只放入kitti数据集中的序列号为00的部分,包括
data_odometry_gray
data_odometry_poses
data_odometry_velodyne
全量数据集请自行下载 -
数据集目录结构(以下只放入序列为00的部分)
data_odometry
├── results(放入ground_truth即data_odometry_poses)
├── sequences(放入灰度图data_odometry_gray)
│…└── 00
│…├── image_0
│…└── image_1
└── velodyne(放入点云data_odometry_velodyne)
…└── sequences
… └── 00
… └── velodyne
-
修改kitti_helper.launch文件
以下为例,主要修改项为:
将dataset_folder修改为数据集目录位置
自行决定将to_bag是否修改为true,若为true则会打包生成数据集的bag文件
将output_bag_file修改为要输出的bag文件路径
<node name="kittiHelper" pkg="aloam_velodyne" type="kittiHelper" output="screen">
<param name="dataset_folder" type="string" value="/home/tony/tmp/data_odometry/" />
<param name="sequence_number" type="string" value="00" />
<param name="to_bag" type="bool" value="false" />
<param name="output_bag_file" type="string" value="/home/tony/tmp/kitti.bag" /> <!-- replace with your output folder -->
<param name="publish_delay" type="int" value="1" />
</node>
- ALIOM运行
#16线激光雷达
roslaunch aloam_velodyne aloam_velodyne_VLP_16.launch
rosbag play YOUR_DATASET_FOLDER/nsh_indoor_outdoor.bag
#64线激光雷达
roslaunch aloam_velodyne aloam_velodyne_HDL_64.launch
roslaunch aloam_velodyne kitti_helper.launch
4.解决编译报错的问题:
1.安装Ceres 出现Can’t find Google Log (glog). 需要安装glog,
https://github.com/google/glog/releases/tag/v0.4.0
先从Github下载源码,然后解压进入文件夹,命令行敲下:
mkdir build
cd build
cmake ..
sudo make install -j4
然后重新编译ceres,发现编译通过了。
2.编译LVI-SAM源码出现错误:GTSAM was built against a different version of Eigen.
因为GTSAM的eigen版本跟系统版本冲突了,需要修改GTSAM的eigen依赖库的版本,改为系统的eigen。
在CMakeLists.txt文件中if(GTSAM_USE_SYSTEM_EIGEN)
前面添加如下代码:
set(GTSAM_USE_SYSTEM_EIGEN ON)
,重新编译就可以了。