十九.激光和惯导LIO-SLAM框架学习之项目工程代码介绍---代码框架和一些文件解释

 专栏系列文章如下:

一: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

下面是代码框架示意图:

十九.激光和惯导LIO-SLAM框架学习之项目工程代码介绍---代码框架和一些文件解释_第1张图片

这里主要解读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::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
  • 机器人限制参数(限制Z轴和旋转)
  # robot motion constraint (in case you are using a 2D robot)
  z_tollerance: 1000                            # meters
  rotation_tollerance: 1000                     # radians
  • CPU Params
 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
  • GPS参数(详细参数,这里还不太懂)

主要有navsat和ekf_gps系列参数

下一章写LIO-SAM的前端。

 

你可能感兴趣的:(多传感器融合SLAM,导航研究和学习,自动驾驶,机器学习,slam)