Az alábbi ábrán látható, hogy ha egy tárgy dőlésszögét már 2 irányban akarjuk meghatározni, akkor az előző oldalon tárgyalt esethez képest kicsit bonyolultabb a helyzet (a gyorsulásmérő a G gravitációs gyorsulás X, Y és Z tengely irányú komponensét méri).
De amint az alábbi képeken és a videón is látható, két atan2() függvényt alkalmazva megoldható a probléma.
(a videóhoz kattints a képre)
Processing kód:
/* Dolesszogmeres 2 tengely iranyaban */
import processing.serial.*;
int graphPosition = 0; // teglalap kezdeti pozicioja
int[] vals = new int[3]; // gyorsulasmero altal mert ertekek
int[] maximum = new int[3]; // maximalis ertek
int[] minimum = new int[3]; // minimalis ertek
int[] mid = new int[3]; // kozepertek
float[] attitude = new float[3]; // szamolt dolesszog ertekek
float position;
Serial myPort;
boolean madeContact = false;
void setup ()
{
smooth();
frameRate(30);
size(400, 400, P3D);
fill(204);
background(255);
// a kalibracioval mert maximum, minimum es kozepertekek
maximum[0] = 540;
minimum[0] = 180;
mid[0] = 335;
maximum[1] = 530;
minimum[1] = 170;
mid[1] = 335;
maximum[2] = 530;
minimum[2] = 170;
mid[2] = 335;
position = width/2;
PFont myFont = createFont(PFont.list()[2], 18);
textFont(myFont);
myPort = new Serial(this, Serial.list()[2], 9600);
myPort.bufferUntil('\n');
fill(204);
}
void draw ()
{
background(255);
translate(width / 2, height / 2, -width);
if (madeContact == false)
{
myPort.write('m');
}
setAttitude();
tilt();
}
void setAttitude()
{
for (int i = 0; i < 2; i++)
{
attitude[i] = atan2(mid[2] - vals[2], mid[i] - vals[i]);
}
}
void tilt()
{
rotateX(attitude[1] - PI/16);
rotateY(attitude[0] - PI/2-0.1);
noStroke();
rect(-200, -100, 400, 200);
stroke(0);
strokeWeight(3);
line(0, 0, -250, 0, 0, 250);
stroke(100);
line(0, 150, 0, 0, -150, 0);
line(250, 0, 0, -250, 0, 0);
}
void serialEvent(Serial myPort)
{
madeContact = true;
String myString = myPort.readStringUntil('\n');
if (myString != null)
{
myString = trim(myString);
int sensors[] = int(split(myString, ','));
if (sensors.length >= 3)
{
vals[0] = sensors[0];
vals[1] = sensors[1];
vals[2] = sensors[2];
delay(100);
myPort.write('m');
}
}
}
A cikk még nem ért véget, lapozz!
Értékeléshez bejelentkezés szükséges!