type
Post
status
Published
date
Apr 17, 2026
slug
summary
关于点云转2d地图的n种尝试
tags
具身智能
ROS
SLAM
category
项目开发
icon
password
文章前言:
第一次测试:fastlio2+octomap
1. pcd点云

2. octomap

3. 修改思路
方案一:硬调 OctoMap 参数(适合必须实时出 2D 图的情况)
如果你要在建图的同时看到 2D 图的生成,你需要放宽 OctoMap 的视野,并加厚你的“切片”。修改你 Launch 文件里的这几个参数:
方案二:“降维打击”离线转换法(🌟 强烈推荐!学术界最爱)
既然你已经拥有了这么完美的一张全局 3D
map_...pcd 文件,完全没有必要再让 OctoMap 实时去算 2D 投影了! 实时射线追踪极其吃 CPU,而且很容易因为那一瞬间的位姿抖动导致地图发虚。最优雅、图最干净的做法是:用你建好的 3D PCD 文件,通过直通滤波(PassThrough)直接“一刀切”成 2D 栅格图。 这种方法生成的图,墙壁黑白分明,没有任何放射状噪点,给 Nav2 导航用简直完美。
你可以使用开源工具
pcd2pgm 极速搞定:1. 下载新版源码
2. 编译它
3. 核心配置(修改切片高度)
在运行之前,我们需要告诉它你的文件在哪,以及“从哪切”。
由于它是通过 launch 文件启动的,我们需要去修改它的参数文件(一般在
src/pcd2pgm/config 目录下,或者是直接改 launch 文件内部参数,具体看它的目录结构)。打开它的参数配置:
(如果文件名有出入,用
ls 看一下 config 文件夹里的名字)重点修改这几项(一定要配合你刚跑出来的数据):
file_directory: 填你存放 PCD 文件的绝对路径,比如/home/ubuntu/ros2_ws/src/maps/
file_name: 填你的文件名(注意有些版本要求不加后缀),比如map_20260417_0313
thre_z_min:0.3(极其关键:过滤掉底盘以下的地面,防止路面起伏变成墙)
thre_z_max:1.5(极其关键:过滤高空的树叶和树枝)
map_resolution:0.05(保持 5cm 精度)
4. 见证降维打击!
保存退出后,直接运行:
终端跑完之后,它会直接在你指定的目录下生成一张黑白分明的
.pgm 图片和对应的 .yaml 描述文件。4. pcd2pgm
- 使用pcd2pgm:参数1

- 使用pcd2pgm:参数2

5. OpenCV 形态学处理
既然图是
.pgm 格式的图片,我们完全可以写个 20 行的 Python 脚本,利用 OpenCV 的形态学操作(闭运算 + 膨胀),让程序自动帮你把图“涂白”和“描黑”。这不仅彻底解放了双手,而且在你的毕业论文里,你可以堂而皇之地写上一节:“本文设计了一种基于形态学闭运算的 2D 代价图自动化增强算法,解决了室外稀疏点云投影造成的规划失败问题...” (这比说“我用画图软件涂的”要高级一万倍!)
核心操作逻辑:
- 先把图里所有的黑块圈出来,测量它们的“面积”。
- 如果这个黑块的像素面积小于 30(说明它是孤立的飞虫或树叶噪点),直接把它擦除!
- 如果面积大于 30(说明它是一堵结实的墙壁),再让它稍微发胖连起来。
repair_map.py
实际效果:

- 总结:因为本身pgm图片过于粗糙,所以即便使用opencv进行修复,也无法得到一个比较好的导航地图,因此该方法不适合。
6. CSF 地面剥离算法
CSF(Cloth Simulation Filter,布料模拟滤波)
它在算法里模拟一块巨大的、有重量的软布,从天上盖到你的 3D 点云上。这块布会完美贴合各种斜坡、坑洼的地面,而遇到大楼、树木时会被撑起来。系统只需把“布”拿走,剩下的就全是纯粹的建筑物实体了!

to_pgm.py

7. 体素裁切
第一步:安装 PCL 命令行工具
第二步:裁切 Z 轴(物理级去除地面)
我们直接用
pcl_passthrough 工具,像切西瓜一样把 0.3m 以下(地面)和 2.0m 以上(天空)的点全部扔掉。这一步之后,你的点云就只剩下干净的墙壁和树干了。
第三步:体素化加厚墙体
为了解决你说的“碎砖头”问题,我们用
pcl_voxel_grid 把点云变“胖”,让它们自动粘在一起。第四步:修复成2d
pro_project.py
- 最终效果

有关问题,欢迎您在底部评论区留言,一起交流~
- Author:Koreyoshi
- URL:https://tangly1024.com/article/344c7b13-c6a7-8082-89e8-d5120a11e2c8
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!




