Web stranica za seminar i projekt iz kolegija "Računalna grafika".
Kao ulazni uređaj na računalu, najčešće koristimo tipkovnicu, miš ili "joystick" međutim postoje razni uređaji za unos podataka u računalo kao što su grafički tableti, mikrofon, skener i dr.
Ovdje ću prikazati upotrebu jednog novog uređaja za unos podataka i manipuliranje računalnom grafikom ovisno o istima.
Više o uređaju potražite ovdje.
Također objasniti ću kako koristiti podatke iz uređaja u iOS aplikaciji i kako riješiti neke, u dokumentaciji, ne spomenute detalje nužne da bi se spojili sa uređajem.
Više o korištenju potražite ovdje.
Na stranici možete pogledati kako izgledaju primjeri izrađeni za potrebe seminarskog rada koristeći OpenGL 2 na iOS-u sa ulaznim podacima iz MindWave Mobile uređaja.
Više o tome ovdje.
Na download dijelu možete preuzeti primjere i prezentaciju.
Ako imate bilo kakvih pitanja, slobodno me kontaktirajte.
MindWave mobile je uređaj koji očitava moždane valove korisnika te ih pomoću ThinkGear iOS API-a može učiniti sastavnim dijelom svake iOS aplikacije. Uređaj se spaja na druge uređaje putem Bluetooth-a.
To je zapravo prijenosni EEG biosenzor koji zamjenjuje skupe, teške, velike i neprijenosne uređaje.
Očitava moždane valove, a NE misli.
Senzor interpretira moždanu aktvivost kroz slijedeće podatke koje može dostaviti aplikaciji:
MindWave mobile možemo koristiti kao jedini ili kao dodatni način unosa parametara u igre. Najčešće se koristi kod rehabilitacije ili treninga sportaša, ali primjena ovog uređaja je neograničena i ovisi samo o mašti.
ThinkGear iOS API olakšava rad s MindWave mobile uređajem jer za programera riješava problem spajanja i održavanja veze s uređajem te parsira primljene podatke iz uređaja.
ThinkGear iOS API je besplatan za preuzimanje i korištenje, a može ga se naći na ovom linku.
Koristi se kod razvoja aplikacija koje koriste podatke bio signala NeuroSky ThinkGear obitelji:
Pri razvoju aplikacija korištenjem ThinkGear iOS API-a treba biti svjestan dva ograničenja, a to su da je moguće spojiti se samo sa jednim uređajem i da zbog frenkvencije uzorkovanja neki podaci mogu biti izgubljeni. Tu najviše stradaju podaci o treptaju koje je najlakše izgubiti.
API za nas upravlja vezom prema ThinkGear uređaju, parsira tok podataka iz uređaja i delegate klasu obaviještava u zadanom intervalu o spajanju uređaja, prekidu veze sa uređajem i o očitanim vrijednostima sa senzora
Prvi korak nakon kreiranja novog projekta je editirati info.plist file u kojem treba dodati "supported external accessory protocols" i vrijednost "com.neurosky.thinkgear"
Zatim sve iz foldera "src/lib" koji se nalazi u .zip file-u kojeg smo preuzeli sa linka navedenog gore, prebacimo u "Libraries" groupu u projektu
Treći korak je da dodamo accelerate.framework i externalAccessories.framework
Kad smo sve pripremili možemo krenuti na editiranje koda.
Prvi korak je da u klasu u kojoj koristimo MindWave ubacimo headere:
Slijedeći korak je da što ranije u kodu postavimo TGAccessoryManager. Tipično se to postavlja u AppDidFinishLaunching metodi delegate klase aplikacije
[[TGAccessoryManager sharedTGAccessoryManager] setupManagerWithInterval:0.05 forAccessoryType:accessoryType];
[[TGAccessoryManager sharedTGAccessoryManager] setDelegate:(ViewController *)[[navigationController viewControllers] objectAtIndex:0]];
Ovime smo postavili osvježavanje tj. obavještavanje metode dataReceived o trenutnim podacima svakih 0.05 sekundi.
Trebamo paziti i da prilikom gašenja aplikacije prekinemo preuzimanje podataka iz uređaja, a to radimo naredbom:
[[TGAccessoryManager sharedTGAccessoryManager] teardownManager];
u appWillTerminate metodi
Da bismo nakon svega bili u mogućnosti primati podatke moramo klasu koja je postavljena kao delegate klasa modificirati da podržava TGAccessoryDelegate protokol.
@interface ViewController : GLKViewController <TGAccessoryDelegate>
Zatim u istoj klasi definiramo slijedeće metode.
- (void)accessoryDidConnect:(EAAccessory *)accessory;
- (void)accessoryDidDisconnect;
- (void)dataReceived:(NSDictionary *)data;
Preuzimanje podataka možemo pokrenuti kad je uređaj spreman i najpraktičnije je to napraviti u wievDidLoad metodi uz provjeru dostupnosti uređaja.
if([[TGAccessoryManager sharedTGAccessoryManager] accessory] != nil){ [[TGAccessoryManager sharedTGAccessoryManager] startStream]; }
Stopiranje radimo u wievWillDisappear metodi uz provjeru dali je uređaj uopće spojen.
if([[TGAccessoryManager sharedTGAccessoryManager] connected]) [[TGAccessoryManager sharedTGAccessoryManager] startStream];
Po dokumentaciji je ovo kraj i uređaj bi se morao javljati te bi, ako ništa drugo, kroz dataReceived metodu trebali moći ispisivati podatke. Ukoliko bi se radilo o aplikaciji koja koristi standardne UI elemente to bi bilo sasvim dovoljno. S obzirom na to da se ovdje radi o OpenGL aplikaciji, tih elemenata nema, a potrebni su jer ih API koristi za prijenos podataka. Zato je potrebno iste kreirati i sakriti.
Započinjemo u appDelegate klasi gdje definiramo
@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, strong) IBOutlet UINavigationController * navigationController;
U applicationDidFinishhLaunching stavljamo slijedeći kod
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:[[ViewController alloc] init]];
self.window.rootViewController = navigationController;
navigationController.navigationBar.hidden = YES;
Prikaz moždanih valova u obliku koordinatnog sustava gdje je pažnja predstavljena vrijednošću na y osi, a meditacija na x osi. Treptaj je prikazan u ishodištu i traje 1 sekundu.
Primjer je moguće isprobati i bez MindWave-a pri čemu se prstom prelazi po ekranu.
Automobil kreće kad je signal kvalitetan(zeleni semafor) i kad korisnik trepne. Koristeći prosječnu vrijednost pažnje i meditacije, prilagođava se brzina vozila koja ide do max 100km/h. U donjem desnom kutu bilježi se vrijeme potrebno za prelazak staze u dužini 402m. Dodirom na ekran igra kreće od početka.
Primjeri su izrađeni u Xcode razvojnom okruženju koristeći OpenGL ES2 te su prilagođeni za dimenzije iPad-a.
Kontaktirati me možete na: