Wyobraź sobie „drona” i punkt docelowy na płaszczyźnie 2D. Istnieje osiem parametrów:
P = my position
Q = target position
V = my velocity
I = my moment of inertia
w = my angular velocity
s = my angular position
T = max thrust
U = max torque
(powiemy tylko, że cel jest nieruchomy)
Zadaniem drona jest jak najszybsze dotarcie do celu, przestrzegając maksymalnego momentu obrotowego i maksymalnego ciągu. Istnieją tylko dwa sposoby zastosowania momentu obrotowego, ponieważ odbywa się to tylko w płaszczyźnie 2d. Ciąg jest ograniczony do poruszania się tylko w jednym kierunku względem orientacji jednostki i nie może być wycelowany bez obracania drona. Zlekceważąc opór, możesz po prostu udawać, że unosi się w przestrzeni kosmicznej 2d. Powiedzmy, że dron sprawdza równanie w przedziale czasowym t
(może mniej więcej co 0,01 sekundy), podłącza parametry i odpowiednio dostosowuje swój moment obrotowy i ciąg. Jakie powinny być równania dla ciągu i momentu obrotowego?
Odpowiedzi:
W świetle kontekstu pytania, http://nodewar.com/ , istnieje kilka szczegółowych uwag dotyczących twojego rozwiązania:
Metody te postanowiłem wykorzystać do osiągnięcia pożądanego przyspieszenia.
Przyspieszenie, a nie prędkość
Ponieważ masz już określoną prędkość, a twój cel się porusza, nie potrzebujesz pchnięcia w kierunku punktu. Potrzebujesz ciągu, aby zmienić prędkość na taką, jaka powinna być. Oznacza to, że twój statek musi wskazywać nie w kierunku, w którym zmierza, ale w kierunku, w którym powinien przyspieszyć.
Kierowanie w prawo
Masz wektor przyspieszenia, teraz chcesz go zastosować. Określ, jak daleko trzeba obrócić. Prawdopodobnie użyłem więcej kroków, niż jest to wymagane, ale wprawiają mnie w zakłopotanie współrzędne i myślę, że nielimitowana wartość obrotu statku i tak jest błędem w API.
Prosta formuła. Cały czas obracanie jest bezpieczne, więc nie zawracaj sobie głowy zastosowaniem częściowych wartości momentu obrotowego. Jeśli potrzebujesz niewielkiej korekty prędkości kątowej, i tak możesz to ustalić wiele razy na sekundę.
Mniej prosta formuła. Nadejdzie moment, w którym nie będziesz chciał kontynuować skręcania, ponieważ w końcu chcesz przestać. Na szczęście to ograniczenie prędkości kątowej oznacza, że możesz szybko zwolnić od maksymalnej prędkości kątowej do zera. Musisz tylko obliczyć, kiedy to zrobić.
Po poprawieniu powyższego kodu, aby dopasować go do twoich potrzeb, twój statek powinien szybko i precyzyjnie obrócić się pod dowolnym kątem, który podałeś do celu.
Szybkość taranowania
Kiedy więc pchnąć? Ponownie szybka zmiana celu i inne czynniki powodują ogromne trudności w rozwiązaniu dokładnego rozwiązania. Nie próbuj.
W przypadkach, w których potrzebujesz częściowego ciągu, możesz ponownie polegać na tym, że możesz wybierać między 0 a 1 ciągiem wiele razy na sekundę. Zapewnia to efektywny ciąg cząstkowy bez zmiany rzeczywistej wartości.
Powodzenia!
źródło
Podobne pytanie, z kilkoma dobrymi odpowiedziami, w tym pozorną nazwą tego całego tematu, „planowanie ruchu”:
/programming/2560817/2d-trajectory-planning-of-a-spaceship-with-physics
Jako programista podoba mi się praktyczność sugestii użytkownika user470365. Jednak poddam się bardziej rygorystycznemu podejściu. Moja propozycja tutaj oblicza pełny plan na początku, ale przypuszczam, że możesz zmienić ocenę tak często, jak to pożądane, jeśli parametry się zmieniają.
Plan
Detale
Sugeruję iteracyjne metody znajdowania d i t :
Zakładając brak ciągu, przemierzaj przyszłą trajektorię drona za pomocą pętli i małego pomiaru czasu:
Znaleźliśmy teraz d i t .
Obrócenie
Kiedy mówię „obróć na d ”, mam na myśli „zrób sekwencję momentów obrotowych, aby obrócić do d tak szybko, jak to możliwe, jednocześnie zmniejszając prędkość kątową do zera”. Prawdopodobnie istnieje równanie dla tego obejmujące kierunek prądu, bieżącą prędkość kątową i maksymalne przyspieszenie kątowe, ale komplikuje to zachowanie zawijania kątów.
źródło