A-LOAM构建3d点云地图并实时转存二维栅格地图

本文介绍如何使用A-LOAM等算法配合octomap实现实时三维点云地图及二维栅格地图构建的过程。从octomap安装配置到运行测试,再到最终地图的展示与保存,提供了一套完整的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章参考

A-LOAM/LOAM/Lego-LOAM/SC_Lego_LOAM实时构建3d点云地图与2d栅格地图(octomap)

1 安装 octomap

可以从 apt 安装或者以功能包的形式安装

apt

#安装octomap
sudo apt-get install ros-melodic-octomap-ros 
sudo apt-get install ros-melodic-octomap-server
 
#安装octomap在rviz中的插件
 sudo apt-get install ros-melodic-octomap-rviz-plugins

功能包

clone 功能包

git clone https://github.com/OctoMap/octomap_mapping.git

2 在功能包里编写 octomap_server_test.launch 文件

<launch>
  <node pkg="octomap_server" type="octomap_server_node" name="octomap_server"> 
 
     <!--resolution in meters per pixel-->
     <!--栅格分辨率,可调-->
    <param name="resolution" value="0.1" />
    
    <!--世界坐标系话题-->
     <!--name of the fixed frame,needs to be "/map" for SLAM-->
    <param name="frame_id" type="string" value="/camera_init" />
 
     <!--max range/depth resolution of the kinect meters-->
    <param name="sensor_model/max_range" value="1000.0" />
    <param name="latch" value="true" />
 
     <!--max/min height for occupancy map, should be in meters-->
    <param name="pointcloud_max_z" value="100" />
    <param name="pointcloud_min_z" value="-100" />
 
    <param name="graound_filter_angle" value="3.14" />
    
     <!--点云消息名称 PointClout2--> 
     <!--topic from where pointcloud2 messages are subscribed-->
    <remap from="cloud_in" to="laser_cloud_surround" />
 
  </node>
 
</launch>

3 启动

// 先启动 octo 为实时降维三位地图做准备
roslaunch octomap_server octomap_server_test.launch

// 再启动 A-loam
roslaunch aloam_velodyne aloam_velodyne_VLP_16.launch

//运行bag
rosbag play xxx.bag

4 添加 Rviz 显示视图插件

启动rviz后,点击“add”,分别添加"Map"、“OccupancyGrid"与"OccupancyMap”,并把其话题名依次改为"/projected_map"、“octomap_full"与"octomap_binary”。

5 示例

在这里插入图片描述
纯点云
在这里插入图片描述
点云地图与栅格地图
在这里插入图片描述
八叉树地图与栅格地图
在这里插入图片描述

6 保存

rosrun map_server map_saver map:=/projected_map -f PATH_TO_YOUR_FILE/mymap

实时建图后可以立马保存,无需等待

7 后话

实时建图极吃内存,博主跑完1.5G的bag后octo节点还在后台运行,啥也没干看着octomap_server内存占用一直在涨,16G的内存十分钟不到就吃满了,直接导致图形界面崩溃。

<think>嗯,用户之前问了关于LeGO-LOAM点云分割细节,现在又进一步想了解点云分割和特征提取的具体细节,包括相关公式和详细过程。首先,我需要回忆一下LeGO-LOAM的工作原理,特别是点云分割和特征提取这两个模块。 用户提供的引用里提到了几个关键点:点云投影到距离像、地面点移除、点云聚类分割,以及特征提取中的曲率计算和特征分类。我需要把这些内容结合起来,给出详细的步骤和公式。 首先,点云预处理部分,用户之前已经提到了将点云投影到二维像上,这里可能需要更详细地解释如何计算深度像,比如每个点的坐标转换到像的行列索引。同时,地面点过滤的方法是基于相邻点的角度阈值,这个需要数学公式的支持,比如角度计算公式和阈值的设置。 接下来是点云分割,使用基于像的分割方法,比如广度优先搜索或区域生长法来聚类非地面点。这里需要说明聚类时的条件,比如距离或深度差异的阈值,给出公式。例如,判断两个相邻点是否属于同一聚类的条件是否满足Δr < threshold。 然后是特征提取部分,用户提到了曲率计算,这里需要详细说明曲率是如何计算的,比如使用周围点的深度值来计算每个点的曲率,可能涉及一阶或二阶差分。然后根据曲率对特征点进行分类,分为边缘特征和平面特征,给出分类的条件,比如曲率阈值的选择。 另外,用户引用的资料中提到了IMU在特征提取中的作用,比如消除运动畸变,这部分可能需要简要说明IMU数据是如何与点云处理结合的,例如通过时间戳同步和运动补偿。 需要注意的是,用户希望看到具体的公式,比如曲率的计算公式、角度阈值的计算,以及聚类的条件公式。同时,要确保所有的数学表达式都用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$。 用户可能还关心这些步骤如何影响后续的SLAM性能,比如特征提取的准确性对位姿估计的影响,或者地面点移除对点云分割效果的重要性。不过当前问题主要聚焦在技术细节和公式上,所以需要集中在这部分。 需要检查是否有遗漏的关键步骤,比如点云分割后的聚类合或噪声过滤,以及特征提取后的特征匹配方法。不过根据LeGO-LOAM的论文和源码,主要步骤可能已经覆盖,但需要确保详细性。 最后,确保回答结构清晰,分点说明,每个步骤包含子步骤和相关公式,正确引用用户提供的引用资料中的信息,如引用[1]、[2]、[3]中的内容,以增强答案的可信度。</think>### LEGO-LOAM 点云分割与特征提取的详细过程与公式 #### 一、点云分割的详细实现 LeGO-LOAM点云分割分为 **地面点过滤** 和 **非地面点聚类** 两个阶段,其核心目标是分离地面点和可追踪的物体点云--- ##### 1. **点云投影到距离像** 将 3D 点云转换为 **深度像(Range Image)**,每个点的位置由极坐标系参数映射到像的行列索引: - **行索引**:对应激光雷达的垂直扫描线编号(如 16 线雷达的 $i \in [0,15]$)。 - **列索引**:水平角度分辨率计算,公式为: $$ j = \left\lfloor \frac{\theta_{\text{horizontal}}}{\Delta \theta} \right\rfloor $$ 其中 $\Delta \theta = \frac{360^\circ}{\text{Horizon\_SCAN}}$(如 Horizon\_SCAN=1800,则 $\Delta \theta = 0.2^\circ$)[^3]。 每个像素存储对应点的深度值 $r_i$,形成矩阵 $\text{rangeMat}$。 --- ##### 2. **地面点过滤** 通过相邻扫描线的高度差判断地面点: - **条件公式**:对于同一列的两个相邻点 $A$(行 $i$)和 $B$(行 $i+1$),若满足: $$ \arctan\left(\frac{|z_B - z_A|}{\sqrt{(x_B - x_A)^2 + (y_B - y_A)^2}}\right) < \theta_{\text{threshold}} $$ 则标记为地面点($\theta_{\text{threshold}}$ 通常设为 $10^\circ$)[^3]。 - **实现**:在矩阵 $\text{groundMat}$ 中标记地面点,记录到 $\text{labelMat}$(地面标签通常为 $1$)。 --- ##### 3. **非地面点聚类分割** 对非地面点进行基于深度的聚类,采用 **广度优先搜索(BFS)** 或 **区域生长法**: - **聚类条件**:相邻点满足深度差异 $\Delta r < r_{\text{threshold}}$(如 $0.4 \, \text{m}$)[^3]。 - **剔除噪声**:若聚类点数 $N < N_{\text{min}}$(如 $30$),则视为噪声丢弃。 - **输出**:在 $\text{labelMat}$ 中为每个有效聚类分配唯一 ID,形成分割后的点云簇。 --- #### 二、特征提取的数学过程 LeGO-LOAM 的特征提取分为 **曲率计算** 和 **特征分类**,目的是筛选边缘特征(Edge Feature)和平面特征(Planar Feature)。 --- ##### 1. **曲率计算** 对每个非地面点 $p_i$,计算其局部曲率 $c_i$,反映表面粗糙度: $$ c_i = \frac{1}{N \cdot r_i} \sum_{k=1}^N \left( r_{i+k} - r_i \right)^2 $$ 其中 $N$ 是邻域点数(通常取前后 $5$ 个点,共 $10$ 邻域),$r_i$ 是点 $p_i$ 的深度值[^1]。 --- ##### 2. **特征分类** 根据曲率值将点分为两类: - **边缘特征**(Edge Feature):曲率 $c_i > c_{\text{high}}$(如 $0.1$),位于物体边缘。 - **平面特征**(Planar Feature):曲率 $c_i < c_{\text{low}}$(如 $0.01$),位于平坦区域[^1]。 --- ##### 3. **非极大值抑制(NMS)** 为避免特征点过于密集,对每个扫描线执行以下操作: - **边缘特征**:在局部窗口内仅保留曲率最大的点。 - **平面特征**:在局部窗口内仅保留曲率最小的点。 --- #### 三、关键公式与参数 | 步骤 | 公式/参数 | 典型值 | |----------------|--------------------------------------------------------------------------|-------------| | 深度像列索引 | $j = \lfloor \theta_{\text{horizontal}} / \Delta \theta \rfloor$ | $\Delta \theta = 0.2^\circ$ | | 地面点角度阈值 | $\theta_{\text{threshold}} = \arctan\left(\Delta h / \Delta d\right)$ | $10^\circ$ | | 曲率计算 | $c_i = \frac{1}{N \cdot r_i} \sum_{k=1}^N (r_{i+k} - r_i)^2$ | $N=10$ | | 边缘特征阈值 | $c_{\text{high}}$ | $0.1$ | | 平面特征阈值 | $c_{\text{low}}$ | $0.01$ | --- #### 四、代码实现示例 ##### 1. **曲率计算(C++ 伪代码)** ```cpp for (int i = 5; i < cloudSize - 5; ++i) { float diffRange = 0; for (int j = 1; j <= 5; ++j) { diffRange += std::abs(rangeMat[i+j] - rangeMat[i]) + std::abs(rangeMat[i-j] - rangeMat[i]); } curvature[i] = diffRange / (10 * rangeMat[i]); } ``` ##### 2. **特征分类与发布** ```cpp for (int i = 0; i < cloudSize; ++i) { if (curvature[i] > 0.1 && !isGround(labelMat[i])) { edgeFeatures->push_back(pointCloud[i]); } else if (curvature[i] < 0.01 && isGround(labelMat[i])) { planarFeatures->push_back(pointCloud[i]); } } ``` --- #### 五、总结 1. **点云分割**通过投影、地面过滤和聚类,显著降低了计算复杂度。 2. **特征提取**依赖曲率计算和阈值分类,保留了场景中高信息量的几何特征。 3. **公式与参数**的设计直接影响算法鲁棒性,需根据传感器特性调整阈值[^1][^3]。 --- ### 相关问题 1. **如何通过曲率阈值调整平衡特征点数量与质量?** 2. **点云分割中深度差异阈值 $\Delta r$ 的选取是否影响动态物体检测?** 3. **在低分辨率激光雷达(如 16 线)下,特征提取的可靠性如何保障?** [^1]: LeGO-LOAM 论文与源码解析 [^2]: 自动驾驶系列(7)LeGO-LOAM 源码解析 [^3]: lego-loam 实践:点云预处理与分割
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zjyspeed

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

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

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

打赏作者

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

抵扣说明:

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

余额充值