?专栏系列文章如下:
一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN博客
二.激光SLAM框架学习之A-LOAM框架---介绍及其演示_goldqiu的博客-CSDN博客
三.激光SLAM框架学习之A-LOAM框架---项目工程代码介绍---1.项目文件介绍(除主要源码部分)_goldqiu的博客-CSDN博客
四.激光SLAM框架学习之A-LOAM框架---项目工程代码介绍---2.scanRegistration.cpp--前端雷达处理和特征提取_goldqiu的博客-CSDN博客
五.激光SLAM框架学习之A-LOAM框架---项目工程代码介绍---3.laserOdometry.cpp--前端雷达里程计和位姿粗估计_goldqiu的博客-CSDN博客
六.激光SLAM框架学习之A-LOAM框架---项目工程代码介绍---4.laserMapping.cpp--后端建图和帧位姿精估计(优化)_goldqiu的博客-CSDN博客
七.激光SLAM框架学习之A-LOAM框架---速腾Robosense-16线雷达室内建图_goldqiu的博客-CSDN博客
八.激光SLAM框架学习之LeGO-LOAM框架---框架介绍和运行演示_goldqiu的博客-CSDN博客
九.激光SLAM框架学习之LeGO-LOAM框架---速腾Robosense-16线雷达室外建图和其他框架对比、录包和保存数据_goldqiu的博客-CSDN博客
十.激光SLAM框架学习之LeGO-LOAM框架---算法原理和改进、项目工程代码_goldqiu的博客-CSDN博客
十一.激光惯导LIO-SLAM框架学习之LIO-SAM框架---框架介绍和运行演示
十二.激光SLAM框架学习之livox-loam框架安装和跑数据集_goldqiu的博客-CSDN博客_livox 数据集
十三.激光SLAM框架学习之livox-Mid-70雷达使用和实时室外跑框架_goldqiu的博客-CSDN博客
十四.激光和惯导LIO-SLAM框架学习之惯导内参标定_goldqiu的博客-CSDN博客
十五.激光和惯导LIO-SLAM框架学习之惯导与雷达外参标定(1)_goldqiu的博客-CSDN博客
十六.激光和惯导LIO-SLAM框架学习之配置自用传感器实时室外跑LIO-SAM框架_goldqiu的博客-CSDN博客
十七.激光和惯导LIO-SLAM框架学习之IMU和IMU预积分_goldqiu的博客-CSDN博客
十八.多个SLAM框架(A-LOAM、Lego-loam、LIO-SAM、livox-loam)室外测试效果粗略对比分析_goldqiu的博客-CSDN博客
代码框架
lio-sam:.
│ CMakeLists.txt #项目工程配置文件,可以知道作者用了哪些第三方库
│ LICENSE #软件版权
│ package.xml #ROS包配置文件
│ README.md #项目工程说明文件:文件构成、依赖、运行等
│
├─config
│ │ params.yaml #参数文件
│ │
│ └─doc #存储效果图、流程图、论文等
│ │
│ └─kitti2bag #将kitti数据集转换成bag格式
│ kitti2bag.py
│ README.md
│
├─include
│ utility.h #参数服务器类,初始化参数;各类公用函数
│
├─launch
│ │ run.launch #总运行launch文件
│ │
│ └─include #分模块运行文件
│ │ module_loam.launch
│ │ module_navsat.launch
│ │ module_robot_state_publisher.launch
│ │ module_rviz.launch
│ │
│ ├─config #存储rviz参数文件和机器人坐标系参数
│ │ rviz.rviz
│ │ robot.urdf.xacro
│
├─msg
│ cloud_info.msg #自定义ROS数据格式
│
├─src #源文件
│ featureExtraction.cpp #提取雷达线面特征,发布雷达点云
│ imageProjection.cpp #订阅提取的雷达点云、IMU数据和IMU里程计数据,对雷达做畸变矫正,进行雷达前端里程计位姿粗估计的发布(以IMU频率)
│ imuPreintegration.cpp #IMU预积分,订阅雷达里程计和IMU数据,估计IMU偏置,进行雷达里程计、IMU预积分因子的图优化,输出IMU里程计。
│ mapOptmization.cpp #订阅雷达前端信息、GPS信息,进行点云配准,进行雷达里程计、全局GPS、回环检测因子的图优化。
│
└─srv
save_map.srv
下面是代码框架示意图:
这里主要解读src文件夹中的四个源码文件,还有utility.h和params.yaml文件。
utility.h
主要包括ParamServer类和其他函数。
ParamServer类中定义了很多公共的成员变量,用于存储参数服务器读取的参数,主要包括Topics、Frames、GPS Settings、Save pcd、Lidar Sensor Configuration、IMU、LOAM、voxel filter paprams、CPU Params、Surrounding map、Loop closure、global map visualization radius
其构造函数ParamServer()读取参数服务器(params.yaml)中的参数,并存到公共成员变量中。
其他源文件中的类继承ParamServer类,实例化对象时就调用了父类的构造函数ParamServer,读取了参数。
这样做的好处是,将需要经常改动的参数写在yaml文件中,程序留个接口读取参数,方便调试。
其他函数:
sensor_msgs::Imu imuConverter(const sensor_msgs::Imu& imu_in)
把imu的数据旋转到前左上坐标系下,并判断是不是用了九轴IMU,因为使用了磁力计的姿态信息。
sensor_msgs::PointCloud2 publishCloud(ros::Publisher *thisPub, pcl::PointCloud<PointType>::Ptr thisCloud, ros::Time thisStamp, std::string thisFrame)
这是发布点云函数。
double ROS_TIME(T msg)
这是打印ROS时间的函数。
void imuAngular2rosAngular(sensor_msgs::Imu *thisImuMsg, T *angular_x, T *angular_y, T *angular_z)
进行加速度数据读取。
void imuRPY2rosRPY(sensor_msgs::Imu *thisImuMsg, T *rosRoll, T *rosPitch, T *rosYaw)
将IMU的RPY角转到ROS定义的RPY角。
float pointDistance(PointType p)
计算点的距离。
float pointDistance(PointType p1, PointType p2)
计算两点的距离。
params.yaml
参数文件参数如下:
- Topics类(各个传感器的话题,根据使用的传感器话题更改)
pointCloudTopic: "points_raw" # Point cloud data
imuTopic: "imu_correct" # 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
Frames类(不同坐标系)
lidarFrame: "base_link" #基座标,机体坐标
baselinkFrame: "base_link" #基座标,机体坐标
odometryFrame: "odom" #里程计坐标系
mapFrame: "map" #世界坐标系
- GPS类(如果使用了GPS,则useImuHeadingInitialization和useGpsElevation为true)
# GPS Settings
useImuHeadingInitialization: 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 data
poseCovThreshold: 25.0 # m^2, threshold for using GPS data
# Export settings
savePCD: false # 保存数据则置为true
savePCDDirectory: "/Downloads/LOAM/" # 保存路径,开始和结尾都要有/,且为根目录下。例:如果在根目录下创建了data文件,要保存在data文件夹,则参数为/data/
# Sensor Settings
sensor: velodyne # lidar sensor type, either 'velodyne' or 'ouster'
N_SCAN: 16 # number of lidar channel (i.e., 16, 32, 64, 128)
Horizon_SCAN: 1800
# lidar horizontal resolution (Velodyne:1800, Ouster:512,1024,2048)
downsampleRate: 1
# default: 1. Downsample your data if too many points. i.e., 16 = 64 / 4, 16 = 16 / 1
lidarMinRange: 1.0 # default: 1.0, minimum lidar range to be used
lidarMaxRange: 1000.0 # default: 1000.0, maximum lidar range to be used
- IMU Settings类(更改IMU的噪音和偏置,还有重力加速度值)
imuAccNoise: 3.9939570888238808e-03
imuGyrNoise: 1.5636343949698187e-03
imuAccBiasN: 6.4356659353532566e-05
imuGyrBiasN: 3.5640318696367613e-05
imuGravity: 9.80511
imuRPYWeight: 0.01 //磁力计所占权重
goldqiu:十四.激光和惯导LIO-SLAM框架学习之惯导内参标定
goldqiu:十五.激光和惯导LIO-SLAM框架学习之惯导与雷达外参标定(1)
# Extrinsics (lidar -> IMU)
extrinsicTrans: [0.0, 0.0, 0.0]
extrinsicRot: [1, 0, 0,
0, 1, 0,
0, 0, 1]
extrinsicRPY: [1, 0, 0,
0, 1, 0,
0, 0, 1]
- loam参数设置(作者使用loam前端雷达里程计的参数,主要是角点和边缘点的数量和阈值)
# LOAM feature threshold
edgeThreshold: 1.0
surfThreshold: 0.1
edgeFeatureMinValidNum: 10
surfFeatureMinValidNum: 100
# voxel filter paprams
odometrySurfLeafSize: 0.4 # default: 0.4 - outdoor, 0.2 - indoor
mappingCornerLeafSize: 0.2 # default: 0.2 - outdoor, 0.1 - indoor
mappingSurfLeafSize: 0.4 # default: 0.4 - outdoor, 0.2 - indoor
# robot motion constraint (in case you are using a 2D robot)
z_tollerance: 1000 # meters
rotation_tollerance: 1000 # radians
numberOfCores: 4 # number of cores for mapping optimization CPU核数
mappingProcessInterval: 0.15 # seconds, regulate mapping frequency 建图频率
- 地图参数(关键帧阈值和点云密度、关键帧滑动窗口距离)
# Surrounding map
surroundingkeyframeAddingDistThreshold: 1.0
# meters, regulate keyframe adding threshold
surroundingkeyframeAddingAngleThreshold: 0.2
# radians, regulate keyframe adding threshold
surroundingKeyframeDensity: 2.0 # meters, downsample surrounding keyframe poses
surroundingKeyframeSearchRadius: 50.0
# meters, within n meters scan-to-map optimization (when loop closure disabled)
- 回环参数(是否开启回环,回环频率,搜索范围、关键帧大小、数量等)
# Loop closure
loopClosureEnableFlag: true
loopClosureFrequency: 1.0 # Hz, regulate loop closure constraint add frequency
surroundingKeyframeSize: 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 closure
historyKeyframeSearchTimeDiff: 30.0 # seconds, key frame that is n seconds older will be considered for loop closure
historyKeyframeSearchNum: 25 # number of hostory key frames will be fused into a submap for loop closure
historyKeyframeFitnessScore: 0.3 # icp threshold, the smaller the better alignment
# Visualization
globalMapVisualizationSearchRadius: 1000.0 # meters, global map visualization radius
globalMapVisualizationPoseDensity: 10.0
# meters, global map visualization keyframe density
globalMapVisualizationLeafSize: 1.0 # meters, global map visualization cloud density
主要有navsat和ekf_gps系列参数
下一章写LIO-SAM的前端。
?
|