不同復雜環境下的路徑規划


介紹

此示例演示如何使用概率路線圖(PRM)路徑規划器來計算給定地圖上兩個位置之間的無障礙路徑。PRM路徑規划器使用自由空間中的隨機采樣節點並將它們相互連接,從而在給定地圖的自由空間中構建路線圖。路線圖構建完成后,您可以查詢從給定開始位置到地圖上給定結束位置的路徑。

在這個例子中,地圖被表示為使用導入數據的占用網格地圖。在對地圖的空閑空間中的節點進行采樣時,PRM使用此二進制占用網格表示來推斷空閑空間。此外,PRM在計算地圖上的無障礙路徑時沒有考慮機器人尺寸。因此,您應該根據機器人的尺寸對地圖進行充氣,以便計算無障礙路徑,從而解決機器人的尺寸問題,並確保避免實際機器人的碰撞。定義地圖上的開始和結束位置,以便PRM路徑規划器查找無障礙路徑。

導入用於規划路徑的示例地圖

filePath = fullfile(fileparts(which('PathPlanningExample')),'data','exampleMaps.mat');
load(filePath)

導入的地圖是:simpleMapcomplexMapternaryMap這將在變量名稱中搜索包含字符串'Map'的變量。

whos *Map*
名稱大小字節類屬性

  complexMap 41x52 2132邏輯               
  simpleMap 26x27 702邏輯               
  三元圖501x501 2008008 double

 

使用導入的simpleMap數據並使用robotics.BinaryOccupancyGrid該類構建占位網格表示這張地圖的分辨率設置為每米2格。

map = robotics.BinaryOccupancyGrid(simpleMap, 2)
map = 

  具有屬性的
 BinaryOccupancyGrid GridSize:[26 27] 
             分辨率:2 
           XWorldLimits:[0 13.5000] 
           YWorldLimits:[0 13] 
    GridLocationInWorld:[0 0]

使用對象show上的函數顯示地圖robotics.BinaryOccupancyGrid

show(map)

定義機器人尺寸並填充地圖

為確保機器人不與任何障礙物碰撞,應在將機器人提供給PRM路徑規划器之前,按照機器人的尺寸對地圖充氣。

這里機器人的尺寸可以假定為半徑為0.2米的圓。然后,您可以使用該inflate函數通過此維度膨脹地圖

robotRadius = 0.2;

如前所述,PRM不考慮機器人的尺寸,因此為PRM提供膨脹的地圖考慮了機器人尺寸。在使用該inflate功能保留原始地圖之前,創建地圖的副本

 

mapInflated = copy(map);
inflate(mapInflated,robotRadius);

顯示膨脹的地圖

show(mapInflated)

構建PRM並設置參數

現在你需要定義一個路徑規划器。創建一個robotics.PRM對象並定義關聯的屬性。

prm = robotics.PRM
prm = 

  具有屬性的PRM:

                   映射:[0x1 robotics.BinaryOccupancyGrid] 
              NumNodes:50 
    ConnectionDistance:Inf

將充氣地圖分配給PRM對象

prm.Map = mapInflated;

定義在PRM構建過程中要使用的PRM節點的數量。PRM使用給定地圖上給定數量的節點構建路線圖。根據輸入地圖的維度和復雜性,這是要在地圖上的兩個點之間獲得解決方案的主要屬性之一。大量節點創建密集的路線圖並增加找到路徑的可能性。但是,擁有更多節點會增加創建路線圖和尋找解決方案的計算時間。

 

prm.NumNodes = 50;

定義地圖上兩個連接節點之間允許的最大距離。PRM連接地圖上以此距離(或更少)分隔的所有節點。這是調整較大和/或復雜輸入地圖的另一個屬性。較大的連接距離會增加節點之間的連通性,從而更容易找到路徑,但可以增加路線圖創建的計算時間。

prm.ConnectionDistance = 5;

找到構建PRM的可行路徑

在地圖上定義路徑規划器要使用的開始和結束位置。

startLocation = [2 1];
endLocation = [12 10];

使用該findpath功能搜索開始和結束位置之間的路徑解決方案是從開始位置到結束位置的一組路標。請注意,path由於PRM算法的概率性質,這將會有所不同。

 

path = findpath(prm, startLocation, endLocation)
路徑= 

    2.0000 1.0000 
    1.9569 1.0546 
    1.8369 2.3856 
    3.2389 6.6106 
    7.8260 8.1330 
   11.4632 10.5857 
   12.0000 10.0000

顯示PRM解決方案。

show(prm)

將PRM用於大型和復雜的地圖

使用導入的complexMap數據代表一個龐大而復雜的平面圖,並以給定的分辨率構建二進制占用網格表示(每米1個單元)

map = robotics.BinaryOccupancyGrid(complexMap, 1)
map = 

  具有屬性的
 BinaryOccupancyGrid GridSize:[41 52] 
             解析:1 
           XWorldLimits:[0 52] 
           YWorldLimits:[0 41] 
    GridLocationInWorld:[0 0]

顯示地圖

show(map)

基於機器人尺寸填充地圖

復制並膨脹地圖以考慮機器人的尺寸以避開障礙物

mapInflated = copy(map);
inflate(mapInflated, robotRadius);

顯示膨脹的地圖

show(mapInflated)

將現有的PRM對象與新的映射關聯並設置參數

用新膨脹的地圖更新PRM對象並定義其他屬性。

prm.Map = mapInflated;

設置NumNodesConnectionDistance屬性

 

prm.NumNodes = 20;
prm.ConnectionDistance = 15;

顯示PRM圖

show(prm)

找到構建PRM的可行路徑

定義地圖上的開始和結束位置以查找無障礙路徑。

startLocation = [3 3];
endLocation = [45 35];

搜索開始和結束位置之間的解決方案。對於復雜的地圖,給定數量的節點可能沒有可行路徑(返回空路徑)。

 

path = findpath(prm, startLocation, endLocation)
path = 

     []

由於您正在規划大型復雜地圖上的路徑,因此可能需要大量節點。但是,通常不清楚有多少節點就足夠了。調整節點的數量以確保開始和結束位置之間有可行的路徑。

while isempty(path)
    % No feasible path found yet, increase the number of nodes
    prm.NumNodes = prm.NumNodes + 10;

    % Use the |update| function to re-create the PRM roadmap with the changed
    % attribute
    update(prm);

    % Search for a feasible path with the updated PRM
    path = findpath(prm, startLocation, endLocation);
end
% Display path
path
路徑= 

    3.0000 3.0000 
    4.2287 4.2628 
    7.7686 5.6520 
    6.8570 8.2389 
   19.5613 8.4030 
   33.1838 8.7614 
   31.3248 16.3874 
   41.3317 17.5090 
   48.3017 25.8527 
   49.4926 36.8804 
   44.3936 34.8592 
   45.0000 35.0000

顯示PRM解決方案

show(prm)

使用PRM與概率占用網格

robotics.OccupancyGrid使用導入的ternaryMap數據構造一個對象ternaryMap使用概率,其中占用的自由空間中的概率是0,對於占用空間是1和用於未知空間為0.5表示的環境。這里使用每米20個單元的分辨率。

map = robotics.OccupancyGrid(ternaryMap, 20)
map = 

  OccupancyGrid屬性:占有

        閾值:0.6500 
            FreeThreshold:0.2000  概率飽和度:[0.0010 0.9990] 
                 GridSize:[501 501] 
               分辨率:20 
             XWorldLimits:[0 25.0500] 
             YWorldLimits:[0 25.0500] 
      GridLocationInWorld:[0 0]

顯示地圖

show(map)

基於機器人尺寸填充地圖

復制並膨脹地圖以考慮機器人的尺寸以避開障礙物

mapInflated = copy(map);
inflate(mapInflated, robotRadius);

顯示膨脹的地圖

show(mapInflated)

將現有的PRM對象與新的映射關聯並設置參數

用新膨脹的地圖更新PRM對象並定義其他屬性。PRM使用FreeThresholdOccupancyGrid對象來確定無障礙空間並計算該無障礙空間內的路徑。未知單元格的值ternaryMap是0.5,而FreeThresholdOccupancyGrid對象上的默認值mapInflated是0.2。因此,PRM不會在未知地區規划一條路徑。

prm.Map = mapInflated;

設置NumNodesConnectionDistance屬性

 

prm.NumNodes = 60;
prm.ConnectionDistance = 5;

% Display PRM graph
show(prm)

找到構建PRM的可行路徑

定義地圖上的開始和結束位置以查找無障礙路徑。

startLocation = [7 22];
endLocation = [15 5];

% Search for a solution between start and end location.
path = findpath(prm, startLocation, endLocation);
while isempty(path)
    prm.NumNodes = prm.NumNodes + 10;
    update(prm);
    path = findpath(prm, startLocation, endLocation);
end

% Display path
path
路徑= 

    7.0000 22.0000 
    7.9059 22.1722 
   10.6881 22.3734 
   11.7508 19.3716 
   13.7982 17.1659 
   17.5826 14.6769 
   16.8227 9.9964 
   15.1329 8.3100 
   14.9489 5.7648 
   15.0000 5.0000

顯示PRM解決方案

show(prm)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM