文章目录
前言
记录一下PCL点云格式与ROS点云格式互相转换的过程。ROS 点云格式 | PCL点云格式 |
---|---|
sensor_msgs::LaserScan | pcl::PointCloud<pcl::PointXYZ> |
sensor_msgs::PointCloud2 | pcl::PointCloud<pcl::PointXYZ> |
一、ROS点云类型概述
-
类型 sensor_msgs::LaserScan 在ros中一般用于二维点云存储,大部分单线激光雷达输出的就是这种格式,在rviz下显示如下:
-
类型 sensor_msgs::PointCloud2 在ros中可以展示二维点云,也可以展示三维点云。
二、PCL点云类型概述
- 类型 pcl::PointCloud<pcl::PointXYZ> 与 类型 pcl::PCLPointCloud2 我的理解是后者是PCL官方推出来想取代前者的。
有兴趣去官网看看吧:
http://pointclouds.org/documentation/structpcl_1_1_p_c_l_point_cloud2.html
三、转换实现
1. sensor_msgs::LaserScan转到sensor_msgs::PointCloud2
这是两个ros类型的相互转换,这里主要用到projectLaser这个方法。
转换代码如下:
//输入的 ros LaserScan 类型
sensor_msgs::LaserScan::ConstPtr& msg;
laser_geometry::LaserProjection t_projectoir;
//输出的ros pointcloud2 类型
sensor_msgs::PointCloud2 t_cloud;
//转换到 ros pointcloud2 类型
t_projectoir.projectLaser(*msg,t_cloud);
2. sensor_msgs::PointCloud2转到 pcl::PointCloud<pcl::PointXYZ>
这是ros到pcl类型的转换,用到fromROSMsg方法。
转换代码如下:
//输入的ros pointcloud2 类型
sensor_msgs::PointCloud2 t_cloud;
//输出的pcl 类型
pcl::PointCloud<pcl::PointXYZ> t_pclCloud;
pcl::fromROSMsg(t_cloud,t_pclCloud);
3. pcl::PointCloud<pcl::PointXYZ>转到sensor_msgs::PointCloud
这是pcl 到ros类型转换,用到toROSMsg方法。(这边转成ros类型后可以publish出去,然后在rviz中就可以看了)
转换代码如下:
//输入的pcl 类型
pcl::PointCloud<pcl::PointXYZ> t_pclCloud;
//输出的ros 类型
sensor_msgs::PointCloud2 t_rosCloud;
pcl::toROSMsg(t_pclCloud,t_rosCloud);
//发布出去
//t_scanPub.publish(t_rosCloud);
总结
这里只是记录了最简单的转换,在ros转到pcl时如果有坐标上的偏差还可以用 transformLaserScanToPointCloud 方法,后面将逐步完善。