Symulacja uniwersyteckiego łazika w Unity
Wersja 3, 29.01.18 Windows Mac Linux
- nagrywanie depth mapy każdej kamery
- optymalizacje
- kamery łazika renderują tylko kiedy trzeba
- wysyłanie obrazu przez socket w oddzielnym wątku
- wyłączony VSync co pozwala na częstsze wysyłanie obrazu
- naprawiono bug: "ostatnia nagrana próbka jest na początku trasy"
Wersja 2, 22.01.18 Windows Mac Linux
- [23.01.17] - naprawiono bug: "symulator wysyła obraz z prawej kamery zamiast centralnej"
- nowy system sterowania
- całkiem nowe menu
- możliwość zapisywania i zmieniania ustawień
- logo continuum w splash screenie
Wersja 1, 14.01.18 Windows Mac Linux
Po uruchomieniu pliku wykonywalnego, powinno pojawić się okno z konfiguracją.
"Graphics quality" radzę ustawić, tak żeby aplikacja działała płynnie i nie zmieniać jej już później, gdyż może ona wpłynąć na wygląd nagrywanych przejazdów. Rozdzielczość nie powinna mieć wpływu na nagrane przejazdy.
Aby uzyskać sterowanie "łazikowe", Accel
ustaw na lewą gałkę, a Steering
na prawą.
Po naciśnięciu Play
, powinno ukazać się Menu.
Przyciski Training
i Autonomous
uruchamiają przejazd w odpowiednim trybie.
Top Speed
- Ograniczenie prędkości na kołachRecording FPS
- ilość zapisywanych sampli na sekundę (w rzeczywistości może ona być trochę mniejsza, ta opcja gwarantuje tylko, że nie przekroczy tej wartości)Camera Resulotion
- rozdzielczość nagrywanych oraz wysyłanych obrazówSocketIO Settings
- IP i Port serwera, na który symulator wysyła dane i od którego otrzymuje sterowanie (TrybAutonomous
)
Ustawienia są zapisywane w pliku settings.json
w folderze Data
. Przycisk Apply
zapisuje obecne ustawienia, a przycisk Revert
wczytuje je z pliku.
W trybie tym łazik sterowany jest manualnie. Wartość Accel
odpowiada za jazdę w przód i w tył, a wartość Steering
za obracanie łazikiem.
W UI widnieją aktualne wartości Accel
i Steering
oraz prędkość łazika obliczana jako średnia prędkości na wszystkich kołach.
Aby rozpocząć nagrywanie przejazdu naciśnij klawisz Record
(domyślnie r
) lub przycisk nagrywania widoczny w prawym dolnym rogu aplikacji.
Jeśli wyskoczy okienko z wyborem folderu, wskaż folder zapisu i ponownie naciśnij przycisk nagrywania. Nagrywanie powiwnno się rozpocząć, a ikona przycisku powinna zmienić się na ikonę Stop.
Aby zakończyć nagrywanie ponownie naciśnij przycisk.
Aplikacja zacznie odtwarzać trasę i zapisywać zrzuty z kamer na dysk.
Kamery
Łazik posiada 3 zestawy kamer: jeden na środku oraz 2 z boku obrócone o 20 stopni. Pozycje kamer przedstawia poniższy rysunek:
Każdy zestaw składa się z kamery renderującej rzeczywisty obraz oraz kamery, która renderuje depth mapę.
Przykład próbki jednego zestawu:
Obraz z kamery nagrywany jest w formacie JPEG (dla oszczędności pamięci), a depth mapa w formacie PNG (aby uniknąć zniekształceń)
Czytanie depth mapy
Obiekt w odległości 30cm lub mniejszej - piksel czarny
Obiekt w odległości 30m lub większej - piksel biały
Wszystko pomiędzy liniowo przechodzi od czarnego do białego
We wskazanym folderze powstanie plik driving_log.csv
. Każdy rekord tego pliku ma postać:
camera1,camera2,...,cameraN,accel,steering,speed,mode
Znaczenie powyższych pól:
- camera - ścieżka do zrzutu z kamery. Domyślnie jest 6 kamer: Left, Center, Right oraz odpowiadające im depth mapy
- accel - wartość
Accel
zadana w danym momencie - steering - wartość
Steering
zadana w danym momencie - speed - prędkość łazika wyrażona w km/h (średnia prędkości na wszystkich kołach)
- mode - tryb sterowania (M - manual, A - Autonomous)
W tym trybie sterowanie domyślnie przekazywane jest przez protokół Socket.IO. Przykładowy program, do którego może się połączyć symulator znajduje się w folderze example
.
W UI widnieje dodatkowa informacja o aktualnym trybie sterowania (Manual
lub Autonomous
). Przyciskiem Control
(domyślnie lewy ctrl) można przełączać się między trybami.
Wymagania:
Python
(testowano na wersji 3.6.4)- pakiety z pliku
requirements.txt
. Można je zainstalować poleceniempip install -r requirements.txt
Uruchamianie:
- Uruchom symulator
- Wybierz tryb
Autonomous
- Uruchom skrypt
drive.py
Działanie:
- skrypt tworzy serwer Socket.IO na porcie 4567
- symulator łączy się z serwerem
- symulator po otwarciu połączenia, wysyła Event
telemetry
, zawierający dane o aktualnej prędkości łazika oraz obraz z centralnej kamery - skrypt odbiera event, konwertuje otrzymany obraz do postaci tablicy RGB i pokazuje plot tego obrazka
- gdy użytkownik zamknie plot, skrypt wysyła Event
steer
z losowymi wartościamiaccel
isteering
- symulator odbiera dane sterowania i przekazuje je do kontrolera łazika
- skrypt wysyła Event
request_telemetry
- symulator odbiera event i wysyła
telemetry
przy następne klatce