Akcelerometre ako 3D ovládač v Matlabe

V tomto príklade sa pokúsime signálmi z akcelerometrov, ktoré bude posielať Arduino s príslušným senzorom, alebo mobilný telefón s príslušným softvérom na prenos cez sériovú linku. Budeme predpokladať, že data chodia dostatočne rýchlo v CSV (Comma Separated Values) formáte, kde každý riadok predstavuje jedno kompletné meranie a okrem samotných zrýchlení môže obsahovať aj iné merané veličiny, prípadne aj časové značky.

Príklad: accX, accY, accZ, time, dalsieVeliciny...

Na konci tohto príkladu je uvedené aj ako ho treba modifikovať v prípade, že nepoužívame real-time data, ale len data uložené v súbore offline. Preto je dôležité si uvedomiť, že nemôžete zobrať celý skript ako je, ale treba si ho naozaj poskladať na mieru pre svoje vlastné zariadenie.

Skript postupne poskladáme z nasledovných blokov. Najprv inicializujeme dôležité premenné. Napríklad pole Accelerometer je dôležité inicializovať aj preto, aby sme nemali kratšie pole v prípade, že nejaký riadok neprijmeme kompletný.

Začneme tým, že si pripravíme kresliacu plochu - graf

Aby sme mohli prijímať live data, musíme si pripraviť a otvoriť príslušný sériový port. Na začiatku si pre istotu príkazom serialportlist("available") vypíšeme zoznam dostupných portov, v nich nájdeme ten správny.

Pozn.: v tomto skripte už používame nový interface serialport namiesto stareho serial, podrobnosti a rozdiely sú opísané na stránke https://uk.mathworks.com/help/matlab/import_export/transition-your-code-to-serialport-interface.html

Teraz si vytvoríme nejaký 3D objekt, ktorým budeme pohybovať. Základné tvary, z ktorých ho môžeme vyskladať sú guľa, valec (z ktorého vieme spraviť aj kužeľ) a kocka (hranol). V tomto príklade vytvoríme z valca a kužeľa jednoduchú šípku, ostatné objekty sú zrejmé zo zakomentovanej časti kódu. Všetky objekty dohromady budú tvoriť objekt h, ktorým budeme potom ďalej manipulovať.

Ak chcete zobraziť komplikovanejší objekt, pozrite sa na tento príklad s lietadlom Lockheed C-130: https://uk.mathworks.com/matlabcentral/fileexchange/47967-draw-a-3d-airplane Na jeho natáčanie však treba použiť priamo argumenty funkcie c130() podľa uvedeného návodu. Asi by mala existovať aj možnosť načítať a zobraziť .obj súbory, ale nepodarilo sa nám ju správne implementovať.

V nasledovnom cykle, ktorý bude bežať tak dlho ako nastavíme do premennej simulation_duration prebehne všetko potrebné:

Po skončení treba ešte korektne zatvoriť port. V prípade, že program niekde havaruje, je tiež vhodné túto premennú zrušiť.

No a to je všetko.

Zmeny pre offline data zo súboru

Ak nemáme možnosť pracovať s datami v reálnom čase, môžeme si ich nahrať na mobile do .csv súboru a pracovať s ním ďalej. Potrebné sú nasledovné zmeny:

pričom nám vznikne objekt typy tabuľka, napriklad tie moje data vyzerajú takto:

 1×4 table

   Accelerometer_0    Accelerometer_1    Accelerometer_2    Accelerometer_timeStamp
    _______________    _______________    ______________       _________________

       0.081405            4.6856             8.6194               4.5337e+09       

 ... a dalsich 6000 riadkov

Po načítaní dát spravíme podobný cyklus, ale namiesto sledovania času cez tic a toc spravíme cyklus cez všetky data zo súboru

Data už nemusíme parsovať a konvertovať, to sa stalo automaticky po načítaní tabuľky. Takže si len vložíme hodnoty z aktuálneho riadku tabuľky do príslušných premenných a beh programu nachvíľu pozastavíme, aby sa to nevykreslilo príliš rýchlo. Konkrétny čas vo vašom prípade záleží na perióde vzorkovania pôvodného zdroja signálu, teda ako často ste data do súboru ukladali. Všimnite si tiež, že data z tabuľky T vyberáme podľa názvov, ktoré sú v hlavičke.

Všetko ostatné v kóde ostáva nezmenené, samozrejme však treba vyhodiť príkazy pre sériový port, ktorý nevyužívame.





8.4.2022