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