Paczka dedykowane jest do symulatora F1TENTH opartego na symulatorze AWSIM v1.1.0
Jako model pojazdu (samochodu), o który został oparty cały kontroler wybrano tzw. kinematyczny model roweru. Został on poddany reformulacji w celu dostosowania go do realizowanego zadania - podążania za trajektorią ścieżki toru. Model przestrzenny (ang. Spatial Bicycle [3]) został sformułowany na podstawie grafki poniżej - zmiennymi stanu są: odsunięcie poprzeczne od ścieżki, błąd kąta yaw oraz dystans przebyty wzdłuż trajektorii.

[Model roweru z zaznaczonym układem odniesienia do referencyjnej ścieżki. (ref: [3])]
MPC zwraca jako sterowanie: kąt skrętu koła oraz prędkość wzdłuż osi pojazdu. Regulatorem prędkości jest dodatkowy regulator PID.
Ograniczenia nałożone na pojazd:
v_max = 10.0
delta_max = pi/3.0
ay_max = 8.0
ax_min = -7.0
ax_max = 4.0
Ścieżka referencyjna została wyznaczona ręcznie jako zbiór kilkudziesięciu punktów wzdłuż trasy (gdzie punkt początkowy jest pierwyszym punktem). Rozdzielczość ścieżki ([waypoint/m]) została zwiększona/dopasowana bazując na mapie zajętości podanej jako obraz. Referencyjna prędkość oraz kąt skierowania pojazdu zostały wyznaczone z uwzględnieniem fizycznych ograniczeń: przyspieszeń wzdłużnych i poprzecznych oraz prędkości maksymalnej. Punkt od którego liczony jest horyzont predykcji wyznaczany jest jako kartezjańsko najbliższy punkt z listy punktów referencyjnych.

[Ścieżka referencyjna - waypointy wpisane ręcznie (kolor niebieski) oraz wyliczone na ich podstawie i poddane smoothingowi (kolor czerwony)]
Całość sterowania realizowana jest w Callbacku ground_truth, gdzie zbierane są dane potrzebne do wyznaczenia stanu modelu (kinematycznego i potem przestrzennego). Częstotliwość wywoływania wynosi 25Hz.
Strutura projektu
.
mpc_package
├── f1tenth_mpc_lib
│ ├── MPC.py # algorytm MPC
│ ├── spatial_bicycle_models.py # model pojazdu
│ ├── pid.py # regulator dynamiki wzdłużnej
│ ├── map.py # obsługa mapy (via matssteinweg)
│ └── reference_path.py # generate reference path, waypoints for the assigned map (via matssteinweg)
├── f1tenth_mpc.py # plik wykonywalny, zawierający Node sterujący ze wszystkimi callbackami, definicja problemu i wartości parametrów
Zestawienie przebiegów prędkości pojazdu w funkcji drogi przebytej wzdłuż środka toru.

[kolorem zielonym - MPC, żółtym - PP]
Zauważalne jest zatem, że prędkość pojazdu przy zastosowaniu MPC jest dość poszarpana, co może wpływać ostatecznie na jej ograniczenie przez sam kontroler. Pure pursuit w tym przypadku okazało się lepsze, choć prawdopodobnie jest to spowodowane problemami opisanymi poniżej.
Rozbieżność między lokalizają pozyskiwaną z ground_truth, a lokalizacją pojadu w symulatorze nie pozwalała na łatwe dostosowywanie ścieżki w celach optymalizaji czasu przejazdu. W pojedynczych zakrętach należało dodać dodatkowe punkty na mapie, aby uniknąć kolizji ze ścianą.
Linearyzajca modelu (szczególnie np. przy większych skrętach kierownicy) niepozwala na uzyskanie płynnych i nieoscylujących rozwiązań.
Brak znajomości parametrów pojazdu z symulatora (zastosowanego modelu, geometrii skrętu, itd.) nie pozwoliła na dokładne dobranie parametrów modelu - przy tak prostym przyjętym modelu nie sprawiało to większego problemu.
Bibliografia:
- [1] https://github.com/coldhenry/Model-Predictive-Control-of-Autonomous-Car
- [2] https://github.com/matssteinweg/Multi-Purpose-MPC
- [3] Stability Conditions for Linear Time-Varying Model Predictive Control in Autonomous Driving
- [4] Towards Time-Optimal Race Car Driving Using Nonlinear MPC in Real-Time
Autorzy:
- Jan Iwaszkiewicz - Rudoszański
- Maksymilian Jaruga