ROS的路徑規划器分為全局路徑和局部路徑規划,其中局部路徑規划器使用的最廣的為dwa,個人理解為:
首先全局路徑規划會生成一條大致的全局路徑,局部路徑規划器會把全局路徑給分段,然后根據分段的全局路徑的坐標,進行局部重新規划,例如:
全局規划后有一組目標點數組【1,2,3,4,5,......】,局部是根據當前速度和時間、約束條件,隨機模擬出50條軌跡,選出最佳一條軌跡到達1號目標點,隨后重復2,3...,
一直到達到目的地為止。具體的步驟如下:
一、路徑存儲
1、全局路徑存儲
在ros move base控制循環中會在規划出新的路徑時,將新的全局路徑利用setPlan傳給DWAPlannerROS,直接保存為global_plan_。
有了局部的目標點,就可以做規划了。
二、機器人運動模型
運動模型推到是為了進行軌跡推演,具體可參考:http://blog.csdn.net/heyijia0327/article/details/44983551
三、速度采樣
機器人的軌跡運動模型有了,根據速度就可以推算出軌跡。因此只需采樣很多速度,推算軌跡,然后評價這些軌跡好不好就行了。但是,速度(Vx,Vw)理論上有無窮多組,假定是在兩輪差速輪上,
因此根據機器人自身的條件和環境的限制,速度采樣范圍需要做一定的限制:
1、移動機器人受自身最大速度最小速度的限制
2、 移動機器人受電機性能的影響:由於電機力矩有限,存在最大的加減速限制,因此移動機器人軌跡前向模擬的周期sim_period內,存在一個動態窗口,在該窗口內的速度是機器人能夠實際達到的速度:
3、 基於移動機器人安全的考慮:為了能夠在碰到障礙物前停下來, 因此在最大減速度條件下, 速度有一個范圍:
Max_vel=max(max_vel,vel+acc_lim*sim_period)
最小速度為:
Min_vel=min(min_vel,vel-acc_lim*sim_period)
其中max_vel,min_vel為人為設定的最大和最小速度,vel是當前速度,acc_lim是人為設定的最大加速度,sim_period是第一步的模擬時間,由人為設定的局部路徑規划頻率決定,默認為0.05。
當計算出各個維度的最大最小速度后,就創建三個VelocityIterator類的對象,並傳入最大最小速度和樣本數目,此對象的構造函數會生成同樣數目的速度樣本並放入samples_這個容器內。具體做法是先計算步長step_size:
step_size=(max-min)/(nums_samples-1)
max為最大速度,min為最小速度,nums_samples為樣本數目。從最小速度每次多累加一次step_size即為一個速度樣本,直到達到最大速度。將每個維度的速度樣本取得后,再全部循環每個樣本組里選擇一個組合放入結構體vel_sample,最后將這些vel_sample放入sample_params_的容器里。至此,速度采樣就完成了。

四、評價函數
根據采樣的速度模擬推演出相對應的軌跡,然后對每一條軌跡進行評價,找出最優的一條軌跡進行局部導航。如何找出最優的軌跡?這里DWA使用的是一個打分系統,
原始的論文只有3個評分項:
最后對每一個項做歸一化處理,目的是進行平滑。
評價函數的意義就是:找出一條最優路徑,使得機器人在局部導航過程中,避開障礙物,以最快的速度到達目標點。
通過上述幾種評分機制,選取最優的一組速度樣本,傳遞給move_base,並發布相應的local plan。move_base如果收到了可用的速度則發布給底盤,否則發布0速度,且如果尋找最優速度的時間超過了限制就會執行障礙物清理模式,state_會變為CLEARING。
五、停止判斷
對於DWAPlannerROS的停止處理邏輯,由LatchedStopRotateController類完成,主要包括了停止判斷、加速停止、旋轉至目標朝向三個大的部分。
在到達目標位置的前提下,還要判斷機器人朝向是否滿足目標朝向yaw_goal_tolerance的需求,如果也滿足,則判斷當前速度是否滿足停止條件,即x和y的速度小於trans_stopped_velocity,theta速度小於rot_stopped_velocity。
只有到達位置、達到朝向、速度滿足停止三個條件都滿足的情況下,才算機器人到達了目標位姿,isGoalReached函數才會返回true。
參考:
https://www.cnblogs.com/sakabatou/p/8297479.html
http://blog.csdn.net/heyijia0327/article/details/44983551