pcl的初步使用 ROS

2021-07-10 23:10:29 字數 4347 閱讀 5551

ros裡面已經預裝好了pcl,和一些與pcl之間的轉換,我們接下來看看如何在ros裡面使用pcl.。

總的來說,pcl包含了乙個很重要得到資料結構,叫pointcloud,這是乙個模板類,把點的型別作為模板引數。

下面是最重要的在點雲裡面的公共域

header 這個域是pcl::pclheader型別和指定點雲的獲取時間。

points:這個域是std::vector型別,是點雲儲存的容器。pointt是類模板引數。

width:這個域指定點雲的寬度在組織乙個影象的時候,否則只有乙個。

height:這個域指定點雲的高度,沒有指定則只有乙個。

is_dense:這個域指定點雲是否包含無效值(infinite或者nan)

sensor_origin_:這個域是eigen::vector4f 型別,它定義 了感測器的獲取姿勢就乙個區域的轉換而言。

sensor_orientation_:這個域是eigen::quaternion型別,他定義了sensor作為乙個旋轉的角度而言。

了解了點雲的資料結構以後,下面就可以了解不同點雲的型別,pcl是怎麼工作的,已及pcl與ros間的關係。

不同的點雲型別

前面所說的,pcl::pointcloud包含乙個域,它作為點的容器,這個域是pointt型別的,這個域是pointt型別的是pcl::pointcloud類的模板引數,定義了點雲的儲存型別。pcl定義了很多態別的點,下面是一些最常用的:

pcl::pointxyz 這是最簡單的點的型別,儲存著點的x,y,z資訊。

pcl::pointxyzi:這個型別的點是和前面的那個很相似的,但是他也包含乙個域描述了點的密集程度。另外還有兩個其他的標準的特殊的點的型別:第乙個是pcl::interestpoint,它有乙個域去儲存長處而不是密集度。pcl::pointwithrange,儲存了點的範圍(深度).

pcl::pointxyzrgba:這個型別的點儲存了3d資訊同時和rgb與alpha(透明度)

pcl::pointxyzrgb

pcl::normal:這是乙個最常用的點的型別,它代表了給定點的 曲面法線(normal翻譯為法線有點奇怪)和曲率的測量。

pcl::pointnormal:這個型別和前面那個一樣。只不過它多了座標(x,y,z)。他的變體有pointxyzrgbnormal和pointxyzinormal,就像名字所說的一樣,前者包含顏色,後者包含密集度。

除了以上這些常用的點的型別,還有很多 標準的其他的pcl型別,比如pointwithviewpoint,momentinvariants,boundary,principalcurvatures,histogram.更重要的是在pcl裡面除了這些型別,使用者還可以自己定義自己的型別。

pcl裡面的演算法

pcl用乙個很特別的設計模式貫穿整個庫去定義點雲處理演算法。總體來說,上面這些型別的演算法是高度配置的,為了開發他們的潛能,庫必須要提供乙個機制對使用者來指定哪些引數是需要的,哪些是預設的。

為了解決這個問題,pcl的開發者決定去使每個演算法屬於乙個特定共同點下的同層次的類。這個方式允許pcl開發者通過派生和新增引數值的方式,復用存在的演算法。它也允許使用者去提供引數值,剩餘的是預設值。下面是一小段**當使用pcl演算法時看起來的樣子:

pcl::pointcloud::ptr cloud(new pcl::pointcloudintxyz>); 

pcl::pointcloud::ptr result(new pcl::pointcloudointxyz>);

pcl::algorithmalgorithm;

algorithm.setinputcloud(cloud);

algorithm.setparameter(1.0);

algorithm.setanotherparameter(0.33);

algorithm.process (*result);

pcl對ros的介面

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命名空間裡面提供的函式

voidfrompcl(const &, &);

voidmovefrompcl(&, &);

voidtopcl(const &, &);

voidmovetopcl(&,

type> &);

這裡,pcl型別必須被替換成先前指定的pcl型別和ros裡面相應的型別。sensor_msgs::pointcloud2有乙個特定的函式集去執行轉換

voidtorosmsg(const pcl::pointcloud&, sensor_msgs::pointcloud2 &);

voidfromrosmsg(const sensor_msgs::pointcloud2 &, pcl::pointcloud

&);voidmovefromrosmsg(sensor_msgs::pointcloud2 &, pcl::pointcloud&);

你可能會對每個函式的不同感到奇怪還有它的move版本。其實是正常版本執行的是乙個深拷貝(完全拷貝),而move版的是淺拷貝,並使源資料作廢。

上面廢話了這麼多,可以來寫**了,不過小夥伴們不要激動,這不是雖然萬惡的"hello world",但也沒啥特殊的效果。

先建乙個包

catkin_create_pkg chapter6_tutorials pcl_conversions pcl_ros pcl_msgs

sensor_msgs

然後再建乙個cpp檔案,叫pcl_sample的cpp檔案 /*

*file namepcl_sample

*author         shukai

*date           mon apr  4 09:29:48 cdt 2016

*description    a ****** pcl demo

*/#include

#include

#include

#include

#include

int main(int argc,char** argv)

這個程式的主要目的是建立乙個有效的使用pcl的節點,同時看看編譯有沒有什麼問題。

然後接著在cmakelist.txt裡面加入以下的東西

尋找系統裡面的pcl庫

find_package(pcl required)

include_directories(include $)

link_directories($

然後下面是生成可執行檔案和鏈結相應的庫

add_executable(pcl_sample src/pcl_sample.cpp)

target_link_libraries(pcl_sample $ $)

最後用catkin_make就可以了

總結,ros裡面可以用pcl的庫,但是往往需要對其轉換,比如上面的pcl::torosmsg(*cloud,output);把pcl裡面的pcl::pointcloud轉換成ros裡面的sensor_msgs::pointcloud2這個型別。

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

在ros中點雲的資料型別 在ros中表示點雲的資料結構有 sensor msgs pointcloud sensor msgs pointcloud2 pcl pointcloud 關於pcl在ros的資料的結構,具體的介紹可查 看 wiki.ros.org pcl overview 關於senso...

ROS 建立 發布和顯示PCL點雲

定義點雲型別 pcl pointcloudcloud 新增點雲資料 cloud.width 50000 cloud.height 2 點集總共2 50000 10 0000個點 cloud.points.resize cloud.width cloud.height for size t i 0 i...

PCL 學習筆記 使用 PCL 來顯示點雲

pcl 裡面使用的一些小技巧,可惜我現在才知道。記下來 方便以後檢視吧。當你得到了一些點雲之後怎麼去快速直觀的看到 點雲的效果呢?有一些比較好的小的技巧。1.顯示乙個點雲的方法 pcl viewer cloud cluster 0.pcd 2.多個點雲在一起顯示的方法 pcl viewer mult...