Akcelerometre: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
Bez shrnutí editace |
||
(3 medziľahlé úpravy od rovnakého používateľa nie sú zobrazené.) | |||
Riadok 67: | Riadok 67: | ||
translate(width/2, height/2); // pociatok suradnic bude v strede okna | translate(width/2, height/2); // pociatok suradnic bude v strede okna | ||
rotateX(radians(roll)); | rotateX(radians(roll)); // argument je v radianoch <0,pi/2> co nam zabezpeci funkcia radians() | ||
rotateY(radians(-pitch)); | rotateY(radians(-pitch)); | ||
rotateZ(radians(yaw)); | rotateZ(radians(yaw)); | ||
Riadok 103: | Riadok 103: | ||
/* Vasa uloha je namiesto pevnej hodnoty vlozit vypocet */ | /* Vasa uloha je namiesto pevnej hodnoty vlozit vypocet */ | ||
yaw=45; | yaw=45; // tu predpokladame, ze hodnoty nam chodia v stupnoch, ale vase senzory mozno davaju radiany alebo nasobky g | ||
pitch=-45; | pitch=-45; | ||
roll=45; | roll=45; | ||
Riadok 142: | Riadok 142: | ||
</math> | </math> | ||
Implementácia by mohla vyzerať napríklad takto (výsledky v radiánoch | Implementácia by mohla vyzerať napríklad takto (atan2 dáva výsledky v radiánoch) | ||
<source lang="cpp"> | <source lang="cpp"> | ||
Riadok 159: | Riadok 159: | ||
* Ak je objekt ktorý kreslíte príliš malý alebo veľký, zmeňte mu veľkosť príkazom <code>myObject.scale(2.0);</code> hneď po nahraní, za príkazom <code>loadShape()</code> | * Ak je objekt ktorý kreslíte príliš malý alebo veľký, zmeňte mu veľkosť príkazom <code>myObject.scale(2.0);</code> hneď po nahraní, za príkazom <code>loadShape()</code> | ||
[[Súbor:logoMatlab.png|80px|left]] Ak vám to nepôjde ani jedným z uvedených spôsobov, skúste to ešte pomocou aplikácie [https://play.google.com/store/apps/details?id=com.mathworks.matlabmobile&hl=en&gl=US MATLAB Mobile].<BR> | |||
Ukážkový program na spracovanie dát a zobrazenie 3D objektu v Matlabe nájdete na [https://senzor.robotika.sk/mems/LiveAccelerometerData.html samostatnej stránke tu]. | |||
<BR> | |||
<BR> | |||
<BR> | |||
[[MEMS inteligentné senzory a aktuátory#Cvi.C4.8Denia|Návrat na zoznam cvičení...]] | [[MEMS inteligentné senzory a aktuátory#Cvi.C4.8Denia|Návrat na zoznam cvičení...]] | ||
[[Category:MEMS]] | [[Category:MEMS]] |
Aktuálna revízia z 07:28, 9. apríl 2022
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.
Pozrite si ukážku.
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
// myObject.scale(2.0); // ak je prilis maly alebo velky, zmente mu velkost
/* 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)); // argument je v radianoch <0,pi/2> co nam zabezpeci funkcia radians()
rotateY(radians(-pitch));
rotateZ(radians(yaw));
drawObject(); // objekt bud nakreslime, alebo
// shape(myObject); // zobrazime 3D model .obj
// 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; // tu predpokladame, ze hodnoty nam chodia v stupnoch, ale vase senzory mozno davaju radiany alebo nasobky g
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 (atan2 dáva výsledky v radiánoch)
roll = atan2(accelerationY, accelerationZ);
pitch = atan2(-accelerationX, sqrt(accelerationY*accelerationY + accelerationZ*accelerationZ));
yaw = atan2(accelerationZ, sqrt(accelerationX*accelerationX + accelerationZ*accelerationZ));
- Ak vám nefunguje on-line prenos dát, môžete toto zadanie spraviť tiež aj off-line, teda zo záznamu. Najprv nafilmujete ruku s mobilom, ktorou spravíte niekoľko jasne definovaných pohybov, potom doplníte video o ukážku, že objekt sa pohybuje v súlade s pohybom ruky, hoci aj nahraným v inom čase.
- Na načítanie údajov zo súboru v programe Processing použite createReader() - pozrite si príklad a bude to jasné.
- Pri načítaní dát zo súboru však musíte program trocha spomaliť, pretože zo súboru tie data dokážete čítať oveľa rýchlejšie ako ste ich zozbierali. Preto je vhodné po výpočte natočenia program zastaviť a "počkať" na ďalšiu vzorku, napríklad pomocou funkcie delay();.
- Ak je objekt ktorý kreslíte príliš malý alebo veľký, zmeňte mu veľkosť príkazom
myObject.scale(2.0);
hneď po nahraní, za príkazomloadShape()
![](/sensorwiki/images/thumb/4/4c/LogoMatlab.png/80px-LogoMatlab.png)
Ak vám to nepôjde ani jedným z uvedených spôsobov, skúste to ešte pomocou aplikácie MATLAB Mobile.
Ukážkový program na spracovanie dát a zobrazenie 3D objektu v Matlabe nájdete na samostatnej stránke tu.