Contenuto principale

Questa pagina è stata tradotta con la traduzione automatica. Fai clic qui per vedere l'ultima versione in inglese.

plannerRRT

Creare un pianificatore RRT per la pianificazione geometrica

Descrizione

L'oggetto plannerRRT crea un pianificatore di alberi casuali (RRT) a rapida esplorazione per risolvere problemi di pianificazione geometrica. RRT è un pianificatore di movimento basato su alberi che costruisce un albero di ricerca in modo incrementale a partire da campioni estratti casualmente da un dato spazio di stato. L'albero alla fine attraversa lo spazio di ricerca e collega lo stato iniziale allo stato finale. Il processo generale di crescita degli alberi è il seguente:

  1. Il pianificatore campiona uno stato casuale xrand nello spazio degli stati.

  2. Il pianificatore trova uno stato xvicino che è già presente nell'albero di ricerca ed è il più vicino (in base alla definizione della distanza nello spazio di stato) a xrand.

  3. Il pianificatore si espande da xvicino verso xrand, finché non viene raggiunto uno stato xnuovo.

  4. Quindi il nuovo stato xnuovo viene aggiunto all'albero di ricerca.

Per la RRT geometrica, l'espansione e la connessione tra due stati possono essere trovate analiticamente senza violare i vincoli specificati nello spazio di stato dell'oggetto pianificatore.

Creazione

Descrizione

planner = plannerRRT(stateSpace,stateVal) crea un pianificatore RRT da un oggetto spazio di stato, stateSpace, e da un oggetto validatore di stato, stateVal. Lo spazio di stato di stateVal deve essere lo stesso di stateSpace. stateSpace e stateVal impostano anche le proprietà StateSpace e StateValidator di planner.

planner = plannerRRT(___,Name=Value) imposta le proprietà utilizzando uno o più argomenti nome-valore oltre agli argomenti di input nella sintassi precedente. È possibile specificare le proprietà StateSampler, MaxNumTreeNodes, MaxIterations, MaxConnectionDistance, GoalReachedFcn e GoalBias come argomenti nome-valore.

esempio

Proprietà

espandi tutto

Spazio di stato per il pianificatore, specificato come oggetto spazio di stato. È possibile utilizzare oggetti dello spazio di stato quali stateSpaceSE2, stateSpaceDubins, stateSpaceReedsShepp e stateSpaceSE3. È anche possibile personalizzare un oggetto dello spazio di stato utilizzando l'oggetto nav.StateSpace.

Validatore di stato per il pianificatore, specificato come oggetto validatore di stato. È possibile utilizzare oggetti di convalida dello stato quali validatorOccupancyMap, validatorVehicleCostmap e validatorOccupancyMap3D.

Da R2023b

Campionatore dello spazio di stato utilizzato per trovare campioni di stato nello spazio di input, specificato come oggetto stateSamplerUniform, oggetto stateSamplerGaussian, oggetto stateSamplerMPNET o oggetto nav.StateSampler. Per impostazione predefinita, plannerRRT utilizza il campionamento dello stato uniforme.

Numero massimo di nodi nell'albero di ricerca (escluso il nodo radice), specificato come numero intero positivo.

Esempio MaxNumTreeNodes=2500

Tipi di dati: single | double

Numero massimo di iterazioni, specificato come numero intero positivo.

Esempio MaxIterations=2500

Tipi di dati: single | double

Lunghezza massima di un movimento consentito nell'albero, specificata come scalare.

Esempio MaxConnectionDistance=0.3

Tipi di dati: single | double

Funzione di callback per valutare se l'obiettivo è stato raggiunto, specificata come funzione handle. Puoi creare la tua funzione obiettivo raggiunto. La funzione deve seguire questa sintassi:

 function isReached = myGoalReachedFcn(planner,currentState,goalState)

Dove:

  • planner — L'oggetto planner creato, specificato come oggetto plannerRRT.

  • currentState — Lo stato corrente, specificato come vettore reale a tre elementi.

  • goalState — Lo stato obiettivo, specificato come vettore reale a tre elementi.

  • isReached — Variabile booleana per indicare se lo stato corrente ha raggiunto lo stato obiettivo, restituita come true o false .

Per utilizzare GoalReachedFcn personalizzato nel workflow di generazione del codice, questa proprietà deve essere impostata su una funzione handle personalizzata prima di chiamare la funzione del piano e non può essere modificata dopo l'inizializzazione.

Tipi di dati: function handle

Probabilità di scegliere lo stato obiettivo durante il campionamento dello stato, specificato come uno scalare reale nell'intervallo [0,1]. La proprietà definisce la probabilità di scegliere lo stato obiettivo effettivo durante il processo di selezione casuale degli stati dallo spazio degli stati. Puoi iniziare impostando la probabilità su un valore piccolo come 0.05 .

Esempio GoalBias=0.1

Tipi di dati: single | double

Funzioni oggetto

planPlan path between two states
copyCreate copy of planner object

Esempi

comprimi tutto

Creare uno spazio di stato.

ss = stateSpaceSE2;

Creare un validatore di stato basato su occupancyMap utilizzando lo spazio di stato creato.

sv = validatorOccupancyMap(ss);

Crea una mappa di occupazione da una mappa di esempio e imposta la risoluzione della mappa su 10 celle/metro.

load exampleMaps
map = occupancyMap(simpleMap,10);
sv.Map = map;

Imposta la distanza di convalida per il validatore.

sv.ValidationDistance = 0.01;

Aggiornare i limiti dello spazio di stato in modo che siano uguali ai limiti della mappa.

ss.StateBounds = [map.XWorldLimits;map.YWorldLimits;[-pi pi]];

Crea il pianificatore di percorsi e aumenta la distanza massima di connessione.

planner = plannerRRT(ss,sv,MaxConnectionDistance=0.3);

Imposta gli stati di inizio e fine.

start = [0.5 0.5 0];
goal = [2.5 0.2 0];

Pianifica un percorso con impostazioni predefinite.

rng(100,'twister'); % for repeatable result
[pthObj,solnInfo] = plan(planner,start,goal);

Visualizza i risultati.

show(map)
hold on
% Tree expansion
plot(solnInfo.TreeData(:,1),solnInfo.TreeData(:,2),'.-')
% Draw path
plot(pthObj.States(:,1),pthObj.States(:,2),'r-','LineWidth',2)

Figure contains an axes object. The axes object with title Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains 3 objects of type image, line.

Caricare nell'area di lavoro una mappa 3D dell'occupazione di un isolato cittadino. Specificare la soglia per considerare le celle come prive di ostacoli.

mapData = load("dMapCityBlock.mat");
omap = mapData.omap;
omap.FreeThreshold = 0.5;

Gonfiare la mappa di occupazione per aggiungere una zona cuscinetto per operazioni in sicurezza attorno agli ostacoli.

inflate(omap,1)

Creare un oggetto dello spazio di stato SE(3) con limiti per le variabili di stato.

ss = stateSpaceSE3([0 220;0 220;0 100;inf inf;inf inf;inf inf;inf inf]);

Creare un validatore dello stato della mappa di occupazione 3D utilizzando lo spazio di stato creato. Assegnare la mappa di occupazione all'oggetto validatore di stato. Specificare l'intervallo di distanza di campionamento.

sv = validatorOccupancyMap3D(ss, ...
     Map = omap, ...
     ValidationDistance = 0.1);

Creare un pianificatore di percorsi RRT con una distanza di connessione massima aumentata e un numero massimo di iterazioni ridotto. Specificare una funzione obiettivo personalizzata che determini che un percorso raggiunga l'obiettivo se la distanza euclidea dal bersaglio è inferiore alla soglia di 1 metro.

planner = plannerRRT(ss,sv, ...
          MaxConnectionDistance = 50, ...
          MaxIterations = 1000, ...
          GoalReachedFcn = @(~,s,g)(norm(s(1:3)-g(1:3))<1), ...
          GoalBias = 0.1);

Specificare le pose di partenza e di arrivo.

start = [40 180 25 0.7 0.2 0 0.1];
goal = [150 33 35 0.3 0 0.1 0.6];

Configurare il generatore di numeri casuali per ottenere risultati ripetibili.

rng(1,"twister");

Pianifica il percorso.

[pthObj,solnInfo] = plan(planner,start,goal);

Visualizza il percorso pianificato.

show(omap)
axis equal
view([-10 55])
hold on
% Start state
scatter3(start(1,1),start(1,2),start(1,3),"g","filled")
% Goal state
scatter3(goal(1,1),goal(1,2),goal(1,3),"r","filled")
% Path
plot3(pthObj.States(:,1),pthObj.States(:,2),pthObj.States(:,3), ...
      "r-",LineWidth=2)

Figure contains an axes object. The axes object with title Occupancy Map, xlabel X [meters], ylabel Y [meters] contains 4 objects of type patch, scatter, line.

Riferimenti

[1] S.M. Lavalle and J.J. Kuffner. "Randomized Kinodynamic Planning." The International Journal of Robotics Research. Vol. 20, Number 5, 2001, pp. 378 – 400.

Funzionalità estese

espandi tutto

Cronologia versioni

Introdotto in R2019b

espandi tutto