Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:dydaktyka:aml:lab4 [2013/10/20 11:56] esimon |
pl:dydaktyka:aml:lab4 [2019/06/27 15:50] (aktualna) |
====== Dostęp do sensorów ====== | ====== 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> | <code> |
//implementacja filtru kalmana | x = x |
//analiza danych z akcelerometru - pobranie, zapisanie do sqlite, analiza w octave (czestotliwosci maksymalnej i minimalnej, amplituda, srednie przyspieszenie, korelacja trzech osi , srednia - jakie?etc.) | p = p + q; |
| |
| k = p / (p + r); |
| x = x + k * (measurement – x); |
| p = (1 – k) * p; |
</code> | </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]] |
| |
| ==== 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]]. |
| |
| |
| |
| |
| |