想象我們要去某個地方游玩,你是不是會先在腦海中勾勒出一條路線,然后出發前往這個地方?
人類的導航如此,那對于機器人來講,該如何實現導航功能呢?
1.機器人自主導航
我們先來理清自主導航的框架,其關鍵是自主定位和路徑規劃。針對這兩個核心功能,ROS提供了一套完整的框架支持,收到導航目標位置后,機器人只需要發布必要的傳感器信息,框架中的功能包即可幫助機器人完成導航。
其中,move_base功能包實現機器人導航中的最優路徑規劃,amcl實現二維地圖中的機器人定位。
為了實現機器人全局最優路徑規劃與實時避障路徑規劃,move_base需要訂閱機器人發布的深度傳感器信息(sensor_msgs/LaserScan或 sensor_msgs/PointCloud)和里程計信息(nav_msgs/Odometry),同時完整的TF坐標變換也是實現路徑規劃的重要基礎。
導航框架最終的輸出是控制機器人的速度指令(geometry_msgs/Twist),這就要求機器人控制節點具備解析控制指令中線速度、角速度的能力,并且控制機器人完成相應的運動。
注:
導航框架所包含的功能包很多,可以直接使用如下命令安裝:
$ sudo apt-get install ros-melodic-navigation
2.機器人定位
導航功能的順利進行,離不開機器人的精準定位。自主定位即機器人在任意狀態下都可以推算出自己在地圖中所處的位置。ROS為開發者提供了一種自適蒙特卡羅定位方法(Adaptive Monte Carlo Localization,amcl),這是一種概率統計方法,針對已有地圖使用粒子濾波器跟蹤一個機器人的姿態。
給定初始位姿后,AMCL會在機器人周圍隨機撒一些粒子,隨著機器人的運動,每個粒子也會實時跟隨機器人的速度更新位姿,當粒子周邊的環境狀態與機器人差距較大時,就會被逐漸淘汰,反之,則會在機器人周邊產生更多粒子。以此類推,粒子都集中在機器人所在位置可能性高的地方,也就是定位的結果。
為了調教以上粒子濾波算法,AMCL功能包中可配置的參數很多,一般初次上手不建議,只需要注意訂閱和發布的話題名匹配即可,感興趣的小伙伴可以在官網(http://wiki.ros.org/amcl)查看各個參數的詳細介紹,相關的理論算法請參考《概率機器人》一書。
3.機器人路徑規劃
機器人知道自己的位置后,如何像人一樣根據自己的經驗規劃出一條路徑來呢?move_base功能包就是負責這樣的功能,主要由全局路徑規劃器和本地實時規劃器(局部路徑規劃器)組成。
全局規劃就好比我們依靠經驗(或地圖數據)規劃點到點最優路徑的過程;局部規劃可以理解為去往目的地途中,不斷調整機器人姿態、躲避障礙物,以貼合最優路徑的過程。
全局路徑規劃常用Dijkstra算法和A*算法。Dijkstra算法深度優先,往往可以找到全局最優路徑,不過搜索時間長、消耗資源多,而A*算法加入了啟發函數,雖然不一定可以找到全局最優路徑,但搜索時間更快,適合大空間范圍的規劃。移動機器人大部分是在室內有限范圍內使用,兩者搜索時間和消耗資源的差距并不明顯,一般使用Dijkstra算法即可。
本地實時規劃常用Dynamic Window Approaches(DWA)和Time Elastic Band(TEB)算法,兩種算法的核心思想如下,具體算法實現大家可以在網上搜索相關的論文。
為了完成以上這些規劃器算法的配置,move_base功能包的啟動也需要配置不少參數,比如下圖所示的這些參數文件:
包含通用配置文件(costmap_common)、全局規劃配置文件(global_costmap)、本地規劃配置文件(local_costmap)、本地規劃器(planer)、路徑規劃算法(全局base_global_planner和局部base_local_planner)和控制頻率(controller_frequency)、規劃頻率(planner_frequency)等一些參數。這些參數的詳細介紹可以去官網(http://wiki.ros.org/move_base)查看。
4.代價地圖的配置
人在導航去某個地方的時候可以通過眼睛和經驗判斷哪里有墻、哪里有水坑、哪里能走和哪里不能走。機器人如何判斷呢?
move_base導航使用兩種代價地圖存儲周圍環境中的障礙信息:一種用于全局路徑規劃(global_costmap),一種用于本地實時路徑規劃(local_costmap)。兩種代價地圖需要使用一些共用的或獨立的配置文件:通用配置文件(costmap_common_params)、全局規劃配置文件(global_costmap_params)和本地規劃配置文件(local_costmap_params)。
通用配置文件costmap_common_params.yaml的代碼和關鍵參數的含義如下:
注意話題名不要設置錯了,footprint也需要根據實際機器人的大小進行設置。
全局規劃配置文件global_costmap_params.yaml的代碼和關鍵參數的含義如下:
由于我們這里是已經有地圖了,所以將static_map設置true。若我們想使用機器人探索未知的地方并且進行建圖的話,則將static_map設置為false。
本地規劃配置文件local_costmap_params.yaml的代碼和關鍵參數的含義如下:
其中width、height、resolution參數用于設置代價地圖的長(米)、高(米)和分辨率(米/格)。rolling_window參數用來設置在機器人移動過程中是否需要滾動窗口,以保持機器人處于中心位置。
既然導航的各個問題都已經梳理清楚,那么是否真的可以實現導航呢?以及在不同運動模態下,機器人的導航效果又會怎樣?接下來我們就用LIMO機器人試一試。
注:關于該機器人運動模態的配置與SLAM,請參考以下內容:
《 細數移動機器人那些常用的運動模態 》
《 如何在移動機器人中部署Gmapping SLAM算法 》
5. 差速移動機器人自主導航
打開機器人的啟動文件limo_start.launch,將use_mcnamu設置為false,如下圖所示。
局部規劃器選用的算法為TEB,由于相關參數比較多,這里就不一一展示和說明,若想了解每個參數,可以前往官網查看相關說明:http://wiki.ros.org/teb_local_planner
下面是一些參數的配置與介紹:
注意,當運動模式為差速運動時,y方向的速度必須設置為0。為了導航效果更好,這里將最小轉彎半徑(min_turning_radius)設置為0。
注意min_obstacle_dist不要設置的比costmap_common_params.yaml中的膨脹半徑小,不然會報錯。
然后運行下面的命令,開啟導航功能。
?
?
?
$ roslaunch limo_bringup limo_start.launch $ roslaunch limo_bringup limo_navigation_diff.launch
啟動的rviz如圖所示,可以通過途中黃色箭頭所指的工具設定機器人的初始位姿,通過紅色箭頭所指示的工具設定機器人的目標位姿。機器人實現效果如下:
6. 全向移動機器人自主導航
更改LIMO機器人的運動模態,打開機器人的啟動文件limo_start.launch,將use_mcnamu設置為true,如下圖所示:
為了更好地體現出全向運動的效果,這里局部規劃器選用的算法為TEB。下面是一些參數的配置與介紹:
與差速模式不同,全向模式可以橫向移動,所以y方向的速度不必設置為0,而是可以設置為任意速度。
weight_kinematics_nh用于調整順應縱向運動和非順應橫向運動(掃射)之間的權衡。當此參數設置比較大時,將傾向于縱向運動;當此參數設置較小時,將更傾向于與橫向運動。weight_optimaltime參數為最優時間權重,如果設置較大時,那么機器人會在直道上快速加速,并且路徑規劃的也會切內道。
運行下面的命令,開啟導航功能。??
?
?
$ roslaunch limo_bringup limo_start.launch $ roslaunch limo_bringup limo_navigation_mcnamu.launch用上文提到的方法設定移動機器人的初始位姿和目標位姿。機器人導航的效果如下:
7. 阿克曼移動機器人自主導航
更改LIMO機器人的運動模態,打開機器人的啟動文件limo_start.launch,將use_mcnamu設置為false,如下圖所示。
由于阿克曼運動只適用TEB算法,所以我們這里仍然選用TEB算法。下面是一些參數的配置與介紹:
我們這里也將y方向的速度設置為0,但是最小轉彎半徑此時不能設置為0,而是需要根據機器人的實際最小轉彎半徑來設置。為了方便測量出機器人的最小轉彎半徑,我們可以用遙控器讓機器人以最大角速度做圓周運動,然后就可以用尺子測量出機器人的最小轉彎半徑。注意設置的最小轉彎半徑不能小于最小轉彎半徑。
然后運行下面的命令,開啟導航功能。
?
$ roslaunch limo_bringup limo_start.launch
$ roslaunch limo_bringup limo_navigation_ackerman.launch依然使用上文提到的方法設定移動機器人的初始位姿和目標位姿。
8. 總結
以上只演示了各種運動模態下使用某一種本地實時規劃算法的導航效果,每種本地實時規劃算法都有其優缺點,各個算法介紹如下圖,可以根據需求選擇相應的算法。
編輯:黃飛
?
評論
查看更多