|
|
pl:dydaktyka:aml:lab4 [2013/11/09 13:38] esimon [Filtrowanie danych] |
pl:dydaktyka:aml:lab4 [2019/06/27 15:50] |
====== Dostęp do sensorów ====== | |
| |
===== Sensor Manager ===== | |
| |
Pobierz aplikację kompas, z repozytorium i przetestuj jej działanie. | |
**Uwaga** Pobierz tylko wersje tagowaną jako RAW, filtrowanie będzie realizowane podczas tego ćwiczenia. | |
| |
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. | |
| |
| |
| |
===== 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: **p,q** oraz **k**. | |
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> | |
| |
| |
| |
| |
===== Analiza danych ===== | |
//analiza danych z akcelerometru - pobranie, zapisanie do sqlite, analiza w octave (czestotliwosci maksymalnej i minimalnej, amplituda, srednie przyspieszenie, korelacja trzech osi , srednia - jakie?etc.)// | |
| |
| |
| |