Wyobraź sobie ruch podobny do samochodu, w którym byty nie mogą włączyć dziesięciocentówki. Powiedzmy, ze względu na dyskusję, że przy dużej prędkości mogą obracać się o 90 stopni na sekundę. W wielu przypadkach zmieniłoby to optymalną ścieżkę, a tym samym wyszukiwanie ścieżki. Może nawet sprawić, że „zwykłe” ścieżki będą całkowicie niemożliwe do przejścia.
Czy istnieją jakieś algorytmy wyszukiwania ścieżki lub algorytmy planowania ruchu, które mogą o tym pamiętać, czy też istnieją proste sposoby dostosowania popularnych?
path-finding
car
Weckar E.
źródło
źródło
Odpowiedzi:
Witamy w cudownym świecie niehonomicznego planowania ruchu. Polecam to zrobić za pomocą planera ścieżki siatki kratowej . Inne alternatywy obejmują kinodynamiczną RRT i optymalizację trajektorii . Systemy niehonomiczne obejmują samochody, łodzie, monocykle lub cokolwiek, w którym pojazd nie może jechać w dowolnym kierunku. Planowanie tych systemów jest znacznie trudniejsze niż systemy holonomiczne i do ~ 2000 roku znajdowało się na krawędzi badań akademickich. Obecnie istnieje wiele algorytmów do wyboru, z których działa przyzwoicie.
Oto jak to działa.
Stan
Konfiguracja twojego samochodu q jest w rzeczywistości stanem 3D zawierającym pozycję x, y i jego orientację t . Węzły w algorytmie A * są w rzeczywistości wektorami 3D.
działania
A co z krawędziami?
To nieco trudniejsze, ponieważ twój samochód może faktycznie wybrać nieskończoną liczbę sposobów obracania koła. Tak, możemy zrobić to dostępne do planowania sieci kratowej poprzez ograniczenie liczby działań samochód może podjąć w celu dyskretnego zbioru, A . Dla uproszczenia załóżmy, że samochód nie przyspiesza, ale może natychmiast zmienić prędkość. W naszym przypadku A może wyglądać następująco:
Teraz możemy stworzyć dyskretny zestaw działań, które samochód może podjąć w dowolnym momencie. Na przykład twarde prawe naciśnięcie gazu do końca przez 0,5 sekundy wyglądałoby tak:
Włączenie cofania i cofanie samochodu wyglądałoby następująco:
Twoja lista działań wyglądałaby następująco:
Potrzebny jest także sposób zdefiniowania, w jaki sposób działanie podjęte w węźle powoduje powstanie nowego węzła. Nazywa się to dynamiką naprzód systemu.
Dyskretne komórki siatki
Teraz, aby zbudować siatkę kratową, wszystko, co musimy zrobić, to hash stany samochodu w dyskretne komórki siatki. To zamienia je w odrębne węzły, po których może następować A *. Jest to bardzo ważne, ponieważ w przeciwnym razie A * nie miałby możliwości dowiedzenia się, czy dwa stany samochodu są takie same, aby je porównać. Przez mieszanie z wartościami całkowitymi komórek siatki staje się to trywialne.
Teraz możemy zrobić plan A *, w którym GridCells są węzłami, Działania są krawędziami między węzłami, a Start i Cel są wyrażone w postaci GridCells. Heurystyka między dwoma komórkami siatki to odległość w xiy plus odległość kątowa w theta.
Podążając ścieżką
Teraz, gdy mamy ścieżkę pod względem GridCells i akcji między nimi, możemy napisać obserwatora ścieżki dla samochodu. Ponieważ komórki siatki są dyskretne, samochód przeskakuje między komórkami. Będziemy musieli wygładzić ruch samochodu wzdłuż ścieżki. Jeśli gra korzysta z silnika fizyki, można to osiągnąć, pisząc kontroler kierowania, który stara się utrzymywać samochód jak najbliżej ścieżki. W przeciwnym razie możesz animować ścieżkę za pomocą krzywych Beziera lub po prostu uśredniając kilka najbliższych punktów na ścieżce.
źródło
Większość algorytmów wyszukiwania ścieżek działa na dowolnym wykresie bez ograniczenia geometrii.
Musisz więc dodać orientację samochodu do każdego badanego węzła i ograniczyć, które węzły są faktycznie połączone.
źródło
Moje myśli nigdy ich nie testowały!
Powinieneś być w stanie to zrobić bez konieczności wcześniejszego ukończenia ścieżki, ergo: obsługa zwrotów podczas A *, które prawdopodobnie będą znacznie lepiej zoptymalizowane, ale może również okazać się problematyczne i usterkowe, naprawdę nie wiedziałbym i niestety nie mam czasu, aby sam to przetestować.
źródło
Jeśli twój agent ma pełną kontrolę nad samochodem, zrób to na odwrót. Najpierw podłącz linię od początku do końca, a następnie ustal, z jaką prędkością możesz nawigować na każdym zakręcie, podobnie jak w odpowiedzi Dennisa.
Nie rysuj jednak krzywych Beziera ze stałych punktów. Aby zminimalizować utratę prędkości, musisz przesunąć całą linię, więc zacznij od wstawienia dodatkowych węzłów w mniej więcej równej odległości, a następnie przejdź do minimalizacji energii lub podobnych strategii. Aby uzyskać szczegółowe informacje, musisz przyjrzeć się generowaniu linii AI w grach wyścigowych (najlepiej sim lub semi-sim).
Po uruchomieniu systemu linii AI uruchom wyszukiwanie A * i dla każdej ścieżki przejdź przynajmniej o jeden róg do przodu, a następnie oblicz linię AI, która daje oszacowanie czasu. To byłaby twoja funkcja kosztów.
źródło