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: 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

Pobierz aplikację kompas, z repozytorium 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:

Kod żródłowy, oraz wykresy pochodzą ze strony 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 Lab 4.

pl/dydaktyka/aml/lab4.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0