天天看點

如何在ROS中使用PCL—資料格式(1)

在ROS中點雲的資料類型

在ROS中表示點雲的資料結構有: sensor_msgs::PointCloud      sensor_msgs::PointCloud2     pcl::PointCloud<T>

關于PCL在ros的資料的結構,具體的介紹可查 看            wiki.ros.org/pcl/Overview

sensor_msgs::PointCloud   和   sensor_msgs::PointCloud2之間的轉換

那麼如何在ROS中使用PCL呢?

(1)在建立的包下的CMakeLists.txt檔案下添加依賴項

如何在ROS中使用PCL—資料格式(1)

在package.xml檔案裡添加:

在src檔案夾下建立.cpp檔案

在 CMakeLists.txt 檔案中添加:

catkin_make之後生成可執行檔案,運作以下指令

運作RVIZ可視化以下,添加了程式釋出的點雲的話題既可以顯示。同時也可以使用PCL自帶的顯示的函數可視化(這裡不再一一贅述)

那麼如果我們想實作對擷取的點雲的資料的濾波的處理,這裡就是進行一個簡單的體素網格采樣的實驗

同樣在src檔案夾下建立.cpp檔案,然後我們的程式如下。也就是要在回調函數中實作對擷取的點雲的濾波的處理,但是我們要特别注意每個程式中的點雲的資料格式以及我們是如何使用函數實作對ROS與PCL 的轉化的。

程式如下

看一下結果如圖,這是在RVIZ中顯示的結果,當然也可以使用PCL庫實作可視化(注意我們在rviz中顯示的點雲的資料格式都是sensor_msgs::PointCloud2

要差別pcl::PCLPointCloud2  這是PCL點雲庫中定義的一種的資料格式,在RVIZ中不可顯示,)

如何在ROS中使用PCL—資料格式(1)

/**************************************************************************

關于使用pcl/PointCloud<T>的舉例應用。這一類型的資料格式是PCL庫中定義的一種資料格式

這裡面使用了兩次資料轉換從

                      sensor_msgs/PointCloud2       到        pcl/PointCloud<T>

                     pcl::ModelCoefficients                到         pcl_msgs::ModelCoefficients.

代碼

提取點雲中平面的參數并且釋出出去

 PCL對ROS的接口的總結

比如: pcl::toROSMsg(*cloud,output);

實作的功能是将pcl裡面的pcl::PointCloud<pcl::PointXYZ>   cloud   轉換成ros裡面的sensor_msgs::PointCloud2   output 這個類型。

PCL對ROS的接口提供PCL資料結構的轉換,通過通過ROS提供的以消息為基礎的轉換系統系統。這有一系列的轉換函數提供用來轉換原始的PCL資料類型成消息型。一些最有用常用的的message類型列舉在下面。

std_msgs:Header:這不是真的消息類型,但是用在Ros消息裡面的每一個部分。它包含了消息被發送的時間和序列号和框名。PCL等于pcl::Header類型

sensor_msgs::PointCloud2:這是最重要的類型。這個消息通常是用來轉換pcl::PointCloud類型的,pcl::PCLPointCloud2這個類型也很重要,因為前面版本的可能被廢除。

pcl_msgs::PointIndices:這個類型存儲屬于點雲裡面的點的下标,在pcl裡面等于pcl::PointIndices

pcl_msgs::PolygonMesh這個類型包括消息需要描述多邊形網眼,就是頂點和邊,在pcl裡面等于pcl::PolygonMesh

pcl_msgs::Vertices:這個類型包含了一系列的頂點作為一個數組的下标,來描述一個多邊形。在pcl裡面等于pcl::Vertices

pcl_msgs::ModelCoefficients:這存儲了一個模型的不同的系數,比如描述一個平面需要4個系數。在PCL裡面等于pcl::ModelCoefficients

上面的資料可以從PCL轉成ROS裡面的PCL。所有的函數有一個類似的特征,意味着一旦我們知道這樣去轉換一個類型,我們就能學會轉換其他的類型。下面的函數是在pcl_conversions命名空間裡面提供的函數

下面的函數是在pcl_conversions命名空間裡面提供的函數

void 

void

總結出來就是

void fromPCL(const <PCL Type> &, <ROS Message type> &);

moveFromPCL(<PCL Type> &, <ROS Message type> &);

toPCL(const <ROS Message type> &, <PCL Type> &);

moveToPCL(<ROS Message type> &, <PCL Type> &);

PCL類型必須被替換成先前指定的PCL類型和ROS裡面相應的類型。sensor_msgs::PointCloud2有一個特定的函數集去執行轉換

void toROSMsg(const pcl::PointCloud<T> &, sensor_msgs::PointCloud2 &);                     轉換為ROS的點雲sensor_msgs::PointCloud2類型

fromROSMsg(const sensor_msgs::PointCloud2 &, pcl::PointCloud<T>&);                 轉為PCL中的pcl::PointCloud<T>類型

moveFromROSMsg(sensor_msgs::PointCloud2 &, pcl::PointCloud<T> &);               轉換為pcl::PointCloud<T> 類型

**************

有興趣者可以關注微信公衆号或者加入QQ群中

如何在ROS中使用PCL—資料格式(1)
如何在ROS中使用PCL—資料格式(1)