Symulacja wyścigów samochodowych

1

Cześć,
trafiłem ostatnio na grę która symuluje wyścigi samochodowe. Gracz nie steruje pojazdem a jedynie jest managerem zespołu zmieniając różne ustawienia pojazdów.

Zastanawiam się jak ograna jest taka symulacja wyścigu i jak to najlepiej zrobić gdybym sam chciał takie coś napisać. Do głowy przychodzą mi 2 rozwiązania: (załóżmy, że mamy widok 2d, z góry na cały tor)

  1. sieć neuronowa i nauczenie jej jak optymalnie powinien zachowywać się pojazd (razem z wyprzedzaniem i unikaniem kolizji z innymi pojazdami)

  2. wytyczenie optymalnej ścieżki po trasie dla pojazdu i dodanie do niej możliwego odchylenia w celu wyprzedzenia np wolniejszego pojazdu i innych dodatkowych rzeczy np ścieżki hamowania przed zakrętami.

Wydaje mi się, że dla celów tylko symulacji wyścigu to 2 rozwiązanie wydaje się lepsze. Jakie jest wasze zdanie? Spotkaliście się może z takim problemem kiedyś? Znacie może jakieś materiały na ten temat?

0

Zeby to bylo realne kierowcy musza popelniac bledy a samochody musza byc awaryjne, do tego z roznymi charakterystykami w zaleznosci od pogody.

0

To wiem ale chodzi mi o tor jazdy czy wystarczy zeby byl z gory zaprogramowany a cale sciganie opieralo sie wlasnie na tych charakterystykach/statystykach pojazdow i kierowcow czy jednak AI bylaby lepsza?

0

Myślę, że ta symulacja działa dużo prościej :D
Z ustawień pojazdu + kierowcy itp wylicza potencjał danego pojazdu i następnie losuje z danym rozkładem prawdopodobieństwa kolejne miejsca. Jest to dużo wydajniejsze, a efekt będzie dość podobny

0

Nie no pewnie, że tak można zrobić :) Tylko chodzi mi o to, że prezentowana jest wizualna symulacja wyścigu gdzie pojazdy się poruszają. I mi chodzi głównie o tą wizualizacje.
Bo obliczyć jest w miarę łatwo zakładając różne zależności.

0

No to tu dochodzą niestety takie zabawy jak pełne symulowanie fizyki. Chyba, że chcesz mieć faktycznie jakiś tylko prosty model to poszedł bym w taką stronę, że na mapie tory wyznaczł punkty do których samochody będą podążały oraz jakies strefy gdzie hamują/przyśpieszają

1

Znalazlem prosty generator tras w pythonie. No i mam wygenerowana trase:

screenshot-20200602141722.png

Teraz zastanawiam sie wlasnie jak pojazdy na nich poruszac symulujac wyscig. W sumie moznaby zaimplementowac proste skanowanie otoczenia i badanie odleglosci od krancow drogi i na tej podstawie wyliczac trase i predkosc.

screenshot-20200602142045.png

Albo narysować mu z gory ustaloną trasę (z możliwością odchylenia np na wyprzedzanie) i po prostu operować przyspieszaniem, hamowaniem żeby lepiej zasymulować wchodzenie w zakręty.

screenshot-20200602142419.png

Nie próbowałem jeszcze tego robić (ani nic podobnego) więc się po prostu zastanawiam :)

0

@karpov: troche pobocznie ale poszukaj sobie info o takiej grze na C64 -> Banger Racer bo z grubsza to co robisz mi ja przypomina, a moze jakies fajne pomysly zgarniesz :)

Bardzo latwy sposob na AI jesli bedzie tylko jedna trasa. Ponagrywaj przejazdy (tzw. ghost) i pozniej losowo wybieraj wg ktorego przeciwnik pojedzie. Mozesz je tez ze soba pomiksaowac :)

I filmik z deep leaninngiem //www.youtube.com/watch?v=Aut32pR5PQA.

1

Dzięki za podpowiedź :) Tych filmików o AI już widziałem mnóstwo hehe

Dobra, wkręciłem się troche w to ;)

Udało mi się zrobić algorytm, ktory potrafi wykonać pełne okrążenie toru:

Mam tylko problem bo chciałbym żeby zmiany kierunku odbywały się płynnie i łagodnie a że algorytm ma cały czas trzymać się środka trasy to na ostrych zakrętach mam efekt przeskoku. Sprawdzam czy poruszając się w określonym kierunku zbliżam się do końca drogi, jeżeli tak to zmieniam kierunek. I tu mam problem bo mogę to sprawdzenie wykonać jak jestem na środku drogi i wtedy przeskoku nie ma, ale jak chce żeby to było bardziej realistyczne i odwrócenie kierunku robie np na 5px przed końcem to moj kwadracik bardzo ostro potem wraca na środek drogi:
Macie może pomysł jak uniknąć tego ostrego zjazdu i spokojnie wrócić na środek?

0

Cisne dalej. Myślę, że robie spore postępy. Mam już grafikę autka, póki co zaorałem stary system poruszania się pojazdu. Na razię mogę sterować nim tylko sam ale mam już punkty odniesienia żeby napisać samodzielnie poruszanie się samochodu. W tym celu badam pod kilkoma kątami odległość auta od ściany. Zastanawiam się teraz nad najbardziej optymalnym dobieraniem skręcania i punktu w którym będzie się poruszać. Prawdopodobnie pierwsza próba to będzie po prostu poruszanie się w kierunku najbardziej oddalonego punktu sprawdzającego odległość. Potem pewnie będę jakość bardziej ulepszać.

1

Poczytaj sobie o "racing line". Zresztą w tej grze, która była inspiracją, tym managerze, gracz zmieniał ustawienia i to miało wpływ na czasy głównie dlatego (zgaduję, tzn. o ile było to podobne do rzeczywistości), że pojazd ma m.in. ograniczoną przyczepność. Także wtedy sens ma "racing line", bo przy nieograniczonej przyczepności (a ograniczonej prędkości), to chyba najlepiej byłoby poruszać się najkrótszą drogą. Jak przyczepność jest ograniczona, to też wchodzi kwestia hamowania i potem przyspieszania jak najwcześniej przy wychodzeniu z zakrętu. Chodzi mi o to, że jeśli fizyka prawie nie istnieje, to nie mają też sensu zachowania rzeczywiste wynikające z tej fizyki.
Coś do poczytania:
https://policedriver.com/wp-content/uploads/2015/05/1-phors.pdf

0

Jak przyczepnosc nie bedzie 100% to musisz dodac jeszcze manipulacje predkoscia zeby optymalnie przejezdzac. Gran turismo 2 mialo fajny tutorial jak sie powinno optymalnie zakrety przejezdac.

0

Zrobilem tak, że auto podąża za najdalszym odcinkiem, który bada odległość od przeszkód. W zależności od długości najdłuższego odcinka ustalana jest też prędkość. Zrobiłem sobie prowizoryczną skrzynie biegów gdzie w zależności długości najdłuższego odcinka ustalam prędkość:

self.skrzyniaBiegow = {
            8: range(280, 400),
            7: range(260, 280),
            6: range(240, 260),
            5: range(220, 240),
            4: range(150, 220),
            3: range(100, 150),
            2: range(50, 100),
            1: range(0, 50),
        }

No i w sumie wygląda całkiem ciekawie bez wytyczania z góry racing line. Muszę zastanowić się jeszcze jak upłynnić tą jazdę, przypuszczac ze jezdzi tak skokowo przez zmiane tej predkosci, musze sie nad tym zastanowic.

1

Jeszcze przypomniał mi się taki prosty artykulik ze starych czasów:
https://www.asawicki.info/Mirror/Car%20Physics%20for%20Games/Car%20Physics%20for%20Games.html
Jest tam coś m.in. o biegach.

1

Stwierdziłem, że spróbuje jednak z tym race line bo nie chciałem za bardzo brnąć w AI. Okazało się, że szybciej by chyba było nauczyć samochodzić jeździć ;) Spróbowałem zaimplementować algorytm do wyznacznia optymalnej trasy ale wyszło mi to średnio. Może umyka mi jakaś mała rzecz ale czacha mi już dzisiaj dymi więc nic lepszego nie wymyśle.

Znalazłem ciekawy opis tutaj: http://phungdinhthang.com/2016/12/16/calculate-racing-lines-automatically/?i=1
A wyszło mi tak:

screenshot-20200604193255.png

Spodziewałem się trochę lepszych rezultatów. Gołym okiem widzę, że w niektórych miejscach mogło pójść inaczej.

W sumie najbardziej podoba mi się pomysł opisany tutaj:

screenshot-20200604193449.png

Ale z tym też mam problem z zaimplementowaniem tego algorytmu - muszę powalczyć.

3

Panie i Panowie :) Udało się :) Zrobiłem w pełni działający generator racing line dla dowolnie generowanej trasy. Póki co wrzucam filmik. Potem dam linka do kodu, muszę go trochę posprzątać ;)
Całość napisana w pythonie. Dodałem do filmu napisy, który opisują o co chodzi:

1 użytkowników online, w tym zalogowanych: 0, gości: 1