type
Post
status
Published
date
Apr 13, 2026
slug
summary
一种3d转2d的3d概率地图模型
tags
具身智能
ROS
SLAM
category
项目开发
icon
password
😀
Octomap:一种3d转2d的3d概率地图模型,将3d空间划分为一个个小方块。

OctoMap


 
1. OctoMap 简介
Octomap 是一种基于 八叉树(Occtree) 结构的开源 3D 概率地图模型。在机器人领域,它主要用于解决 3D 环境下的避障、导航和路径规划问题。
简单来说,如果说传统的 2D 栅格地图是将空间划分为一个个“小方格”,那么 Octomap 就是将 3D 空间划分为一个个“小方块”(Voxel)。
 
  • 核心原理:Octomap 的核心是递归地将 3D 空间划分为八个子节点。
    • 如果一个空间块内完全是空的或完全被占据,则无需进一步细分。
    • 如果空间内既有障碍物又有空隙,则继续分裂。 这种结构使得它在表示大范围稀疏环境时,比直接存储点云要节省大量的内存。
 
 
2. OctoMap 主要特点
  • 概率更新(Probabilistic) : 它不仅仅记录“有”或“无”,而是记录一个占据概率。通过多次传感器观测(如 LiDAR 或 RGB-D 相机)来更新每个立方体的状态。这能有效过滤掉传感器噪声或动态物体的干扰。
  • 三种状态: 不同于点云只表达“哪里有物体”,Octomap 明确区分了:
      1. 占据(Occupied): 确定有障碍物。
      1. 空闲(Free): 确定可以通过。
      1. 未知(Unknown): 传感器尚未探测到的区域(对自主探索任务至关重要)。
  • 内存高效: 由于八叉树的特性,对于大面积的空白区域,Octomap 只需一个大的节点即可表示,而不需要存储成千上万个点。
 
3. OctoMap 优势
在 ROS/ROS 2 的导航框架中(如 Nav2),Octomap 经常被用来替代原始点云:
  1. 避障: 机器人需要知道 3D 空间中哪个高度有障碍物,Octomap 可以提供完整的体积信息。
  1. 路径规划: 算法(如 A* 或 RRT*)可以快速在 Octomap 中查询某个坐标是否可行。
  1. 地图保存: 相比于几个 GB 的点云文件,Octomap(.bt 或 .ot 格式)通常只有几 MB 到几十 MB,非常适合持久化存储。
 
4. OctoMap 对比常规建图
  • 地图话题变了:OctoMap 默认会发布两个极其有用的话题:
    • /octomap_full/octomap_binary:这是完整的 3D 体素地图数据。
    • /projected_map:这是拍扁后的 2D 栅格地图(类型就是 nav_msgs/OccupancyGrid)。你需要在 RViz 的 Map 插件里将话题改为这个,就能看到 2D 地图了。
  • 纯粹信任里程计slam_toolbox 内部会做闭环检测(Loop Closure)来修正漂移;而 octomap_server 只是一个纯粹的建图器,它完全信任 FAST-LIO2 喂给它的 TF 位姿。得益于 Mid-360 的强悍,FAST-LIO2 的漂移极小,在这个场景下单次建图绝对够用。
  • 消除动态障碍物(如路过的同学):OctoMap 的精髓在于它的射线追踪(Raytracing)。当机器狗往前走时,雷达的光束扫过原本被路人挡住的区域打到了墙上,它就会在内存中把这段光束经过的体素“清空”。这就意味着,你可以在有人的校园里建图,地图依然很干净。
 
5. 示意图
  • OctoMap投影原理
notion image
  • 实际建图效果(go2w:Mid-360)
0m-1.3m
notion image
0.15m ~ 1.5m
notion image
 
6. 代码实现
  • 预安装
    • launch文件:FAST-LIO2 + OctoMap 投影
       
      💡
      有关问题,欢迎您在底部评论区留言,一起交流~
      Loading...
      Koreyoshi
      Koreyoshi
      一个普通的干饭人🍚
      Announcement
      🎉写给自己的2026心愿🎉
      学一门乐器
      拍摄人生照片
      义工旅游一个月
      在北京交很多新朋友
      学习胡闹厨房建模和贴图
      ----- 2026 ------
      👏希望我们一起变好👏