移動機器人D*Lite路徑規劃演算法設計、模擬及原始碼
轉自:https://blog.csdn.net/ayawaya/article/details/70155932
Dstar Lite路徑規劃演算法簡介
D*Lite演算法是Koenig S和Likhachev M基於LPA*演算法基礎上提出的路徑規劃演算法。 LPA*演算法本是基於Dijkstra最短路徑演算法而產生的定起點、定目標點的路徑規劃演算法。 通過對LPA*演算法的改造,使LPA*演算法的思想能應用到諸如車輛動態導航這樣的問題。
LPA*演算法區別於其他演算法 的一個重要特點是rhs()的定義:
rhs(s)={0mins′∈Pred(s)(g(s′)+c(s′,s))ifs=sstartotherwise
rhs(s)={0ifs=sstartmins′∈Pred(s)(g(s′)+c(s′,s))otherwise
D*Lite演算法繼承了rhs()的概念,但D*Lite演算法是從目標節點向起始節點搜尋。
為了讓節點v的啟發函式值隨著起點位置變化而變化, Koenig S和Likhachev M給出了兩種方法:一是,根據新的起點位置,將優先佇列中所有節點的啟發函式值重新計算;二是,並不重新計算佇列中的啟發函式值,而是在計算新新增到優先佇列中的節點的啟發函式值時,加上一個修飾符 ,表示機器人移動距離的疊加。
D* Lite Pseudo Code:
CaculateKey(s)
return [min(g(s),rhs(s))+h(sstart , s)+km; min(g(s),rhs(s))];
Initialize()
U: =0;
km =0;
for all s ∈∈ S, rhs(s) = g(s) = ∞∞;
rhs(sgoal) = 0;
U.Insert(sgoal), CaculateKey(sgoal));
UpdateVertex(μ)(μ)
if (μ≠sgoal)(μ≠sgoal), rhs(μ)(μ) = mins′∈Succ(μ)(c(μ,s′)+g(s′))mins′∈Succ(μ)(c(μ,s′)+g(s′));
if (μ∈U)(μ∈U), U.Remove(μ)(μ)
if (g(μ)≠rhs(μ))(g(μ)≠rhs(μ)), U.Insert(μ,CaculateKey(μ))(μ,CaculateKey(μ));
ComputeShortestPath()
while (U.TopKey() < CaculateKey(SstartSstart) or rhs(sstart)≠g(sstart)rhs(sstart)≠g(sstart))
koldkold = U.TopKey();
μμ = U.Pop();
if (koldkold < CaculateKey(μμ))
U.Insert(μμ, CaculateKey(μμ));
elseif (g(μ)>rhs(μ)g(μ)>rhs(μ))
g(μ)=rhs(μ)g(μ)=rhs(μ)
for all s∈Pred(μ)s∈Pred(μ), UpdateVertex(s);
else
g(μ)=∞g(μ)=∞;
for all s∈Pred(μ)∪μs∈Pred(μ)∪μ, UpdateVertex(s);
Main()
Slast=SstartSlast=Sstart;
Initialize();
ComputeShortestPath();
while(Sstart≠SgoalSstart≠Sgoal)
/* if (g(Sstart=∞)g(Sstart=∞)) then there is no known path */
Sstart=argmins′∈Succ(μ)(c(μ,s′)+g(s′))Sstart=argmins′∈Succ(μ)(c(μ,s′)+g(s′));
Move to SstartSstart;
Scan graph for changed edge costs;
if any edge costs changed
km=km+h(slast,sstart)km=km+h(slast,sstart);
Slast=SstartSlast=Sstart;
for all directed edges (u,v)(u,v) with changed edge costs
Update the edge cost c(u,v)c(u,v);
Update Vertex(u)(u);
Compute ShortestPath();
更詳細的演算法說明,請查閱有關文獻資料。
Linux系統簡要說明
Linux是一套免費使用和自由傳播的類Unix作業系統,是一個基於POSIX和UNIX的多使用者、多工、支援多執行緒和多CPU的作業系統。它能執行主要的UNIX工具軟體、應用程式和網路協議。它支援32位和64位硬體。Linux繼承了Unix以網路為核心的設計思想,是一個性能穩定的多使用者網路作業系統。
在做演算法程式開發之前,應對Linux系統基本操作有一定的瞭解,才能方便上手,在這裡向同學們推薦一款教程:
鳥哥的 Linux 私房菜
該教程內容詳實全面,是Linux入門的好材料。
這裡用到一些Linux下的基本操作,客戶端可以選擇PUTTY,至少掌握:
ls
cd
tar
man
gcc
make
vim
nano
命令不能一一列舉。
Dstar Lite程式使用說明
該程式呼叫一些GNU庫,請在類Unix系統下編譯使用。
如果系統沒有安裝編譯工具,則需要先安裝 (Ubuntu):
$ sudo apt-get install build-essential
1
下載後解壓,進入解壓後的目錄:
$ cd dstar
$ ls
1
2
然後使用make編譯
$ make
1
完畢,執行程式:
$ ./dstar
1
模擬程式操作命令:
[q/Q] - 退出
[r/R] - 再次規劃路徑
[a/A] - 切換自動規劃
[c/C] - 清屏(重啟)
滑鼠左鍵 - 設定障礙物
滑鼠中間 - 移動目標點
滑鼠右鍵 - 移動起始點
程式提供的Dstar類可以單獨呼叫,使用vim編輯器編寫程式:
$ vim DstarDraw.cpp
1
輸入以下內容:
#include "Dstar.h"
int main() {
Dstar *dstar = new Dstar();
list<state> mypath;
dstar->init(0,0,10,5); // set start to (0,0) and goal to (10,5)
dstar->updateCell(3,4,-1); // set cell (3,4) to be non traversable
dstar->updateCell(2,2,42.432); // set set (2,2) to have cost 42.432
dstar->replan(); // plan a path
mypath = dstar->getPath(); // retrieve path
dstar->updateStart(10,2); // move start to (10,2)
dstar->replan(); // plan a path
mypath = dstar->getPath(); // retrieve path
dstar->updateGoal(0,1); // move goal to (0,1)
dstar->replan(); // plan a path
mypath = dstar->getPath(); // retrieve path
return 0;
}