A-LOAM总结-(前端+后端)算法流程分析

文章目录

  • scanRegistration.cpp 雷达信息预处理进程
  • laserOdometry.cpp
  • laserMapping.cpp

A-LOAM算法流程:主要运行以下3个cpp文件
流程框图在文末

scanRegistration.cpp 雷达信息预处理进程

  • ros::Subscriber subLaserCloud = nh.subscribe(“/velodyne_points”, 100, laserCloudHandler);

  • laserCloudHandler{} 点云处理回调函数

算法原理细节在这里面有讲解
A-LOAM(前端-1)的特征提取及均匀化-算法流程+代码注释
A-LOAM(前端-2)异常点的剔除-算法流程+代码注释
- ①计算曲率
- ②根据曲率提取特征点,分曲率大与一般大两种角点
- ③角点均匀化
- ④根据曲率提取面点
- ⑤对面点进行体素滤波
- ⑥将曲率大、曲率一般大、全部面点、体素滤波后的面点、全部点云,共5中点云发布出去,分别对应5个话题发布,在laserOdometry.cpp中接收

laserOdometry.cpp

  • 订阅scanRegistration.cpp 发布的话题信息

  • ros::spinOnce();

算法原理细节在这里面有讲解
A-LOAM(前端-3)的雷达畸变及运动补偿-算法流程+代码注释
A-LOAM(前端-4)的帧间lidar里程计-算法流程+代码注释
- 处理5个回调函数,把订阅的消息放进队列在while中处理
- ①将5种点云消息转成pcl形式
- ②构建点线约束,并放入problem
- ③构建点面约束,并放入problem
- ④扔进ceres求解problem获得里程计位姿
- ⑤发布里程计消息,laserMapping.cpp中订阅
- ⑥发布轨迹,这个主要是给ROS显示界面看的,没有实际处理

laserMapping.cpp

  • 订阅laserOdometry.cpp 发布的里程计位姿信息和角点与面点的信息

  • 运行process子线程

算法原理细节在这里面有讲解
A-LOAM(后端1)基于栅格点云地图构建-算法流程+代码注释
A-LOAM(后端2)地图中的线面特征提取及优化问题构建-算法流程+代码注释
- ①判断队列中是否有数据
- ②根据前端结果,得到后端的一个初始估计值
- ③据初始估计值计算寻找当前位姿在地图中的栅格索引
- ④根据判断决定是否移动
- ⑤构造用来优化当前帧的小局部地图
- ⑥将当前帧的点云进行下采样
- ⑦构建协方差矩阵进行特征分解来获取地图中的线,并构造两个虚拟点
- ⑧构建点约束,并放入problem
- ⑨通过平面方程求得平面
- ⑩通过平面方程构建点面约束,并放入problem,注意这里的点面约束构建与前端不同
- 11 更新odom到map之间的位姿变换
- 12 每个5帧发布局部地图,每隔20帧发布全局地图
- 13 发布当前帧、位姿、轨迹、TF出去给ROS显示,ROS中订阅这些话题就能直接显示了

ROS中坐标系关系不理解的可以参考这篇文章关于ROS中map、odom、base_link三个坐标系的理解
A-LOAM总结-(前端+后端)算法流程分析_第1张图片

你可能感兴趣的:(激光SLAM-LOAM系列,算法,自动驾驶,c++)