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...