ros navigation stack 各個包的作用


nav_core

該包定義了整個導航系統關鍵包的接口函數,包括base_global_planner, base_local_planner以及recovery_behavior的接口。
里面的函數全是虛函數,所以該包只是起到規范接口的作用,真正功能的
實現在相應的包當中。

global_planner和navfn

這兩個包干的事情是一樣的,都是為實現目標點與當前點之間的全局路徑規划,內部都有Dijkstra算法和A*導航算法的實現,
ROS系統默認采用的是navfn。

base_local_planner

完成局部窗口內的路徑規划任務,機器人行動速度的具體生成在此包當中完成。目前有兩種局部路徑規划算法實現,
一是航跡推算法(TrajectoryROS),一是動態窗口法(DWA),
該包內部的默認實現是航跡推算法,但是留出了DWA的定義接口,DWA的實現在dwa_local_planner中。

map_server

主要功能是讀取pgm和yaml配套的地圖文件,並將之轉換到/map話題發送出來(比如rviz中顯示的地圖就是訂閱了該話題), 
另外還提供地圖保存等增值服務 。

costmap_2d

以層的概念來組織圖層,用戶可以根據需要自己配置,默認的層有static_layer(通過訂閱map_server的/map主題)來生成, 
obstacle_layer根據傳感器獲得的反饋來生成障礙物圖層, inflation_layer則是將前兩個圖層的信息綜合進行緩沖區擴展。
該包可進行動態窗口的生成(比如base_local_planner中使用的就是動態的局部窗口地圖)也可以生成靜態地圖
(比如global_planner中使用的就是全局靜態地圖)。(有待驗證的疑問,是否靜態地圖中obstacle_layer不起作用,而動態地圖中static_layer不起作用)。
此外,該包還在實時發送自己的地圖信息,通過nav_msgs::OccupancyGrid發送消息給rviz。所以可以仿照該寫法來發送自己想要的數據到rviz中去。

rotate_recovery和clear_costmap_recovery

這兩個包都繼承自nav_core中定義的recovery_behavior類, 具體實現的是當導航發現無路可走的時候,
機器人在原地打轉轉並清理(更新更恰當些)周圍障礙物信息看是否有動態障礙物運動開,
能找到路繼續走。在move_base當中,默認使用的recovery_behavior是這樣的,先進行一次旋轉,然后進行一次小半徑的障礙物更新,然后再進行一次旋轉,
再進行一次大范圍的障礙物更新,每進行一次recovery_behavior,都會重新嘗試進行一次局部尋路,如果沒找到,
才會再執行下一個recovery_behavior。這兩個包的代碼非常簡單,不看也不會影響理解偏差,
所以可以不用浪費時間看,當然因為簡單要看也是分分鍾的事。

move_base

這個是整個navigation stack當中進行宏觀調控的看得見的手。
它主要干的事情是這樣的: 維護一張全局地圖(基本上是不會更新的,一般是靜態costmap類型),維護一張局部地圖(實時更新,costmap類型),
維護一個全局路徑規划器global_planner完成全局路徑規划的任務, 維護一個局部路徑規划器base_local_planner完成局部路徑規划的任務。
然后提供一個對外的服務,負責監聽nav_msgs::goal類型的消息,然后調動全局規划器規划全局路徑,再將全局路徑送進局部規划器,
局部規划器結合周圍障礙信息(從其維護的costmap中查詢),全局路徑信息,目標點信息采樣速度並評分獲得最高得分的軌跡(即是采樣的最佳速度),
然后返回速度值,由move_base發送Twist類型的cmd_vel消息上,從而控制機器人移動。完成導航任務。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM