Autor Wątek: AI pojazdu w grze 2D  (Przeczytany 3004 razy)

Offline vanguard

  • Użytkownik

# Wrzesień 03, 2015, 17:33:27
Witam. Mam pytanie co do tego jak zrobić AI oraz czy moje obecne podejście jest dobre.

Szybki opis sytuacji: Tworzę sobie prostą gierkę 2D pod Unity. Mam prostokątnego Sprite'a (grafika pojazdu) ze skryptem pojazdu, którego dane wejściowe (pola klasy) to booleanowskie zmienne czy wciśnięty pedał gazu, hamulca oraz liczba obrót kierownicy. Na tej podstawie klasa pojazdu liczy sobie ruch czyli ogólnie chodzi o przemieszczeni pojazdu względem tego jaki jest skręt kierownicy no i zwiększanie/zmniejszanie prędkości. To dosyć proste obliczenia.

Klasa Player to jakby wrapper co to obsługuje. Mam w niej czytanie z klawiatury lub dotyku na telefonie i ta klasa tylko steruje klasą pojazdu ustawiając trzymanie gazu na true, czy tam hamulca, czy obrotu kierownicy.

No i do sedna tematu. Teraz robię klasę NPC która będzie sterować pojazdem, czyli tymi 3 polami (bool wcisnietyGaz, bool wcisnietyHamulec, float obrotKierownicy).
Potrzebuję tak napisać klasę NPC by bot jeździł po wyznaczonej trasie. Trochę nie wiem jak do końca to ugryźć i czy słuszna jest metoda działania taka, że bot ma do dyspozycji tylko pedały gazu, hamulca i kierownicę i ma za zadanie tylko tymi narzędziami korygować swój ruch, nanosić poprawki. Ale wydaje mi się że powinno być OK.

Jako że temat duży, a jestem początkujący w gamedevie chciałbym na początek zrobić ruch po linii prostej, a w zasadzie podążanie po linii prostej. Nawiasem mówiąc tak chcę zrobić logikę dróg - będą drogi na ekranie i będą się generowały funkcję liniowe dla nich, do skrętu może ruch po okręgu jako łączenie dwóch prostych czy coś, ale to nieistotne teraz.

No ale wracając znów do tematu, jak zrobić podążanie po prostej trasie? Żeby bot był w stanie wrócić na trasę. Myślę że kilka czynników wezmę pod uwagę:
- odległość pojazdu od prostej - im dalej tym pojazd mocniej skręca
- wziąć pod uwagę prędkość pojazdu do prędkości skrętu - im szybciej pojazd jedzie tym bot wolniej kręci kierownicą
- im szybciej pojazd jedzie tym maksymalny obrót kierownicy staje się mniejszy

Co sądzicie o tym? Czy to dobra droga? Polecacie się czymś zainteresować do wykonania tego? Np może jakieś krzywe beuziera (nigdy jeszcze ich nie wykorzystywałem w programowaniu).
Z góry dzięki za każdą pomoc.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline ShadowDancer

  • Redaktor

# Wrzesień 03, 2015, 18:27:54

Offline jarou

  • Użytkownik

# Wrzesień 03, 2015, 19:34:26
O ile te trzy własności są istotne w przypadku gracza, by zasymulować jakiś stopień realizmu w kierowaniu pojazdem, to i tak koniec końców przekładają się one na wektor prędkości tegoż pojazdu. Proponowałbym w takim razie zastanowienie się, czy w przypadku bota konieczne jest takie komplikowanie sobie życia i czy operowanie samym wektorem prędkości nie będzie wystarczające. Chyba, że planujesz jakąś wizualizację wciskania pedałów i ruchów kierownicy.

Offline koirat

  • Użytkownik

# Wrzesień 03, 2015, 19:45:34
Też miałem proponować sieci neuronowe ale piszesz że jesteś początkujący wiec się powstrzymałem.
Możesz spróbować z logiką rozmytą.

Offline Xender

  • Użytkownik

# Wrzesień 03, 2015, 20:27:01
O ile te trzy własności są istotne w przypadku gracza, by zasymulować jakiś stopień realizmu w kierowaniu pojazdem, to i tak koniec końców przekładają się one na wektor prędkości tegoż pojazdu. Proponowałbym w takim razie zastanowienie się, czy w przypadku bota konieczne jest takie komplikowanie sobie życia i czy operowanie samym wektorem prędkości nie będzie wystarczające. Chyba, że planujesz jakąś wizualizację wciskania pedałów i ruchów kierownicy.

Czytając OP, w pierwszej chwili pomyślałem to samo, w drugiej - że jednak może być potrzebne, ale z zupełnie innego powodu - realizmu jazdy.

Jeśli chcemy, żeby pojazd gracza poruszał się realistycznie, to pojazdy AI powinny poruszać się wg. takiego samego lub podobnego modelu.

To, czy dany model da się i warto symulować dla AI osobno bez tych wartości pewnie zależy od tego, jaki to konkretnie model.

No a w wypadku wspomnianych wcześniej sieci neuronowych, wydaje mi się nawet naturalne, że AI steruje podobnym zestawem zmiennych wejściowych, co gracz. No ale tak, sieci neuronowe jakoś specjalnie trudne nie są, ale może lepiej niech najpierw OP weźmie się za ten ruch po linii prostej, a nie odwrotnie.

Offline ShadowDancer

  • Redaktor

# Wrzesień 03, 2015, 21:38:49
Z tymi sieciami neuronowymi to oczywiście był żart ;)


Do gry wyścigowej użyłbym waypointów + steering behaviors

Offline koirat

  • Użytkownik

# Wrzesień 03, 2015, 21:41:30
Swoją drogą warto by się również przyjrzeć kontrolerom PID.

@up no ja nie żartowałem.

Offline ShadowDancer

  • Redaktor

# Wrzesień 03, 2015, 22:44:53
@up:
Myślę, że skoro OP jest na etapie prostej gry 2d i prostego sprite'a, to nie da rady sieciom neuronowym.

Offline vanguard

  • Użytkownik

# Wrzesień 03, 2015, 22:58:35
Co znaczy OP? OP/OOP - Object Oriented Programming czy coś innego?

Waypointów chyba nie użyję, bo chodzi o to żeby pojazd trzymał się zasad ruchu drogowego. Żeby jeździł po swoim pasie ruchu. Więc gdyby zjechał z drogi (np poprzez ominięcie przeszkody) to potem nie kierowałby się bezpośrednio do waypointa na końcu drogi, tylko potrzebowałby zaraz wrócić na swój pas. Ale właściwie nie ważne.. Czy to powrót na linię prostą, czy nawet gdyby robić waypointy i dodatkowo obliczyć waypoint do powrotu na trasę to jest wspólny inny problem.

Problem jest taki że nie wiem jak to zacząć bo te czynniki współdziałają na siebie. Ale to sedno działania które i tak muszę sam wymyślić. Na razie nie mogę znaleźć punktu zaczepienia.
Muszę zrobić by pojazd wrócił po łuku na trasę. Muszę obliczać rotację pojazdu. Ale za rotacją pojazdu stoi skręt kół. Od niego to zależy. Ale skrętu kół też nie mogę na sztywno ustawiać raz 50 stopni, za klatke 70 tylko też jakoś przejściowo, od 50 do 70.

Trzeba by ograniczyć pojazdowi w taki prosty sposób maksymalny skręt kierownicy dla prędkości. Np. że od 15km/h kierownica może skręcać 100% w daną stronę i od tej pory do wyższej prędkości zaczyna maleć aż do prędkości max pojazdu 50km/h gdzie maksymalnie można skręcić 40% kierownicą w daną stronę.

Hm może jakiś współczynnik optymalnej prędkości skrętu do prędkości jazdy. Jakoś bym go liczył, coś takiego:
- wynoszący około 1 to jazda po łuku byłaby optymalna (nie za szybko, nie za wolno)
- więcej niż 1 to pojazd jedzie zbyt szybko i w rzeczywistości zaraz będzie poślizg jeśli jeszcze auto będzie przyspieszać
- mniej niż 1 to z kolei auto jedzie wolno, przeciwieństwo wpadania w poślizg. Np jedziemy 10km/h przy lekkim skręcie - nic się nie dzieje, ale możemy przyspieszyć żeby współczynnik zbliżał się do 1

Na razie mam mętlik, muszę o coś zahaczyć by resztę dostosować.

EDIT: Mógłbym może wykorzystać to że movement pojazdu jest liczony tak, że powstaje okrąg po którym jadą koła. Prowadzę po stronie skrętu prostopadłe do osi kół i przecinają się w punkcie gdzie jest środek okręgu po którym jadą koła. Wyznaczyć tak skręt kół żeby powstałe koło/zarazem łuk zbiegało się/przecinało się z linią trasy, ale tak przecinało żeby w tym miejscu łuku był on takiej samej rotacji co prosta. Żeby styczna łuku/koła miała tą samą rotację co prosta. Chyba brzmi nieźle.
Tylko musiałbym obliczyć ten punkt początku łuku przed pojazdem, tak żebym zdążył skręcić płynnie o daną wielkość łuku/skrętu kół/powstałego promienia ;d.

Tak wygląda skręcanie: http://i.imgur.com/9cmFb6h.png
« Ostatnia zmiana: Wrzesień 03, 2015, 23:20:53 wysłana przez vanguard »

Offline Karol

  • Użytkownik

  • +2
# Wrzesień 03, 2015, 23:06:33
Co znaczy OP?
OP - Original Poster, czyli osoba zakładająca wątek w którym toczy się rozmowa.

Offline JasonVoorhees

  • Użytkownik
    • The Immortal Life of the Son of Jay

  • +1
# Wrzesień 04, 2015, 08:31:32
http://www.miejski.pl/slowo-OP

Heh, ja znałem tylko Overpowered...

Offline Icy Tower

  • Użytkownik

  • +2
# Wrzesień 04, 2015, 11:14:03
Hej,

By uzyskać bardziej złożone zachowanie AI musisz rozbić jego działanie na warstwy. Czyli najpierw musisz mieć warstwę, która dostaje punkt lub krzywą i potrafi po niej podążać z zadaną prędkością. Następnie tworzysz warstwę, która wybiera jak ta krzywa ma wyglądać (może być ona złożona z "waypointów", czyli po prostu punktów). Ta druga warstwa może wyznaczyć np. że w tej chwili należy zwolnić i poruszać się po innej krzywej, ponieważ należy uniknąć jakiejś przeszkody.

Im lepiej będą działały warstwy podstawowe (podążanie po ścieżce) tym lepiej będą działały warstwy wyższe. Dzieląc w ten sposób model unikasz wielkiego bałaganu i możesz łatwo usprawniać poszczególne części modelu.

Do samego podążania za ścieżką dobry byłby sterownik PID. Jego parametrami byłyby odległość od ścieżki w poprzek i różnica prędkości aktualnej i pożądanej (czyli dwa sterowniki PID - jeden dla skrętu, drugi dla gazu/hamulca). Z tym, że sterownik PID uwzględnia nie tylko aktualny błąd podążania za ścieżką (czyli odległość od ścieżki w poprzek, która powinna być w idealnym przypadku zerowa), ale też tempo zmian tego błędu. Czyli jeśli jesteś 3m po lewej stronie ścieżki, ale bardzo szybko zbliżasz się do niej to sterownik PID już zacznie skręcać kierownicą w lewo, by zmniejszyć tempo zbliżania się do ścieżki i jej nie przeciąć zbyt szybko. Zwykła funkcja skrętu od odległości od ścieżki przecięłaby ścieżkę, a dopiero potem skręciła w lewo - miałbyś ciągłe zygzakowanie.

Istnieją oczywiście jeszcze inne sterowniki (np. predykcyjne), ale zacząłbym od PID na Twoim miejscu. Potem zawsze możesz jedną warstwę modelu przepisać lub zmienić.
« Ostatnia zmiana: Wrzesień 04, 2015, 11:16:46 wysłana przez Icy Tower »

Offline vanguard

  • Użytkownik

# Wrzesień 30, 2015, 01:25:01
Witam po przerwie. Dałem sobie z tym problemem spokój i postanowiłem zrobić prościej, jednak teraz wracam bo chcąc udoskonalić sieć dróg, połączeń musiałbym klepać za dużo parametrów i potrzebuję to zautomatyzować.

Jak w grach, np. Euro Truck Simulator 2 wygląda logika dróg/ai? Najpierw rysują świat - drzewa, budynki, drogi, skrzyżowania a potem ustawiają w tym świecie waypointy na drogach? Jedne waypointy takie jak na autostradzie zwykłe, jeden połączony z następnym. Ale już w mieście trochę kombinacji bo skrzyżowania, bo światła, pierwszeństwo itd.

Próbowałem układać segmenty i je łączyć ze sobą - prostą drogę, skrzyżowanie, rondo. Ale kiedy naszła potrzeba np na drodze zrobić dodatkowy pas do skrętu i więcej takich kombinacji to musiałbym bardzo dużo małych segmentów łączyć i chyba lepiej najpierw poukładać sprite'y dróg a potem logikę z waypointami zrobić.

Dajcie jakiś feedback, może jest jakieś ciekawe źródło na ten temat? :)