在基於激光的自動駕駛或者移動機器人的應用中,在移動場景中提取單個對象的能力是十分重要的。由於這樣的系統須要在動態的感知環境中感知到周圍發生變化或者移動的對象,在感知系統中,將圖像或者點雲數據預處理成單個物體是進行進一步分析的第一個步驟。git
在這篇文章中就提出了一種十分高效的分割方法。首先是將掃描到的點雲移除平面處理,而後移除平面後必定範圍內的點雲數據分割成不一樣的對象。該論文的是集中解決了在很小的計算量的條件下,可以在大多數系統上作到高效的分割。避免了直接對3D點雲的計算,並直接在2.5D 的深度圖像上進行操做。此方案可以很好的解決處理稀疏的3D點雲數據。做者使用了新型Velodyne VLP-16掃描儀,而且代碼是在C++和ROS中實現了這種方法,而且代碼是開源的,這種方法能夠作到使用單核CPU以及高於傳感器的幀運行速率運行,可以產生高質量的分割結果。github
左圖:使用Velodyne VLP-16掃描儀獲得的稀疏3D點雲數據分割後生成的對象(如人,車和樹)。 不一樣的顏色對應不一樣的分割結果。 右:用於實驗的Clearpath Husky機器人。算法
在3D激光點雲數據中分離單個對象是移動機器人或自動駕駛車輛自主導航的重要任務。 在未知環境中航行的自動駕駛車輛面臨着對其周圍環境進行推理的複雜任務。,在擁有汽車和行人的繁忙街道上,地圖可能受到環境動態性質致使的錯誤數據關聯的影響。 在掃描配準和映射過程當中,可以更好地推理此類對象並忽略可能的動態對象的關鍵步驟是將3D點雲數據分割爲不一樣的對象,以即可以單獨跟蹤它們數組
因此本論文很重要的貢獻是將實現快讀高效且穩健的3D稀疏點雲的分割。(本人親自測試,真的很快,個人電腦的配置真的很菜,可是運行起來都超快)在移動的CPU上均可以處理超過70HZ(64線)或者250HZ的(16線)的Velodyne傳感器。微信
地面去除 測試
在進行分割以前,須要從掃描的點雲數據中移除地面。這種地面移除的方法,只是把低於車輛高度的3D點移除。這種方法在簡單的場景中起做用,可是若是在車輛的俯仰或者側傾角不等於零或者地面不是完美的平面。則會失敗。可是可使用RANSAC的平面擬合的方法改善狀況。spa
激光雷達的會提供每一個激光束的距離值,時間戳以及光束的方向做爲原始數據。這使得咱們能夠直接將數據轉換爲深度圖像。圖像中的行數由垂直方向上的光束的數量定義,好比對於Velodyne掃描儀,有16線,32線以及64線,而圖像的列數有激光每360度旋轉獲得的距離值。這種虛像的每一個像素存儲了傳感器到物體之間的距離,爲了加速計算甚至能夠考慮在須要時將水平方向上的多個讀數組合成一個像素。3d
左上角:深度圖像的一部分。 左中:經過顯示α角度生成的圖像。 左下:應用Savitsky-Golay平滑後的角度。orm
右上角:α角的圖示。 右下圖:左圖中標記的α角度列的平滑圖示。視頻
使用上述生成的和成圖像來處理而不是直接處理計算3D點雲,能夠有效的加速處理速度,對於其餘的不提供距離值的掃描儀也能夠將3D點雲投影到圓柱圖像上,計算每一個像素的歐幾里得距離,仍然可使用該論文提出的方法。
爲了識別地面,這裏面有三個假設:
1, 假設傳感器是大體安裝在水平移動基座上。
2, 假設地面的曲率很低。
3, 移動機器人或者車輛至少在深度圖像上最低行的像素觀測地平面
在假設成立的條件下,首先將深度圖像的每一列(c)像素的距離值(R)轉化爲角度值 這些角度表示了鏈接兩點的傾斜角度。
和
分別表明在該行相鄰的深度值。知道連續垂直的兩個單個激光束深度值,可使用三角規則計算角度α,以下所示:
其中ξa和ξb是對應於行r-1和r的激光束的垂直角,因爲每一個α計算須要兩個深度值,因此生成的角度圖大小比深度圖範圍的行數小1.這裏假設吧這些全部的角度表示爲,表示爲在r行和c列(行和列)座標上的角度值。
地面識別算法。
根據上述算法得出的地面,地面標記爲淺藍色。
可是因爲激光雷達也是有偏差點的,因此這裏也是須要處理一些在深度範圍內的離羣點,具體可查看論文。爲了達到角度平滑的效果使用了Savitsky-Golay濾波算法對每個列進行處理。在獲得濾波後的角度圖後,在這個基礎上開始執行地面識別,使用了廣度優先搜索將類似的點標記在一塊兒,廣度優先搜索(Breadth-first search BFS) 是一種流行的圖搜索遍歷算法,他從圖給定的點開始遍歷,並在移動到下一級令居以前首先開始探索直接相鄰的節點,在該論文中使用了網格上的N4領域值計算角度差值,以肯定矩陣M的兩個相鄰元素是否知足角度上的約束條件Δa,設置爲5°。
使用激光深度圖像進行快速有效的分割
傳感器的垂直分辨率對分割問題的難度是有着十分重要的影響的,咱們須要判斷對於相鄰點,去判斷該激光束是不是被同一物體反射。爲了解決激光是不是同一個物體反射的問題,這裏是基於角度測量的方法。這種方法的好處是文中反覆說起屢次這種方法的優勢 :首先,咱們能夠直接在深度圖像中利用明肯定義的鄰域關係,這使得分割問題更容易。 其次,咱們避免生成3D點雲,這使得總體方法的計算速度更快。
在下圖中展現了分割的效果
這是使用該分割方案的結果,(A)圖是來自Velodynede 點雲,(B)根據傳感器的原始值建立的深度圖像,而且已經將地面點去除了。(C)圖是在生成的深度圖的基礎上執行的分割結果。(D)將分割後的深度圖還原爲點雲,並以不一樣的顏色顯示。
這裏詳細的解釋一下關於若是使用角度約束的方法實現分割的:
以下圖所示的一個示例場景,其中兩我的在騎自行車者前面彼此靠近地行走,騎自行車者在他們和停放的汽車之間通過。 這裏使用的Velodyne VLP-16掃描儀記錄了這個場景。 中間的圖像展現出了從位於O處的掃描儀測量的兩個任意點A和B的結果,表示出了激光束OA和OB。 在不失通常性的狀況下,咱們假設A和B的座標位於以O爲中心的座標系中,y軸沿着兩個激光束中較長的那一個。 咱們將角度β定義爲激光束與鏈接A和B的線之間的角度,該角度通常是遠離掃描儀。 在實踐中,角度β證實是有價值的信息,能夠用來肯定點A和B是否位於同一物體上。
那麼基於激光的測量值咱們是知道第一次測量的距離值OA以及對應的第二次測量值OB,分別將這兩次的測量結果標記爲d1和d2,那麼利用以上信息既能夠用下列公式測量角度:
下列圖中的右圖示出了從場景的俯視圖中在xy平面中的計算。 注意,咱們能夠計算在範圍圖像中在行或列方向上相鄰的點A和B對的角度β。 在第一種狀況下,角度對應於行方向上的角度增量,而另外一種狀況下對應於列方向上的增量。
左:示例場景有兩個行人,一個騎自行車者和一輛汽車。 中間:假設傳感器在O點而且線OA和OB表示兩個激光束,則點A和B產生一條線,該線估計對象的表面,若是它們都屬於同一對象。 咱們基於角度β作出是否爲同一物體的判斷。 若是β>θ,其中θ是預約閾值,認爲這些點表明一個對象。 右圖:示例場景中行人的俯視圖。 綠線表示β>θ的點,而紅線表示低於閾值的角度,所以將對象標記爲不一樣。
基於閾值的β的分割方法在實驗評估中進行實驗,實際狀況能夠是被掃描物體是平面的狀況,例如牆壁,而且幾乎平行於激光束方向。在這種狀況下,角度β將很小,所以物體可能被分紅多個區段。這基本上意味着若是β小於θ,則難以肯定兩個點是否源自兩個不一樣的物體,或者僅僅位於幾乎平行於波束方向的平面物體上。然而,儘管有這個缺點,咱們的實驗代表該方法在實踐中仍然有用。上述行爲不多發生,若是是這樣,它一般將會致使特別傾斜的平面物體的過分分割。
以上就是關於去地面後使用的分割算法。能夠看得出最重要的一個公式就是β角度值的求解
實驗部分
該算法
(i)全部計算均可以快速執行,即便在大約70 Hz的移動CPU的單核上運行,
(ii)能夠 將移動機器人得到3D原始數據生成深度數據並分段爲有意義的個體
(iii)該方法在稀疏數據上表現良好,例如從16光束Velodyne Puck掃描儀得到的稀疏數據。 在實驗中中,使用點雲庫PCL中來實現的歐幾里德聚類。 在全部實驗中,咱們使用默認參數θ= 10°。
代碼開源(https://github.com/PRBonn/depth_clustering),且小編親自測試,並附上測試視頻,有興趣者關注微信公衆號,
並能夠推薦有價值的您以爲比較好的與點雲相關的代碼或者論文,發送到羣主郵箱(dianyunpcl163.com),如此能夠一塊兒交流討論!!
有興趣的小夥伴能夠關注微信公衆號,加入QQ或者微信羣,和你們一塊兒交流分享吧(該羣主要是與點雲三維視覺相關的交流分享羣,歡迎你們加入並分享)