Akcelerometre
Zo stránky SensorWiki
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:
- Ú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.
- Údaje prijmete v aplikácii, ktorú máte ako vzor uvedenú nižšie. Treba len:
- rozparsovať prijímané dáta na tri súradnice ax, ay a az.
- prepočítať zrýchlenia na natočenia roll, yaw a pitch.
- na základe výpočtu pohybovať objektom v okne
- 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
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
- 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 (OrientationDemo.zip)
- Prevod natočenia z akcelerometrov na yaw, pitch a roll je popísaný v týchto troch článkoch:
- Mark Pedley: Tilt Sensing Using a Three-Axis Accelerometer. Application Note AN3461. Freescale Semiconductor, 2013.
- Talat Ozyagcilar: Implementing a Tilt-Compensated eCompass using Accelerometer and Magnetometer Sensors Application Note AN4248. Freescale Semiconductor, 2012.
- Talat Ozyagcilar: Accuracy of Angle Estimation in eCompass and 3D Pointer Applications Application Note AN4249. Freescale Semiconductor, 2015.
Ale predpokladám, že vám bude stačiť toto, kde G sú jednotlivé zrýchlenia a ϕ = roll and θ = pitch:
Implementácia by mohla vyzerať napríklad takto (výsledky v radiánoch, potrebujeme potom stupne)
roll = atan2(accelerationY, accelerationZ);
pitch = atan2(-accelerationX, sqrt(accelerationY*accelerationY + accelerationZ*accelerationZ));
yaw = atan2(accelerationZ/sqrt(accelerationX*accelerationX + accelerationZ*accelerationZ));