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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

读自动驾驶激光雷达物体检测技术(Lidar Obstacle Detection)(1):Stream PCD流式载入激光点云数据

發布時間:2023/11/27 生活经验 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 读自动驾驶激光雷达物体检测技术(Lidar Obstacle Detection)(1):Stream PCD流式载入激光点云数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先貼一下大佬的github鏈接:https://github.com/williamhyin/SFND_Lidar_Obstacle_Detection

知乎專欄:https://www.zhihu.com/people/william.hyin

CSDN博客:https://blog.csdn.net/williamhyin/article/details/105159842

先呈現一個完整的視頻流結果:

?

靜置畫面截圖:

開始一步步分析這個代碼:

第一步:首先我們需要流式載入激光點云數據(以下是要讀入的數據)。

流式載入激光點云數據(疑問:每兩個pcd文件之間是不是在幀上本來就是相連的,就是一幀一幀?如果不是那么如果多個pcd文件兩兩之間在視角方位或者時間上不存在連續性可以形成視頻嗎?)

原始函數聲明在processPointCloud.h

流式載入pcd數據函數聲明

原始函數定義在processPointCloud.cpp

函數定義

函數調用在environment.cpp中(main函數中)

函數調用

這里只是捋一下代碼每一步在哪里在做什么的思路具體代碼注釋見下上傳的完整代碼版本。

本部分涉及到的知識:(1)模板:http://c.biancheng.net/view/2317.html

(2)Boost 智能指針。(也就是說 用了智能指針 你就不用擔心 什么釋放內存的問題了)

boost::shared_ptr 這句一般加在下圖箭頭前面其中shared_ptr 主要功能是,管理動態創建的對象的銷毀。他的基本原理是記錄對象被引用的次數,當引用次數為0的時候,也就是最后一個指向某對象的指針析構的時候,共享指針的析構函數就會把指向的內存區域釋放掉。

上圖使用new給指針指向的對象開辟一個空間,new后邊的pcl::PointCloud<PointT>是指名對象的類型,并返回一個地址。

講解鏈接:https://www.jianshu.com/p/f9eea3610637

http://blog.sina.com.cn/s/blog_1705e3fc10102xe28.html

https://blog.csdn.net/aishuirenjia/article/details/91986961

一般使用 ptr 定義 cloud 就是調用了boost庫里面的共享指針,

(3)PCL的Ptr與非Ptr類型(點云對象的兩種定義方式pcl::PointCloud::Ptr和pcl::PointCloud是可以相互轉換的)

? ? ? ?? (2.1)創建與訪問:

? ? ? ? ? ? ??第一種,是一種vector的賦值方式,將point數據push_back到pcl::PointXYZ類型的模板中。

pcl::PointCloud<pcl::PointXYZ> pointCloud;
pcl::PointXYZ point;point.x = 2.0f - y;point.y = y;point.z = z;pointCloud.points.push_back(point);

? ? ??第二種,指針型類模板,采用“->points[i]”方式賦值。

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
for (int i = 0; i < cloud->points.size (); ++i){cloud->points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);cloud->points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);cloud->points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);}

? ? ? ? ? ?? (2.2)?pcl::PointCloud::Ptr和pcl::PointCloud可以相互轉換

pcl::PointCloud<pcl::PointXYZ>::Ptr cloudPtr(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ> cloud;
cloud = *cloudPtr;//由Ptr轉變為另一種類型
cloudPtr = cloud.makeShared();//轉變為Ptr類型

? ? ? ? ? ? ?? (2.3)pcl::PointCloud::Ptr和pcl::PointCloud兩種對象,在操作是會有所不同

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("F:\\PCL\\2.pcd",*cloud) == -1)
pcl::PointCloud<pcl::PointXYZ> cloud;
pcl::io::loadPCDFile("F:\\PCL\\2.pcd",cloud) == -1)

PS:?kdtree和octree類中的setInputCloud()函數只支持Ptr類型,如果點云對象不是Ptr類型,需要進行類型轉換。

(4)boost文件目錄操作:https://www.cnblogs.com/milanleon/p/10756869.html

使用到的容器vector知識:

//通過存儲元素類型相同的其它 vector 容器,也可以創建新的 vector 容器
std::vector<char>value1(5, 'c');
std::vector<char>value2(value1);//value2 容器中也具有 5 個字符 'c'
....省略代碼
//在此基礎上,如果不想復制其它容器中所有的元素,可以用一對指針或者迭代器來指定初始值的范圍,例如: 
int array[]={1,2,3};
std::vector<int>values(array, array+2);//values 將保存{1,2}
std::vector<int>value1{1,2,3,4,5};
std::vector<int>value2(std::begin(value1),std::begin(value1)+3);//value2保存{1,2,3}

?

?

?

?

總結

以上是生活随笔為你收集整理的读自动驾驶激光雷达物体检测技术(Lidar Obstacle Detection)(1):Stream PCD流式载入激光点云数据的全部內容,希望文章能夠幫你解決所遇到的問題。

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