slam建图与八叉树地图

博客指出点云地图存在规模大、占用大量存储空间且包含不必要细节,以及无法处理运动物体等缺陷。同时介绍了八叉树地图,它将三维空间建模为小方块,通过细分形成八叉树结构,具有灵活、可压缩、能随时更新的特点,比点云地图更节省空间。

  八叉树地图是一种在导航中比较常用的,本身有较好的压缩性能的地图形式。

点云地图的缺陷

在点云地图中,虽然有了三维结构,也进行了体素滤波以调整分辨率,但是点云有几个明显的缺陷:

1.点云地图通常规模很大,所以pcd文件也会很大。一幅640像素×480像素的图像,会产生30万个空间点,需要大量的存储空间。即使经过一些滤波后,pcd文件也还是很大的。而且重要的是,它的大并不是必须的。点云地图提供了很多不必要的细节。对于地毯上的褶皱,阴暗处的影子,我们并不特别关心这些东西。把它们放在地图里是在浪费空间。由于这些空间的占用,除非降低分辨率,否则在有限的内存中,无法建模较大的环境。然而降低分辨率会导致地图质量下降。

2.点云地图无法处理运动物体。因为我们的做法里只有“添加点”,而没有“当点消失时把它移除”的做法。而在实际环境中,运动物体的普遍存在,使得点云地图变得不够实用。

接下来要介绍的,就是一种灵活的、压缩的、又能随时更新的地图形式:八叉树地图。

 八叉树地图

 把三维空间建模为许多个小方块(或体素)是一种常见的做法。如果把一个小方块的每个面都平均切成2片,那么这个小块就会变成同样大小的八个小方块。这个步骤可以不断的重复,直到最后的方块大小达到建模的最高精度。在这个过程中,把“将一个小方块分成同样大小的八个”看成”从一个结点展开成八个子节点”,那么整体从最大空间细分到最小空间的过程,就是一颗八叉树。

    整个大方块可以看成是根节点,而最小的块可以看作是“叶子节点”。于是在八叉树中,当我们由下一层结点往上走一层时,地图的体积就能扩大为原来的八倍。如果叶子结点的方块大小为1平方厘米,那么当我们限制八叉树为10层时,总共能建模的体积大约为8的10次幂立方厘米,也就是1073平方米。这足够建模一间屋子。由于体积与深度呈指数关系,所以当用更大的深度时,建模的体积会增长的非常快。

    为什么八叉树比点云节省空间呢?在点云的体素滤波器中,也限制了一个体素中只有一个点呀?这是因为,在八叉树中,在节点中存储它是否被占据的信息。当某个方块的所有子节点都被占据或都不被占据时,就没必要展开这个节点。例如,一开始地图为空白时,我们就只需要一个根节点,而不需要完整的树。当向地图中添加信息时,由于实际的物体经常连在一起,空白的地方也会常常连在一起,所以大多数八叉树节点都无须展开到叶子层面。 

 

 

 

### ORB-SLAM 使用八叉树地图的方法和实现 为了使 ORB-SLAM 能够使用八叉树来构地图,通常需要集成 Octomap 库以及 `octomap_server`。Octomap 是一种用于表示三维空间的概率占用网格数据结构,在机器人导航领域广泛应用。 #### 安装依赖项 在 Ubuntu 18.04 上准备环境时,需先安装 ROS 及其对应的 Octomap 包: ```bash sudo apt-get update sudo apt-get install ros-<your_ros_distro>-octomap ros-<your_ros_distro>-octomap-server ``` 这里的 `<your_ros_distro>` 需要替换为实际使用的 ROS 版本名称,比如 melodic 或 noetic[^1]。 #### 修改 ORB-SLAM2 发布点云 为了让 ORB-SLAM 的特征点能够被转换成适合输入给 Octomap 的形式,可能需要调整 ORB-SLAM2 中的关键帧发布方式,确保可以输出带有时间戳的点云消息 `/orb_slam2/point_cloud`。这一步骤取决于具体的应用场景和个人需求,有时也需要修改源码以适应特定硬件平台的要求。 #### 启动配置文件设置 创一个新的 launch 文件用来启动 ORB-SLAM 和 Octomap Server。下面是一个简单的例子: ```xml <!-- orb_octomap.launch --> <launch> <!-- Start ORB SLAM node with appropriate parameters --> <node name="orb_slam_node" pkg="orb_slam2_ros" type="orb_slam2_ros" output="screen"> ... </node> <!-- Launch octomap server to build the map from point cloud data published by ORB SLAM --> <node name="octomap_server" pkg="octomap_server" type="octomap_server_node" respawn="true"> <param name="frame_id" value="/camera_depth_frame"/> <param name="sensor_model/max_range" value="5.0"/> <remap from="cloud_in" to="/orb_slam2/point_cloud"/> </node> </launch> ``` 上述 XML 片段展示了如何通过 remapping 将来自 ORB-SLAM 输出的点云重定向到 Octomap Server 进行处理[^2]。 #### 构并查看八叉树地图 当一切正常工作之后,可以通过 rviz 来可视化生成的地图。订阅主题 `/projected_map` 获取二维占据栅格地图或者直接观察三维概率地图 `/octomap_binary`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值