日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pcl画圆球_PCL之轨迹绘制(二)

發布時間:2025/3/11 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pcl画圆球_PCL之轨迹绘制(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

之前學習點云庫做一些簡單的應用都是直接復制demo的代碼,然后把導入文件改一下,今天嘗試自己寫一些程序,結果錯漏百出,難受的早上,不過堅持了下來,求夸~~~

這個主要是一個簡單的繪制軌跡的教程,繪制軌跡只需要兩個東西,旋轉R和平移T,只要我們能夠得到這兩個東西,再結合初始坐標點,利用點云庫里面的Visualization模塊中的addLine函數就可以實現軌跡的繪制了。

這里為了簡單,我們直接采用模擬的數據以及模擬的旋轉矩陣。先一步一步講解流程,最后再附上源碼~~

1.生成點云數據

```c++  //為了方便,我們在這里只生成一個點

pcl::PointCloud::Ptr cloud1(new pcl::PointCloud);

cloud1->width = 1;

cloud1->height = 1;

cloud1->points.resize(cloud1->width * cloud1->height);

cloud1->points[0].x = 1;

cloud1->points[0].y = 1;

cloud1->points[0].z = 1;

cout << "cloud1 size " << cloud1->points.size()<

2.模擬生成旋轉矩陣

2.模擬生成旋轉矩陣

```c++

//模擬一個旋轉矩陣,為了簡單,這里只是用一個,每次迭代都使用這個矩陣,效果是x方向一次增加1個單位長度

//我們知道旋轉矩陣形式如下[ R t

0 1] 下一篇文章會講解一下這些的由來

Eigen::Matrix4f transform_1 ;

transform_1 << 1 , 0 , 0 , 1 ,

0 , 1 , 0 , 0 ,

0 , 0 , 1 , 0 ,

0 , 0 , 0 , 1 ;

cout << transform_1 <

3.接下來會用來 Register模塊中的transforms函數來實現點的轉變

```c++ //將矩陣進行變化

pcl::PointCloud::Ptr cloud2(new pcl::PointCloud);

pcl::transformPointCloud (cloud1, cloud2, transform_1);

cout << "original cloud1 points "<< cloud1->points[0].x<

cout<

吐槽:不知道為啥B乎每次都把我們格式弄壞了。。。

4.最后會用到Visualization模塊中的PCLVisualizer類顯示窗口

pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer ("3D Viewer"));

viewer->setBackgroundColor (0, 0, 0);

viewer->addText("Trajector", 10, 10, "v1 text");

viewer->addCoordinateSystem (1.0);

viewer->initCameraParameters ();

int line_numeber = 0;

char str[25];//這一個的作用是為了下面給每條線段 1 個唯一的id符,不然的畫只能畫出一條線

while(!viewer->wasStopped()){

viewer->spinOnce (1000);//這一句很重要,一開始沒有寫這一句,導致窗口一直沒有顯示,用于更新屏幕

line_numeber++;//依次增加,從而實現id號的不同

sprintf(str, "%d", line_numeber);//將數字轉化為字符串,addLine需要,addLine函數定義在下面

viewer->addLine<:pointxyz> (cloud1->points[0], cloud2->points[0], str);

*cloud1 = *cloud2;//將上一步的點云給另外一個

pcl::transformPointCloud (*cloud1, *cloud2, transform_1);

//cout語句用于測試

cout << "cloud1 points "<< cloud1->points[0].x<points[0].y <points[0].z<

cout << "cloud1 points "<< cloud2->points[0].x<points[0].y <points[0].z<

cout<

}

5.最后把頭文件給你就組成完整的程序了

#include

#include

#include #include //這兩個std文件沒有作用,因為一開始想用到itoa(),將整形轉化為字符的函數,后來發現這

#include //這個函數只有在window下面才存在

using namespace std;

注意點:

1.void pcl::visualization::PCLVisualizer::spinOnce(int time =1 ; bool force_redraw = false )

Spin once method.

Calls the interactor and updates the screen once.Parameters

[in] time- How long (in ms) should the visualization loop be allowed to run.

[in] force_redraw- if false it might return without doing anything if the interactor's framerate does not require a redraw yet.

while(!viewer->wasStopped()){

// viewer->spinOnce (100); }

viewer->spinOnce (100);一定要加這一句,否則什么現象也沒有

2.bool pcl::visualization::PCLVisualizer::addLine(const P1 & pt1, const P2 & ptr2,const std::string& id ="line",int viewpoint = 0 )

Add a line segment from two points.Parameters

[in]pt1the first (start) point on the line

[in]pt2the second (end) point on the line

[in]idthe line id/name (default: "line")

[in]viewport(optional) the id of the new viewport (default: 0)

Note:每一條線都需要有自己的id號

總結:還是要多多自己敲代碼,復制粘貼一時爽,真定編碼火葬場~~~B乎的格式和Typora很不一樣....,還是CSDN好。

總結

以上是生活随笔為你收集整理的pcl画圆球_PCL之轨迹绘制(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。