无人机 SLAM 建图这个话题,最近问的人明显多了。尤其是“无人机 + SLAM + 点云图”这三个词组合在一起,基本就指向一个方向:让无人机在未知环境里边飞边建模,最后输出一版可以测量、可以规划路径、可以用于三维重建的点云地图。这篇文章不绕弯子,直接说清楚无人机 SLAM 建图到底在做什么、点云图怎么生成、普通电脑能不能跑、用什么工具链,以及从环境搭建到实机/仿真验证的完整流程。
1. 无人机 SLAM 建图核心能力速览
先给一张速览表,把无人机 SLAM 建图涉及的核心能力项列清楚。这里不针对某一个特定软件,而是针对“无人机 + SLAM + 点云地图”这条完整技术链路。
| 能力项 | 说明 |
|---|---|
| 核心任务 | 无人机在未知环境中实时定位并构建环境地图 |
| 常见技术路线 | 激光 SLAM(LOAM、LIO-SAM、FAST-LIO)、视觉 SLAM(ORB-SLAM、VINS-Mono)、激光视觉融合 |
| 输出产物 | 二维栅格地图、三维点云地图、位姿轨迹、占据栅格地图 |
| 点云格式 | PCD、PLY、LAS/LAZ,可通过 Open3D、PCL、CloudCompare 查看 |
| 推荐硬件 | 带激光雷达或双目/深度相机的无人机;地面站台式机建议 16G 内存以上 |
| 显存需求 | 纯 CPU 可跑大部分激光 SLAM;视觉 SLAM 或稠密建图建议 4G 以上显存,越高越稳 |
| 支持平台 | Ubuntu 18.04/20.04/22.04 + ROS1/ROS2,Windows 可用 WSL2 或 Docker 测试 |
| 启动方式 | 命令行启动、launch 文件启动、Docker 启动 |
| 是否支持 API | 多数开源 SLAM 没有 HTTP API,但提供 ROS 话题/服务接口,可二次开发 |
| 是否支持批量任务 | 通常按数据集序列批量处理,可编写脚本遍历多种数据集 |
| 适合场景 | 无人机室内巡检、地下矿井、隧道、桥梁检测、农业测绘、三维重建、路径规划 |
关于显存和硬件,这里多说一句。如果你只跑 2D 激光 SLAM,比如 Hector SLAM、Gmapping,CPU 完全够用。如果跑 3D 激光 SLAM,比如 LIO-SAM、FAST-LIO,点云配准和回环检测会吃内存和 CPU,16G 内存是底线,32G 更舒服。视觉 SLAM 如果只是跑稀疏特征点地图,CPU 也能凑合;但要生成稠密点云图,还是建议有 NVIDIA 显卡,至少 4G 显存,CUDA 和 cuDNN 要装好。
2. 无人机 SLAM 建图适用场景与使用边界
无人机 SLAM 建图的本质,是解决“无人机没有 GPS 或者 GPS 信号差时,怎么知道自己在哪,以及周围是什么”的问题。所以它最典型的应用场景是这几个:
- 室内无人机巡检:仓库、厂房、地下车库,GPS 信号弱,无人机靠 SLAM 定位并建图。
- 地下空间测绘:矿井、隧道、人防工程,无人机飞行时实时构建三维点云,后续用于体积估算和结构分析。
- 桥梁与基础设施检测:无人机沿桥墩、塔架飞行,视觉或激光 SLAM 生成结构表面点云,用于裂缝检测或变形分析。
- 农业与林业调查:低空飞行,激光 SLAM 不受光照影响,可以生成高精度树木点云,估算冠层体积。
- 无人机集群协同:多机协同建图时,每架无人机各自跑 SLAM 并共享地图,最终合并为统一点云图。
需要明确使用边界。SLAM 不是万能的,以下几类情况不建议直接依赖:
- 大范围无特征环境:比如纯白色墙壁的走廊,视觉 SLAM 容易丢帧,激光 SLAM 在几何结构重复时也可能漂移。
- 高速运动场景:无人机快速翻转或急加速时,运动模糊会导致视觉 SLAM 特征点丢失。
- 动态物体密集场景:SLAM 假设环境大部分是静态的。如果场景里大量行人、车辆来回移动,点云图中会出现大量“鬼影”,影响定位精度。
- 需要绝对地理坐标的场景:SLAM 地图通常是相对坐标系,如果要接入国土云、GIS 系统,需要配合 RTK/PPK 做坐标转换。
在合规性方面,务必注意:无人机飞行前要确认当地法律法规,获得空域许可,避免进入禁飞区。SLAM 建图过程中会采集环境图像和点云,如果涉及人员面部、车牌、涉密区域,必须提前脱敏或限制数据使用范围。点云数据和图像数据属于敏感数据,存储和传输需要加密,不能随意上传到公网。
3. 无人机 SLAM 建图环境准备与前置条件
以最常见的 Ubuntu 20.04 + ROS Noetic + 开源激光/视觉 SLAM 为例,给出环境准备清单。
3.1 操作系统与 ROS 版本
推荐 Ubuntu 20.04,配 ROS Noetic,这是目前开源 SLAM 算法兼容最广的组合。Ubuntu 18.04 + ROS Melodic 也可以,但新算法如 LIO-SAM、FAST-LIO2 对 Eigen、PCL、GTSAM 的版本有要求,旧系统容易编译冲突。Ubuntu 22.04 + ROS2 Humble 也越来越多,但部分老算法没有 ROS2 版本,需要自己封装节点。
建议桌面版安装,方便查看 Rviz 里的点云图。
3.2 基础依赖
# 如果使用 Ubuntu 20.04 且尚未安装 ROS Noetic,请先按 ROS 官方文档完成安装 sudo apt update sudo apt install -y \ cmake \ git \ build-essential \ libeigen3-dev \ libpcl-dev \ libopencv-dev \ python3-catkin-tools \ python3-vcstool \ ros-noetic-pcl-ros \ ros-noetic-velodyne-msgs \ ros-noetic-rviz如果跑 LIO-SAM 这类基于因子图的算法,还需要 GTSAM:
sudo apt install -y libgtsam-dev或者从源码编译 GTSAM,注意版本要选 4.0.2 以上。
3.3 GPU 与 CUDA(视觉 SLAM / 稠密点云建图选配)
如果只是跑激光 SLAM,比如 LIO-SAM,CPU 足够,CUDA 不是必须。但如果是 ORB-SLAM3 提取特征、或跑稠密重建,建议安装 CUDA 11.x,并编译对应的 OpenCV 版本。
# 检查显卡和驱动 nvidia-smi # 检查 CUDA 版本 nvcc --version如果 nvidia-smi 显示驱动正常,但 nvcc 提示找不到,说明只装了驱动没装 CUDA Toolkit,需要单独安装。
3.4 磁盘与内存
点云数据集一般不小。一袋 10 分钟的激光雷达数据,如果每秒 10 帧、每帧 10 万点,原始点云数据可能超过 5GB。建图过程中还会生成中间文件、位姿轨迹、关键帧图像。建议预留至少 50GB 磁盘空间。内存方面,8GB 勉强能跑 2D SLAM,跑 3D SLAM 建议 16GB 以上。
3.5 仿真环境(无实机时的替代方案)
如果手里没有无人机,可以先在 Gazebo 里搭仿真环境,用 PX4 或 ArduPilot 固件配合 MAVROS 跑仿真无人机。仿真虽然不能完全替代实机,但用来调试 SLAM 算法链路、验证点云输出流程完全够用。
# 常见仿真工具(具体安装参考 PX4 官方文档) sudo apt install -y \ gazebo11 \ ros-noetic-gazebo-ros \ ros-noetic-gazebo-plugins \ ros-noetic-mavros \ ros-noetic-mavros-extras4. 无人机 SLAM 建图安装部署与启动方式
下面以三个最常见的开源 SLAM 方案为例,说明安装部署方式。实际使用时,按你的传感器类型选择。
4.1 激光 SLAM:LIO-SAM
LIO-SAM 是典型的激光惯性紧耦合 SLAM,依赖 IMU 和激光雷达,适合固态激光雷达或机械式雷达。
cd ~/catkin_ws/src git clone https://github.com/TixiaoShan/LIO-SAM.git cd .. catkin_make启动前需要修改两个文件:
config/params.yaml:配置雷达 topic、IMU topic、外参。launch/run.launch:加载点云、IMU 的 topic 名称,以及使用哪种雷达驱动的 launch 文件。
实际启动:
source devel/setup.bash roslaunch lio_sam run.launch如果没有实机雷达,可以回放数据集:
rosbag play your_lidar_imu.bag启动后在 Rviz 中订阅/lio_sam/mapping/cloud_registered话题,就能看到实时拼接的点云图。
4.2 视觉 SLAM:ORB-SLAM3
ORB-SLAM3 支持单目、双目、RGB-D 以及视觉惯性模式,兼容性好,但实时性受特征提取速度影响。
cd ~/catkin_ws/src git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git cd ORB_SLAM3 chmod +x build.sh ./build.sh启动单目模式示例(需要修改 vocabulary 路径和相机参数文件):
./Examples/Monocular/mono_euroc Vocabulary/ORBvoc.txt Examples/Monocular/EuRoC.yaml /path/to/datasetORB-SLAM3 本身输出的地图是稀疏点云,用内置的 Viewer 可以看到。要生成稠密点云,需要结合其他重建模块,或者使用ORB-SLAM3 + RGB-D模式直接输出深度点云。
4.3 融合方案:FAST-LIO2 + Point-LIO
FAST-LIO2 是目前 3D 激光 SLAM 中口碑较好的一款,计算效率高,代码结构清晰,比较适合无人机嵌入式平台。
cd ~/catkin_ws/src git clone https://github.com/hku-mars/FAST_LIO.git cd .. catkin_make使用前需要修改config/下的 yaml 文件,指定雷达类型和 IMU 参数。启动:
roslaunch fast_lio mapping_velodyne.launchFAST-LIO2 在 Rviz 中输出/cloud_registered点云话题,可以直接保存为 PCD。
4.4 Docker 部署(可选)
如果不想污染宿主机环境,可以用 Docker 搭建 SLAM 环境。以 ROS Noetic 官方镜像为基础:
FROM ros:noetic-ros-base-focal RUN apt-get update && apt-get install -y \ git \ cmake \ libeigen3-dev \ libpcl-dev \ libopencv-dev \ ros-noetic-pcl-ros WORKDIR /root/catkin_ws然后进入容器编译你的 SLAM 包。注意 Docker 容器需要共享网络和 X11 才能显示 Rviz,配置稍微麻烦。更简单的做法是用nvidia-docker加-e DISPLAY和-v /tmp/.X11-unix实现 GUI 显示。
5. 无人机 SLAM 建图功能测试与效果验证
部署完成后,重点不是“能启动”,而是“建出来的图到底准不准”。下面给一套完整的功能测试流程。
5.1 测试数据准备
推荐三类数据源:
- 官方公开数据集:比如 KITTI、EuRoC、M2DGR,适合先验证算法链路。
- 自己录制的 rosbag:如果有无人机和雷达,用
rosbag record录制点云和 IMU。 - Gazebo 仿真数据:在仿真环境中自动生成,省去外场时间。
无论哪种数据,都要能同时提供激光/视觉和 IMU 数据,否则 LIO-SAM、VINS-Mono 这类融合算法无法运行。
5.2 测试流程
第一步:启动 SLAM 算法,等待回调就绪。
第二步:播放数据。
rosbag play your_dataset.bag第三步:在 Rviz 中观察三个关键话题:
- 实时点云
/lio_sam/mapping/cloud_registered - 位姿轨迹
/lio_sam/mapping/path - 激光里程计
/lio_sam/mapping/odometry
判断成功的标准:
- 点云拼接不出现明显的重复或错位。
- 位姿轨迹平滑,没有突然跳变。
- 无人机绕行一圈后,起点和终点误差小于 1%(例如 100 米路径漂移小于 1 米)。
- 回环检测触发后,全局地图有明显的闭合效果。
5.3 生成并保存点云图
以 LIO-SAM 为例,跑完数据后,可以用自带脚本保存全局点云:
rosrun lio_sam mapOptmization # 运行时订阅相关话题更通用方式是通过话题录制:
rosbag record -O final_map /lio_sam/mapping/cloud_registered之后将 bag 转为 PCD 文件,使用pcl_ros的bag_to_pcd:
rosrun pcl_ros bag_to_pcd final_map.bag /lio_sam/mapping/cloud_registered pcd_output运行结束后,pcd_output目录下会按时间戳生成一组 PCD 点云文件。
5.4 用 Python 打开点云图
网上经常有人问“python 能打开点云图吗”,答案是可以,用 Open3D 就能轻松完成。以下是一个读取 PCD 点云并在窗口中显示的例子:
import open3d as o3d pcd = o3d.io.read_point_cloud("map.pcd") print("点数:", len(pcd.points)) o3d.visualization.draw_geometries([pcd])如果点云文件是 LAS/LAZ 格式,需要先转换成 PCD 或 PLY:
import laspy import numpy as np import open3d as o3d las = laspy.read("map.las") points = np.vstack((las.x, las.y, las.z)).transpose() pcd = o3d.geometry.PointCloud() pcd.points = o3d.utility.Vector3dVector(points) o3d.visualization.draw_geometries([pcd])另外也可以用 CloudCompare 可视化点云,它打开大点云比 Open3D 更流畅,适合后续做手动裁剪和测量。
5.5 精度评估
如果需要对 SLAM 结果做量化评估,可以使用 EVO 工具。EVO 支持绘制轨迹、计算绝对位姿误差(APE)和相对位姿误差(RPE)。
pip install evo --upgrade --no-binary evo # 绘制轨迹并计算误差 evo_ape tum ground_truth.txt estimated_trajectory.txt -a -pEVO 是评估 SLAM 系统的重要工具,推荐提前安装好。评估时需要准备真实轨迹(Ground Truth)和算法输出的估计轨迹。真实轨迹可以由动捕系统、RTK 或仿真环境提供。
6. 无人机 SLAM 建图接口与批量任务处理
开源 SLAM 大多没有 HTTP API,但提供了两大类接口:
- ROS 话题接口:订阅点云、IMU、图像话题,发布位姿、地图、路径话题。
- ROS 服务接口:例如保存地图服务、回环优化服务、重置服务。
6.1 通过 ROS 话题获取点云
在自定义节点中订阅/lio_sam/mapping/cloud_registered话题,实时获取建图结果:
#!/usr/bin/env python3 import rospy from sensor_msgs.msg import PointCloud2 import sensor_msgs.point_cloud2 as pc2 def cloud_callback(msg): points = list(pc2.read_points(msg, field_names=("x", "y", "z"), skip_nans=True)) rospy.loginfo("当前帧有效点数: %d", len(points)) rospy.init_node("cloud_listener") rospy.Subscriber("/lio_sam/mapping/cloud_registered", PointCloud2, cloud_callback) rospy.spin()只要这个节点能收到点云,就说明 SLAM 话题链路正常,后面可以接自己的业务逻辑,比如障碍物检测、目标识别、路径规划。
6.2 批量处理多段数据
SLAM 的批量任务,通常指对多段 rosbag 数据依次建图。可以写一个 Shell 脚本遍历目录:
#!/bin/bash for bag in /data/bags/*.bag; do echo "处理 $bag" roslaunch lio_sam run.launch & sleep 5 rosbag play "$bag" sleep 3 rosnode kill -a sleep 2 # 保存该段点云 rosrun pcl_ros bag_to_pcd output.bag /lio_sam/mapping/cloud_registered ./pcd_output/ done这种脚本适合数据集批量测试,但要注意:每段数据建图前要重置 SLAM 状态,否则上一段的位姿会污染下一段。更规范的做法是为每段数据单独启动一个干净的 ROS 进程。
批量任务的关键是日志和失败重试。建议每处理一段数据就记录时间戳、点数、耗时、误差信息,方便后续排查。如果某段数据建图失败,先检查数据完整性,再看是否缺乏 IMU 信息,最后看参数外参是否匹配。
7. 无人机 SLAM 建图资源占用与性能观察
运行 SLAM 时要关注三类资源:CPU、内存、显存。
7.1 CPU 占用
激光 SLAM 中,点云特征提取、配准和回环检测是 CPU 密集型任务。单机运行 LIO-SAM 时,CPU 占用根据点云频率浮动,一般 1 到 4 个核心高负载。视觉 SLAM 的 ORB 特征提取同样吃 CPU,尤其在图像分辨率较高时更明显。
观察方式:
top -u $(whoami) # 或使用 htop htop如果 CPU 占用持续超过 80%,而且实时性差,优先降低点云频率或缩小图像分辨率。
7.2 内存占用
内存主要消耗在点云缓存、地图栅格和因子图上。3D 激光 SLAM 长时间建图时,如果地图点数持续堆叠,内存可能会一路上涨。部分算法支持局部地图裁剪,但多数开源实现是全局存储。飞行时间越长,内存占用越高。
建议:
- 长时间建图分段保存地图。
- 定期重启 SLAM 节点并加载历史地图。
- 使用 16G 以上内存,避免颠簸。
7.3 显存占用
纯激光 SLAM 一般不需要显存,除非你用 GPU 加速点云配准,例如使用 CUDA 版本的 GTSAM 或 cuPCL。视觉 SLAM 的稠密建图模块,比如 ORB-SLAM3 RGB-D 点云生成、或 NeurRE 重建类算法,显存占用从 2G 到 12G 不等,取决于分辨率和建图规模。实际占用需要以本机测试为准。
观察显存:
nvidia-smi -l 1如果显存不足,尝试降低图像分辨率、减少点云体素滤波半径、降低建图频率。不要因为显存不够就把所有功能同时打开,SLAM 建图最好只保留必要模块。
7.4 降低资源占用的方法
- 点云降采样:使用 Voxel Grid 滤波,把点云分辨率降到 0.1m 或 0.2m。
- 图像分辨率:视觉 SLAM 把图像缩放到 640x480,特征提取速度明显提升。
- 建图频率:不必每帧都更新全局地图,可以 1Hz 更新一次。
- 关闭不必要的 Rviz 显示,Rviz 在显示大量点云时也吃 CPU。
8. 无人机 SLAM 建图常见问题与排查方法
无人机 SLAM 建图最容易踩的坑,集中在数据同步、外参标定和环境兼容上。下面给出排查清单。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 启动后 Rviz 看不到点云 | 话题名不匹配 | rostopic list确认话题名 | 修改 launch 文件中的订阅话题 |
| 点云断层严重 | IMU 数据缺失或频率过低 | rostopic hz /imu/data查看频率 | 补 IMU 数据,或改用非惯性 SLAM |
| 地图漂移明显 | 外参标定错误 | 检查 radar-IMU 外参矩阵 | 重新标定外参,或先用已知数据集验证 |
| 回环检测不触发 | 场景结构重复或视角变化太快 | 在 Rviz 中检查关键帧分布 | 调整回环搜索半径,或提供更多视角重叠 |
| CPU 占用过高 | 分辨率/频率过高 | 查看点云帧率和点数 | 下采样,降低更新频率 |
| 保存的 PCD 点云过大 | 全局地图点数过多 | ls -lh pcd_output查看文件大小 | 体素滤波后保存 |
| SLAM 崩溃退出 | 内存不足或 ROS 版本不兼容 | 查看~/.ros/log日志 | 升级内存,重编特定依赖库 |
| 无人机飞行中定位丢失 | 特征缺失或剧烈运动 | 分析 bag 中图像/点云时间戳 | 降低飞行速度,增加纹理/几何特征 |
| Docker 中无法显示 Rviz | X11 权限未共享 | 检查 DISPLAY 变量 | 使用 host 网络并挂载 X11 socket |
| 批处理时上一段影响下一段 | SLAM 状态未重置 | 观察启动日志中的初始位姿 | 每段数据独立启动 SLAM 进程 |
外参标定是无人机 SLAM 里最容易被忽视的环节。激光雷达和 IMU 之间的旋转、平移矩阵如果不准,即使算法再强,建图也是乱飘的。常见标定工具是 Kalibr,但它主要针对相机,雷达-IMU 标定需要额外工具。如果实在没有标定条件,可以在仿真环境中先确定一组外参,再逐步替换真实参数。
9. 无人机 SLAM 建图最佳实践与使用建议
经过大量项目实践,这里给你几条工程化建议。
第一,先从仿真开始。第一次接触无人机 SLAM 建图,不建议直接上实机。在 Gazebo 中搭建一个带有墙壁、柱子和纹理的室内场景,用仿真雷达和 IMU 数据验证整个链路。仿真环境可以精确提供 Ground Truth,方便评估算法精度。
第二,保存一份“最小可运行配置”。把经过验证的 params.yaml、launch 文件、雷达驱动配置备份到独立目录,并写好 README。这样即使换了电脑,也可以快速恢复。
第三,统一数据管理。建议目录结构如下:
~/uav_slam_workspace/ ├── data/ │ ├── bags/ # 原始 rosbag │ ├── pcd/ # 输出点云 │ └── trajectories/ # 轨迹文件 ├── config/ │ ├── lio_sam_params.yaml │ └── camera_params.yaml ├── scripts/ │ ├── run_slam.py │ ├── batch_process.sh │ └── eval_trajectory.py └── logs/ ├── slam_run_001.log └── evo_result.zip第四,批量任务必须加日志。每次跑完一段数据,记录算法名称、数据集名称、开始时间、结束时间、点数、漂移误差。长期积累后,你能比较出哪套算法最适合当前无人机平台。
第五,接口服务要限制访问范围。如果你把 SLAM 结果接到 Web 端或地面站,建议使用内网访问,加 token 认证,防止点云和轨迹数据泄漏。
第六,合规必查。涉及人脸、车牌、军警设施、私人住宅的数据一律不允许公开。无人机飞行前检查禁飞区和空域申请,地面站和飞手要保持合法操作。
第七,评估工具提前装好。EVO、Open3D、CloudCompare 这些工具在项目一开始就装好,不要等项目跑完再补。特别是 EVO 可以快速绘制轨迹误差,用于 SLAM 精度对比,非常实用。
10. 总结与下一步
无人机 SLAM 建图不是单一算法,而是一套“传感器 + 融合定位 + 地图生成 + 后处理”的完整链路。核心价值在于:没有 GPS 的环境里,无人机依然能通过自身传感器知道自己在哪里,并输出可用的点云地图。
最先值得尝试的,是激光 SLAM 方案,比如 FAST-LIO2 或 LIO-SAM。它们对硬件要求相对友好,点云图直观,后续接路径规划也方便。最容易踩的坑是外参标定和数据同步,必须提前验证好再上机。
建议收藏这篇文章,按“环境搭建 -> 数据集测试 -> 功能验证 -> 精度评估 -> 批量处理”的顺序推进。先从仿真数据集跑通全流程,再逐步过渡到真实无人机平台。
下一步可以扩展的方向包括:无人机集群协同建图、SLAM 点云与语义分割融合、点云地图上的自主导航、以及基于点云的体积测量和目标检测。每一条都值得单独写深度的实践教程。