1. 程式人生 > >移動機器人D*Lite路徑規劃演算法設計、模擬及原始碼

移動機器人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;
}