一、前言

首先,为什么要进行数据的转换?举个例子,在ROS中,我们通过订阅Kinect的RGB图像topic就可以获取到图像数据,但当我们要对这些图像进行处理的时候,我们需要用到专门的图像处理库,比如OpenCV.因此,我们需要用到ROS提供的package,cv_brige,将ROS格式的数据转换为OpenCV适用的数据.

回到本文,当我们要对激光雷达的数据进行处理时,我们也需要将ROS获取的雷达数据,即sensor_msgs::LaserScan,转化为PCL点云库可以使用的数据,如pcl::PointCloud.

二、转换方法

如上图所示,首先我们需要订阅激光雷达topic(如/scan)获取到sensor_msgs::LaserScan的message.然后使用ROS提供的laser_geometry包将其转化为sensor_msgs::PointCloud2格式的message.接着将sensor_msgs::PointCloud2的message转换为PCL点云库所需的数据格式.有两种方法,一种方法是使用ROS提供的pcl_conversions包,另一种方法是直接订阅之前转化的PointCloud2的数据,这样可以自动完成两种类型的转换,需要注意的是这种方法需要引入pcl_ros/point_cloud.h.

三、代码示例

首先定义一个pcl点云数据转换类

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

class My_Filter {

public:

My_Filter();

//订阅 LaserScan 数据,并发布 PointCloud2 点云

void scanCallback(const sensor_msgs::LaserScan::ConstPtr& scan);

//订阅 LaserScan 数据,先转换为 PointCloud2,再转换为 pcl::PointCloud

void scanCallback_2(const sensor_msgs::LaserScan::ConstPtr& scan);

//直接订阅 PointCloud2 然后自动转换为 pcl::PointCloud

void pclCloudCallback(const pcl::PointCloud<:pointxyz>::ConstPtr& cloud);

private:

ros::NodeHandle node_;

laser_geometry::LaserProjection projector_;

tf::TransformListener tfListener_;

//发布 "PointCloud2"

ros::Publisher point_cloud_publisher_;

//订阅 "/scan"

ros::Subscriber scan_sub_;

//订阅 "/cloud2" -> "PointCloud2"

ros::Subscriber pclCloud_sub_;

};

添加类的实现

#include "My_Filter.h"

My_Filter::My_Filter(){

//scan_sub_ = node_.subscribe<:laserscan> ("/scan", 100, &My_Filter::scanCallback, this);

//订阅 "/scan"

scan_sub_ = node_.subscribe<:laserscan> ("/scan", 100, &My_Filter::scanCallback_2, this);

//发布LaserScan转换为PointCloud2的后的数据

point_cloud_publisher_ = node_.advertise<:pointcloud2> ("/cloud2", 100, false);

//此处的tf是 laser_geometry 要用到的

tfListener_.setExtrapolationLimit(ros::Duration(0.1));

//前面提到的通过订阅PointCloud2,直接转化为pcl::PointCloud的方式

pclCloud_sub_ = node_.subscribe<:pointcloud> >("/cloud2", 10, &My_Filter::pclCloudCallback, this);

}

void My_Filter::scanCallback(const sensor_msgs::LaserScan::ConstPtr& scan){

sensor_msgs::PointCloud2 cloud;

projector_.transformLaserScanToPointCloud("laser", *scan, cloud, tfListener_);

point_cloud_publisher_.publish(cloud);

}

void My_Filter::scanCallback_2(const sensor_msgs::LaserScan::ConstPtr& scan){

sensor_msgs::PointCloud2 cloud;

/*laser_geometry包中函数,将 sensor_msgs::LaserScan 转换为 sensor_msgs::PointCloud2 */

//普通转换

//projector_.projectLaser(*scan, cloud);

//使用tf的转换

projector_.transformLaserScanToPointCloud("laser", *scan, cloud, tfListener_);

int row_step = cloud.row_step;

int height = cloud.height;

/*将 sensor_msgs::PointCloud2 转换为 pcl::PointCloud */

//注意要用fromROSMsg函数需要引入pcl_versions(见头文件定义)

pcl::PointCloud<:pointxyz> rawCloud;

pcl::fromROSMsg(cloud, rawCloud);

for(size_t i = 0; i < rawCloud.points.size(); i++){

std::cout<

}

point_cloud_publisher_.publish(cloud);

}

void My_Filter::pclCloudCallback(const pcl::PointCloud<:pointxyz>::ConstPtr& cloud){

for(size_t i = 0; i < cloud->points.size(); i++){

std::cout<points[i].x<points[i].y<points[i].z<<:endl>

}

}

最后加入主函数

#include "My_Filter.h"

int main(int argc, char** argv)

{

ros::init(argc, argv, "my_pcl_node");

My_Filter filter;

ros::spin();

return 0;

}

四、创建一个点云数据转换的ROS包

首先进入到你自己的ROS工作空间下的src目录,

cd ~/your_workspace/src

然后使用catkin_create_pkg创建一个名为my_pcl的ROS包.

catkin_create_pkg my_pcl pcl_conversions pcl_ros roscpp rospy sensor_msgs laser_geometry tf

修改package.xml文件,添加

libpcl-all-dev

libpcl-all

修改CMakeLists.txt文件.下面给出的作为一个参考

cmake_minimum_required(VERSION 2.8.3)

project(my_pcl)

find_package(catkin REQUIRED COMPONENTS

laser_geometry

pcl_conversions

pcl_ros

roscpp

rospy

sensor_msgs

tf

)

find_package(PCL 1.7 REQUIRED)

include_directories(

include

${catkin_INCLUDE_DIRS}

${PCL_INCLUDE_DIRS}

)

add_executable(${PROJECT_NAME}_node src/My_Filter.cpp src/my_pcl_node.cpp)

target_link_libraries(${PROJECT_NAME}_node

${catkin_LIBRARIES}

${PCL_LIBRARIES}

)

最后,进入工作空间,编译,运行.

五、结果展示

新建terminal,运行rosrun rviz rviz.在添加PointCloud2就可以观察到转换后的点云

同时,终端里也打印出转化为pcl::PointCloud类型的点云数据.(详见具体代码)

六、参考资料

pointcloud 转ptr_ROS学习笔记(三)sensor_msgs::LaserScan转pcl::PointCloud相关推荐

  1. J2EE学习笔记三:EJB基础概念和知识 收藏

    J2EE学习笔记三:EJB基础概念和知识 收藏 EJB正是J2EE的旗舰技术,因此俺直接跳到这一章来了,前面的几章都是讲Servlet和JSP以及JDBC的,俺都懂一些.那么EJB和通常我们所说的Ja ...

  2. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)

    tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...

  3. Ethernet/IP 学习笔记三

    Ethernet/IP 学习笔记三 原文为硕士论文: 工业以太网Ethernet/IP扫描器的研发 知网网址: http://kns.cnki.net/KCMS/detail/detail.aspx? ...

  4. iView学习笔记(三):表格搜索,过滤及隐藏列操作

    iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...

  5. 吴恩达《机器学习》学习笔记三——多变量线性回归

    吴恩达<机器学习>学习笔记三--多变量线性回归 一. 多元线性回归问题介绍 1.一些定义 2.假设函数 二. 多元梯度下降法 1. 梯度下降法实用技巧:特征缩放 2. 梯度下降法的学习率 ...

  6. Python基础学习笔记三

    Python基础学习笔记三 print和import print可以用,分割变量来输出 import copy import copy as co from copy import deepcopy ...

  7. Mr.J-- jQuery学习笔记(三十二)--jQuery属性操作源码封装

    扫码看专栏 jQuery的优点 jquery是JavaScript库,能够极大地简化JavaScript编程,能够更方便的处理DOM操作和进行Ajax交互 1.轻量级 JQuery非常轻巧 2.强大的 ...

  8. MYSQL学习笔记三:日期和时间函数

    MYSQL学习笔记三:日期和时间函数 1. 获取当前日期的函数和获取当前时间的函数 /*获取当前日期的函数和获取当前时间的函数.将日期以'YYYY-MM-DD'或者'YYYYMMDD'格式返回 */ ...

  9. ROS学习笔记三:创建ROS软件包

    ,# ROS学习笔记三:创建ROS软件包 catkin软件包的组成 一个软件包必须满足如下条件才能被称之为catkin软件包: 这个软件包必须包含一个catkin编译文件package.xml(man ...

最新文章

  1. 值得收藏的经典网页代码(1)
  2. 鸟哥的Linux私房菜(服务器)- 第十二章、网络参数控管者: DHCP 服务器
  3. C#医疗挂号系统试题
  4. 互联网晚报 | 1月11日 星期二 | 恒大集团退租深圳总部大楼;荣耀发布首款折叠旗舰手机;虎牙拿下5年LPL独播权...
  5. 高速缓冲存储器(Cache)
  6. Shell编程之变量
  7. java qq 界面_【Java】仿真qq尝试:聊天界面 响应用户输入
  8. tyvj1194 划分大理石
  9. 2.8 循环语句介绍
  10. 19.4.17 javaScript基础 培训第三天
  11. XTU OJ 1395
  12. 一年省一,两年国集,高二斩获世界金牌,他有哪些经验值得借鉴?
  13. WAR3改键工具FinalKey beta 1.0制作完成
  14. 工商银行u盾 java_中国工商银行u盾怎么用
  15. 用 Python + Appium 的方式自动化清理微信僵尸好友
  16. 让人脑壳疼的STP是如何做到防止环路?-理论
  17. Obsidian 常用插件
  18. listbox java_如何将所选项从一个listBox添加到另一个listBox
  19. MindMaster 快捷键
  20. 【QQ聊天界面-创建自定义Cell Objective-C语言】

热门文章

  1. DUILIB中获取flash,webbrowser control的方法
  2. 浅谈通信编程(二)--如何分离通信物理接口和应用程序
  3. [导入][转]跨越域的Cookie
  4. 剑指Offer面试题:24.复杂链表的复制
  5. 图的邻接矩阵存储结构
  6. 前端开发大众手册(转)
  7. 适合平面设计的linux版本,Qogir - 色彩鲜艳的Linux平面设计图标主题
  8. 纯html css博客,纯HTML+CSS打造动画
  9. linux 将当前时间往后调整2分钟_自动调整linux系统时间和时区与Internet时间同步...
  10. python qthread 线程退出_线程:概念和实现