Powiedzmy na przykład, że mam samochód, a samochód ma określony minimalny promień skrętu i chcę jeździć tym samochodem od punktu a do punktu b, ale samochód nie jest skierowany do punktu b. Jak obliczyć ścieżkę do punktu b? Określenie orientacji w punkcie b również byłoby dobre (powiedz, że chcesz jechać na podjazd, a następnie wjechać do garażu - nie przyniesie to wiele dobrego, jeśli dojdziesz do podjazdu, przejeżdżając przez trawnik i są skierowane bokiem :)
Wskaźnik do dokumentacji (a nawet tylko nazwa) byłby całkowicie w porządku - nie mogę nic znaleźć.
W moich próbach działają one w prostych przypadkach, ale zawodzą niefortunnie w sytuacjach, takich jak gdy punkt b jest bliższy niż minimalny promień skrętu.
Na przykład, jak określisz ścieżkę podobną do tej (pogrubiona ścieżka):
edytuj: W moim rzeczywistym problemie istnieją pewne proste ograniczenia ścieżki, ale już mam algorytm A *, który działa, ale pozwala on na natychmiastowe zmiany kursu, więc wygląda to głupio, gdy samochód nagle skręca o 90˚ za dziesięciocentówkę, kiedy dotrą do punktu zwrotnego.
źródło
Odpowiedzi:
Nie opracowałem do tej pory pełnych równań, ale oto kilka elementów wizualnych, które pomogą nam rozwiązać problem. Sprowadza się do pewnej geometrii:
( Ikony samochodów przez Kenney )
Z dowolnego punktu początkowego i orientacji możemy narysować dwa okręgi z naszym minimalnym promieniem skrętu - jeden po lewej, drugi po prawej. Opisują one punkty na jak najściślejszym początku naszej ścieżki.
Możemy zrobić to samo dla dowolnej żądanej pozycji końcowej i orientacji. Kręgi te opisują najściślejszy możliwy koniec naszej ścieżki.
Teraz problem sprowadza się do znalezienia ścieżki, która łączy jedno z początkowych kół z jednym z końcowych kół, całując je wzdłuż stycznej.
(Zakłada się, że nie musimy szukać ścieżki pomiędzy przeszkodami pomiędzy nimi, o czym nie wspomniano w pytaniu. Odpowiedź Stormwind dotyczy sposobu wykorzystania informacji z wykresu nawigacyjnego dla tego rodzaju problemów. Po uzyskaniu sekwencji węzłów aby przejść, możemy zastosować poniższą metodę do każdego segmentu planu).
Jeśli dla uproszczenia używamy linii prostych, otrzymujemy coś takiego:
To nas ogranicza. Po znalezieniu ścieżki tą metodą możesz sztucznie napompować jedno lub oba koła początkowe i końcowe, aby uzyskać mniej bezpośrednią, ale gładszą ścieżkę, aż do momentu, w którym oba kręgi się pocałują.
Obliczanie tych ścieżek
Przeanalizujmy przypadki dla jednego kierunku skrętu - powiedzmy, że zaczynamy naszą drogę od skrętu w prawo.
Środek naszego prawego promienia skrętu to:
startRightCenter = carStart.position + carStart.right * minRadius
Nazwijmy kąt prostego odcinka naszej ścieżki (mierzony od dodatniej osi x)
pathAngle
Jeśli narysujemy wektor od
rightCenter
punktu, w którym opuszczamy okrąg zawracający (w tym momencie musimy być skierowani w stronę pathAngle), to ten wektor jest ...startOffset = minRadius * (-cos(pathAngle), sin(pathAngle))
Oznacza to, że punktem wyjścia z kręgu musi być ...
departure = startRightCenter + startOffset
Punkt, w którym ponownie wkraczamy w okrąg skrętu, zależy od tego, czy zamierzamy zakończyć zakręt w lewo, czy w prawo:
Teraz, jeśli dobrze wykonaliśmy naszą pracę, linia łącząca
departure
zreentry
powinna być prostopadła dostartOffset
:A rozwiązanie tego równania da nam kąt (kąty), pod jakim to jest prawdziwe. (Używam liczby mnogiej, ponieważ technicznie istnieją dwa takie kąty, ale jeden z nich obejmuje jazdę do tyłu, co zwykle nie jest tym, czego chcemy)
Jako przykład zamieńmy skręt w prawo na literę skrętu w prawo:
Przypadek crossovera jest bardziej skomplikowany - to ten, na który jeszcze nie wypracowałem całej matematyki. Na razie opublikuję odpowiedź bez odpowiedzi, na wypadek, gdyby była dla Ciebie przydatna podczas opracowywania pozostałych szczegółów.
Edycja: Miejsce docelowe w minimalnym promieniu skrętu
Okazuje się, że ta metoda często działa natychmiast po wyjęciu z pudełka, nawet gdy miejsce docelowe jest bliżej niż nasza minimalna odległość skrętu. Przynajmniej część jednego z kręgów powrotnych kończy się poza promieniem skrętu, co pozwala nam znaleźć realną ścieżkę, o ile nie przeszkadza nam, że robi się trochę w stylu precla ...
Jeśli nie podoba nam się ścieżka, którą dostajemy w ten sposób (lub jeśli nie jest to wykonalne - nie sprawdziłem dokładnie wszystkich przypadków - być może są niemożliwe), zawsze możemy jechać prosto do przodu lub do tyłu, dopóki nie znajdziemy odpowiedniego całowanie kontaktu między kołem początkowym i końcowym, jak pokazano na schemacie powyżej.
źródło
To bardzo zależy od reszty modelu danych do nawigacji. To znaczy. jakie dane masz pod ręką, co możesz łatwo dodać i jak je wykorzystać.
Biorąc podobny scenariusz z systemu ruchu na wodzie i przy założeniu, że
możesz mieć coś takiego poniżej (wybacz mi dziecinny wygląd zdjęć)
(Czerwone kwadraty są węzłami, czerwone linie są połączeniami węzłów. Załóżmy, że użyłeś solwera identyfikującego ścieżki, który dał węzłom 1-9 przejazd; węzły 4-9 widoczne na obrazie i chcesz przejść przez węzły wskazane zieloną linią , do garażu w węźle nr 9; jednak nie chcesz jechać dokładnie zieloną linią, zamiast tego pozostań naturalnie na prawym bocznym pasie i rób płynne manewry).
Każdy węzeł miałby metadane, które przechowują na przykład promień lub wiele, dla różnych celów. Jednym z nich jest niebieskie kółko, które zapewnia wskazówki dotyczące celowania samochodów .
Za każdym razem pojazd musi znać następne dwa punkty węzłowe P (następny) i P (następny + 1) oraz ich pozycje. Oczywiście samochód ma również pozycję. Samochód ma na celu styczną po prawej stronie niebieskiego okręgu metadanych P (dalej). Podobnie samochody jadące w przeciwnym kierunku, dlatego nie zderzą się. Celowanie w styczną oznacza, że samochód może zbliżyć się do koła z dowolnego kierunku i zawsze trzymać się prawej strony. Jest to z grubsza podstawowa zasada, którą można poprawić na wiele sposobów.
P (następne + 1) jest potrzebne do określenia odległości - gdy samochód osiągnie P (następny) lub znajdzie się w promieniu metadanych, może dostosować kąt skrętu w zależności od odległości P (następne + 1). To znaczy. jeśli jest blisko, obróć dużo, jeśli jest daleko, obróć mało. Najwyraźniej muszą istnieć również inne reguły i warunki na krawędzi, na przykład obliczenie odległości między samochodem a linią pomocniczą na podstawie stycznych prawej strony P (dalej) i P (dalej + 1), i przez to korekta - wola pozostania na linii przerywanej (powyżej rys.) i kropkowanej (poniżej rys.).
W każdym razie, gdy samochód mija jeden węzeł , zapomina o nim i zaczyna patrzeć na kolejne dwa .
Na twoje pytanie Najwyraźniej po dotarciu do węzła 7 (na zdjęciu powyżej, widzianego jako węzeł 2 na poniższym obrazku), nie może się wystarczająco obrócić .
Jednym z możliwych rozwiązań jest zbudowanie niektórych linii pomocy i utrzymanie celu przez cały czas , a następnie pozwolić samochodowi poruszać się według jego własnych ustawień fizycznych (przyspieszać z określoną prędkością, cofać się wolniej, brać pod uwagę ograniczenia prędkości metadanych węzła, hamować przy danym lub obliczonym G itp.). Jak powiedziano, samochód jest w tym scenariuszu autonomicznym, samoopisującym się, samonośnym przedmiotem.
Miej zielone linie pomocy 1,2,3 . Gdy samochód dociera do magenta kręgu , zaczyna skręcać w prawo. W tym momencie możesz już obliczyć, że się nie powiedzie (znasz maksymalną prędkość skrętu i możesz obliczyć krzywą, i zobaczysz, że przecina ona obie linie pomocy 2 i 3). Skręć całkowicie w prawo i pozwól mu jechać do przodu (przyrosty fizyki) i zwolnij, gdy dojdzie do linii pomocy 3 (zbliża się do progów użycia, f (dystans do linii pomocy) itp.). Gdy znajdzie się na linii pomocy 3, przejdź do trybu cofania , przekręć kierownicę do pozycji całkowicie przeciwnej . Odwróć, aż dojdzie do linii pomocy 4(linia połączenia między węzłem 1 a 2 - google dla „algorytmu punktu z boku linii”). Zwolnij, gdy się do niego zbliży, przejdź ponownie do trybu jazdy do przodu , obróć koło. Powtarzaj, aż droga będzie wolna - najwyraźniej tym razem wystarczyło 1 dodatkowego manewru.
Jest to ogólny pomysł: podczas pętli gry lub podczas sprawdzania systemu kolejki zadań gry:
Podając węzłom i samochodom wystarczające dane, nastąpi ruch i kontynuacja.
Edycja: I dodawanie: To oczywiście wymaga dopracowania. Twoja symulacja behawioralna może wymagać różnych linii pomocy, metadanych, okręgów itp. To dałoby pomysł na jedno możliwe rozwiązanie.
źródło
Skończyło się na tym, że zasugerowałem DMGregory i działa dobrze. Oto odpowiedni kod (choć nie samodzielny), którego można użyć do obliczenia dwóch stylów stycznych. Jestem pewien, że ten kod nie jest wydajny i prawdopodobnie nie jest nawet poprawny we wszystkich sytuacjach, ale do tej pory działa dla mnie:
Oto dwa filmy z powyższym kodem w akcji:
Oto „zewnętrzna” ścieżka: http://youtube.com/watch?v=99e5Wm8OKb0, a oto ścieżka „przejściowa”: http://youtube.com/watch?v=iEMt8mBheZU
Jeśli ten kod pomaga, ale masz pytania dotyczące niektórych części, które nie zostały tutaj pokazane, po prostu opublikuj komentarz i powinienem go zobaczyć za dzień lub dwa.
źródło