Hauptinhalt

Diese Seite wurde mithilfe maschineller Übersetzung übersetzt. Klicken Sie hier, um die neueste Version auf Englisch zu sehen.

plannerRRT

Erstellen Sie einen RRT-Planer für die geometrische Planung

Beschreibung

Das plannerRRT-Objekt erstellt einen schnell erkundenden Zufallsbaum-Planer (RRT) zum Lösen geometrischer Planungsprobleme. RRT ist ein baumbasierter Bewegungsplaner, der schrittweise einen Suchbaum aus zufällig aus einem gegebenen Zustandsraum gezogenen Abtastungen erstellt. Der Baum überspannt schließlich den Suchraum und verbindet den Startzustand mit dem Zielzustand. Der allgemeine Baumwachstumsprozess läuft wie folgt ab:

  1. Der Planer wählt einen zufälligen Zustand xrand im Zustandsraum aus.

  2. Der Planer findet einen Zustand xnahe, der sich bereits im Suchbaum befindet und (basierend auf der Distanzdefinition im Zustandsraum) am nächsten zu xrand ist.

  3. Der Planer erweitert sich von xnahe in Richtung xrand, bis ein Zustand xneu erreicht ist.

  4. Dann wird der neue Status xneu zum Suchbaum hinzugefügt.

Bei der geometrischen RRT können die Ausdehnung und Verbindung zwischen zwei Zuständen analytisch gefunden werden, ohne die im Zustandsraum des Planerobjekts angegebenen Beschränkungen zu verletzen.

Erstellung

Beschreibung

planner = plannerRRT(stateSpace,stateVal) erstellt einen RRT-Planer aus einem Zustandsraumobjekt, stateSpace, und einem Zustandsvalidierungsobjekt, stateVal. Der Zustandsraum von stateVal muss derselbe sein wie der von stateSpace. stateSpace und stateVal legen auch die Eigenschaften StateSpace und StateValidator von planner fest.

planner = plannerRRT(___,Name=Value) legt Eigenschaften mithilfe eines oder mehrerer Name-Wert-Argumente zusätzlich zu den Eingabeargumenten in der vorherigen Syntax fest. Sie können die Eigenschaften StateSampler, MaxNumTreeNodes, MaxIterations, MaxConnectionDistance, GoalReachedFcn und GoalBias als Name-Wert-Argumente angeben.

Beispiel

Eigenschaften

alle erweitern

Zustandsraum für den Planer, angegeben als Zustandsraumobjekt. Sie können Zustandsraumobjekte wie stateSpaceSE2, stateSpaceDubins, stateSpaceReedsShepp und stateSpaceSE3 verwenden. Sie können ein Zustandsraumobjekt auch mit dem nav.StateSpace-Objekt anpassen.

Statusvalidator für den Planer, angegeben als Statusvalidatorobjekt. Sie können Statusvalidierungsobjekte wie validatorOccupancyMap, validatorVehicleCostmap und validatorOccupancyMap3D verwenden.

Seit R2023b

Zustandsraumsampler zum Suchen von Zustandsbeispielen im Eingaberaum, angegeben als stateSamplerUniform-Objekt, stateSamplerGaussian-Objekt, stateSamplerMPNET-Objekt oder nav.StateSampler-Objekt. Standardmäßig verwendet plannerRRT eine einheitliche Zustandsabtastung.

Maximale Anzahl von Knoten im Suchbaum (ohne den Stammknoten), angegeben als positive Ganzzahl.

Beispiel: MaxNumTreeNodes=2500

Datentypen: single | double

Maximale Anzahl von Iterationen, angegeben als positive Ganzzahl.

Beispiel: MaxIterations=2500

Datentypen: single | double

Maximale Länge einer im Baum zulässigen Bewegung, angegeben als Skalar.

Beispiel: MaxConnectionDistance=0.3

Datentypen: single | double

Callback-Funktion zur Auswertung, ob das Ziel erreicht wurde, angegeben als Funktions-Handle. Sie können Ihre eigene Funktion zum Erreichen des Ziels erstellen. Die Funktion muss dieser Syntax folgen:

 function isReached = myGoalReachedFcn(planner,currentState,goalState)

Wobei:

  • planner – Das erstellte Planerobjekt, angegeben als plannerRRT-Objekt.

  • currentState – Der aktuelle Status, angegeben als reeller Vektor mit drei Elementen.

  • goalState – Der Zielzustand, angegeben als reeller Vektor mit drei Elementen.

  • isReached – Eine Boolesche Variable, die angibt, ob der aktuelle Zustand den Zielzustand erreicht hat, zurückgegeben als true oder false.

Um benutzerdefiniertes GoalReachedFcn im Codegenerierungs-Workflow zu verwenden, muss diese Eigenschaft vor dem Aufruf der Planfunktion auf einen benutzerdefinierten Funktionshandle festgelegt werden und kann nach der Initialisierung nicht mehr geändert werden.

Datentypen: function handle

Wahrscheinlichkeit für die Wahl des Zielzustandes bei der Zustandsabtastung, angegeben als reeller Skalar im Bereich [0,1]. Die Eigenschaft definiert die Wahrscheinlichkeit, mit der beim Prozess der zufälligen Auswahl von Zuständen aus dem Zustandsraum der tatsächliche Zielzustand gewählt wird. Sie können beginnen, indem Sie die Wahrscheinlichkeit auf einen kleinen Wert wie 0.05 setzen.

Beispiel: GoalBias=0.1

Datentypen: single | double

Objektfunktionen

planPlan path between two states
copyCreate copy of planner object

Beispiele

alle reduzieren

Erstellen Sie einen Zustandsraum.

ss = stateSpaceSE2;

Erstellen Sie einen occupancyMap-basierten Statusvalidator unter Verwendung des erstellten Statusraums.

sv = validatorOccupancyMap(ss);

Erstellen Sie eine Belegungskarte aus einer Beispielkarte und stellen Sie die Kartenauflösung auf 10 Zellen/Meter ein.

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

Legen Sie die Validierungsdistanz für den Validierer fest.

sv.ValidationDistance = 0.01;

Aktualisieren Sie die Statusraumgrenzen, sodass sie mit den Kartengrenzen übereinstimmen.

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

Erstellen Sie den Pfadplaner und erhöhen Sie die maximale Verbindungsdistanz.

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

Legen Sie den Start- und Zielzustand fest.

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

Planen Sie einen Pfad mit Standardeinstellungen.

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

Visualisieren Sie die Ergebnisse.

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.

Laden Sie eine 3D-Belegungskarte eines Häuserblocks in den Workspace. Geben Sie den Schwellenwert an, ab dem Zellen als hindernisfrei betrachtet werden sollen.

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

Erweitern Sie die Belegungskarte, um eine Pufferzone für einen sicheren Betrieb rund um die Hindernisse hinzuzufügen.

inflate(omap,1)

Erstellen Sie ein SE(3)-Zustandsraumobjekt mit Grenzen für Zustandsvariablen.

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

Erstellen Sie mithilfe des erstellten Zustandsraums einen 3D-Belegungskarten-Zustandsvalidator. Weisen Sie die Belegungskarte dem Statusvalidierungsobjekt zu. Geben Sie das Abtastabstandsintervall an.

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

Erstellen Sie einen RRT-Pfadplaner mit erhöhter maximaler Verbindungsdistanz und reduzierter maximaler Iterationsanzahl. Geben Sie eine benutzerdefinierte Zielfunktion an, die bestimmt, dass ein Pfad das Ziel erreicht, wenn die euklidische Distanz zum Ziel unter einem Schwellenwert von 1 Meter liegt.

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

Geben Sie Start- und Zielposen an.

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

Konfigurieren Sie den Zufallszahlengenerator für wiederholbare Ergebnisse.

rng(1,"twister");

Planen Sie den Weg.

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

Visualisieren Sie den geplanten Weg.

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.

Referenzen

[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.

Erweiterte Fähigkeiten

alle erweitern

Versionsverlauf

Eingeführt in R2019b

alle erweitern