ROS導航包的介紹


博客轉載自:https://blog.csdn.net/handsome_for_kill/article/details/53130707#t3

ROS導航包的應用

利用ROS Navigation功能包集跑通基於rplidar 的slam

開發環境

Ubuntu14.04+ROS indigo 
Navigation stack:amcl | base_local_planner | carrot_planner | clear_costmap_recovery | costmap_2d | dwa_local_planner | fake_localization | global_planner | map_server | move_base | move_base_msgs | move_slow_and_clear | nav_core | navfn | robot_pose_ekf | rotate_recovery | voxel_grid

這是2D的導航功能包集,通過接收里程計數據、tf坐標變換樹以及傳感器數據,為移動機器人輸出目標位置以及安全速度。概念層面上講,導航功能包集是相當簡單的。 它從里程計和傳感器數據流獲取信息,並將速度命令發送給移動基站(比如你的機器人)。但是,想要在任意機器人上使用導航功能包集可能有點復雜。使用導航功能包集的先決條件是,機器人必須運行ROS,有一個tf變換樹,使用正確的ROS Message types發布傳感器數據。而且,我們需要在高層為一個具有一定形狀和動力學特點的機器人配置導航功能包集。

acml:是一個針對在二維移動的機器人的基於概率定位系統。它實現了自適應蒙特卡羅濾波的定位方法,並使用粒子濾波器去跟蹤在已知地圖中機器人的位置。

base_local_planner:這個包提供了Trajectory Rollout以及Dynamic Window兩種在2D平面局部導航的方法。通過提供一個跟隨的規划路徑和一個代價地圖,控制器生成速度指令並發送至機器人。它支持全向和非全向機器人,以及任何可以用多邊形或圓描述的機器人輪廓,並且可以在launch文件中設置這些參數。這個包已經被封裝好,可以通過nav_core包的BaseLocolPlanner接口來調用。

carrot_planner:這個規划器是一個簡單的全局規划器,可以通過nav_core::BaseGlobalPlanner 來進行調用,並且被move_base節點用作一個全局規划的插件。這個規划器從用戶處采集到一個目標點,之后檢查用戶指定的目標點是否是障礙物,如果是的話沿着robot與目標點構成的向量向后退,直到找到一點沒有障礙物位置。之后它會將此目標點作為目標發送給局部規划器和控制器。這個規划器允許機器人盡可能到達離用戶指定的目標點最近的位置。

clear_costmap_recovery:為導航包提供了一種自救行為,試圖通過將代價地圖還原成已知區域外的靜態地圖從而清除出空間。

costmap_2d:通過激光或點雲的數據,投影到2D平面上,創建代價地圖,並可以設置膨脹半徑。

dwa_local_planner:局部規划器,提供動態窗口方法( Dynamic Window Approach)在平面上局部導航。與base_local_planner類似。

fake_localization:提供了一個簡單節點fake_localization node,可以代替一個定位系統,並提供了acml包的ROS API的子集。由於較低的計算量,這個節點非常頻繁的用於在仿真環境中提供完美的定位。這個節點將里程計數據轉換為位置、粒子雲,並以acml發布的數據格式發布。

global_planner:全局路徑規划節點。

map_server:將代價地圖作為ROS Service發布,提供了map_saver節點,可以通過命令行存儲地圖。

move_base:提供了action動作的實現(actionlib包),即給定一個世界系下的目標位置,機器人會試圖移動到該位置。另外,move_base節點中包含了兩個代價地圖(全局、局部),以及一個全局規划器和一個局部規划器,以便實現導航任務。

move_base_msgs: 通過MoveBase.action文件定義產生的消息文件,用於actionlib與move_base的通信。

move_slow_and_clear:為robot提供一種自救行為,即清除代價地圖的信息並限制機器人速度,但這不絕對安全,robot可能會撞到某些障礙。但這是唯一一種可以與允許最大速度動態設置的局部規划器兼容的自救行為。

nav_core:為robot實現導航任務提供了通用的接口,包括BaseGlobalPlanner,BaseLocalPlanner,, RecoveryBehavior interfaces等,這有利於方便的更新規划器或者自救行為的版本。

navfn:全局規划器,提供了一個快速插值的函數,可以在起始點到目標點之間快速插值,並找到代價最小的一條路徑。

robot_pose_ekf:這個包用於估計robot的三維位置,利用擴展卡爾曼濾波的方法,建立了一個六維模型,聯合了輪子里程計、IMU、視覺里程計的數據。

rotate_recovery:提供了一種自救行為,通過旋轉360度來清除空間。

voxel_grid:提供一個有效的三維體素網格的實現。

導航框架

這幅圖描述了使用Navigation導航包的一個整體框架,其核心是move_base節點,包含了global_planner、local_planner、global_costmap、local_costmap、recovery_behaviors五個模塊,move_base節點訂閱tf(坐標系轉換)、odom(里程計數據)、map(地圖)、sensor datas(激光數據或點雲)以及goal等話題,之后發布cmd_vel話題。

tf:利用ROS的tf工具發布坐標系之間的轉換關系,包括:/map->/odom,/odom->/base_link,/base_link->/sensor等
odom:導航包需要用到里程計的數據,故需將其用tf工具和nav_msgs/Odometry消息發布出來
map:在導航前,最好可以提供一張全局的地圖,因此需要我們提前創建(但這不是必須的)
sensor data:用於避障,建圖等等,可以是激光雷達的平面數據或者是點雲數據(sensor_msgs/LaserScan or sensor_msgs/PointCloud )
goal:目標在全局地圖中的坐標,用geometry_msgs/PoseStamped消息格式發布

此外,move_base節點還提供了action動作的接口(即SimpleActionServer的實現,詳細可見actionlib包),包括訂閱了move_base/goal (move_base_msgs/MoveBaseActionGoal),move_base/cancel (actionlib_msgs/GoalID)兩個話題,並發布了move_base/feedback (move_base_msgs/MoveBaseActionFeedback)、move_base/status (actionlib_msgs/GoalStatusArray)、move_base/result (move_base_msgs/MoveBaseActionResult)等三個話題。因此用戶可以自己寫一個利用actionlib庫寫一個發布目標位置的節點。

在熟悉完整個導航框架后,我們就可以開始依次做好相應的准備工作了。需要的步驟如下: 
1、搭建一個移動平台,使其訂閱/cmd_vel話題,並發布odom里程計數據以及/odom->/base_link的tf數據?? 
2、將傳感器數據(激光數據或RGB-D點雲數據)發布出來 
3、創建地圖,利用slam_gmapping或hector_slam的方法 
4、配置Navigation包,進行導航 


免責聲明!

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



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