「深度解析」:探究自動駕駛中的光達點雲分割演算法
目前常見的雷射點雲分割演算法有基於平面擬合的方法和基於雷射點雲資料特徵的方法兩類。具體如下:
點雲地面分割演算法
01 基於平面擬合的方法-Ground Plane Fitting
演算法想法:一個簡單的處理方法就是沿著x方向(車頭的方向)將空間分割成若干個子平面,然後對每個子平面使用地面平面擬合演算法(GPF)從而得到能夠處理陡坡的地面分割方法。此方法是在單幀點雲中擬合全域平面,在點雲數量較多時效果較好,點雲稀疏時極易帶來漏檢和誤檢,例如16線雷射雷達。
演算法偽代碼:
#偽代碼
演算法流程是對於給定的點雲 P ,分割的最終結果為兩個點雲集合,地面點雲 和非地面點雲。此演算法有四個重要參數,如下:
- Niter : 進行奇異值分解(SVD)的次數,也即進行最佳化擬合的次數
- NLPR : 用於選取LPR的最低高度點的數量
- #Thseed : 用來選取LPR的最低高度點的數量
- Thseed : 用於選取種子點的閾值,當點雲內的點的高度小於LPR的高度加上此閾值時,我們將該點加入種子點集
Thdist : 平面距離閾值,我們會計算點雲中每一個點到我們擬合的平面的正交投影的距離,而這個平面距離閾值,就是用來判定點是否屬於地面
種子點集的選擇
我們先選取一個種子點集(seed point set),這些種子點來自點雲中高度(即z值)較小的點,種子點集被用來建立描述地面的初始平面模型,那麼如何選取這個種子點集合呢?我們引入最低點代表(Lowest Point Representative, LPR)的概念。 LPR是NLPR個最低高度點的平均值,LPR保證了平面擬合階段不受量測雜訊的影響。
種子點的選擇
#輸入是一幀點雲,這個點雲內的點已經沿著z方向(即高度)做了排序,取num_lpr_ 個最小點,求得高度平均值lpr_height(即LPR),選取高度小於lpr_height th_seeds_的點作為種子點。
具體程式碼實作如下
/* @brief Extract initial seeds of the given pointcloud sorted segment. This function filter ground seeds points accoring to heigt. This function will set the `g_ground_pc` to `g_seed_pc`. @param p_sorted: sorted pointcloud @param ::num_lpr_: num of LPR points @param ::th_seeds_: threshold distance of seeds @param :: */ void PlaneGroundFilter::extract_initial_seeds_(const pcl::PointCloud &p_sorted) { // LPR is the mean of low point representative double sum = 0; int cnt = 0; // Calculate the mean height value. for (int i = 0; i
平面模型
##接下來我們建立一個平面模型,點雲中的點到這個平面的正交投影距離小於閾值Thdist,則認為該點屬於地面,否則屬於非地面。採用一個簡單的線性模型用於平面模型估計,如下:
ax by cz d=0
即:
其中
####,透過初始點集的協方差矩陣C來解n,從而確定一個平面,種子點集作為初始點集,其協方差矩陣為######
这个协方差矩阵 C 描述了种子点集的散布情况,其三个奇异向量可以通过奇异值分解(SVD)求得,这三个奇异向量描述了点集在三个主要方向的散布情况。由于是平面模型,垂直于平面的法向量 n 表示具有最小方差的方向,可以通过计算具有最小奇异值的奇异向量来求得。
那么在求得了 n 以后, d 可以通过代入种子点集的平均值 ,s(它代表属于地面的点) 直接求得。整个平面模型计算代码如下:
/* @brief The function to estimate plane model. The model parameter `normal_` and `d_`, and `th_dist_d_` is set here. The main step is performed SVD(UAV) on covariance matrix. Taking the sigular vector in U matrix according to the smallest sigular value in A, as the `normal_`. `d_` is then calculated according to mean ground points. @param g_ground_pc:global ground pointcloud ptr. */ void PlaneGroundFilter::estimate_plane_(void) { // Create covarian matrix in single pass. // TODO: compare the efficiency. Eigen::Matrix3f cov; Eigen::Vector4f pc_mean; pcl::computeMeanAndCovarianceMatrix(*g_ground_pc, cov, pc_mean); // Singular Value Decomposition: SVD JacobiSVD svd(cov, Eigen::DecompositionOptions::ComputeFullU); // use the least singular vector as normal normal_ = (svd.matrixU().col(2)); // mean ground seeds value Eigen::Vector3f seeds_mean = pc_mean.head(); // according to normal.T*[x,y,z] = -d d_ = -(normal_.transpose() * seeds_mean)(0, 0); // set distance threhold to `th_dist - d` th_dist_d_ = th_dist_ - d_; // return the equation parameters }
优化平面主循环
extract_initial_seeds_(laserCloudIn); g_ground_pc = g_seeds_pc; // Ground plane fitter mainloop for (int i = 0; i clear(); g_not_ground_pc->clear(); //pointcloud to matrix MatrixXf points(laserCloudIn_org.points.size(), 3); int j = 0; for (auto p : laserCloudIn_org.points) { points.row(j++) points.push_back(laserCloudIn_org[r]); } } }
得到这个初始的平面模型以后,我们会计算点云中每一个点到该平面的正交投影的距离,即 points * normal_,并且将这个距离与设定的阈值(即th_dist_d_) 比较,当高度差小于此阈值,我们认为该点属于地面,当高度差大于此阈值,则为非地面点。经过分类以后的所有地面点被当作下一次迭代的种子点集,迭代优化。
02 基于雷达数据本身特点的方法-Ray Ground Filter
代码
https://www.php.cn/link/a8d3b1e36a14da038a06f675d1693dd8
算法思想
Ray Ground Filter算法的核心是以射线(Ray)的形式来组织点云。将点云的 (x, y, z)三维空间降到(x,y)平面来看,计算每一个点到车辆x正方向的平面夹角 θ, 对360度进行微分,分成若干等份,每一份的角度为0.2度。
激光线束等间隔划分示意图(通常以激光雷达角度分辨率划分)
同一角度范围内激光线束在水平面的投影以及在Z轴方向的高度折线示意图
为了方便对同一角度的线束进行处理,要将原来直角坐标系的点云转换成柱坐标描述的点云数据结构。对同一夹角的线束上的点按照半径的大小进行排序,通过前后两点的坡度是否大于我们事先设定的坡度阈值,从而判断点是否为地面点。
线激光线束纵截面与俯视示意图(n=4)
通过如下公式转换成柱坐标的形式:
转换成柱坐标的公式
radius表示点到lidar的水平距离(半径),theta是点相对于车头正方向(即x方向)的夹角。对点云进行水平角度微分之后,可得到1800条射线,将这些射线中的点按照距离的远近进行排序。通过两个坡度阈值以及当前点的半径求得高度阈值,通过判断当前点的高度(即点的z值)是否在地面加减高度阈值范围内来判断当前点是为地面。
伪代码
伪代码
- local_max_slope_ :设定的同条射线上邻近两点的坡度阈值。
- general_max_slope_ :整个地面的坡度阈值
遍历1800条射线,对于每一条射线进行如下操作:
1.计算当前点和上一个点的水平距离pointdistance
2.根据local_max_slope_和pointdistance计算当前的坡度差阈值height_threshold
3.根据general_max_slope_和当前点的水平距离计算整个地面的高度差阈值general_height_threshold
4.若当前点的z坐标小于前一个点的z坐标加height_threshold并大于前一个点的z坐标减去height_threshold:
5.若当前点z坐标小于雷达安装高度减去general_height_threshold并且大于相加,认为是地面点
6.否则:是非地面点。
7.若pointdistance满足阈值并且前点的z坐标小于雷达安装高度减去height_threshold并大于雷达安装高度加上height_threshold,认为是地面点。
/*! * * @param[in] in_cloud Input Point Cloud to be organized in radial segments * @param[out] out_organized_points Custom Point Cloud filled with XYZRTZColor data * @param[out] out_radial_divided_indices Indices of the points in the original cloud for each radial segment * @param[out] out_radial_ordered_clouds Vector of Points Clouds, each element will contain the points ordered */ void PclTestCore::XYZI_to_RTZColor(const pcl::PointCloud::Ptr in_cloud, PointCloudXYZIRTColor &out_organized_points, std::vector &out_radial_divided_indices, std::vector &out_radial_ordered_clouds) { out_organized_points.resize(in_cloud->points.size()); out_radial_divided_indices.clear(); out_radial_divided_indices.resize(radial_dividers_num_); out_radial_ordered_clouds.resize(radial_dividers_num_); for (size_t i = 0; i points.size(); i++) { PointXYZIRTColor new_point; //计算radius和theta //方便转到柱坐标下。 auto radius = (float)sqrt( in_cloud->points[i].x * in_cloud->points[i].x + in_cloud->points[i].y * in_cloud->points[i].y); auto theta = (float)atan2(in_cloud->points[i].y, in_cloud->points[i].x) * 180 / M_PI; if (theta points[i]; new_point.radius = radius; new_point.theta = theta; new_point.radial_div = radial_div; new_point.concentric_div = concentric_div; new_point.original_index = i; out_organized_points[i] = new_point; //radial divisions更加角度的微分组织射线 out_radial_divided_indices[radial_div].indices.push_back(i); out_radial_ordered_clouds[radial_div].push_back(new_point); } //end for //将同一根射线上的点按照半径(距离)排序 #pragma omp for for (size_t i = 0; i
03 基于雷达数据本身特点的方法-urban road filter
原文
Real-Time LIDAR-Based Urban Road and Sidewalk Detection for Autonomous Vehicles
代码
https://www.php.cn/link/305fa4e2c0e76dd586553d64c975a626
z_zero_method
z_zero_method
首先将数据组织成[channels][thetas]
对于每一条线,对角度进行排序
- 以当前点p为中心,向左选k个点,向右选k个点
- 分别计算左边及右边k个点与当前点在x和y方向差值的均值
- 同时计算左边及右边k个点的最大z值max1及max2
- 根据余弦定理求解余弦角
如果余弦角度满足阈值且max1减去p.z满足阈值或max2减去p.z满足阈值且max2-max1满足阈值,认为此点为障碍物,否则就认为是地面点。
x_zero_method
X-zero和Z-zero方法可以找到避开测量的X和Z分量的人行道,X-zero和Z-zero方法都考虑了体素的通道数,因此激光雷达必须与路面平面不平行,这是上述两种算法以及整个城市道路滤波方法的已知局限性。X-zero方法去除了X方向的值,使用柱坐标代替。
x_zero_method
首先将数据组织成[channels][thetas]
對於每一條線,對角度進行排序
- 以當前點p為中心,向右選第k/2個點p1和第k個點p2
- 分別計算p及p1、p1及p2、p及p2間z方向的距離
- 依據餘弦定理求解餘弦角
#如果餘弦角度滿足閾值且p1.z-p.z滿足閾值或p1.z-p2.z滿足閾值且p.z-p2.z滿足閾值,認為此點為障礙物
star_search_method
該方法將點雲劃分為矩形段,這些形狀的組合像一顆星;這就是名字的來源,從每個路段提取可能的人行道起點,其中創建的演算法對基於Z座標的高度變化不敏感,這意味著在實踐中,即使當雷射雷達相對於路面平面傾斜時,該演算法也會表現良好,在柱座標系中處理點雲。
具體實作:
#star_search_method
######################################################以上是「深度解析」:探究自動駕駛中的光達點雲分割演算法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

寫在前面&筆者的個人理解三維Gaussiansplatting(3DGS)是近年來在顯式輻射場和電腦圖形學領域出現的一種變革性技術。這種創新方法的特點是使用了數百萬個3D高斯,這與神經輻射場(NeRF)方法有很大的不同,後者主要使用隱式的基於座標的模型將空間座標映射到像素值。 3DGS憑藉其明確的場景表示和可微分的渲染演算法,不僅保證了即時渲染能力,而且引入了前所未有的控制和場景編輯水平。這將3DGS定位為下一代3D重建和表示的潛在遊戲規則改變者。為此我們首次系統性地概述了3DGS領域的最新發展與關

昨天面試被問到了是否做過長尾相關的問題,所以就想著簡單總結一下。自動駕駛長尾問題是指自動駕駛汽車中的邊緣情況,即發生機率較低的可能場景。感知的長尾問題是目前限制單車智慧自動駕駛車輛運行設計域的主要原因之一。自動駕駛的底層架構和大部分技術問題已經解決,剩下的5%的長尾問題,逐漸成了限制自動駕駛發展的關鍵。這些問題包括各種零碎的場景、極端的情況和無法預測的人類行為。自動駕駛中的邊緣場景"長尾"是指自動駕駛汽車(AV)中的邊緣情況,邊緣情況是發生機率較低的可能場景。這些罕見的事件

0.寫在前面&&個人理解自動駕駛系統依賴先進的感知、決策和控制技術,透過使用各種感測器(如相機、光達、雷達等)來感知周圍環境,並利用演算法和模型進行即時分析和決策。這使得車輛能夠識別道路標誌、檢測和追蹤其他車輛、預測行人行為等,從而安全地操作和適應複雜的交通環境。這項技術目前引起了廣泛的關注,並認為是未來交通領域的重要發展領域之一。但是,讓自動駕駛變得困難的是弄清楚如何讓汽車了解周圍發生的事情。這需要自動駕駛系統中的三維物體偵測演算法可以準確地感知和描述周圍環境中的物體,包括它們的位置、

一先導與重點文章主要介紹自動駕駛技術中幾種常用的座標系統,以及他們之間如何完成關聯與轉換,最終建構出統一的環境模型。這裡重點理解自車到相機剛體轉換(外參),相機到影像轉換(內參),影像到像素有單位轉換。 3d向2d轉換會有對應的畸變,平移等。重點:自車座標系相機機體座標系需要被重寫的是:平面座標系像素座標系難點:要考慮影像畸變,去畸變和加畸變都是在像平面上去補償二簡介視覺系統一共有四個座標系:像素平面座標系(u,v)、影像座標系(x,y)、相機座標系()與世界座標系()。每種座標系之間均有聯繫,

軌跡預測在自動駕駛中承擔著重要的角色,自動駕駛軌跡預測是指透過分析車輛行駛過程中的各種數據,預測車輛未來的行駛軌跡。作為自動駕駛的核心模組,軌跡預測的品質對於下游的規劃控制至關重要。軌跡預測任務技術堆疊豐富,需熟悉自動駕駛動/靜態感知、高精地圖、車道線、神經網路架構(CNN&GNN&Transformer)技能等,入門難度很高!許多粉絲期望能夠盡快上手軌跡預測,少踩坑,今天就為大家盤點下軌跡預測常見的一些問題和入門學習方法!入門相關知識1.預習的論文有沒有切入順序? A:先看survey,p

原文標題:SIMPL:ASimpleandEfficientMulti-agentMotionPredictionBaselineforAutonomousDriving論文連結:https://arxiv.org/pdf/2402.02519.pdf程式碼連結:https://github.com/HKUST-Aerial-Robotics/SIMPLobotics單位論文想法:本文提出了一種用於自動駕駛車輛的簡單且有效率的運動預測基線(SIMPL)。與傳統的以代理為中心(agent-cent

寫在前面&出發點端到端的範式使用統一的框架在自動駕駛系統中實現多任務。儘管這種範式具有簡單性和清晰性,但端到端的自動駕駛方法在子任務上的表現仍然遠遠落後於單任務方法。同時,先前端到端方法中廣泛使用的密集鳥瞰圖(BEV)特徵使得擴展到更多模態或任務變得困難。這裡提出了一種稀疏查找為中心的端到端自動駕駛範式(SparseAD),其中稀疏查找完全代表整個駕駛場景,包括空間、時間和任務,無需任何密集的BEV表示。具體來說,設計了一個統一的稀疏架構,用於包括檢測、追蹤和線上地圖繪製在內的任務感知。此外,重

最近一個月由於眾所周知的一些原因,非常密集地和業界的各種老師同學進行了交流。交流中必不可免的一個話題自然是端到端與火辣的特斯拉FSDV12。想藉此機會,整理當下這個時刻的一些想法和觀點,供大家參考和討論。如何定義端到端的自動駕駛系統,應該期望端到端解決什麼問題?依照最傳統的定義,端到端的系統指的是一套系統,輸入感測器的原始訊息,直接輸出任務關心的變數。例如,在影像辨識中,CNN相對於傳統的特徵提取器+分類器的方法就可以稱之為端到端。在自動駕駛任務中,輸入各種感測器的資料(相機/LiDAR
