Angenommen, ich habe ein Auto und ein Auto hat einen bestimmten Mindestwenderadius und ich möchte dieses Auto von Punkt a nach Punkt b fahren, aber das Auto zeigt nicht auf Punkt b. Wie berechne ich einen Pfad zu Punkt b? Die Ausrichtung am Punkt b angeben zu können, wäre ebenfalls gut (sagen wir, Sie möchten zu Ihrer Auffahrt fahren und dann in Ihre Garage einfahren - es nützt nicht viel, wenn Sie über Ihren Rasen zu Ihrer Auffahrt gelangen und sind seitwärts gerichtet :)
Ein Zeiger auf die Dokumentation (oder auch nur ein Name) wäre vollkommen in Ordnung - ich habe Probleme, überhaupt etwas zu finden.
Bei meinen Versuchen funktionieren sie in einfachen Fällen, scheitern jedoch kläglich in Situationen, in denen Punkt b näher an a liegt als der minimale Wenderadius.
Wie würden Sie beispielsweise einen ähnlichen Pfad bestimmen (den fett gedruckten Pfad):
Bearbeiten: In meinem eigentlichen Problem gibt es einige einfache Pfadbeschränkungen, aber ich habe bereits einen A * -Algorithmus, der funktioniert, aber es ermöglicht den Dingen, sofortige Kursänderungen vorzunehmen, so dass es albern aussieht, wenn ein Auto plötzlich eine 90 ° -Drehung macht auf einen Cent, wenn sie an einen Wendepunkt kommen.
quelle
Antworten:
Ich habe die vollständigen Gleichungen dafür noch nicht durchgearbeitet, aber hier sind einige Bilder, die uns helfen sollen, das Problem in den Griff zu bekommen. Es läuft auf eine gewisse Geometrie hinaus:
( Autosymbole über Kenney )
Von jedem Startpunkt und jeder Ausrichtung aus können wir zwei Kreise mit unserem minimalen Wenderadius zeichnen - einen links und einen rechts. Diese beschreiben die Punkte auf dem engstmöglichen Weg zu unserem Weg.
Wir können das Gleiche für jede gewünschte Endposition und Ausrichtung tun. Diese Kreise beschreiben das engstmögliche Ende unseres Weges.
Jetzt reduziert sich das Problem darauf, einen Pfad zu finden, der einen der Startkreise mit einem der Endkreise verbindet und jeden entlang seiner Tangente küsst.
(Dies setzt voraus, dass wir keine Hindernisse dazwischen finden müssen, was in der Frage nicht erwähnt wurde. Stormwinds Antwort bezieht sich darauf, wie wir Navigationsdiagramminformationen für diese Art von Problemen verwenden können. Sobald wir die Folge von Knoten haben Um durchzukommen, können wir die folgende Methode auf jedes Segment des Plans anwenden.)
Wenn wir der Einfachheit halber gerade Linien verwenden, erhalten wir ungefähr Folgendes:
Dies gibt uns den Grenzfall. Sobald Sie mit dieser Methode einen Pfad gefunden haben, können Sie einen oder beide Start- und Endkreise künstlich aufblasen, um einen weniger direkten, aber glatteren Pfad zu erhalten, bis zu dem Punkt, an dem sich die beiden Kreise küssen.
Berechnung dieser Pfade
Lassen Sie uns die Fälle für eine Drehrichtung herausarbeiten - sagen wir, wir beginnen unseren Weg mit einer Rechtskurve.
Das Zentrum unseres rechten Wendekreises ist:
startRightCenter = carStart.position + carStart.right * minRadius
Nennen wir den Winkel des geraden Abschnitts unseres Pfades (gemessen von der positiven x-Achse).
pathAngle
Wenn wir einen Vektor von
rightCenter
dem Punkt zeichnen, an dem wir den Wendekreis verlassen (an diesem Punkt müssen wir pathAngle zugewandt sein), dann ist dieser Vektor ...startOffset = minRadius * (-cos(pathAngle), sin(pathAngle))
Das heißt, der Punkt, an dem wir den Kreis verlassen, muss sein ...
departure = startRightCenter + startOffset
Der Punkt, an dem wir wieder in einen Wendekreis eintreten, hängt davon ab, ob wir mit einer Linkskurve oder einer Rechtskurve enden möchten:
Nun, wenn wir unseren Job richtig gemacht haben, verbindet die Linie
departure
zureentry
soll , dass sie senkrechtstartOffset
:Und das Lösen dieser Gleichung gibt uns die Winkel, unter denen dies wahr ist. (Ich verwende hier einen Plural, weil es technisch gesehen zwei solche Winkel gibt, aber einer davon beinhaltet das Rückwärtsfahren, was normalerweise nicht das ist, was wir wollen.)
Ersetzen wir als Beispiel den Fall von Rechtskurve zu Rechtskurve:
Der Crossover-Fall ist komplizierter - es ist der, für den ich noch nicht die ganze Mathematik ausgearbeitet habe. Ich werde die Antwort vorerst ohne veröffentlichen, falls es für Sie nützlich ist, während ich die verbleibenden Details ausarbeite.
Bearbeiten: Ziel innerhalb des minimalen Wenderadius
Es stellt sich heraus, dass diese Methode oft sofort funktioniert, selbst wenn das Ziel näher als unser Mindestdrehabstand liegt. Zumindest ein Teil eines der Wiedereintrittskreise endet außerhalb des Abbiegeradius, sodass wir einen brauchbaren Weg finden können, solange es uns nichts ausmacht, dass es ein bisschen wie eine Brezel aussieht ...
Wenn uns der Weg, den wir so bekommen, nicht gefällt (oder wenn einer nicht machbar ist - ich habe nicht jeden Fall gründlich geprüft - vielleicht gibt es unmögliche), können wir immer geradeaus oder rückwärts fahren, bis wir einen geeigneten finden Kusskontakt zwischen einem Start- und einem Endkreis, wie oben dargestellt.
quelle
Dies hängt sehr stark vom Rest Ihres Datenmodells für die Navigation ab. Dh. Welche Daten haben Sie zur Hand, was können Sie einfach hinzufügen und wie verbrauchen Sie sie?
Nehmen Sie ein ähnliches Szenario aus einem Verkehrssystem auf dem Wasser und unter der Annahme, dass
Sie könnten so etwas wie unten haben (verzeihen Sie mir das kindliche Aussehen der Bilder)
(Die roten Quadrate sind die Knoten, rote Linien sind Knotenverbindungen. Angenommen, Sie haben einen Pfadfindungslöser verwendet, mit dem die Knoten 1 bis 9 durchfahren werden können. Die Knoten 4 bis 9 sind auf dem Bild zu sehen, und Sie möchten die durch die grüne Linie angezeigten Knoten durchlaufen , zur Garage am Knoten Nr. 9; Sie möchten jedoch nicht genau an der grünen Linie fahren, sondern auf natürliche Weise auf der rechten Fahrspur bleiben und reibungslose Manöver durchführen).
Jeder Knoten hätte Metadaten, die beispielsweise einen Radius oder mehrere für verschiedene Zwecke enthalten. Einer von ihnen ist der blaue Kreis, der den Autos eine zielgerichtete Anleitung bietet .
In jedem Fall muss das Fahrzeug die nächsten beiden Knotenpunkte P (weiter) und P (weiter + 1) und ihre Positionen kennen. Natürlich hat das Auto auch eine Position. Ein Auto zielt auf die rechte Tangente des blauen Metadatenkreises von P (weiter). Autos fahren in die entgegengesetzte Richtung, damit sie nicht kollidieren. Wenn Sie auf die Tangente zielen, kann sich das Auto dem Kreis aus jeder Richtung nähern und sich immer rechts halten. Dies ist ein grobes Grundprinzip, das auf viele Arten verbessert werden kann.
P (next + 1) wird benötigt, um eine Entfernung zu bestimmen. Wenn das Auto P (next) erreicht oder sich in einem Radius seiner Metadaten befindet, kann es seinen Lenkwinkel anpassen, je nachdem, wie weit P (next + 1) entfernt ist. Dh. Wenn es nah ist, drehen Sie viel, wenn es weit weg ist, drehen Sie wenig. Anscheinend muss es auch andere Regeln und Randbedingungen geben, zum Beispiel die Berechnung eines Abstands zwischen dem Auto und einer Hilfslinie basierend auf den Tangenten auf der rechten Seite von P (weiter) und P (weiter + 1) und eine Korrektur durch diese - ein Wille, auf der gestrichelten (über dem Bild) und gepunkteten (unter dem Bild) Linie zu bleiben.
In jedem Fall vergisst das Auto, wenn es einen Knoten passiert , diesen und beginnt, die nächsten beiden zu betrachten .
Auf deine Frage. Anscheinend kann es beim Erreichen von Knoten 7 (im Bild oben, im Bild unten als Knoten 2 gesehen) nicht genug drehen .
Eine mögliche Lösung es einige Hilfslinien zu konstruieren und ein weiteren Treffer aller Zeiten zu halten , und hat dann das Auto zu bewegen , indem es die eigenen Physik - Einstellungen (Beschleunigung mit einer bestimmten Geschwindigkeit, Rückwärts langsamer, nehmen Knoten Metadaten SPEEDLIMITS berücksichtigt, Bremsen zu einem bestimmten oder berechneten G usw.). Wie gesagt, das Auto ist in diesem Szenario ein autonomes, selbstbeschreibendes, selbsttragendes Objekt.
Haben Sie die grünen Hilfslinien 1,2,3 . Wenn das Auto den Magentakreis erreicht , biegt es nach rechts ab. Zu diesem Zeitpunkt können Sie bereits berechnen, dass dies nicht erfolgreich sein wird (Sie kennen die maximale Drehrate und können die Kurve berechnen und sehen, dass beide Helplines 2 und 3 gekreuzt werden). Drehen Sie die Lenkung ganz nach rechts und lassen Sie sie vorwärts fahren (in Schritten der Physik) und verlangsamen Sie sie, wenn sie die Hilfslinie 3 erreicht (nähert sich - verwenden Sie Schwellenwerte, f (dist zur Helpline) usw.). Wenn es sich in der Hilfslinie 3 befindet, wechseln Sie in den Rückwärtsmodus und drehen Sie die Lenkung auf die entgegengesetzte Position . Lassen Sie es umkehren, bis es die Hilfslinie 4 erreicht(die Verbindungslinie zwischen Knoten 1 und 2 - Google für "Point at Side of Line-Algorithmus"). Wenn Sie es erreichen, verlangsamen Sie es, gehen Sie wieder in den Vorwärtsfahrmodus und drehen Sie das Rad. Wiederholen, bis die Straße frei ist - anscheinend war es diesmal mit 1 zusätzlichen Manöver ausreichend.
Dies ist die allgemeine Idee: Während der Spielschleife oder beim Überprüfen des Spiels Task Que System:
Indem den Knoten und den Autos ausreichende Daten gegeben werden, wird es Bewegung und Fortsetzung geben.
Bearbeiten: Und hinzufügen: Dies erfordert natürlich eine Feinabstimmung. Für Ihr Simulationsverhalten sind möglicherweise andere Hilfslinien, Metadaten, Kreise usw. erforderlich. Dies würde jedoch eine Vorstellung von einer möglichen Lösung geben.
quelle
Am Ende habe ich getan, was DMGregory vorgeschlagen hat, und es funktioniert gut. Hier ist ein relevanter Code (wenn auch nicht eigenständig), der zur Berechnung der beiden Tangentenstile verwendet werden kann. Ich bin mir sicher, dass dieser Code nicht effizient ist und wahrscheinlich nicht in allen Situationen korrekt ist, aber er funktioniert bisher für mich:
Hier sind zwei Filme des obigen Codes in Aktion:
Hier ist ein "äußerer" Pfad: http://youtube.com/watch?v=99e5Wm8OKb0 und hier ist ein "Kreuzungspfad": http://youtube.com/watch?v=iEMt8mBheZU
Wenn dieser Code hilft, Sie aber Fragen zu einigen der Teile haben, die hier nicht gezeigt werden, schreiben Sie einfach einen Kommentar und ich sollte ihn in ein oder zwei Tagen sehen.
quelle