octomap的入门与学习

octomap的入门与学习

    • octomap简介
    • 八叉树的表达
    • 八叉树的更新
    • 安装
    • 3D点云转octomap

octomap简介

octomap是一种基于八叉树的三维地图创建工具, 可以显示包含无障碍区域及未映射区域的完整3D图形, 而且基于占有率栅格的传感器数据可以在多次测量中实现融合和更新; 地图可提供多种分辨率, 数据可压缩, 存储紧凑. 事实上, octomap的代码主要包含两个模块: 三维地图创建工具octomap和可视化工具octovis。
相比点云,能够省下大把的空间。octomap建立的地图大概是这样子的:(从左到右是不同的分辨率)
octomap的入门与学习_第1张图片
由于八叉树的原因,它的地图像是很多个小方块组成的(很像《我的世界》这种沙盒类游戏)。当分辨率较高时,方块很小;分辨率较低时,方块很大。每个方块表示该格被占据的概率。因此你可以查询某个方块或点“是否可以通过”,从而实现不同层次的导航。简而言之,环境较大时采用较低分辨率,而较精细的导航可采用较高分辨率。

八叉树的表达

八叉树(Octree)的概念最早在 1978 年由 Hunter 博士在他的博士毕业论文中提出,是四叉树(Quadtree) 在三维空间的推广,主要应用于计算机辅助设计与制造(CAD /CAM)、三维计算机图形学、三维图像处理等领域。用八叉树来表示三维形体,并研究在这种表示下的各种操作及应用是在进入 20 世纪 80 年代后才比较全面地开展起来的。这种方法也可以认为是用三维体素阵列表示形体方法的一种改进。
八叉树结构具有很强的空间分解能力,将空间目标划分为 8 个象限,每一个象限表示八叉树的一个节点。从八叉树根节点开始,如果该节点所在的三维空间实体为空,称其为空节点;如果该节点所在的三维空间实体类型相同(即为均质的),称其为黑节点;否则,称其为灰节点,并将其沿每一个坐标轴方向分割为 2 × 2 × 2 个子节点。这样递归的判断并分割,直到节点为空或该节点所在的三维空间实体为均质的,或达到预先确定的最小尺寸为止。图1 是用八叉树表示简单对象的一个例子,分别用三维栅格结构和树结构描述八叉树。
octomap的入门与学习_第2张图片
每个节点都有一个数据描述它是否被占据,在最简单的情况下,可以用 0、1 两个数表示,通常用 0 ~ 1 之间的浮点数表示它被占据的概率。0. 5 表示未确定,越大则表示被占据的可能性越高,反之亦然。由于它是八叉树,那么一个根节点的 8 个子节点都有一定的概率被占据或不被占据。用树结构的好处在于当某个节点的子节点都占据”或“不占据”或“不确定”时,就可以把它减去,这样就可以节省很多空间。

八叉树的更新

在八叉树中,我们用概率来表示一个叶子节点是否被占据而不是直接用 0、1 表达。因为在对环境的观测过程中,由于噪声及物体移动等情况的存在,每个节点是否被占据的情况会随时间的变化而发生改变。根据八叉树的推导原理,假设时间序列为 t = 1,2,3,…,T,每个时刻记录的信息为 i1,i2,i3,…,iT。那么第 n 个子节点的更新信息为:
在这里插入图片描述
对上式做一个 logit 变换,把一个概率 p 转换到全实数空间 R 上:
在这里插入图片描述
其逆变换为:
在这里插入图片描述
α 称之为 log - odds,用 L()表示每个叶子节点的 log
- odds,则可以得到下面的式子:
在这里插入图片描述
通过式(4)可知,每次更新八叉树的信息时,只需要将新的信息加入就可以了,需要注意的是,每个值取值都是有上限和下限的,不然会造成计算溢出,计算八叉树地图的时候只需要把实数转回概率就可以了。通过八叉树
的构造原理可以得到另一个结论是,当需要知道父节点的概率时,可以根据子节点来计算,方法可以是取平均值,或者是取所有子节点的上限或者下限。

安装

octomap的网页见:https://octomap.github.io

它的github源码在:https://github.com/OctoMap/octomap

- ctomap ros 功能包安装 :
octomap_server是ROS中的一个基于octomap的功能包。我在查阅资料的时候,发现所有的介绍、博客等资料都是在介绍其将点云地图转化为基于Octree的OctoMap的功能。

打开一个终端.(ctrl+alt+T)输入下面指令安装octomap.
sudo apt-get install ros-kinetic-octomap-ros #安装octomap
sudo apt-get install ros-kinetic-octomap-msgs
sudo apt-get install ros-kinetic-octomap-server
 
安装octomap 在 rviz 中的插件
sudo apt-get install ros-kinetic-octomap-rviz-plugins

3D点云转octomap

代码放在了我的github:https://github.com/1332927388/pcl2octomap.git

本次学习,我用的是实验室的小觅相机。
连接小觅相机后,打开rostopic list 可以看到小觅相机发布的话题,其中的pointcloud即是我们需要的点云话题。但是由于我们使用的点云转octomap需要的是pointcloud2,所以我们需要先把pointcloud转换为pointcloud2。在使用时,只需要remep一下话题名称,再运行point_cloud_converter.launch文件,然后再运行octomap_server中的octomap_mapping.launch

point_cloud_converter.launch


	
		
		
		

	

octomap_mapping.launch



	
		
		
		

	
	

	
		
		
		
		
		
		
		
		
		
		
	
	

我这里为了方便,将两个launch文件放在了一起。

成功之后,即可用rviz来查看地图。
由于之前安装了插件,所以在add中会多出一个octomap_rviz_plugins模组.如下图所示:
octomap的入门与学习_第3张图片
其中的OccupancyGrid是显示三维概率地图,也就是octomap地图。OccupancyMap是显示二维占据栅格地图。
然后选择合适的话题查看地图。

你可能感兴趣的:(octomap的入门与学习)