BalanceBoard

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche
Bildschirmansicht
BalanceBoard ist ein Spiel, das im Rahmen des Praktikums Interaktion im Wintersemester 2019/2020 entstand.

Idee

Die Idee hinter dem Projekt ist ein Spiel, bei dem eine virtuelle Kugel auf ein Board projiziert wird und durch Neigung des Boards daran gehindert wird vom Board zu rollen. Das Board soll sich im kompletten Beamerbild frei bewegen können, was bedeutet, dass das Bild so transformiert werden muss, dass es immer passend auf das Board gemappt wird.


Geräte, Software, Aufbau

Geräte:
Aufbau
  • Lagesensor: BNO055
  • Arduino ESP8266
  • Router
  • Rechner
  • Infrarot-Kamera UEye 1120 SE M HQ von IDS
  • 4 Infrarot-LEDs
  • Beamer

Software:

  • Bibliothek: node mcu1.0
  • Visual Studio 2017
  • OpenFrameworks 0.10.1 (addons: ofxBullet, ofxOsc)
  • uEye-Full-49203-64-WHQL (Treiber für IR-Kamera)

Aufbau:

  • Daten des Lagesensors werden auf dem Arduino in einen OSC-Stream konvertiert
  • OSC-Stream wird per WLAN an den Rechner übertragen
  • IR-Kamera nimmt Bild der IR-LEDs auf und überträgt die Daten an den Rechner
  • Rechner verarbeitet die Daten von Arduino und IR-Kamera in Lage im Raum und Neigung des Boards
  • Rechner berechnet das zu projizierende Bild und sendet überträgt es an den Beamer
  • Beamer projiziert das Bild

Realisierung

Arduino

Arduino und Lagesensor wurden über ein Entwicklerboard miteinander verbunden.

Die Daten des Lagesensors werden vom Arduino in einen OSC-Stream konvertiert und anschließend in Form von "/Gyro X Z" (X, Z in Grad angegeben) über WLAN an den Rechner geschickt.

  // Setting up OSC adress
  OSCMessage msgOut("/Gyro");
  
  /* Get a new sensor event */ 
  sensors_event_t event; 
  bno.getEvent(&event);

  // Adding X and Y (float)  to the OSC stream 
  msgOut.add(event.orientation.y);
  msgOut.add(event.orientation.z);

  Udp.beginPacket(destIp, destPort);
  msgOut.send(Udp);
  Udp.endPacket();
  msgOut.empty();
  delay(100);

Um mit dem Arduino Daten über WLAN versenden zu können, muss initial die WLAN-Konfiguration am Arduino eingestellt worden sein.

Rechner

Auf dem Rechner wurde zunächst eine Welt erstellt, in der sich eine Kugel und ein Board befinden. Dies wurde mit dem Addon ofxBullet realisiert.

  //setuo world
  world.setup();
  world.enableCollisionEvents();
  world.enableDebugDraw();
  world.setGravity(ofVec3f(0, 1000, 0));
  world.setCamera(&camera);

  //setup ground
  ground.create(world.world, ofVec3f(0., 0, 0.), 0., 50.f, 1.f, 50.f);
  ground.setProperties(.25, .95);
  ground.enableKinematic();
  ground.add();

  //setup sphere
  bullet = new ofxBulletSphere();
  bullet->create(world.world, ofVec3f(0, -40, 0), 10, 4.25);
  bullet->add();

Die mithilfe des Addons ofxOsc empfangen Daten des Arduinos werden zunächst in Bogenmaß umgerechnet und dann zur Berechnung der Neigung des Boards genutzt.

  // set the rotation of the bullet transform to that of the axis of the stored quaternion  
  // and apply the new rotation   
  trans.setRotation(btQuaternion(0, newRotY, newRotZ*(-1)));

  // set the rotation of the bullet transform to that of the axis of the stored quaternion  
  // and apply the new rotation   
  // apply the transform to the rigid body //  
  f->setWorldTransform(trans);
  ground.getRigidBody()->setMotionState(f);		

  // tell the ofxBulletWorldRigid that we have moved rigid body and it should update the collision object // 
  ground.activate();

Infrarot-Kamera

Mithilfe der Infrarot-Kamera werden die 4 Infrarot-LEDs der Platte aufgenommen. Nachdem die 4 Punkte detektiert sind, wird der Schwerpunkt des Boards berechnet.

Probleme

Wegen der mangelnden Dokumentation des Addons ofxBullet und der damit einhergehenden langsameren Umsetzung des Projekts sind wir in der gegebenen Zeit leider nicht fertig geworden.

Resultat

Die Übertragung der Rotationsdaten und deren Verarbeitung, sowie die Physik der Kugel funktionieren und man erhält so schon eine erste Version des Spiels, die am Bildschirm angezeigt wird. Allerdings fehlt noch die Schwerpunktberechnung aus den Daten der IR-Kamera und damit auch die Positionsbestimmung im Raum sowie die Projektion über den Beamer. Im Moment kann die Position im Raum mithilfe der Tastatur geändert werden.

Ausblick

Um das Projekt zu vervollständigen muss noch die Entfernung zur Kamera, sowie die Lage im Raum berechnet werden und diese dann den bereits vorhandenen Kamera-Variablen zugewiesen werden. Außerdem muss das projizierte Bild korrekt auf das Board gemappt werden.

Uploads

Programmcode