====== 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]].