使用octomap_server将点云地图转化为八叉树地图和占据栅格地图

使用octomap_server创建八叉树地图和栅格地图

    • 说明
    • 问题1:点云与网格垂直
    • 问题2:八叉树显示不完整
    • 问题3:地面滤除

说明

Octomap 在ROS环境下实时显示、Lego_loam使用教程两篇博文对如何从PCD创建PointCloud2点云、如何用octomap_server创建八叉树地图和栅格地图已经说的很详细了,但是我在使用时还是遇到了一些问题。

问题1:点云与网格垂直

我用深度相机得到点云地图后,按照Octomap 在ROS环境下实时显示去创建点云地图后发现点云和网格时垂直的
点云与网格垂直主要是因为我的相机坐标系定义为:z轴往前,x轴往左(不是常见的往右是因为我的图像采集时镜像了),y轴往下,RVIZ默认显示的是xy平面,改成显示xz平面就正常了
在这里插入图片描述另一种办法是像Lego_loam使用教程中那样对点云坐标做变换,绕x轴旋转90度,将z轴指向上方。

1
2
3
4
    Eigen::Affine3f transform = Eigen::Affine3f::Identity();
    transform.rotate(Eigen::AngleAxisf(-M_PI/2, Eigen::Vector3f(1,0,0)));
    pcl::transformPointCloud(cloud, cloud, transform);
</wyn><ul class="pre-numbering"></ul>

我用-pi/2而非pi/2还是因为的坐标镜像问题。

第二种方法其实更好,因为从octomap_server的参数来看,它的坐标系是定义z轴向上的,它得到栅格地图也是默认投影到xy平面。

问题2:八叉树显示不完整

构建八叉树地图时发现地图显示不完整,地面没有显示出来
在这里插入图片描述原因是我的相机与地面之间是有一定高度,octomap_server中的pointcloud_min_z不应该设置为0,而应该取一定的负数范围

1
2
3
    <param name="pointcloud_max_z" value="1000" />
    <param name="pointcloud_min_z" value="-1000" />
</wyn><ul class="pre-numbering"></ul>

地面就正常显示了
在这里插入图片描述

问题3:地面滤除

生成栅格地图后发现地面也被认为是占据状态了
在这里插入图片描述原因是地面的点云也被投影了,应该把地面滤除掉,同样设置好pointcloud_min_z即可

1
2
3
<param name="pointcloud_max_z" value="1000" />
<param name="pointcloud_min_z" value="-0.2" />
</wyn><ul class="pre-numbering"></ul>

在这里插入图片描述