OctoMap-基于八叉树的地图¶
八叉树是用于在3D视觉中细分空间的数据结构。每个立方体都可以逐级地细分为8个子立方体,直到达到了给定的最小体积(体素)尺寸。且该最小体积(体素)决定了八叉树的分辨率。
An Efficient Probabilistic 3D Mapping Framework Based on Octrees
octomap的作用:
- 通过点云生成占用空间小、内容紧凑的地图,节省空间
- 合并了融合后的点云出现的重叠细节,提高运算效率
- 方便用于进行路径规划、导航、碰撞检测
一般场景比较大时,采用较低的分辨率,意味着方块更少,且更大。场景较小时,采用高分辨率,提高精度。
以上是一个八叉树的存储示例,左侧为体积模型,右侧为树状表示结构
OctoMap示例图:
使用方法¶
源码地址: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代码的作用:
- 将点云文件内容数据发布到话题
/pointcloud/output
- 使用octomap_server_node接收数据并生成Octomap
- 使用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" />