使用octomap_server创建八叉树地图和栅格地图
说明
Octomap 在ROS环境下实时显示、Lego_loam使用教程两篇博文对如何从PCD创建PointCloud2点云、如何用octomap_server创建八叉树地图和栅格地图已经说的很详细了,但是我在使用时还是遇到了一些问题。
问题1:点云与网格垂直
我用深度相机得到点云地图后,按照Octomap 在ROS环境下实时显示去创建点云地图后发现点云和网格时垂直的
主要是因为我的相机坐标系定义为:z轴往前,x轴往左(不是常见的往右是因为我的图像采集时镜像了),y轴往下,RVIZ默认显示的是xy平面,改成显示xz平面就正常了
另一种办法是像Lego_loam使用教程中那样对点云坐标做变换,绕x轴旋转90度,将z轴指向上方。
Eigen::Affine3f transform = Eigen::Affine3f::Identity();
transform.rotate(Eigen::AngleAxisf(-M_PI/2, Eigen::Vector3f(1,0,0)));
pcl::transformPointCloud(cloud, cloud, transform);
我用-pi/2而非pi/2还是因为的坐标镜像问题。
第二种方法其实更好,因为从octomap_server的参数来看,它的坐标系是定义z轴向上的,它得到栅格地图也是默认投影到xy平面。
问题2:八叉树显示不完整
构建八叉树地图时发现地图显示不完整,地面没有显示出来
原因是我的相机与地面之间是有一定高度,octomap_server中的pointcloud_min_z不应该设置为0,而应该取一定的负数范围
<param name="pointcloud_max_z" value="1000" />
<param name="pointcloud_min_z" value="-1000" />
地面就正常显示了
问题3:地面滤除
生成栅格地图后发现地面也被认为是占据状态了
原因是地面的点云也被投影了,应该把地面滤除掉,同样设置好pointcloud_min_z即可
<param name="pointcloud_max_z" value="1000" />
<param name="pointcloud_min_z" value="-0.2" />