====== Dostęp do sensorów ====== ===== Sensor Manager ===== 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. ==== Mindroid ==== Sklonuj projekt: [[https://github.com/sbobek/mindroid|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. ==== Kompas ==== {{:pl:dydaktyka:aml:compas.png?200 |}} Pobierz aplikację kompas, z repozytorium [[https://sbobek@bitbucket.org/sbobek/aml_compas|Bitbucket]] i przetestuj jej działanie. **Uwaga** Pobierz tylko wersje tagowaną jako **RAW**, filtrowanie będzie realizowane podczas tego ćwiczenia. ===== Filtrowanie danych ===== 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: * x - filtrowana dana * p - szacowany błąd * k - wzmocnienie Kalmana (tzw. //Kalman Gain//) * r - szum pomiaru * q - szum przetwarzania 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: {{:pl:dydaktyka:aml:kalman-test.png?500|}} //Kod żródłowy, oraz wykresy pochodzą ze strony// [[http://interactive-matter.eu/blog/2009/12/18/filtering-sensor-data-with-a-kalman-filter/|Interactive Matter Lab]] ==== Gotowe do użycia zestawy filtrów ==== Fajne repozytorium: https://github.com/berndporr/iirj ===== Zapis danych do analizy ===== Zacznij pracować nad zapisem danych z **akcelerometru** do bazy danych SQLite, odpowiednio modyfikując klasy z [[.:lab3#baza_danych|Lab 4]].