Zaraźliwe ziewanie, Ziewiający pies, NLP, EEG i interfejsy mózg-komputer

Chyba każdy z nas doświadczył zaraźliwego ziewania i nie raz złapał się na tym, że w towarzystwie osoby bliskiej sam szeroko otwiera usta, gdy owa osoba zacznie ziewać. Jeśli nawet nie doświadczasz tego często to na pewno słyszałeś o "zaraźliwym ziewaniu". Kiedyś nawet słyszałem, że owo ziewanie ma być bardziej zaraźliwe od grypy;) Ile w tym prawdy nie wiem, ale ostatnio natknąłem się na artykuł, który częściowo rozwiązał zagadkę: Dlaczego zarażamy się ziewaniem?

Nim przejdę jednak do sedna sprawy kilka faktów na temat ziieeeewaaaania..


Na wikipedi znajdziemy taką oto definicję: "Ziewanie to odruch polegający na wykonaniu głębokiego wdechu i wydechu związany ze zmęczeniem, brakiem pobudzenia lub potrzebą snu, jednak występuje także podczas niedotlenienia oraz przy wybudzaniu się. Ludzkie ziewanie jest silnym przekazem niewerbalnym, może posiadać różne znaczenia w zależności od sytuacji, w jakiej wystąpi. Przyczyny ziewania nie są dokładnie poznane. Jedna z teorii głosi, że ziewanie poprawia przepływ krwi i chłodzi mózg."

Doświadczenia pokazują, że nie tylko ludzie potrafią zarazić się ziewaniem. Ramiro M. Joly-Mascheroni, Atsushi Senju i Alex J. Shepherd (Dogs catch human yawns, Biol. Lett. (2008) 4, 446–448, ) przeprowadzili ciekawe badania, które pokazują, że ziewaniem zarazić się może również nasz pies. Co ciekawe, jak w podsumowaniu piszą badacze, zaraźliwość w przypadku pupila jest większe i wynosi 72% niż w przypadku ludzi 45-60%. Jak wyglądało badanie, można zobaczyć na filmie: http://gu.com/p/xztg2





Mam nadzieję, że jeszcze nie śpicie;) Sprawa "małpowania" odruchów, czy postawy ciała nie dotyczy tylko ziewania. Jak pewnie niektórzy wiedzą, osoby mające ze sobą "dobry kontakt" lub przyjacielską więż, często przyjmuja podobne postawy ciała a nawet oddychają w tym samym tempie. Jak wykorzystywać mowę ciała, można się dowiedzieć w książkach i kursach poświęconych NLP. Zresztą podobne techniki wykorzystuje się w hipnozie czy sugestii. Dlaczego podświadomie przejmujemy czyjeś postawy i zachowania? Pozostawało to dla mnie pewnego rodzaju zagadką. Jednak dlaczego tak się dzieje? Natknąłem się na ciekawe doświadczenie, które rozjaśnia nieco sprawę.

Od jakiegoś czasu znany jest fakt, że wykonanie ruchu (na przykład palcem) powoduje zmiany sygnału EEG (elektroencefalograficznego) w korze mózgowej. Znany jest również fakt, że samo wyobrażenie sobie ruchu powoduje pewne zmiany sygnału EEG podobne do tego, gdy wykonujemy samodzielnie ruch. Fakt ten jest często wykorzystywany przez interfejsy mózg-komputer. Osoba niepełnosprawna wyobraża sobie ruch, co powoduje zmiany potencjałów EEG a sprytny  komputer wykrywa te zmiany i steruje (na przykład) wózkiem inwalidzkim. Zmiany te nazywamy ERD/ERS, powrócimy do tego tematu na pewno w innym poście. Poniżej, możemy zobaczyć przykład tego, gdzie znajdują się obszary mózgu "odpowiedzialne" za dane fragmenty ciała.




Jednak doświadczenie wykonane w roku 1954! przez Pana Gastauta i jego zespół (Gastaut, H. J., & Bert, J. (1954). EEG changes during cinematographic presentation. Electroencephalogr. Clin. Neurophysiol., 6, 433-444) pokazało, że zachodzą zmiany w mózgu (zauważalne w sygnale EEG) jeśli patrzymy na ruch wykonywany przez zupełnie inną osobę! Zatem wystarczy, że obserwujemy wykonany ruch na przykład palcem wskazującym a nasz mózg (dla uściślenia fragment mózgu odpowiedzialny za ruch) zaczyna pracować podobnie jak mózg osoby która wykonuje ruch.

Teraz wystarczy poskładać fragmenty układanki i.. mamy całkiem ciekawe wyjaśnienie dlaczego ziewamy;) Oczywiście to dopiero początek, dodam, że doświadczenia te były zaczątkiem do stworzenia przez psychologów teorii o tak zwanych "neuronach lustrzanych".

Lego Mindstorms NXT 2.0+żyroskop HiTechnic+RobotC = Segway

Po kilku wieczorach wreszcie udało się skomponować (hardware i software) w całość i oto powstał Segway. Ponieważ już dostałem wiele pytań, jak zbudować takie cudo, przedstawię instrukcję budowy oraz co najważniejsze program Segwaya. Dodam tylko, że jest to wersja pierwsza a w zamierzeniu robot będzie sterowany za pomocą Bluetootha za pomocą telefonu z Windows Mobile i będzie poruszał się do przodu, do tyłu oraz skręcał.





Do zbudowania Segwaya, potrzebne będą:

Następnie należy połączyć dwa serwomoechanizmy, kostkę NXT oraz przypiąć nasz żyrokompas. Powinniśmy otrzymać coś takiego jak na poniższych zdjęciach:







Serwomotory podłączamy do wejść B i C. Żyroskop podłączamy do portu S1.

Teraz przechodzimy do najtrudniejszej części a mianowicie oprogramowania. Na początku próbowałem używać oprogramowania NXT-G dostarczonego przez firmę Lego w zestawie, ale było zbyt wolne i cały algorytm stawał się nieczytelny. Do napisania orpogramowania na Segway polecam programowanie NXC lub RobotC. Wykorzystałem oprogramowanie RobotC. 

Zaprogramowanie Sagwaya to nie taka prosta sprawa, jest wiele problemów z którymi należy się zmierzyć:

  • Pierwszy problem to odczyt wskazań z żyroskopu. Żyroskop to jednoosiowy czujnik obrotu  mierzy prędkość kątową do +/- 360° na sekundę a sam pomiar rejestruje do 300 razy na sekundę. Jednak sam żyroskop po podłączeniu do zestawu NXT, wskazuje już pewną wartość, nazwijmy tą wartość offsetem, u mnie było to około 608. Wartość ta (offset) jest zależny między innymi od temperatury otoczenia. A zatem jeśli zmieni się temperatura, nasz czujnik wskaże zupełnie inne wartości. Dalej opiszę jak sobie z tym radzić.

  • Kolejny problem to serwomechaznimy, otóż okazuje się, że szybkość obrotów zależy między innymi od naładowania baterii. Im lepsze baterie tym szybciej poruszają się serwomotory, musimy kompensować te zmiany.

  • Najważniejszy problem a zarazem wyzwanie to sama regulacja (sterowanie) samymi serwomotorami, tak aby robot zachowywał pozycję pionową. Będziemy "ustawiali" robota do pionu około 100 razy na sekundę.
  
 Poniżej przestawiam napisany program:

task main(){

int ng,gn=607,nw=0,rp=0,rg,lrp=0,rwi=0,md;

nMotorPIDSpeedCtrl[motorB] = mtrNoReg;
nMotorPIDSpeedCtrl[motorC] = mtrNoReg;
bFloatDuringInactiveMotorPWM=true;

// Wyliczenie offsetu i wpisanie go do zmiennej gn
int suma=0,i=0;
int srednia;
for (i=0; i<11; i++)
{
suma=suma+SensorRaw(S1);
}


srednia=suma/11;
gn=srednia;

nxtDisplayCenteredTextLine(1, "%d", gn); //wypisanie offsetu na ekranie


//glowna petla programu
while(true){

ng=SensorRaw(S1)-gn; nw+=ng; //wyliczenie kąta
rp=nMotorEncoder(B); //odczytanie pozycji koła

rg=rp-lrp; lrp=rp; rwi+=rg; //obliczenie prędkość koła
if (abs(rwi)>15){gn-=sgn(rwi); rwi=0;} //kompensacja zyrokompasu


md=(nw+ng*12+rp*5+rg*360)>>5; //kontroler PD dla (kół dużych RXC)
//md=(nw+ng*10+rp*4+rg*200)>>4; //kontroler PD (NXT dla kół małych)


md+=sgn(md)*48; //kompensacja tarcia/baterii

motor[motorB]=motor[motorC]=md; //ustawienie serwomotorów
wait1Msec(10); // pętla około 100 x na sekundę

}
} 

Myślę, że kod źródłowy wyjaśnia działanie programu. Oczywiście dla swojego Segwaya, powinieneś dobrać parametry dla regulatora PD oraz kompensację baterii.

Na koniec przedstawię jeszcze wynik działania programu wraz ze wszytkimi zmiennymi (wykres przy użyciu Matlaba).