空间映射最佳实践
Last updated: August 13, 2026
ZED SDK 的空间映射模块也可通过独立的 ZEDfu 应用程序使用,它支持对场景或物体进行 3D 扫描。通过从多个视角随时间整合图像、深度和位置追踪数据,可以创建彩色 3D 模型(网格或融合点云)。
有关该模块的完整描述,请参阅空间映射文档;有关 ZEDfu 工具,请参阅 ZEDfu 文档。
支持的相机
空间映射需要配备惯性传感器(IMU)的双目相机,例如 ZED 2/2i、ZED Mini、ZED X、ZED X Mini 和 ZED X Nano。
以下相机不受支持:
- 最初的 ZED(已停产),没有内置 IMU;
- ZED X One GS/4K/S 相机,它们是单目相机。请注意,支持双 ZED X One Virtual Stereo Camera 设置;在 ZEDfu 中,使用本地流媒体输入来接收其数据。
扫描时的最佳实践
- 缓慢且平稳地移动。 快速移动会产生运动模糊;模糊的图像会降低位置追踪和重建的 3D 几何结构的质量。
- 确保场景光线充足。 光线不足的区域会增加深度噪声,并可能在模型中引入伪影和错误的表面。
- 优先选择有纹理的场景。 无纹理、均匀的表面(裸墙、玻璃等)为立体匹配和追踪提供的视觉信息很少。得益于神经深度模式,室内扫描现在比旧版 SDK 的表现好得多,但丰富的纹理仍能改善结果。
- 避免反光和透明物体。 镜子、玻璃和光亮表面会产生无效的深度测量结果。
- 与表面保持适当的距离。 不要靠近到超出相机型号的最小深度范围以内,并记住深度精度会随着距离增加而降低;因此,映射范围限制为 20 米。
- 闭环扫描。 扫描房间或物体时,尝试重新访问之前扫描过的区域;这有助于位置追踪优化地图。启用 区域记忆 后,SDK 可以识别之前映射过的区域并提高追踪一致性;请参阅 VSLAM 映射教程。
- 关注追踪状态。 在 ZEDfu 中,如果位置追踪状态切换为
SEARCHING,请将相机移回已映射的区域,以帮助 SDK 重新定位并继续生成地图。
选择合适的设置
- 深度模式:在 ZEDfu 中,您可以选择
NEURAL LIGHT(最佳实时性能)、NEURAL(质量和性能之间的良好折中)以及NEURAL PLUS(最高质量,推荐用于 SVO 文件的离线处理)。 - 地图类型:选择
MESH以生成一组三角形封闭网格,这些网格可在扫描后进行过滤和纹理处理;或选择POINT CLOUD以生成彩色融合点云。由于每个点都附带颜色信息,点云格式需要更多内存。 - 映射分辨率:分辨率可设置在 1 cm 到 12 cm 之间。更高的分辨率会生成更详细的地图,但需要更多内存和处理能力,并会减慢地图更新速度;请使用适合您应用的最低分辨率。API 提供
HIGH(2 cm,小区域)、MEDIUM(5 cm,平衡)和LOW(8 cm,大区域或碰撞网格)预设。 - 映射范围:集成到地图中的深度数据范围可设置在 2 m 到 20 m 之间。增大范围可以快速捕获大型空间,但会牺牲精度;减小范围则可提升性能。API 提供
NEAR(3.5 m)、MEDIUM(5 m)和FAR(10 m)预设。 - 网格过滤:捕获后,过滤可在保留几何特征的同时减少多边形数量。
LOW可填充孔洞并清理离群点;MEDIUM和HIGH还会执行网格简化。请尝试不同的预设,以找到最适合您应用的选项。 - 网格纹理:在扫描前启用纹理选项,以记录部分左摄像头图像并将其投影到网格表面。这可以提升模型的视觉质量,但需要更多处理能力和内存。纹理处理仅适用于网格。
实时扫描或离线处理
空间映射模块(包括 ZEDfu)接受三种类型的输入:
- 实时相机:由连接的 ZED 立体相机实时捕获的数据;
- 本地流媒体:通过 ZED 本地流媒体服务器从远程相机接收的数据;
- SVO 文件:使用相机录制并在之后处理的数据。详细了解录制和离线处理。
在 ZEDfu 中处理 SVO 文件时,我们建议启用 OFFLINE 模式:在开始生成地图之前,会对完整的 SVO 文件进行预处理,从而生成质量更高的地图,但处理时间也会更长。结合 NEURAL PLUS 深度模式,这是能够提供最佳 3D 重建质量的工作流程。
注意:ZEDfu 将生成的地图保存在用户主目录下的 ZED/Meshes 文件夹中;地图生成完成后,生成地图的完整路径会显示在状态栏中。
在应用程序中使用空间映射 API
ZEDfu 中提供的所有功能都可以通过 ZED SDK 集成到您自己的应用程序中。典型工作流程如下:
- 打开相机并使用
enablePositionalTracking()启用位置追踪; - 使用
enableSpatialMapping()启用该模块,并配置SpatialMappingParameters(分辨率、范围、地图类型、纹理); - 在循环中调用
grab();该模块会在后台处理图像、深度和位姿; - 使用
extractWholeSpatialMap()一次性提取地图,或使用异步requestSpatialMapAsync()/getSpatialMapRequestStatusAsync()/retrieveSpatialMapAsync()函数持续提取; - 可选:使用
Mesh::filter()和Mesh::applyTexture()优化网格,然后使用save("mesh.obj")保存; - 使用
getSpatialMappingState()监控该模块:FPS_TOO_LOW表示系统无法达到一致映射所需的帧率,而NOT_ENOUGH_MEMORY表示已达到内存限制;在这两种情况下,该模块都会停止集成新数据,但仍可提取 3D 模型。
请求和提取空间地图会消耗大量资源;为了提高性能,请不要过于频繁地请求新的空间地图。
有关更多详细信息,请参阅: