Akcelerometre: Rozdiel medzi revíziami
Zo stránky SensorWiki
|  Vytvorená stránka „Modifikované cvičenie  na DOMA:   '''Úloha:''' Akcelerometre ktoré máte v mobile, alebo ako samostatný senzor, použijeme na ovládanie 3D modelu v prostredí Proc…“ | Bez shrnutí editace | ||
| Riadok 28: | Riadok 28: | ||
| <source lang="cpp"> | <source lang="cpp"> | ||
| import processing.serial.*; | |||
| Serial myPort; | Serial myPort; | ||
| PShape myObject; | PShape myObject; | ||
| Riadok 45: | Riadok 40: | ||
| { | { | ||
|    size(600, 600, P3D); |    size(600, 600, P3D); | ||
|    myObject = loadShape("tinker.obj");  //  |    myObject = loadShape("tinker.obj");  // objekt, ktorym chcem hybat | ||
|   /* Toto je niekolko prikladov, ako si vybrat seriovy port, nie je aktivne | |||
|      ani jedno, musite si niektoru moznost odkomentovat                    */ | |||
|    //  |    // ak nic neviete, vypiste si najprv vsetky porty co mate: | ||
|    printArray(Serial.list()); |    printArray(Serial.list()); | ||
|    //  |    // ak mate len jeden port, alebo viete ktory v poradi je ten vas: | ||
|    //myPort = new Serial(this, Serial.list()[1], 115200);  |    //myPort = new Serial(this, Serial.list()[1], 115200);   | ||
|    //  |    // ak viete cislo portu: | ||
|    //myPort = new Serial(this, "COM5:", 9600);        // Windows "COM#:" |    //myPort = new Serial(this, "COM5:", 9600);        // Windows "COM#:" | ||
|    myPort = new Serial(this, "\\\\.\\COM39", 115200); // Windows, COM10  |    // myPort = new Serial(this, "\\\\.\\COM39", 115200); // Windows, od COM10 vyssie | ||
|    //myPort = new Serial(this, "/dev/ttyACM0", 9600);   // Linux "/dev/ttyACM#" |    //myPort = new Serial(this, "/dev/ttyACM0", 9600);   // Linux "/dev/ttyACM#" | ||
|    //myPort = new Serial(this, "/dev/cu.usbmodem1217321", 9600);  // Mac "/dev/cu.usbmodem######" |    //myPort = new Serial(this, "/dev/cu.usbmodem1217321", 9600);  // Mac "/dev/cu.usbmodem######" | ||
| } | } | ||
| void draw() | void draw() | ||
| { | { | ||
|    serialEvent();  |    serialEvent();   // nacitaj hodnoty z prichadzajucej spravy | ||
|   background(255); // biele pozadie | |||
|    lights();        // osvetlenie sceny | |||
|    translate(width/2, height/2); // pociatok suradnic bude v strede okna | |||
|    pushMatrix();    // zaciname transformaciu | |||
|     rotateX(radians(roll)); | |||
|     rotateY(radians(-pitch)); | |||
|     rotateZ(radians(yaw)); | |||
|     // drawObject();  // objekt bud nakreslime, alebo | |||
|     shape(myObject); // zobrazime 3D model .obj | |||
|    popMatrix(); // end of object |    popMatrix(); // end of object | ||
|    //  |    // Ziskane hodnoty si pre istotu vypiseme aj do konzoly | ||
|    print(roll); |    print(roll); | ||
|    print("\t"); |    print("\t"); | ||
| Riadok 106: | Riadok 86: | ||
|    println(); |    println(); | ||
| } | } | ||
| void serialEvent() | void serialEvent() | ||
| Riadok 112: | Riadok 93: | ||
|    int newLine = 13; // new line character in ASCII |    int newLine = 13; // new line character in ASCII | ||
|    String message; |    String message; | ||
|    do { |    do { | ||
|      message = myPort.readStringUntil(newLine); // read from port until new line |      message = myPort.readStringUntil(newLine);     // read from port until new line | ||
|      if (message != null) { |      if (message != null) { | ||
|        String[] list = split(trim(message), " "); //  |        String[] list = split(trim(message), " ");   // hodnoty su oddelene medzerami (ale mozem sem dat napr. ciarky) | ||
|        if (list.length >= 4 && list[0].equals("Orientation:")) {  // tu vyhodime zo zaciatku slovo Orientation: ale nemusi to byt vobec |        if (list.length >= 4 && list[0].equals("Orientation:")) {  // tu vyhodime zo zaciatku slovo Orientation: ale nemusi to byt vobec | ||
|          aX = float(list[1]); // convert to float yaw |          aX = float(list[1]); // convert to float yaw | ||
| Riadok 121: | Riadok 103: | ||
|          aZ = float(list[3]); // convert to float roll |          aZ = float(list[3]); // convert to float roll | ||
|          /* Tuto treba dopisat prevod zrychlenia v jednotlivych osiach na natocenia */   | |||
|          /* Vasa uloha je namiesto pevnej hodnoty vlozit vypocet                    */ | |||
|         yaw=45; | |||
|          pitch=-45; | |||
|          roll=45;         | |||
|        } |        } | ||
|      } |      } | ||
| Riadok 138: | Riadok 115: | ||
| } | } | ||
| void  | void drawObject() | ||
| { | { | ||
|    stroke(0); // black outline |    stroke(0); // black outline | ||
|    fill(255, 215, 0); // gold color |    fill(255, 215, 0); // gold color | ||
|    box(100,100, 100); // cube | |||
|    box( | |||
| } | } | ||
| </source> | </source> | ||
Verzia z 22:11, 20. apríl 2020
Modifikované cvičenie na DOMA:
Úloha:
Akcelerometre ktoré máte v mobile, alebo ako samostatný senzor, použijeme na ovládanie 3D modelu v prostredí Processing.
Postup:
1. Údaje z akcelerometrov v mobile prenesiete cez Bluetooth alebo cez WiFi pomocou niektorej z aplikácií, ktoré poznáte z predošlých cvičení. Kontrola: v programe Terminal.exe alebo podobnom skontrolujete, či prijímate správne údaje.
2. Údaje prijmete v aplikácii, ktorú máte ako vzor uvedenú nižšie. Treba len: a) rozparsovať prijímané dáta na tri súradnice ax, ay a az. b) prepočítať zrýchlenia na natočenia roll, yaw a pitch. c) na základe výpočtu pohybovať objektom v okne
3. Okrem vzorovej kocky, ktorú máte vo vzorovej aplikácii, vytvorte alebo stiahnite z internetu iný 3D model vo formáte .obj a demonštrujte na krátkom videu, že ním viete otáčať.
Odovzdať treba:
- video na ktorom vidno ako otáčate objektom pohybom mobilu
- zdrojový kód v Processingu (.pde)
- model objektu (.obj)
Vzorový program
import processing.serial.*;
Serial myPort;
PShape myObject;
float yaw = 0.0;
float pitch = 0.0;
float roll = 0.0;
void setup()
{
  size(600, 600, P3D);
  myObject = loadShape("tinker.obj");  // objekt, ktorym chcem hybat
  /* Toto je niekolko prikladov, ako si vybrat seriovy port, nie je aktivne
     ani jedno, musite si niektoru moznost odkomentovat                    */
  // ak nic neviete, vypiste si najprv vsetky porty co mate:
  printArray(Serial.list());
  
  // ak mate len jeden port, alebo viete ktory v poradi je ten vas:
  //myPort = new Serial(this, Serial.list()[1], 115200); 
  // ak viete cislo portu:
  //myPort = new Serial(this, "COM5:", 9600);        // Windows "COM#:"
  // myPort = new Serial(this, "\\\\.\\COM39", 115200); // Windows, od COM10 vyssie
  //myPort = new Serial(this, "/dev/ttyACM0", 9600);   // Linux "/dev/ttyACM#"
  //myPort = new Serial(this, "/dev/cu.usbmodem1217321", 9600);  // Mac "/dev/cu.usbmodem######"
}
void draw()
{
  serialEvent();   // nacitaj hodnoty z prichadzajucej spravy
  background(255); // biele pozadie
  lights();        // osvetlenie sceny
  translate(width/2, height/2); // pociatok suradnic bude v strede okna
  pushMatrix();    // zaciname transformaciu
    rotateX(radians(roll));
    rotateY(radians(-pitch));
    rotateZ(radians(yaw));
    // drawObject();  // objekt bud nakreslime, alebo
    shape(myObject); // zobrazime 3D model .obj
  popMatrix(); // end of object
  // Ziskane hodnoty si pre istotu vypiseme aj do konzoly
  print(roll);
  print("\t");
  print(-pitch);
  print("\t");
  print(yaw);
  println();
}
void serialEvent()
{
  float aX, aY, aZ;
  int newLine = 13; // new line character in ASCII
  String message;
  do {
    message = myPort.readStringUntil(newLine);     // read from port until new line
    if (message != null) {
      String[] list = split(trim(message), " ");   // hodnoty su oddelene medzerami (ale mozem sem dat napr. ciarky)
      if (list.length >= 4 && list[0].equals("Orientation:")) {  // tu vyhodime zo zaciatku slovo Orientation: ale nemusi to byt vobec
        aX = float(list[1]); // convert to float yaw
        aY = float(list[2]); // convert to float pitch
        aZ = float(list[3]); // convert to float roll
        
        /* Tuto treba dopisat prevod zrychlenia v jednotlivych osiach na natocenia */ 
        /* Vasa uloha je namiesto pevnej hodnoty vlozit vypocet                    */
        yaw=45;
        pitch=-45;
        roll=45;        
        
      }
    }
  } while (message != null);
}
void drawObject()
{
  stroke(0); // black outline
  fill(255, 215, 0); // gold color
  box(100,100, 100); // cube
}
Tipy:
- Na vytvorenie 3D objektu môžete použiť napr. TinkerCAD (návody na tomto YouTube kanáli: https://www.youtube.com/playlist?list=PLmh6bwr3ZDwAzcU1krZOvCDkJEuO8nUhv
- Ak k vyexportovanému objektu pridáte aj .mtl súbor, objekt bude farebný
- Tento demo program v Processingu otáča objektom pomocou myšky