|
|
pl:dydaktyka:aml:lab4 [2017/10/22 23:25] esimon |
pl:dydaktyka:aml:lab4 [2019/06/27 15:50] |
====== 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: | |
<code> | |
x = x | |
p = p + q; | |
| |
k = p / (p + r); | |
x = x + k * (measurement – x); | |
p = (1 – k) * p; | |
</code> | |
| |
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: | |
<code 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; | |
} | |
</code> | |
| |
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]] | |
| |
===== 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]]. | |
| |
| |
| |
| |
| |