Nowe technologie w fizyce biomedycznej/Posturografia: Różnice pomiędzy wersjami

Z Brain-wiki
 
(Nie pokazano 8 wersji utworzonych przez 2 użytkowników)
Linia 29: 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]].  
+
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.
 
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.
Linia 59: Linia 59:
  
 
===Przygotowanie danych do analizy===
 
===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ą. Pierwsze 4 kanały to dane z kolejnych sensorów (górny lewy-TL, górny prawy-TR, dolny prawy-BR, dolny lewy-BL), natomiast 5 kanał to próbki czasu wyrażone w [s].
+
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">
 
<source lang="Python">
Linia 65: Linia 65:
 
# -*- coding: utf-8 -*-
 
# -*- coding: utf-8 -*-
  
from obci.signal_processing import read_manager
+
from obci_readmanager.signal_processing import read_manager
from obci.signal_processing.balance.wii_preprocessing import *
+
from obci_readmanager.signal_processing.balance.wii_preprocessing import *
from obci.signal_processing.balance.wii_analysis import *
+
from obci_readmanager.signal_processing.balance.wii_analysis import *
  
 
file_name = 'still_eyes_closed_eyes_open'
 
file_name = 'still_eyes_closed_eyes_open'
 
wbr = read_manager.ReadManager(file_name+'.obci.xml', file_name+'.obci.raw', file_name + '.obci.tag')
 
wbr = read_manager.ReadManager(file_name+'.obci.xml', file_name+'.obci.raw', file_name + '.obci.tag')
TL = wbr.get_samples()[0,:]
+
TR = wbr.get_samples()[0,:]
TR = wbr.get_samples()[1,:]
+
BR = wbr.get_samples()[1,:]
BR = wbr.get_samples()[2,:]
+
TL = wbr.get_samples()[2,:]
 
BL = wbr.get_samples()[3,:]
 
BL = wbr.get_samples()[3,:]
 
TIME = wbr.get_samples()[4,:]
 
TIME = wbr.get_samples()[4,:]
Linia 85: Linia 85:
 
# -*- coding: utf-8 -*-
 
# -*- coding: utf-8 -*-
  
from obci.signal_processing import read_manager
+
from obci_readmanager.signal_processing import read_manager
from obci.signal_processing.balance.wii_preprocessing import *
+
from obci_readmanager.signal_processing.balance.wii_preprocessing import *
from obci.signal_processing.balance.wii_analysis import *
+
from obci_readmanager.signal_processing.balance.wii_analysis import *
  
 
file_name = 'still_eyes_closed_eyes_open'
 
file_name = 'still_eyes_closed_eyes_open'
 
wbr = read_manager.ReadManager(file_name+'.obci.xml', file_name+'.obci.raw', file_name + '.obci.tag')
 
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'])
 
smart_tags = wii_cut_fragments(wbr, start_tag_name='ss_start', end_tags_names=['ss_stop'])
TL = smart_tags[0].get_samples()[0,:]
+
TR = smart_tags[0].get_samples()[0,:]
TR = smart_tags[0].get_samples()[1,:]
+
BR = smart_tags[0].get_samples()[1,:]
BR = smart_tags[0].get_samples()[2,:]
+
TL = smart_tags[0].get_samples()[2,:]
 
BL = smart_tags[0].get_samples()[3,:]
 
BL = smart_tags[0].get_samples()[3,:]
  
Linia 274: 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 posture'')
+
*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),
 
*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),
 
*długość drogi względem położenia środka równowagi (w AP,ML oraz płaszczyźnie AP/ML),
Linia 293: 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 przestrzeni AP, ML).
+
*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

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.

Interfejs graficzny aplikacji Brain4edu
Okno wyboru scenariuszy eksperymentalnych aplikacji WiiApp


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:

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