目录
1、 LIO-SAM 安装
1.1 安装依赖
安装 ROS 依赖
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
浏览器中复制下方网址下载 gtstam
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 -j8
1.2 下载源码并编译
创建新的工作空间
makdir -p ~/lio_sam_ws/src
cd ~/catkin_ws
catkin_make
sudo gedit ~/.bashrc
将下列代码写进打开的文件,保证每次打开终端都能刷新新工作空间的环境变量
source ~/lio_sam_ws/devel/setup.bash
在工作空间下克隆 Lio-sam 工程,编译
cd ~/lio_sam_ws/src
git clone https://ghproxy.com/https://github.com/TixiaoShan/LIO-SAM.git
cd ..
catkin_make
编译成功界面如下
2、lidar-align 安装
lidar_align基本原理:
1、读取rosbag的数据,通过时间戳匹配LiDAR每帧里面的每个点和IMU的坐标变换
2、通过上面的变换矩阵将利用位姿信息将LiDAR的每帧拼接成点云,迭代优化坐标变换使得距离最小。
2.1 下载源码编译
lidar-align 是苏黎世理工大学开源的一种标定里程计与雷达的算法,经改动后也可以对IMU和雷达进行联合标定,其 github 链接为 lidar_align ,改动后的链接为 lidar_align_wwtx ,建议直接下载改动后的链接,将代码放进工作空间 ~/lio_sam_ws/src
cd ~/lio_sam_ws
catkin_make
直接编译会出现依赖报错的情况
2.2 解决 nlopt 报错
下载依赖 nlopt
sudo apt-get install ros-melodic-nlopt
同时也安装了另一种方式的依赖
sudo apt-get install libnlopt-dev
将 ~/lio_sam_ws/src/lidar_align_wwtx-main/NLOPTConfig.cmake 文件移动到 ~/lio_sam_ws/src下,并进行第二次编译
catkin_make
2.3 解决定义冲突报错
第二次编译依旧会报错,这属于是定义冲突问题
运行以下指令,处理定义冲突问题
//依次运行以下指令
sudo mv /usr/include/flann/ext/lz4.h /usr/include/flann/ext/lz4.h.bak
sudo mv /usr/include/flann/ext/lz4hc.h /usr/include/flann/ext/lz4.h.bak
sudo ln -s /usr/include/lz4.h /usr/include/flann/ext/lz4.h
sudo ln -s /usr/include/lz4hc.h /usr/include/flann/ext/lz4hc.h
重新编译
catkin_make
编译成功
3、安装 rs_to_velodyne 转化节点
LIO-SAM 作者对激光雷达的数据格式有要求,考虑到与 IMU 时间同步问题,源码中会检查激光雷达的ring通道和时间戳是否符合要求,即对数据格式要求为 XYZIRT(- x, y, z, intensity, ring, timestamp)格式,这种格式就包含了ring通道和timestamp时间戳数据,速腾新款驱动支持两种激光雷达点云格式,即 XYZI (x, y, z, intensity)格式和 XYZIRT(- x, y, z, intensity, ring, timestamp)格式
因此需要把 rslidar_sdk 中的数据输出格式改为 XYZIRT 格式,修改 CMakeLists.txt 中的内容,将输出格式改为 XYZIRT
(此处缺一张图)
但是运行 LIO-SAM 的时候,直接使用速腾输出的 XYZIRT 格式的点云仍然会保存,是因为速腾的 RS16 雷达输出中包含了部分 Nan 的点,需要做剔除。为了方便起见,可以直接使用 rs_to_velodyne 转化节点,直接把 robosense XYZIRT 转成 velodyne XYZIRT 即可
3.1 下载源码编译
打开之前安装速腾雷达驱动的工作空间 ~/rslidar/src,下载转化节点,可以使用 git clone,也可以直接网页下载 rs_to_velodyne,下载后退到上一级空间编译
git clone https://github.com/HViktorTsoi/rs_to_velodyne.git
cd ..
catkin_make
编译成功
3.2 建立 launch 文件
在与 src 并列的位置新建 launch 文件夹,在 launch 文件夹内新建 rs2velodyne.launch 文件用来启动节点
cd ~/rslidar_ws/src/rs_to_velodyne-master/launch
touch rs2velodyne.launch
并在 launch 内写入
<launch>
<node pkg="rs_to_velodyne" name="rs_to_velodyne" type="rs_to_velodyne" args="XYZIRT XYZIRT" output="screen">
</node>
</launch>
注意 args 参数,采集 XYZIRT 格式的点输入 XYZIRT,采集 XYZI 格式的点输入 XYZI
可先启动 launch 文件测试一下
roslaunch rs_to_velodyne rs2velodyne.launch
看到 Listening to /rslidar_points … 就说明可以了
3.3 将节点写进驱动运行文件
以上步骤无误后打开 src/rslidar_sdk/launch/start.launch ( SDK 驱动的 launch 文件),添加以下语句,将转化节点随激光雷达驱动一起启动
<!--- rs_to_velodyne -->
<include file="$(find rs_to_velodyne)/launch/rs2velodyne.launch" />
添加节点以后,电脑连接激光雷达,启动激光雷达驱动的 launch 文件
roscore
roslaunch rslidar_sdk start.launch
输入代码查看节点是否运行
rostopic list
3.4 解决 intensity 警告
以上运行结果可以看出来虽然可以正常输出点云,但是终端会输出 intensity 的警告,出现这个警告的原因,大概率是因为 rs_to_velodyne功能包中定义的点云数据结构中的 intensity 出现了不一致的原因。首先,这个包希望接收的 rslidar 点云的数据格式中的 intensity 是 uint8_t 类型的,但是它转换之后的 velodyne 点云的数据格式中的 intensity 是通过一个宏定义来定义的,看到这里,答案已经很明确了,就是因为这里使用的 intensity 是 float 类型的,导致了两种数据格式不匹配,所以才出现了我们一开始报的那个 ``warming`
把 rslidar 的点云格式中的 uint8_t intensity; 使用PCL_ADD_INTENSITY; 替换,并将POINT_CLOUD_REGISTER_POINT_STRUCT 中 intensity 的数据类型也改成 float 即可
修改完成之后,重新编译一次,我们运行再看看是否还有那个警告,警告消失了,但依旧存在以下问题,这个问题不知道咋解决,不影响点云显示,看网友评论速腾工程师说这个并不影响结果,不是报错,就先不解决,先放着
4、 Lidar-IMU外参标定
开始标定,使用轮趣小车,robosense helios 16p 激光雷达,N10 mini IMU,寻找一个室内场景录制1-2分钟不超过2G大的 bag 包
4.1 数据采集
启动小车
roscore
roslaunch turn_on_wheeltec_robot turn_on_wheeltec_robot.launch
启动雷达
roslaunch rslidar_sdk start.launch
启动IMU
roslaunch fdilink_ahrs ahrs_data.launch
使用 rosbag 录制标定数据集
rosbag record -O lidarimu.bag /velodyne_points /imu
保险起见录制了5个数据集,均不超过 2G 大小
4.2 使用 lidar_align 标定
使用录制的数据集跑标定算法,打开 lidar_align.launch 文件,修改 bag 包的地址,如下图第四行,将 “/home/nuc/自己录制的数据集/ lidarimu.bag”写进去
重新打开一个终端,运行程序
roslaunch lidar_align lidar_align.launch
运行过程图如下所示
标定完成
可以看到在程序结束后并没有退出终端,所以在 launch 文件中的 node 节点中添加 required=“true”,如果 node 标记为 required ,这个 node 结束时,会结束整个 launch 启动的所有 node
5、IMU的内参标定
IMU内参是一项非常重要的参数,建图的时候各种跑飞基本是这一项误差未标定的原因。笔者使用的标定工具是港科大的一个标定工具imu_utils,使用Allan方差来标定高斯白噪声和随机游走噪声(即零偏Bias)。有了这一项参数即可准备开始建图了。
5.1 安装依赖
sudo apt-get install libdw-dev
5.2 下载 imu_utils 和 code_utils
imu_utils下载地址为:https://github.com/gaowenliang/imu_utils
code_utils下载地址为: https://github.com/gaowenliang/code_utils
在编译之前我们先注意三个问题,避免入坑
(1)全局安装 ceres 库,code_imu 依赖 ceres
(2)不要同时把 imu_utils 和 code_utils 一起放到 src 下进行编译
由于imu_utils 依赖 code_utils,所以先把 code_utils 放在工作空间的 src 下面,进行编译。然后再将 imu_utils 放到 src 下面,再编译
5.3 编译
先解压 code_utils 编译,编译时会遇到头文件报错
catkin_make
解决办法:修改~/imuCali_ws/src/code_utils/src/sumpixel_test.hpp文件中的头文件为:
#include "code_utils/backward.hpp"
之后重新编译即可编译成功,此时解压 imu_utils,再重新编译即可编译成功
5.4 录制 imu.bag
让 imu 静止不动两个小时,录制 imu 的bag.,开启 imu
roslaunch fdilink_ahrs ahrs_data.launch
查看运行的节点,可以看到 imu 的节点已经运行了
rostopic list
启动十分钟后开始录制 imu 数据集,在准备保存数据集的文件夹下打开终端
rosbag record -O imu.bag /imu
两个小时后 CTRL+C 结束录制
5.5 标定
打开 imu_utils 下面有一堆 launch 文件,将 A3.launch 复制并重命名为 test.launch,打开,将下面的 value 换成你自己的 IMU 数据 topic,下面的120是读取数据时间长度,录了俩小时就写120。之后开始标定
roscore
roslaunch imu_utils test.launch
//以两百倍速播放IMU数据包
rosbag play -r200 imu.bag
终端接收到数据是没有反应的,结束时才会显示标定结果。同时在data文件夹下会生成一堆文件我们需要的是图中选中的
%YAML:1.0
---
type: IMU
name: A3
Gyr:
unit: " rad/s"
avg-axis:
gyr_n: 7.2335662478452336e-04
gyr_w: 2.5839245379852482e-05
x-axis:
gyr_n: 7.1439149985839186e-04
gyr_w: 1.1065778084095001e-05
y-axis:
gyr_n: 9.9490070066998271e-04
gyr_w: 5.5351755000790449e-05
z-axis:
gyr_n: 4.6077767382519551e-04
gyr_w: 1.1100203054671986e-05
Acc:
unit: " m/s^2"
avg-axis:
acc_n: 1.1880020152589913e-02
acc_w: 2.4785727564746469e-04
x-axis:
acc_n: 1.6381922962635669e-02
acc_w: 2.5041696441884117e-04
y-axis:
acc_n: 9.6692762380288406e-03
acc_w: 2.3425782678078804e-04
z-axis:
acc_n: 9.5888612571052335e-03
acc_w: 2.5889703574276493e-04
6、 实际环境 LIO-SAM 建图
嘤嘤嘤,终于到这一步了,天不负我!!!!
6.1 实际环境地图数据采集
启动小车
roscore
roslaunch turn_on_wheeltec_robot turn_on_wheeltec_robot.launch
启动键盘控制
roslaunch wheeltec_robot_rc keyboard_teleop.launch
启动雷达
roslaunch rslidar_sdk start.launch
启动 IMU
roslaunch fdilink_ahrs ahrs_data.launch
使用 rosbag 录制标定数据集
rosbag record -O dalou.bag /velodyne_points /imu
6.2 修改 LIO-SAM 配置参数
打开 config 文件夹下 params.yaml 文件,最好是 copy 一份源文件保存下来)
修改雷达和 imu 的话题,pointCloudTopic 改为自己的雷达话题名称,imuTopic 修改为自己的 imu 话题名称
修改 imu 内参,内参数据参考上述步骤中内参标定文件,其对应关系为(均为avg-axis下数据)
// Acc误差模型高斯白噪声
imuAccNoise<---------->acc_n
// Gyro误差模型高斯白噪声
imuGyrNoise<----------> gyr_n
// Acc误差模型随机游走噪声
imuAccBiasN<---------->acc_w
// Gyro误差模型随机游走噪声
imuGyrBiasN<----------> gyr_w
修改 Lidar–>IMU 外参,打开标定好激光雷达和IMU外参的 txt 文件找到以下参数
将上述方框标注的参数对应写到下方配置文件中
其他参数最好是不要改动,修改完保存。最好是在编译一下,没有错误之后可运行 launch 文件启动,进行播包。(另外默认是不会保存 pcd 文件的,可以自己修改一下,但是每次运行都要修改路径,否则会覆盖掉上次的文件。)
6.3 实际数据集跑 LIO-SAM
关闭所有终端,新开终端开始运行数据集
roscore
roslaunch lio_sam run.launch
在保存数据集的文件夹打开终端,播放数据集、
rosbag play ladirimut.bag
解决 libmetis.so 报错,如果运行时出现以下报错,是因为运行时需要用到 libmetis-gtsam.so 这个动态库,libmetis-gtsam.so 这个文件位于路径“/usr/local/lib” 中,而程序默认找的位置是路径“/usr/lib”,所以没有找到,把文件复制过去就行
sudo cp /usr/local/lib/libmetis.so /usr/lib
报错这种,属于是第一步依赖没有装,滚回去第一步装依赖!!!
最终运行结果如下所示
虽然结果没有很精确,但是这组标定参数能够完整建出一张图,没有飘的很离谱,那就说明可用,是一只能抓耗子的猫!!!时间紧任务重,就这么着了,还要什么自行车!!!!!
最终比较好的结果
保存 pcd 地图,修改 /config/params.yaml 文件,将 savePCD 后面 false 改为 true,在双引号中写清楚保存地址,注意不用写 /home/gongmeifang 最后保存的时候会在你写的地址前主动加上这俩,写了的话保存就会出错,修改完编译
在 rviz 中建图过程结束了之后,终端 ctrl+c 就能保存地图
查看 pcd 点云图
pcl_viewer GlobalMap.pcd
天不负我!!!!!!
参考
激光雷达和IMU联合标定并运行LIOSAM_imu和雷达联合标定后怎么使用_岁暮&C的博客-CSDN博客
Ubuntu18.04 安装速腾聚创最新驱动RSLidar_SDK采集XYZIRT格式的激光点云数据 --SLAM不学无术小问题_^oprater^的博客-CSDN博客
Ubuntu18 安装ROS节点解决----速腾聚创雷达点云格式转换为Velodyne雷达点云格式 --SLAM不学无术小问题_^oprater^的博客-CSDN博客
使用lidar_align标定lidar与imu_imu怎么录制数据_zhhao1326的博客-CSDN博客
用imu_utils标定IMU,之后用于kalibr中相机和IMU的联合标定_imu_untils的作者_一ping就通的博客-CSDN博客
lio-sam运行并保存地图_lio-sam怎么保存建图_等下完这场yu的博客-CSDN博客