OctoMap-基于八叉树的地图

八叉树是用于在3D视觉中细分空间的数据结构。每个立方体都可以逐级地细分为8个子立方体,直到达到了给定的最小体积(体素)尺寸。且该最小体积(体素)决定了八叉树的分辨率。

An Efficient Probabilistic 3D Mapping Framework Based on Octrees

octomap的作用:

  • 通过点云生成占用空间小、内容紧凑的地图,节省空间
  • 合并了融合后的点云出现的重叠细节,提高运算效率
  • 方便用于进行路径规划、导航、碰撞检测

一般场景比较大时,采用较低的分辨率,意味着方块更少,且更大。场景较小时,采用高分辨率,提高精度。

以上是一个八叉树的存储示例,左侧为体积模型,右侧为树状表示结构

OctoMap示例图:

octomap_demo.png

octomap_demo2.png

使用方法

源码地址:https://github.com/OctoMap/octomap 这里我们直接使用ros版的OctoMap,然后接收点云话题,将之转成octomap并显示。

ROS安装octomap

这里 $ROS_DISTRO 代表你电脑上的ros版本,可以通过 echo $ROS_DISTRO 查看具体代表的版本,如果命令没有输出内容,可以根据不同的ubuntu系统,替换成字符串即可:

  • Ubuntu14.04 -> indigo
  • Ubuntu16.04 -> kinetic
  • Ubuntu18.04 -> melodic
sudo apt-get install ros-$ROS_DISTRO-octomap-ros 
sudo apt-get install ros-$ROS_DISTRO-octomap-msgs
sudo apt-get install ros-$ROS_DISTRO-octomap-server

给rviz安装插件用于显示octomap

sudo apt-get install ros-$ROS_DISTRO-octomap-rviz-plugins

下载并编译ROS节点

cd catkin_ws/src
git clone https://gitee.com/tangyang/pointcloud_publisher.git
cd ..
catkin_make

pointcloud_publisher代码的作用:

  1. 将点云文件内容数据发布到话题 /pointcloud/output
  2. 使用octomap_server_node接收数据并生成Octomap
  3. 使用rviz查看点云及对应的Octomap

启动节点并预览

roslaunch pointcloud_publisher demo.launch

使用其他点云

我们可以将其他.pcd文件拷贝到 pointcloud_publisher/data 目录下,然后修改 launch/demo.launch 中的path参数即可:

<param name="path" value="$(find pointcloud_publisher)/data/room_scan1.pcd" type="str" />