视差到点云、栅格图发布

   在路径规划中,地图是必不可少的,有多种地图可供路径规划使用,点云图和栅格图就是其中之一。通过双目匹配等获取视差图后转换成点云图,栅格图等是路径规划中的一部分。本文主要叙述如何将视差图转换成PCL或ROS下的点云图,以及ROS下栅格图。

一、视差图转换为点云图:

   两者之间的转换需要用到三角法,图示如下,根据视差可以求得点的深度为h=f*b/d,再根据摄像头的小孔成像分析可以进一步得到点的x,y坐标,以上坐标均基于camera坐标系,如果要得到base坐标或者global坐标,还需要经过坐标系之间的变换得到,ROS下可使用tf完成这个功能(参考http://wiki.ros.org/tf)。

二、PCL、ROS点云表示:

      参考:http://wiki.ros.org/pcl/Tutorials                                http://wiki.ros.org/pcl/Overview

  PCL的点云格式为pcl::PointCloud<T>,其中T为点云格式,这里以最简单的pcl::PointXYZ为例(参考http://www.pointclouds.org/documentation/),ROS下点云有两种表示sensor_msgs::PointCloud和sensor_msgs::PointCloud2,它们是两个msg信息(http://docs.ros.org/kinetic/api/sensor_msgs/html/index-msg.html)。

    PCL中提供了pcl::PointCloud<T>和sensor_msgs::PointCloud2的转换方式,使用pcl::fromROSMsg和pcl::toROSMsg。完成该转换需要在CMakeLists.txt和packa.xml添加如下依赖项。

##CMakeLists.txt下
find_package(catkin REQUIRED COMPONENT
            pcl_conversions
            pcl_ros
)

##package.xml下
<build_depend>libpcl-all-dev</build_depend>
<run_depend>libpcl-all</run_depend>

    ROS中点云格式的转换方式如下:

    sensor_msgs::convertPointCloud2ToPonitCloud

    sensor_msgs::convertPointCloudToPointCloud2

三、ROS占据栅格图:

    ROS中使用nav_msgs::OccupancyGrid来表示栅格图,该msg信息可以通过ROS的api查看,也可以通过rosmsg show 查看。对该msg的操作,首先需要设置好grid的格式,然后根据点的三维数据和设置的坐标系位置确定栅格图data数据,即占据情况,如下:

grid.header.frame_id = "base_link";
grid.header.stamp = ros::Time();
grid.info.resolution = resolution;
grid.info.width = width;
grid.info.height = height;
//初始化data
for(int i=0; i<height; i++)
	for(int j=0; j<width; j++)
		grid.data.push_back(0);
grid.info.origin.position.x = - width / 2. * resolution;
grid.info.origin.position.y = - height / 2. * resolution;
grid.info.origin.position.z = 0;
grid.info.origin.orientation.x = 0;
grid.info.origin.orientation.y = 0;
grid.info.origin.orientation.z = 0;
grid.info.origin.orientation.w = 1;

根据三维数据和坐标确定占据情况
for(;;)
    grid.data[x * width + z] = 100;

猜你喜欢

转载自blog.csdn.net/chx725/article/details/81173692