从零入门激光SLAM(十三)——LeGo-LOAM源码超详细解析2

大家好呀,我是一个SLAM方向的在读博士,深知SLAM学习过程一路走来的坎坷,也十分感谢各位大佬的优质文章和源码。随着知识的越来越多,越来越细,我准备整理一个自己的激光SLAM学习笔记专栏,从0带大家快速上手激光SLAM,也方便想入门SLAM的同学和小白学习参考,相信看完会有一定的收获。如有不对的地方欢迎指出,欢迎各位大佬交流讨论,一起进步。博主创建了一个科研互助群Q:772356582,欢迎大家加入讨论。

一、整体输入输出

LEGO-LOAM的第二个文件是Feature association,主要功能是对分割后的点云进行特征点提取和匹配操作,估算出位姿,本节将介绍整体功能和怎么从杂乱的点云中提取特征。该文件的整体框架如下:

1.1 输入如下

// 订阅了分割之后的点云
subLaserCloud=nh.subscribe("/segmented_cloud", 1, &FeatureAssociation::laserCloudHandler, this);
// 订阅的分割点云含有图像的深度信息
subLaserCloudInfo=nh.subscribe("/segmented_cloud_info", 1, &FeatureAssociation::laserCloudInfoHandler, this);
// 非聚类的点
subOutlierCloud=nh.subscribe("/outlier_cloud", 1, &FeatureAssociation::outlierCloudHandler, this);
// IMU传感器的消息
subImu=nh.subscribe(imuTopic, 50, &FeatureAssociation::imuHandler, this);

1.2 功能如下

首先对无序点云进行特征提取,之后利用特征点进行匹配计算出位姿

1. Feature Extraction特征提取
// 1.1 点云运动补偿
adjustDistortion();
// 1.2 计算平滑度
calculateSmoothness();
// 1.3 标记遮挡点
markOccludedPoints();
// 1.4 提取特征
extractFeatures();
// 1.5 发布点云
publishCloud();
2. Feature Association特征匹配
if (!systemInitedLM) {
// 2.1 检查系统初始化,点云投影到结束点
checkSystemInitialization();
return;}
// 2.2 更新初始猜测位置
updateInitialGuess();
// 2.3 特征匹配,输出Transformation
updateTransformation();
// 2.4 融合IMU坐标Transformation
integrateTransformation();
// 2.5 发布雷达里程计
publishOdometry();
// 2.6 发布点云用于建图
publishCloudsLast();

1.3 输出如下

pubCornerPointsSharp = nh.advertise("/laser_cloud_sharp", 1); //当前帧角点
pubCornerPointsLessSharp = nh.advertise("/laser_cloud_less_sharp", 1); //当前帧较缓的角点
pubSurfPointsFlat = nh.advertise("/laser_cloud_flat", 1);  //当前帧面点
pubSurfPointsLessFlat = nh.advertise("/laser_cloud_less_flat", 1); //当前帧较缓的面点
pubAdjustPoints= nh.advertise("/adjust_pointcloud", 1);  //修正后的分割点云
pubLaserCloudCornerLast = nh.advertise("/laser_cloud_corner_last", 2); //前一帧所有角点
pubLaserCloudSurfLast = nh.advertise("/laser_cloud_surf_last", 2);  //前一帧所有面点
pubOutlierCloudLast = nh.advertise("/outlier_cloud_last", 2); //前一帧所有界外点pubLaserOdometry = nh.advertise (“/laser_odom_to_init”, 5); //激光里程计

二、Feature Extraction

提取特征能够避免使用全部点云进行计算和匹配,大大降低了内存资源,是3D激光SLAM能够实时建图的特新思想。所有LOAM系的算法均用角点和面点特征进行匹配。

…详情请参照 https://www.guyuehome.com/46787https://www.guyuehome.com/46790

### KITTI 数据集与 LEGO-LOAM 激光雷达里程计算法实现 #### 关于 KITTI 数据集 KITTI 是一个广泛用于自动驾驶研究的数据集,提供了丰富的传感器数据,包括立体相机、单目相机、GPS/IMU 和 Velodyne 激光扫描仪获取的信息。该数据集不仅涵盖了城市道路场景下的多种交通状况,还包含了标注好的目标检测框以及语义分割标签等辅助信息[^2]。 #### LEGO-LOAM 算法简介 LEGO-LOAM (Lightweight and Ground-based Lidar Odometry and Mapping) 是一种轻量级地面激光雷达里程计和建图方法。此算法通过提取特征点和平面来匹配连续两帧之间的变换关系从而完成定位功能;同时利用这些几何约束条件构建局部地图模型以提高精度稳定性。其主要优点在于计算效率高且易于实现实时应用,在资源受限设备上也能良好工作。 #### 实现教程概览 对于想要深入了解并实践 LEGO-LOAM 的开发者来说,可以从以下几个方面入手: 1. **环境搭建** - 安装 ROS(Robot Operating System),因为大多数开源 SLAMLOAM 库都是基于这个平台开发出来的。 - 获取最新版的 PCL(Point Cloud Library),这是处理三维点云的核心库之一。 2. **理解核心原理** - 掌握基本概念如 ICP(Iterative Closest Point), NDT(Normal Distributions Transform) 等配准技术。 - 学习如何从原始 LiDAR 扫描中抽取边缘特征(line feature extraction) 及平面要素(plane feature extraction). 3. **代码解析** 下载官方 GitHub 上发布的源码,并按照 README 文件指示编译安装依赖项。重点查看 `loam_velodyne` 节点内的几个重要函数: ```cpp void laserCloudHandler(const sensor_msgs::PointCloud2ConstPtr& scanMsg); void extractFeatures(); void associateWithMap(); ``` 4. **调试优化** 使用 rviz 工具加载 KITTI 提供的真实世界轨迹作为参考标准来进行对比分析。调整参数直至达到满意的效果为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桦树无泪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值