躺了一年多的動態環境下雷射定位的坑,忍不住來強答一發。標簽雖然是視覺SLAM,但不管雷射也好視覺也好,SLAM也好定位也好,都會面臨環境動態性問題。
環境中的物體通常可以分成三類:
-
靜態物體:長時間穩定不變的物體,如墻、柱子等。
-
半靜態物體:大部份時間是靜止的,但會在某個時刻發生變化。如時而開時而關的門,路邊的停車。
- 動態物體:移動的物體,如移動的行人、車輛。
通常的SLAM、定位演算法都是基於靜態環境假設的,也就是假設環境中都是第一類物體,顯然,現實環境中並不是這樣。不過,視覺中的RANSAC匹配,2D下的MCL等演算法都有一定的魯棒性,能夠適應少量的動態變化,所以只要第二、三類物體在環境中占的比重不大,那些基於靜態假設的演算法一般也還是work的。當然,動態環境的挑戰還是要直面的,特別是在計畫已經接了,發現現場環境全是二、三類物體,再說做不了已經晚了,必須得硬著頭皮上的情況下,o(╯□╰)o。
處理動態環境其實就是處理第二、三類物體,思路一般就兩種:要麽剔掉,要麽建模。通常的作法是:
1. 對於第三類物體,直接當做outlier剔掉。因為這類物體在連續觀測幀中是移動的,所以先將相鄰幀進行匹配,得到匹配關系R,t,再將不滿足匹配關系的關聯對當做outlier剔除,影像中可以用RANSAC,雷射幀可以ICP。值得註意的是,新出現在視野中的點,也無法與歷史幀關聯,但不應該被當成outlier,可以先透過視野判斷,將新出現在視野中的點抽離出來,剩下的再去剔outlier。但在一些情況仍然有問題,這些極端情況目前也沒有太好的解決方法(也可能是我了解的太少,大家如果有思路,歡迎交流。)
2. 對於第二類物體,一般是環境發生的變換,所以需要把這些變化建模、更新到地圖當中,也就是動態地圖更新。在2D-SLAM中,如果用的柵格地圖,環境變化後可以根據新的觀測對柵格地圖的值進行更新(如Gmapping),更厲害的就是直接構建動態地圖模型,比如對每個柵格用HMM構建動態模型。Graph-SLAM中,因為存的是一些關鍵幀或者點雲,所以當發現環境變化時,需要找到歷史的那幾幀過期的關鍵幀剔掉。VSLAM了解的不是太多,特征點地圖、關鍵幀地圖一般也是可以更新的吧。地圖更新會來帶的一個新的問題在它依賴於定位或匹配的穩定性和精度,如果匹配失敗,地圖可能會被錯誤的更新,當地圖被錯誤更新後,在錯誤地圖上的定位出的位置就也有可能是錯的,進而地圖進一步被錯誤更新,惡性叠代...雖然最後也能形成一張新的地圖,老的地圖被完全覆蓋掉了,但是對於導航而言,之前在老地圖上的導航目標點等沒有被更新,新的地圖已經無法再進行導航了。
動態環境問題對SLAM或定位來說,仍然沒有很好的解決方案。所以現在一般透過多傳感器融合來規避這些問題,像雷射、視覺、慣導裏程等,因為通常環境變化不會對所有傳感器產生影響,實在不行,還有慣導可以起作用。另外,有一種比較新的思路是拋棄全域SLAM,不再建模全域地圖,而是進行相對SLAM,因為對機器人來說SLAM的目的還是用來導航,導航只關心機器人能夠準確的移動到環境中的某個位置,並不關心地圖是不是有誤差,所以只需要構建一張位姿的拓撲圖,機器人沿著拓撲路徑就可以導航到某個點。