pretty code

2022年11月22日 星期二

PCL 點雲踩坑紀錄

連續好幾個月都在碰點雲,看到點雲都快吐了,但暫時應該還是脫離不了它。

剛好很久沒更新 Blog 了,藉此機會記錄一下最近遇到的坑。

01. pcl::PolygonMesh

為了模組化 code,我們應該會常常把東西拆解成函數,昨天為了重覆利用此變數並透過 reference 傳進函數中,當在這個函數中重覆使用它去載入 Mesh 檔案,之後再去使用這個變數便會觸發異常。

當異常時有時候會跳出 VC 視窗,有時候又不會,目前看過兩種不同的錯誤,一個是類似操作 Heap 錯誤,一個是操作 vector 錯誤,有抓到的視窗如下。


雖然不知道如何解決?但應該是跟資源沒有清除乾淨誤存取有關?不看 PCL Code 的情況下看了一下文件,剛好裡面有一個 Public member polygons,它本身就是一個 vector,試著清除它後,這個問題便不再發生。

解決方式:mesh.polygons.clear()

後記:這個問題的奇怪點只有當傳 mesh 的參照進去函數並重複使用才會發生問題,區域變數重複使用不會有問題,跟參照有關?可惜本人 C++ 很弱,想不到錯誤的發生原因。

02. pcl::PassThrough

一樣是為了重覆利用變數才發生問題,但這就跟 PCL 本身無關,純粹是 Coding issue XD

簡單來說,在做點雲時,時常要將點雲不要的東西切掉,故很常用到這個 Filter,但有時候我們要的是選到的範圍以外的,故我們會 call pass.setNegative(true),但你重覆使用這個變數繼續再割另一個點雲時,這個值已經被設為 true,故會變成跟你要的範圍相反。

這個沒注意還真不容易看到錯誤,尤其是在做了好幾十次切割後,看 Code 都看到懷疑人生了。

解決方式:每次重複利用變數時,開頭一定要 call pass.setNegative(XXX),將它設成你要的設定。

沒有留言: