Hauptinhalt

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

plannerHybridAStar

Hybrider A*-Pfadplaner

Beschreibung

Das Hybrid-A*-Pfadplanerobjekt generiert in einer gegebenen 2D-Karte einen glatten Pfad für Fahrzeuge mit nichtholonomen Einschränkungen. Der Ansatz wendet den A*-Algorithmus auf den dreidimensionalen kinematischen Zustandsraum des Fahrzeugs mit Zustandsvariablen (x, y, theta) an. Darüber hinaus verwendet es eine analytische Reed-Shepp-Erweiterung, um die Suchgeschwindigkeit zu verbessern.

Sie können das Verhalten der Verbindung ändern, indem Sie Eigenschaften wie MinTurningRadius, ForwardCost und ReverseCost anpassen. Mit der Eigenschaft AnalyticExpansionInterval können Sie den Zyklus für die Überprüfung der Reeds-Shepp-Verbindung festlegen.

Hinweis

Der Hybrid A*-Planer sucht in der Karte nach Kollisionen, indem er die Bewegungsprimitiven interpoliert und eine analytische Erweiterung basierend auf der ValidationDistance-Eigenschaft des stateValidator-Objekts durchführt. Wenn die Eigenschaft ValidationDistance auf Inf gesetzt ist, interpoliert das Objekt basierend auf der Zellengröße der Karte, die im Statusvalidator angegeben ist. Erweitern Sie die Belegungskarte vor der Zuweisung an den Planer, um die Fahrzeuggröße zu berücksichtigen.

Erstellung

Beschreibung

planner = plannerHybridAStar(validator) erstellt ein Pfadplanerobjekt mithilfe des Hybrid A*-Algorithmus. Geben Sie die validator-Eingabe als validatorOccupancyMap- oder validatorVehicleCostmap-Objekt an. Der validator-Eingang legt den Wert der StateValidator-Eigenschaft fest.

Beispiel

planner = plannerHybridAStar(validator,Name,Value) legt Eigenschaften des Pfadplaners fest, indem ein oder mehrere Name-Wert-Paar-Argumente verwendet werden. Setzen Sie jeden Eigenschaftsnamen in einfache Anführungszeichen (' ').

Eigenschaften

alle erweitern

Zustandsvalidator für die Planung, angegeben entweder als validatorOccupancyMap- oder validatorVehicleCostmap-Objekt basierend auf dem SE(2)-Zustandsraum.

Länge der zu generierenden Bewegungsprimitiven, angegeben als durch Kommas getrenntes Paar bestehend aus 'MotionPrimitiveLength' und einem positiven Skalar in Metern. Erhöhen Sie die Länge für große Karten oder spärliche Umgebungen. Verringern Sie die Länge in dichten Umgebungen.

Hinweis

'MotionPrimitiveLength' kann nicht länger als ein Viertel der Umfangslänge eines Kreises sein, der auf 'MinTurningRadius' basiert.

Datentypen: double

Minimaler Wenderadius des Fahrzeugs, angegeben als durch Komma getrenntes Paar bestehend aus 'MinTurningRadius' und einem positiven Skalar in Metern.

Hinweis

Der Wert von 'MinTurningRadius' wird so eingestellt, dass 'MotionPrimitiveLength' ein Viertel der Umfangslänge eines darauf basierenden Kreises nicht überschreiten kann.

Datentypen: double

Anzahl der zu generierenden Bewegungsprimitiven, angegeben als durch Kommas getrenntes Paar bestehend aus 'NumMotionPrimitives' und einem positiven ungeraden ganzzahligen Skalar größer oder gleich 3.

Kostenmultiplikator für die Vorwärtsfahrt, angegeben als durch Kommas getrenntes Paar bestehend aus 'ForwardCost' und einem positiven Skalar. Erhöhen Sie den Kostenwert, um Vorwärtsbewegungen zu bestrafen.

Datentypen: double

Kostenmultiplikator für die Fahrt in die entgegengesetzte Richtung, angegeben als durch Kommas getrenntes Paar bestehend aus 'ReverseCost' und einem positiven Skalar. Erhöhen Sie den Kostenwert, um eine Rückwärtsbewegung zu bestrafen.

Datentypen: double

Additive Kosten für die Änderung der Bewegungsrichtung, angegeben als kommagetrenntes Paar bestehend aus 'DirectionSwitchingCost' und einem positiven Skalar. Erhöhen Sie den Kostenwert, um Richtungswechsel zu bestrafen.

Datentypen: double

Intervall für den Versuch der analytischen Erweiterung vom kostengünstigsten Knoten, der zu diesem Zeitpunkt verfügbar ist, angegeben als durch Kommas getrenntes Paar bestehend aus 'AnalyticExpansionInterval' und einem positiven ganzzahligen Skalar.

Der Hybrid-A*-Pfadplaner erweitert die Bewegungsprimitiven von den Knoten mit den niedrigsten verfügbaren Kosten zu diesem Zeitpunkt:

  • Die Anzahl der zu erweiternden Knoten hängt von der Anzahl der zu generierenden Primitiven sowohl hinsichtlich der Richtung als auch ihrer Gültigkeit ab. Der Zyklus wiederholt sich, bis 'AnalyticExpansionInterval' erreicht ist.

  • Der Planer versucht dann eine analytische Erweiterung, um mithilfe eines Reeds-Shepp-Modells die Zielpose vom Baum aus zu erreichen. Wenn der Versuch fehlschlägt, wiederholt der Planer den Zyklus.

Verbessern Sie die Leistung des Algorithmus, indem Sie das Intervall reduzieren, um die Anzahl der Prüfungen auf eine Reeds-Shepp-Verbindung zum Endziel zu erhöhen.

Abstand zwischen interpolierten Posen im Ausgabepfad, angegeben als durch Komma getrenntes Paar bestehend aus 'InterpolationDistance' und einem positiven Skalar in Metern.

Datentypen: double

Seit R2023b

Übergangskostenfunktion, angegeben als Funktionshandle. Dieser Wert gibt die Kosten für den Übergang von einem Zustand in einen anderen Zustand an. Standardmäßig verwendet die Funktion plannerHybridAStar die euklidische Distanz als Übergangskostenfunktion. Sie können auch eine benutzerdefinierte Übergangskostenfunktion angeben, um die Übergangskosten zu berechnen. Der Funktionshandle für die benutzerdefinierte Kostenfunktion muss mindestens einen Input haben und einen Output zurückgeben. Die Ausgabe kann ein Skalar oder ein Vektor sein, der die Übergangskosten für Bewegungsprimitive in Vorwärts- und Rückwärtsrichtung angibt.

Beispiel: planner = plannerHybridAStar(validator,TransitionCostFcn=@(param1)customFcnName(param1));

Datentypen: function_handle

Seit R2023b

Kosten für die analytische Erweiterung, angegeben als Funktionshandle. Standardmäßig verwendet die Funktion plannerHybridAStar analytische Erweiterungen basierend auf dem Reeds-Shepp-Modell. Sie können auch eine benutzerdefinierte Kostenfunktion für die analytische Erweiterung angeben. Der Funktionshandle für die benutzerdefinierte Kostenfunktion muss mindestens einen Input haben und einen Output zurückgeben.

Beispiel: planner = plannerHybridAStar(validator,AnalyticalExpansionCostFcn=@(param1)customFcnName(param1));

Datentypen: function_handle

Objektfunktionen

planFind obstacle-free path between two poses
showVisualize the planned path

Beispiele

alle reduzieren

Planen Sie mithilfe des Hybrid A*-Algorithmus einen kollisionsfreien Weg für ein Fahrzeug durch einen Parkplatz.

Karte erstellen und dem Statusvalidator zuweisen

Laden Sie die Kostenwerte von Zellen in der Fahrzeug-Kostenkarte eines Parkplatzes.

load parkingLotCostVal.mat % costVal

Erstellen Sie ein binaryOccupancyMap mit Kostenwerten.

resolution = 3;
map = binaryOccupancyMap(costVal,resolution);

Erstellen Sie einen Zustandsraum.

ss = stateSpaceSE2;

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

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

Erstellen Sie ein Statusvalidierungsobjekt zur Kollisionsprüfung.

sv = validatorOccupancyMap(ss);

Weisen Sie die Karte dem Statusvalidierungsobjekt zu.

sv.Map = map;

Planen und Visualisieren Sie den Pfad

Initialisieren Sie das plannerHybridAStar-Objekt mit dem Statusvalidierungsobjekt. Geben Sie die MinTurningRadius- und MotionPrimitiveLength-Eigenschaften des Planers an.

planner = plannerHybridAStar(sv, ...
                             MinTurningRadius=4, ...
                             MotionPrimitiveLength=6);

Definieren Sie Start- und Zielpositionen für das Fahrzeug als [x, y, theta]-Vektoren. x und y geben die Position in Metern an und theta gibt den Ausrichtungswinkel im Bogenmaß an.

startPose = [4 9 pi/2]; % [meters, meters, radians]
goalPose = [30 19 -pi/2];

Planen Sie einen Weg von der Startpose zur Zielpose.

refpath = plan(planner,startPose,goalPose,SearchMode='exhaustive');     

Visualisieren Sie den Pfad mit der Show-Funktion.

show(planner)

Figure contains an axes object. The axes object with title Hybrid A* Path Planner, xlabel X [meters], ylabel Y [meters] contains 8 objects of type image, line, scatter. These objects represent Reverse Motion Primitives, Forward Motion Primitives, Forward Path, Path Points, Orientation, Start, Goal.

Referenzen

[1] Dolgov, Dmitri, Sebastian Thrun, Michael Montemerlo, and James Diebel. Practical Search Techniques in Path Planning for Autonomous Driving. American Association for Artificial Intelligence, 2008.

[2] Petereit, Janko, Thomas Emter, Christian W. Frey, Thomas Kopfstedt, and Andreas Beutel. "Application of Hybrid A* to an Autonomous Mobile Robot for Path Planning in Unstructured Outdoor Environments." ROBOTIK 2012: 7th German Conference on Robotics. 2012, pp. 1-6.

Erweiterte Fähigkeiten

alle erweitern

C/C++ Codegenerierung
Generieren Sie C und C++ Code mit MATLAB® Coder™.

Versionsverlauf

Eingeführt in R2019b

alle erweitern