Do wybranego projektu: Przeanalizuj w jaki sposób realizowany jest dostęp do sensorów i ich przekształcenie w odpowiedni dla obrotu ekranu układ współrzędnych.
Sklonuj projekt: Mindroid. Zbuduj 4-kołowego robota, przeczytaj tutorial dot tego jak sterować robotem za pomocą ruchów telefonu. Przetestuj działanie aplikacji i wykonując kolejne ćwiczenia dotyczące filtrowania danych, spróbuj polepszyć działanie aplikacji, tak by szybciej reagowała na zmiany.
Pobierz aplikację kompas, z repozytorium Bitbucket i przetestuj jej działanie.
Uwaga Pobierz tylko wersje tagowaną jako RAW, filtrowanie będzie realizowane podczas tego ćwiczenia.
Dla danych pobieranych z sensorów urządzenia zaimplementuj filtr Kalmana. Poszczególne parametry tego filtra powinny być aktualizowane zgodnie z formułami podanymi poniżej:
x = x p = p + q; k = p / (p + r); x = x + k * (measurement – x); p = (1 – k) * p;
Gdzie:
Wartości, które należy dobrać, w celu modyfikowania działania filtru to: q, r oraz k. Wartość p nie jest specjalnie istotna, ponieważ jej wartość jest dynamicznie ustalana w procesie filtrowania.
Poeksperymentuj z różnymi wartościami i zaobserwuj wyniki. Dla jakich wartości otrzymujesz najlepsze rezultaty?
Uwaga Dla ułatwienia, poniżej kod filtru kalmana w C:
typedef struct { double q; //process noise covariance double r; //measurement noise covariance double x; //value double p; //estimation error covariance double k; //kalman gain } kalman_state; kalman_state kalman_init(double q, double r, double p, double intial_value) { kalman_state result; result.q = q; result.r = r; result.p = p; result.x = intial_value; return result; } void kalman_update(kalman_state* state, double measurement) { //prediction update //omit x = x state->p = state->p + state->q; //measurement update state->k = state->p / (state->p + state->r); state->x = state->x + state->k * (measurement - state->x); state->p = (1 - state->k) * state->p; }
Przykładowe wyjście dla kodu z przykładu powyżej:
Kod żródłowy, oraz wykresy pochodzą ze strony Interactive Matter Lab
Fajne repozytorium: https://github.com/berndporr/iirj
Zacznij pracować nad zapisem danych z akcelerometru do bazy danych SQLite, odpowiednio modyfikując klasy z Lab 4.