Navigation幹了啥?

分三大塊來理解,costmap,globalplanner,baselocalplanner

1.costMap
在costmap這一模塊上面,首先就提出了分層
如果是一整張圖,那麼我們對圖的任何修改都會在它上面完成。實際上當信息量太多的時候,很有可能我們並不想總是一次性更新所有的圖。具體論文Lu, Hershberger, Smart - 2014 - Layered costmaps for context-sensitive navigation
如果是普通來講,大致是分爲static layer,inflation layer obstacle layer

1.1 static layer
名字上叫做靜態層。其實對這一層的理解上,可以叫做initial layer, 這一層所包含的信息,也就是costmap初始化的時候所包含的信息。

1.2inflation layer
可以想象一下,我們的機器人肯定是有一定體積的,也就是說,在空間中運動的時候我們並不能把它看做是一個點。那麼它怎麼避免去與障礙物相撞呢。這一層就是實現一個反向思考的辦法,將障礙物全部膨脹,那麼之後我們就可以把有一定體積的機器人看做是一個點的運動了
下圖是對costmap代價值的一個解釋,下面紅色框的是一個五邊形的移動小車。那麼把所有的障礙物都膨脹它的外切半徑(circumscribed radius)那麼大,就可以保證小車不會與障礙物相撞了。
在這裏插入圖片描述
整個代價地圖中,我們都會給每一個格子分配一個值,取值爲下列幾個
255 代表 未知區域
254 代表 障礙物
253 代表 小車會和障礙物衝突
128 代表 小車可能會衝突也可能不會,根據朝向決定
0 – 128 代表 不衝突

1.3 obstacle layer
用標記清除的辦法,更新障礙物的實時位置

2.globalplanner
這裏要明確一點的是,全局規劃器globalplanner計算起點終點路徑,局部規劃器localplanner根據之前生成的路徑,計算移動機器人的運動速度。
navigation包裏面globalplanner用了dijkstra和A兩種算法,任選一種都可以。這一點ros wiki上面可以看到他們的具體差別。
另外還有一些其他的算法可以使用的,包括D
算法,在網上可以找到其他人的實現。
這裏還有一個點直接注意的是,在navigation包裏面move_base的實現裏面,是添加了動態規劃的,也就是在小車的移動過程中,globalplanner也是有個線程一直在計算當前位置到終點的路徑。在這裏是我覺得奇怪的地方,本來就有D這樣的算法可以實現動態規劃,可是navigation並沒有採用這種方法,而且啓動了一個線程,在移動過程中對路徑不斷的進行重新規劃。不過這種方法有個優點,在不妨礙原有實現上(也就是dijkstra和A 尋路上) 添加了動態規劃

3.localplanner
提供了兩種實現,trajectorylocalplanner和DWAlocalplanner
對於全向機器人來說,也就是存在x方向的速度,y方向的速度,和角速度。DWA確實效率高一點。但是如果是非全向機器人,比如說只存在角速度和線速度。trajectorylocalplanner會更適用一點。

最後
用一些仿真的方法把navigation包跑起來也很重要。我比較推薦的是2D的stage這個模擬。github 這個目錄下面的navigation_stage是可以直接跑起來的。比起其他一些辦法,這個算是很快捷的了。

轉載自:Navigation包解析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章