Nowe technologie w fizyce biomedycznej/Posturografia: Różnice pomiędzy wersjami
(Nie pokazano 26 wersji utworzonych przez 2 użytkowników) | |||
Linia 17: | Linia 17: | ||
[[Media: WiiBoard.pdf]] Informacje wstępne oraz opis zadań | [[Media: WiiBoard.pdf]] Informacje wstępne oraz opis zadań | ||
+ | |||
+ | [[Media: WiiBoardENG.pdf]] Introduction and task description in English | ||
<!-- | <!-- | ||
[[Media:wprowadzenie.pdf]] Wykład z zajęć wprowadzających | [[Media:wprowadzenie.pdf]] Wykład z zajęć wprowadzających | ||
Linia 27: | Linia 29: | ||
==Pomiary== | ==Pomiary== | ||
+ | Pomiary przeprowadzane są w środowisku OpenBCI przy użyciu aplikacji Brain4edu (na Ubuntu 16.04). Opis architektury systemu OpenBCI oraz podręcznik użytkownika Brain4edu dostępne są na stronie http://laboratorium-eeg.braintech.pl/. <!--Z samego OpenBCI można również korzystać na systemie Windows -> instrukcja [[Media: obci_Windows.pdf]]. --> | ||
+ | |||
+ | Zaczynamy od uruchomienia aplikacji Brain. W prawym górnym rogu ekranu pojawi się ikona mózgu będąca interfejsem graficznym aplikacji. Do pomiarów posturograficznych wybieramy opcję 'Wii App', która otworzy okno z wyborem scenariuszy. | ||
+ | |||
+ | [[Plik:brain4edu.png|300px|thumb|left|<figure id="fig:wbb"></figure>Interfejs graficzny aplikacji Brain4edu]] | ||
+ | [[Plik:wiiApp.png|300px|thumb|right|<figure id="fig:wbb"></figure>Okno wyboru scenariuszy eksperymentalnych aplikacji WiiApp]] | ||
+ | <!-- | ||
Pomiary przeprowadzane są w środowisku OpenBCI. Architektura systemu oraz opis wybranych scenariuszy jest dostępny na stronie http://bci.fuw.edu.pl/wiki/Tutorials. Szczegółowe informacje dotyczące konfiguracji OpenBCI na Ubuntu 14.04 LTS można znaleźć pod adresem http://deb.braintech.pl/. Po zainstalowaniu pakietów źródła znajdą sie w katalogu <tt>/usr/share/openbci</tt>. | Pomiary przeprowadzane są w środowisku OpenBCI. Architektura systemu oraz opis wybranych scenariuszy jest dostępny na stronie http://bci.fuw.edu.pl/wiki/Tutorials. Szczegółowe informacje dotyczące konfiguracji OpenBCI na Ubuntu 14.04 LTS można znaleźć pod adresem http://deb.braintech.pl/. Po zainstalowaniu pakietów źródła znajdą sie w katalogu <tt>/usr/share/openbci</tt>. | ||
Linia 34: | Linia 43: | ||
Rejestracja danych odbywa się w środowisku OpenBCI. System ten uruchamiamy wykonując w terminalu polecenie: | Rejestracja danych odbywa się w środowisku OpenBCI. System ten uruchamiamy wykonując w terminalu polecenie: | ||
<source lang="c">$ obci_gui --presets new_tech </source> | <source lang="c">$ obci_gui --presets new_tech </source> | ||
+ | --> | ||
Podczas zajęć przeprowadzone zostaną następujące pomiary: | Podczas zajęć przeprowadzone zostaną następujące pomiary: | ||
Linia 40: | Linia 50: | ||
*wychylenia szybkie i "z przytrzymaniem" z informacją zwrotną dla badanego (w przód, w tył, w prawo, w lewo). | *wychylenia szybkie i "z przytrzymaniem" z informacją zwrotną dla badanego (w przód, w tył, w prawo, w lewo). | ||
− | W wyniku każdego pomiaru otrzymujemy komplet trzech plików (lokalizacja | + | W wyniku każdego pomiaru otrzymujemy komplet trzech plików (domyślna lokalizacja to Katalog Domowy): |
* Plik z sygnałem (.raw) zapisanym w formacie binarnym. W pliku znajdują się próbki z pięciu kanałów – wartości z czterech czujników WBB oraz momenty w czasie (w sekundach) mierzone względem pojawienia się pierwszej próbki. | * Plik z sygnałem (.raw) zapisanym w formacie binarnym. W pliku znajdują się próbki z pięciu kanałów – wartości z czterech czujników WBB oraz momenty w czasie (w sekundach) mierzone względem pojawienia się pierwszej próbki. | ||
* Plik z metadanymi (.xml), w którym znajdują się szczegółowe informacje dotyczące rejestracji (nazwy kanałów, częstość próbkowania, całkowita liczba próbek itp.). | * Plik z metadanymi (.xml), w którym znajdują się szczegółowe informacje dotyczące rejestracji (nazwy kanałów, częstość próbkowania, całkowita liczba próbek itp.). | ||
* Plik ze znacznikami (.tag), w którym zapisywane są momenty kolejnych zdarzeń (np. początek i koniec wykonywania zadania) zsynchronizowane z sygnałem. Każdy znacznik posiada charakterystyczną nazwę, moment wystąpienia w sygnale, długość oraz ewentualnie opis. | * Plik ze znacznikami (.tag), w którym zapisywane są momenty kolejnych zdarzeń (np. początek i koniec wykonywania zadania) zsynchronizowane z sygnałem. Każdy znacznik posiada charakterystyczną nazwę, moment wystąpienia w sygnale, długość oraz ewentualnie opis. | ||
− | W przypadku zadań z informacją zwrotną dla badanego generowane są dwa pliki ze znacznikami. Interesujące nas informacje znajdują się w pliku z rozszerzeniem .game.tag. | + | <!--W przypadku zadań z informacją zwrotną dla badanego generowane są dwa pliki ze znacznikami. Interesujące nas informacje znajdują się w pliku z rozszerzeniem .game.tag.--> |
==Analiza danych== | ==Analiza danych== | ||
===Przygotowanie danych do analizy=== | ===Przygotowanie danych do analizy=== | ||
− | Pierwszym etapem analizy jest wstępne przetworzenie danych. W tym celu należy wyestymować rzeczywistą częstość próbkowania Fs (w idealnym przypadku wynosi ona 65 Hz) oraz przepróbkować sygnał do częstości fs ok. 30 Hz (wychylenia swobodne widoczne są głównie w niższych częstościach). | + | Pierwszym etapem analizy jest wczytanie danych. Korzystamy tutaj z funkcji klasy ReadManager. Otrzymany obiekt posiadaja metodę 'get_samples', która zwraca macierz 5-kanałową. Pierwszy kanał to próbki czasu wyrażone w [s] natomiast pozostałe kanały to dane z kolejnych sensorów TR, BR, TL, BL (górny prawy-TR, dolny prawy-BR, górny lewy-TL, dolny lewy-BL). |
+ | |||
+ | <source lang="Python"> | ||
+ | #!/usr/bin/env python3 | ||
+ | # -*- coding: utf-8 -*- | ||
+ | |||
+ | from obci_readmanager.signal_processing import read_manager | ||
+ | from obci_readmanager.signal_processing.balance.wii_preprocessing import * | ||
+ | from obci_readmanager.signal_processing.balance.wii_analysis import * | ||
+ | |||
+ | file_name = 'still_eyes_closed_eyes_open' | ||
+ | wbr = read_manager.ReadManager(file_name+'.obci.xml', file_name+'.obci.raw', file_name + '.obci.tag') | ||
+ | TR = wbr.get_samples()[0,:] | ||
+ | BR = wbr.get_samples()[1,:] | ||
+ | TL = wbr.get_samples()[2,:] | ||
+ | BL = wbr.get_samples()[3,:] | ||
+ | TIME = wbr.get_samples()[4,:] | ||
+ | |||
+ | </source> | ||
+ | |||
+ | Jednak w przypadku niektórych zadań należy jeszcze przed pobraniem próbek, odpowiednio wyciąć interesujące nas dane względem znaczników. Czynność tę wykonuje funkcja 'wii_cut_fragments' przyjmująca obiekt klasy ReadManager i znaczniki początkowe i końcowe, a zwracająca listę obiektów 'smart_tags'. Liczba tych obiektów odpowiada liczbie zdarzeń z danym znacznikiem (dla stania swobodnego lista będzie miała tylko jeden element, natomiast dla wielokrotnych wychyleń będzie ich kilka). Każdy element na tej liście, również posiada metodę 'get_samples'. | ||
+ | |||
+ | <source lang="Python"> | ||
+ | #!/usr/bin/env python3 | ||
+ | # -*- coding: utf-8 -*- | ||
+ | |||
+ | from obci_readmanager.signal_processing import read_manager | ||
+ | from obci_readmanager.signal_processing.balance.wii_preprocessing import * | ||
+ | from obci_readmanager.signal_processing.balance.wii_analysis import * | ||
+ | |||
+ | file_name = 'still_eyes_closed_eyes_open' | ||
+ | wbr = read_manager.ReadManager(file_name+'.obci.xml', file_name+'.obci.raw', file_name + '.obci.tag') | ||
+ | smart_tags = wii_cut_fragments(wbr, start_tag_name='ss_start', end_tags_names=['ss_stop']) | ||
+ | TR = smart_tags[0].get_samples()[0,:] | ||
+ | BR = smart_tags[0].get_samples()[1,:] | ||
+ | TL = smart_tags[0].get_samples()[2,:] | ||
+ | BL = smart_tags[0].get_samples()[3,:] | ||
+ | |||
+ | </source> | ||
+ | |||
+ | Na podstawie danch z czterech czujników można wyznaczyć wartości wychyleń w kierunkach x i y (<xr id="fig:wbb">rys. %i</xr>).: | ||
+ | |||
+ | <div style="text-align: center;"> | ||
+ | <math>x=\frac{(TR+BR)-(TL+BL)}{TR+TL+BL+BR}</math> | ||
+ | |||
+ | <math>y=\frac{(TR+TL)-(BR+BL)}{TR+TL+BL+BR}</math> | ||
+ | </div> | ||
+ | |||
+ | Należy pamiętać, że dane z czujników pochodzą z układu odniesienia deski Wii Board - zatem uzyskane wartości x i y mieszczą się w zakresie od -1 do 1. Aby uzyskać dane w cm trzeba przemnożyć współrzędne x i y przez odpowiednie czynniki: | ||
+ | [[Plik:wbb_axes.png|600px|thumb|center|<figure id="fig:wbb"></figure>Wii Balance Board z oznaczonymi płaszczyznami ML i AP. TR, TL, BR, BL ozanczają pozycje czterech czujników.]] | ||
+ | |||
+ | Znaczniki 'start_tag_name' oraz 'end_tags_names' dla poszczególnych pomiarów: | ||
+ | |||
+ | * stanie swobodne oczy otwarte: 'ss_start', 'ss_stop' | ||
+ | * stanie swobodne oczy zamknięte: 'ss_eyes_closed_start', 'ss_eyes_closed_stop' | ||
+ | |||
+ | * wychylenia szybkie bez informacji zwrotnej: 'start_fast', 'stop_fast' | ||
+ | * wychylenia "z przytrzymaniem" bez informacji zwrotnej: 'start', 'stop' | ||
+ | |||
+ | * stanie swobodne jako kalibracja do zadań z informacją zwrotną: 'baseline_start', 'baseline_stop' | ||
+ | * wychylenia szybkie z informacją zwrotną: nie ma znaczników - ciągły zapis danych | ||
+ | * wychylenia "z przytrzymaniem" z informacją zwrotną: 'start_1', 'finish' | ||
+ | |||
+ | Dla przypadku wychyleń "z przytrzymaniem" obiekty w liście zwróconej przez funkcję 'wii_cut_fragments' odpowiadają kolejnym realizacjom zadania. Mają one jednak nieco inną strukturę. Oprócz metody 'get_samples()', za pomocą której tak jak poprzednio wczytamy dane z 4 czujników, posiadają również metody: | ||
+ | *'get_end_tag()' - zwraca strukturę, która w polu ['desc']['value'] przechowuje informację o tym czy zadanie zostało wykonane poprawnie (0-niepoprawnie, 1-poprawnie) | ||
+ | *'get_start_tag()' - zwraca strukturę, która w polu ['desc']['value'] przechowuje informację o kierunku wychylenia (pole 'direction', wartości: 'up','down','left','right') oraz o poziomie trudności zadania (pole 'level'). Aby wydobyć informację o kierunku wychylenia (analogicznie dla poziomiu trudności) można skorzystać z funkcji: | ||
+ | <source lang="Python"> | ||
+ | eval(smart_tags[index].get_start_tag()['desc']['value'])['direction'] | ||
+ | </source> | ||
+ | |||
+ | Informacje o poziomie trudności, poprawności wykonania zadania oraz kierunku będą potrzebne do podjęcia decyzji, które próby wykonania zadania będą brane do dalszej analizy. Interesują nas jedynie te poprawne o najwyższym poziomie trudności w każdym z kierunków. | ||
+ | |||
+ | <!--Pierwszym etapem analizy jest wstępne przetworzenie danych. W tym celu należy wyestymować rzeczywistą częstość próbkowania Fs (w idealnym przypadku wynosi ona 65 Hz) oraz przepróbkować sygnał do częstości fs ok. 30 Hz (wychylenia swobodne widoczne są głównie w niższych częstościach). | ||
<source lang="Python"> | <source lang="Python"> | ||
Linia 115: | Linia 197: | ||
Podczas wczytywania danych z informacją zwrotną interesujące nas informacje znajdują się w pliku z rozszerzeniem .game.tag. Zatem należy ustawić parametr 'tag_format' w wywołaniu funkcji read_file na 'game' (zamiast domyślnie ustawionego 'obci'). Znaczniki czasowe gry nie są zsynchronizowane z sygnałem, ponieważ gra uruchamiana jest w osobnym wątku, który nie ma możliwości komunikacji z multiplekserem. Z tego względu każdy znacznik zapisany w tym pliku posiada czas systemowy, który należy wyrównać względem pierwszej próbki w sygnale. Procedura ta została zaimplementowana w poniższej funkcji, którą należy wykonać przed przepróbkowaniem sygnału: | Podczas wczytywania danych z informacją zwrotną interesujące nas informacje znajdują się w pliku z rozszerzeniem .game.tag. Zatem należy ustawić parametr 'tag_format' w wywołaniu funkcji read_file na 'game' (zamiast domyślnie ustawionego 'obci'). Znaczniki czasowe gry nie są zsynchronizowane z sygnałem, ponieważ gra uruchamiana jest w osobnym wątku, który nie ma możliwości komunikacji z multiplekserem. Z tego względu każdy znacznik zapisany w tym pliku posiada czas systemowy, który należy wyrównać względem pierwszej próbki w sygnale. Procedura ta została zaimplementowana w poniższej funkcji, którą należy wykonać przed przepróbkowaniem sygnału: | ||
<source lang="Python"> | <source lang="Python"> | ||
+ | from obci.exps.ventures.analysis import analysis_helper | ||
wbr_sway.mgr = analysis_helper.set_first_timestamp(wbr_sway.mgr) | wbr_sway.mgr = analysis_helper.set_first_timestamp(wbr_sway.mgr) | ||
</source> | </source> | ||
Dalsze kroki przygotowania danych do analizy wykonujemy tak samo. Dla przypadku wychyleń "z przytrzymaniem" obiekty w liście zwróconej przez funkcję 'wii_cut_fragments' odpowiadają kolejnym realizacjom zadania. Mają one jednak nieco inną strukturę. Oprócz metody 'get_samples()', za pomocą której tak jak poprzednio wczytamy dane z 4 czujników, posiadają również metody: | Dalsze kroki przygotowania danych do analizy wykonujemy tak samo. Dla przypadku wychyleń "z przytrzymaniem" obiekty w liście zwróconej przez funkcję 'wii_cut_fragments' odpowiadają kolejnym realizacjom zadania. Mają one jednak nieco inną strukturę. Oprócz metody 'get_samples()', za pomocą której tak jak poprzednio wczytamy dane z 4 czujników, posiadają również metody: | ||
*'get_end_tag()' - zwraca strukturę, która w polu ['desc']['type'] przechowuje informację o tym czy zadanie zostało wykonane poprawnie (0-niepoprawnie, 1-poprawnie) | *'get_end_tag()' - zwraca strukturę, która w polu ['desc']['type'] przechowuje informację o tym czy zadanie zostało wykonane poprawnie (0-niepoprawnie, 1-poprawnie) | ||
− | *'get_start_tag()' - zwraca strukturę, która w polu ['desc']['type'] przechowuje informację o kierunku wychylenia (pole 'direction', wartości: 'up','down','left','right') oraz o poziomie trudności zadania (pole 'level'). Aby wydobyć informację o kierunku wychylenia (analogicznie dla poziomiu trudności) można skorzystać z funkcji: eval(smart_tags[index].get_start_tag()['desc']['type'])['direction'] | + | *'get_start_tag()' - zwraca strukturę, która w polu ['desc']['type'] przechowuje informację o kierunku wychylenia (pole 'direction', wartości: 'up','down','left','right') oraz o poziomie trudności zadania (pole 'level'). Aby wydobyć informację o kierunku wychylenia (analogicznie dla poziomiu trudności) można skorzystać z funkcji: |
+ | <source lang="Python"> | ||
+ | eval(smart_tags[index].get_start_tag()['desc']['type'])['direction'] | ||
+ | </source> | ||
Informacje o poziomie trudności, poprawności wykonania zadania oraz kierunku będą potrzebne do podjęcia decyzji, które próby wykonania zadania będą brane do dalszej analizy. Interesują nas jedynie te poprawne o najwyższym poziomie trudności w każdym z kierunków. | Informacje o poziomie trudności, poprawności wykonania zadania oraz kierunku będą potrzebne do podjęcia decyzji, które próby wykonania zadania będą brane do dalszej analizy. Interesują nas jedynie te poprawne o najwyższym poziomie trudności w każdym z kierunków. | ||
+ | |||
+ | --> | ||
<!--Dokumentacja funkcji klasy WBBReadManager (przy pomcy której wczytujemy dane. Korzysta ona z obiektu klasy ReadManager, która została zaprojektowana do wczytywania i segmentacji danych rejestrowanych przy pomocy systemu OpenBCI. Moduł <tt>obci.analysis.balance.wii_preprocessing</tt> umożliwia dodatkowo przepróbkowanie oraz filtrację danych): | <!--Dokumentacja funkcji klasy WBBReadManager (przy pomcy której wczytujemy dane. Korzysta ona z obiektu klasy ReadManager, która została zaprojektowana do wczytywania i segmentacji danych rejestrowanych przy pomocy systemu OpenBCI. Moduł <tt>obci.analysis.balance.wii_preprocessing</tt> umożliwia dodatkowo przepróbkowanie oraz filtrację danych): | ||
Linia 186: | Linia 274: | ||
W przypadku stania swobodnego z oczami zamkniętymi oraz otwartymi, studenci mają za zadanie wyznaczyć następujące wskaźniki posturograficzne: | W przypadku stania swobodnego z oczami zamkniętymi oraz otwartymi, studenci mają za zadanie wyznaczyć następujące wskaźniki posturograficzne: | ||
<!-- (korzystając z funkcji zaimplentowanych w bibliotece <tt>obci.analysis.balance.wii_analysis</tt>): --> | <!-- (korzystając z funkcji zaimplentowanych w bibliotece <tt>obci.analysis.balance.wii_analysis</tt>): --> | ||
− | *położenie środka równowagi COP (''center of | + | *położenie środka równowagi COP (''center of pressure'') |
− | *maksymalne przemieszczenie względem położenia środka równowagi (w AP,ML oraz | + | *maksymalne przemieszczenie względem położenia środka równowagi (w AP,ML oraz płaszczyźnie AP/ML), |
− | *długość drogi względem położenia środka równowagi (w AP,ML oraz | + | *długość drogi względem położenia środka równowagi (w AP,ML oraz płaszczyźnie AP/ML), |
− | *średnia prędkość przemieszczenia (w AP,ML oraz | + | *średnia prędkość przemieszczenia (w AP,ML oraz płaszczyźnie AP/ML), |
*wskaźnik Romberga - stosunek różnicy długości drogi przy oczach zamkniętych i otwartych, do sumy długości drogi przy oczach zamkniętych i otwartych | *wskaźnik Romberga - stosunek różnicy długości drogi przy oczach zamkniętych i otwartych, do sumy długości drogi przy oczach zamkniętych i otwartych | ||
<!--*95% powierzchnia ufności elipsy - powierzchnia elipsy, w której powinno zawierać się około 95% punktów drogi COP, | <!--*95% powierzchnia ufności elipsy - powierzchnia elipsy, w której powinno zawierać się około 95% punktów drogi COP, | ||
Linia 205: | Linia 293: | ||
*położenie środka równowagi (dla warunku bez informacji zwrotnej będzie to COP ze stania swobodnego z oczami otwartymi, natomiast dla warunku z informacją zwrotną będzie to COP z sesji kalibracyjnej) | *położenie środka równowagi (dla warunku bez informacji zwrotnej będzie to COP ze stania swobodnego z oczami otwartymi, natomiast dla warunku z informacją zwrotną będzie to COP z sesji kalibracyjnej) | ||
*wartość maksymalnego wychylenia (w określonym kierunku) względem położenia równowagi, | *wartość maksymalnego wychylenia (w określonym kierunku) względem położenia równowagi, | ||
− | *wykresy składowych wychwiań względem położenia równowagi w płaszczyźnie AP, ML w zależności od czasu oraz wypadkowa trajektoria przemieszczeń COP (w dwuwymiarowej | + | *wykresy składowych wychwiań względem położenia równowagi w płaszczyźnie AP, ML w zależności od czasu oraz wypadkowa trajektoria przemieszczeń COP (w dwuwymiarowej płaszczyźnie AP, ML). |
i zbadać czy informacja zwrotna wpływa na rezultaty badanego. | i zbadać czy informacja zwrotna wpływa na rezultaty badanego. |
Aktualna wersja na dzień 13:53, 21 lut 2019
Spis treści
Posturograf
Zajęcia warsztatowe składające się z wprowadzającego w tematykę zajęć wykładu i indywidualnych ćwiczeń wykonywanych przez studentów. Studenci w czasie zajęć przeprowadzają standardowe pomiary posturograficzne, a następnie analizują zebrane dane.
Plan zajęć
Zajęcia 1:
- Wstęp teoretyczny:
- Wii Balance Board (budowa, główne biblioteki obsługujące sensor, zastosowania)
- Projesjonalne systemy do rejestracji siły nacisku
- Równowaga a stabilność posturalna
- Podstawowe zadania posturograficzne
- Opis wybranych wskaźników do zadań posturograficznych
- Wprowadzenie do pomiarów przeprowadzanych na zajęciach (zapoznanie się z wybranymi scenariuszami oraz modułami do analizy)
- Zapoznanie się z działaniem Wii Balance Board
- Przeprowadzenie pomiarów
Media: WiiBoard.pdf Informacje wstępne oraz opis zadań
Media: WiiBoardENG.pdf Introduction and task description in English
Zajęcia 2,3,4:
- Analiza zebranych danych
- Prezentacja wyników
Pomiary
Pomiary przeprowadzane są w środowisku OpenBCI przy użyciu aplikacji Brain4edu (na Ubuntu 16.04). Opis architektury systemu OpenBCI oraz podręcznik użytkownika Brain4edu dostępne są na stronie http://laboratorium-eeg.braintech.pl/.
Zaczynamy od uruchomienia aplikacji Brain. W prawym górnym rogu ekranu pojawi się ikona mózgu będąca interfejsem graficznym aplikacji. Do pomiarów posturograficznych wybieramy opcję 'Wii App', która otworzy okno z wyborem scenariuszy.
Podczas zajęć przeprowadzone zostaną następujące pomiary:
- stanie swobodne z oczami otwartymi/zamkniętymi,
- wychylenia szybkie i "z przytrzymaniem" bez informacji zwrotnej dla badanego (w przód, w tył, w prawo, w lewo),
- wychylenia szybkie i "z przytrzymaniem" z informacją zwrotną dla badanego (w przód, w tył, w prawo, w lewo).
W wyniku każdego pomiaru otrzymujemy komplet trzech plików (domyślna lokalizacja to Katalog Domowy):
- Plik z sygnałem (.raw) zapisanym w formacie binarnym. W pliku znajdują się próbki z pięciu kanałów – wartości z czterech czujników WBB oraz momenty w czasie (w sekundach) mierzone względem pojawienia się pierwszej próbki.
- Plik z metadanymi (.xml), w którym znajdują się szczegółowe informacje dotyczące rejestracji (nazwy kanałów, częstość próbkowania, całkowita liczba próbek itp.).
- Plik ze znacznikami (.tag), w którym zapisywane są momenty kolejnych zdarzeń (np. początek i koniec wykonywania zadania) zsynchronizowane z sygnałem. Każdy znacznik posiada charakterystyczną nazwę, moment wystąpienia w sygnale, długość oraz ewentualnie opis.
Analiza danych
Przygotowanie danych do analizy
Pierwszym etapem analizy jest wczytanie danych. Korzystamy tutaj z funkcji klasy ReadManager. Otrzymany obiekt posiadaja metodę 'get_samples', która zwraca macierz 5-kanałową. Pierwszy kanał to próbki czasu wyrażone w [s] natomiast pozostałe kanały to dane z kolejnych sensorów TR, BR, TL, BL (górny prawy-TR, dolny prawy-BR, górny lewy-TL, dolny lewy-BL).
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from obci_readmanager.signal_processing import read_manager
from obci_readmanager.signal_processing.balance.wii_preprocessing import *
from obci_readmanager.signal_processing.balance.wii_analysis import *
file_name = 'still_eyes_closed_eyes_open'
wbr = read_manager.ReadManager(file_name+'.obci.xml', file_name+'.obci.raw', file_name + '.obci.tag')
TR = wbr.get_samples()[0,:]
BR = wbr.get_samples()[1,:]
TL = wbr.get_samples()[2,:]
BL = wbr.get_samples()[3,:]
TIME = wbr.get_samples()[4,:]
Jednak w przypadku niektórych zadań należy jeszcze przed pobraniem próbek, odpowiednio wyciąć interesujące nas dane względem znaczników. Czynność tę wykonuje funkcja 'wii_cut_fragments' przyjmująca obiekt klasy ReadManager i znaczniki początkowe i końcowe, a zwracająca listę obiektów 'smart_tags'. Liczba tych obiektów odpowiada liczbie zdarzeń z danym znacznikiem (dla stania swobodnego lista będzie miała tylko jeden element, natomiast dla wielokrotnych wychyleń będzie ich kilka). Każdy element na tej liście, również posiada metodę 'get_samples'.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from obci_readmanager.signal_processing import read_manager
from obci_readmanager.signal_processing.balance.wii_preprocessing import *
from obci_readmanager.signal_processing.balance.wii_analysis import *
file_name = 'still_eyes_closed_eyes_open'
wbr = read_manager.ReadManager(file_name+'.obci.xml', file_name+'.obci.raw', file_name + '.obci.tag')
smart_tags = wii_cut_fragments(wbr, start_tag_name='ss_start', end_tags_names=['ss_stop'])
TR = smart_tags[0].get_samples()[0,:]
BR = smart_tags[0].get_samples()[1,:]
TL = smart_tags[0].get_samples()[2,:]
BL = smart_tags[0].get_samples()[3,:]
Na podstawie danch z czterech czujników można wyznaczyć wartości wychyleń w kierunkach x i y (rys. 3).:
[math]x=\frac{(TR+BR)-(TL+BL)}{TR+TL+BL+BR}[/math]
[math]y=\frac{(TR+TL)-(BR+BL)}{TR+TL+BL+BR}[/math]
Należy pamiętać, że dane z czujników pochodzą z układu odniesienia deski Wii Board - zatem uzyskane wartości x i y mieszczą się w zakresie od -1 do 1. Aby uzyskać dane w cm trzeba przemnożyć współrzędne x i y przez odpowiednie czynniki:
Znaczniki 'start_tag_name' oraz 'end_tags_names' dla poszczególnych pomiarów:
- stanie swobodne oczy otwarte: 'ss_start', 'ss_stop'
- stanie swobodne oczy zamknięte: 'ss_eyes_closed_start', 'ss_eyes_closed_stop'
- wychylenia szybkie bez informacji zwrotnej: 'start_fast', 'stop_fast'
- wychylenia "z przytrzymaniem" bez informacji zwrotnej: 'start', 'stop'
- stanie swobodne jako kalibracja do zadań z informacją zwrotną: 'baseline_start', 'baseline_stop'
- wychylenia szybkie z informacją zwrotną: nie ma znaczników - ciągły zapis danych
- wychylenia "z przytrzymaniem" z informacją zwrotną: 'start_1', 'finish'
Dla przypadku wychyleń "z przytrzymaniem" obiekty w liście zwróconej przez funkcję 'wii_cut_fragments' odpowiadają kolejnym realizacjom zadania. Mają one jednak nieco inną strukturę. Oprócz metody 'get_samples()', za pomocą której tak jak poprzednio wczytamy dane z 4 czujników, posiadają również metody:
- 'get_end_tag()' - zwraca strukturę, która w polu ['desc']['value'] przechowuje informację o tym czy zadanie zostało wykonane poprawnie (0-niepoprawnie, 1-poprawnie)
- 'get_start_tag()' - zwraca strukturę, która w polu ['desc']['value'] przechowuje informację o kierunku wychylenia (pole 'direction', wartości: 'up','down','left','right') oraz o poziomie trudności zadania (pole 'level'). Aby wydobyć informację o kierunku wychylenia (analogicznie dla poziomiu trudności) można skorzystać z funkcji:
eval(smart_tags[index].get_start_tag()['desc']['value'])['direction']
Informacje o poziomie trudności, poprawności wykonania zadania oraz kierunku będą potrzebne do podjęcia decyzji, które próby wykonania zadania będą brane do dalszej analizy. Interesują nas jedynie te poprawne o najwyższym poziomie trudności w każdym z kierunków.
Analiza danych: stanie swobodne
W przypadku stania swobodnego z oczami zamkniętymi oraz otwartymi, studenci mają za zadanie wyznaczyć następujące wskaźniki posturograficzne:
- położenie środka równowagi COP (center of pressure)
- maksymalne przemieszczenie względem położenia środka równowagi (w AP,ML oraz płaszczyźnie AP/ML),
- długość drogi względem położenia środka równowagi (w AP,ML oraz płaszczyźnie AP/ML),
- średnia prędkość przemieszczenia (w AP,ML oraz płaszczyźnie AP/ML),
- wskaźnik Romberga - stosunek różnicy długości drogi przy oczach zamkniętych i otwartych, do sumy długości drogi przy oczach zamkniętych i otwartych
Dokładny opis matematyczny wyżej wymienionych wskaźników znajduje się w pracy (Prieto, 1996).
Należy również przedstawić na wykresie przebieg ruchu COP oddzielnie w płaszczyźnie AP, ML oraz w przestrzeni AP/ML.
Dodatkowo studenci mają za zadanie przeprowadzić analizę rozkładu przestrzennego punktów statokinezjogramu. Statokinezjogramem lub posturogramem nazywamy wędrówkę COP w dwuwymiarowej płaszczyźnie podparcia. Kierunki na tej płaszczyźnie określa się jako AP (y) lub ML (x), przy czym ML oznacza wychylenia w płaszczyźnie czołowej (medio-lateral), a AP w płaszczyźnie strzałkowej (anterio-posterior). W celu przeprowadzenie takiej analizy, cały zakres zostaje podzielony na jednakowe komórki. Następnie obliczony zostaje histogram przestrzenny czasu przebywania w każdej z nich. Taki histogram pozwala ocenić, czy kontrola położenia referencyjnego COG (center of gravity), a tym samym pionowa orientacja ciała, jest prawidłowa. Wyznacznikiem prawidłowej kontroli jest histogram o skupionym rozkładzie i z wyraźnym maksimum. Upośledzenie kontroli objawia się tym, że histogram przestrzenny staje się rozmyty lub wyraźnie niesymetryczny (Błaszczyk, 2004).
Analiza danych: wychylenia dynamiczne
Oprócz wskaźników statycznych stabilności do oceny kontroli posturalnej wykorzystuje się również miary dynamiczne. Z punktu widzenia miar bezpośrednich, istotna jest ocena kontroli środka ciężkości ciała w czasie jego świadomego przemieszczania w wyznaczonym kierunku. W ramach pomiarów, studenci mieli za zadanie wykonać dwa rodzaje wychyleń (szybkie i "z przytrzymaniem") w dwóch warunkach: bez informacji zwrotnej dla badanego oraz z informacją zwrotną dla badanego. Dla każdego z przypadków należy wyznaczyć następujące parametry:
- położenie środka równowagi (dla warunku bez informacji zwrotnej będzie to COP ze stania swobodnego z oczami otwartymi, natomiast dla warunku z informacją zwrotną będzie to COP z sesji kalibracyjnej)
- wartość maksymalnego wychylenia (w określonym kierunku) względem położenia równowagi,
- wykresy składowych wychwiań względem położenia równowagi w płaszczyźnie AP, ML w zależności od czasu oraz wypadkowa trajektoria przemieszczeń COP (w dwuwymiarowej płaszczyźnie AP, ML).
i zbadać czy informacja zwrotna wpływa na rezultaty badanego.
Literatura:
- Błaszczyk J., Biomechanika kliniczna, PZWL, 2004
- Prieto T.E. et al., Measures of postural steadiness: differences between healthy young and elderly adults, IEEE Trans Biomed Eng, 1996, 43(9):956-66