Adatnaplózás VEX Brain/Szenzorokkal (Python verzió)

Bevezetés

Ebben a cikkben megvitatjuk, hogyan lehet olyan adatnaplózási projektet létrehozni, amely arra utasítja a VEX Robotot, hogy adatokat gyűjtsön a VEX Brain segítségével, és mentse azokat CSV-fájlba az SD-kártyára adatelemzés céljából.

Az adatnaplózás egy hatékony eszköz, amellyel segíthetünk a tudományos kutatásban, saját kísérleteinket végezhetjük el, és megoldhatunk konkrét problémákat. Különféle szórakoztató és izgalmas feladatokat hajthatunk végre a VEX Robot segítségével adatnaplózással. Íme néhány példa:

  • Adatgyűjtés a távolságérzékelővel a robot sebességének kiszámításához
  • A robot körbevezetése az osztályteremben és adatok gyűjtése az optikai érzékelővel, hogy megfigyelje a fényváltozásokat különböző helyeken.
  • Kalandra vigye a robotot, és rögzítse a GPS-koordináták adatait egy térkép elkészítéséhez.

Adatnaplózási projekt fejlesztéséhez szükséges kódolási ismeretek

  • Különféle parancsok segítségével gyűjtsön adatokat a VEX Brain/Sensors segítségével, és adja hozzá az adatstruktúrához.
  • Írja az adatokat egy vesszővel tagolt értékek (CSV) fájlba az SD-kártyán.

Az adatnaplózáshoz szükséges hardver:

  • A VEX Brain (IQ, V5, EXP)
  • Egy SD kártya
  • Egy érzékelő vagy több érzékelő (opcionális, a szükséges adatoktól függően)

Adatok lekérése az érzékelőből

A VEX Robotot (IQ, V5, EXP) programozhatjuk úgy, hogy az alábbi érzékelők adatait rögzítse:

  • Inerciális érzékelő
  • Távolság érzékelő
  • Optikai érzékelő
  • Látásérzékelő
  • Forgásérzékelő (V5, EXP)
  • GPS-érzékelő (V5)

Megjegyzés: A VEX IQ (2. generációs) Brain és a VEX EXP Brain beépített inerciális érzékelővel rendelkezik. Ezekkel a VEX Brian-ekkel gyűjthetjük az inerciális érzékelő adatait.

Ebben a cikkben egy olyan adatnaplózási projektet fogunk kidolgozni, amely a VEX IQ Brain (2.) segítségével gyűjti össze a gyorsulási adatokat, és tárolja azokat egy SD-kártyán. 

Először egy rövid programot kell írnunk, hogy leolvassuk az időzítőt és a VEX IQ Brainbe épített inerciális érzékelőt (2.).

  • A program elején importálnunk kell a Python modulokat a VEX IQ Brain (2.) vezérléséhez, és le kell kérnünk onnan az adatokat. Ezért kezdje azzal, hogy hozzáadja ezeket az utasításokat a projekthez.
  • # A könyvtár
    at importál vexből *

    # Az agyat alapértelmezés szerint definiálni kell
    brain = Brain()
    brain_inertial = Inertial()
  • Ezután adja hozzá a kódot a numOfDataEntries változó deklarálásához a rögzítéshez szükséges adatbejegyzések számának tárolásához, deklaráljon egy polling_delay_msec változót az adatok kiolvasásához szükséges időintervallum értékének tárolásához, és hozzon létre egy üres data_buffer változót a tároláshoz. az érzékelőből kiolvasott adatok.
  • numOfDataEntries = 100
    polling_delay_msec = 50
    data_buffer = ""
  • Mivel az időbélyeg adatokhoz való hozzáadásához az időzítő aktuális értékét fogjuk használni, az adatgyűjtés megkezdése előtt vissza kell állítanunk az időzítő értékét 0 másodpercre.
  • # Időzítő inicializáló kód hozzáadása
    brain.timer.clear()
  • Mielőtt használnánk azt az utasítást, amely lekéri az adatokat a VEX IQ Brainből (2.), és rögzíti az adatokat a pufferben, először meg kell értenünk.
    A következő utasítás egy adott formátumban hozzáfűzi az időzítő aktuális értékét az data_buffer változóhoz.

    A Python kód egy sorát darabokban emeltük ki a részletes magyarázat érdekében. A kódsor a következőt olvassa: data_buffer += 1.3f % brain.timer.value() + vessző. Először a += operátort jelöljük ki, és a következő felirattal látjuk el: Adatok hozzáfűzése a data_buffer karakterlánchoz. Ezután az 1.3f karakterláncot jelöljük ki és Formátum karakterlánc néven jelöljük meg. Ezután a százalékjel kiemelésre kerül, és a következő feliratot kapja: Karakterlánc modulo operátor. Ezután a brain.timer.value() parancsot jelöljük ki, és az időzítő aktuális értéke felirattal látjuk el. Végül a vessző hozzáadását a végén kiemeli a rendszer, és a következő olvasható: Vessző hozzáadása a végéhez az adatok elválasztásához.

    Bontsuk fel a “%1.3f”formátumú karakterláncot: 

    • „%”: Bemutatja a konverzióspecifikátort.
    • „1”: A karakterláncban jelenlévő számjegyek minimális számát jelzi
    • „.3”: Megadja a formázott számba belefoglalandó tizedesjegyek számát.
    • „f”: Azt jelzi, hogy a formázandó érték egy lebegőpontos szám.

    Így a „%1.3f” formátumú karakterlánc segítségével formázhatunk egy lebegőpontos számot legalább 1 számjegy szélességgel és 3 tizedesjegy pontossággal.

  • Most leolvashatjuk a VEX IQ Brainben (2.) beépített inerciális érzékelő időzítőjét és gyorsulási értékét, majd a megadott formátumban hozzáfűzhetjük az adatokat a data_buffer változóhoz.
  • # Parancsok az adatok pufferbe írásához
    data_buffer += "%1.3f" % brain.timer.value() + "\n"
    data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"

    Az előző kódot részletesen ismertetjük. A brain.timer.value() függvényt használó első data_buffer sor az Időbélyeg hozzáadása a pufferhez feliratú. A következő három sor felirata: Adja hozzá a gyorsulás értékét az X, Y és Z tengelyek mentén a pufferhez.

  • Megjegyzés: "\n" az új sor karakter. Ez azt jelzi, hogy a sor itt véget ér, és egy új sor kezdetét jelöli.
  • Ezután bizonyos számú adatbejegyzés rögzítéséhez a data_buffer változóba használhatjuk a for loop , hogy ismételten végrehajtsuk az adatokat lekérő utasításokat, és hozzáfűzzük az adatokat a data_buffer változóhoz számos iterációhoz. A stratégiánk az, hogy a numOfDataEntries változó értékét használjuk az iterációk számának meghatározásához.
  • #
    adatgenerálás az i-hez a range(0, numOfDataEntries) tartományban:

    # Parancsok az adatok
    pufferbe írásához data_buffer += "%1.3f" % brain.timer.value() + "\n"
    data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
  • Eddig a programunk olyan gyorsan rögzíti az adatokat, amennyire csak lehetséges. Az adatokat azonban meghatározott időközönként szeretnénk rögzíteni. Ezért használhatunk egy wait() függvényt a for ciklusban a program szüneteltetésére, hogy hozzáadjuk a két leolvasás közötti meghatározott időintervallumot. Az időintervallum értékének meghatározásához a polling_delay_msec változó értékét használjuk.
  • #
    adatgenerálás az i-hez a range(0, numOfDataEntries) tartományban:

    # Parancsok az adatok
    pufferbe írásához data_buffer += "%1.3f" % brain.timer.value() + "\n"
    data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"

    wait(polling_delay_msec, MSEC)

Gratulálunk! Befejeztük a VEX Brainbe épített inerciális érzékelő leolvasási (gyorsulási adatok) leolvasási programját. Ezután megvizsgáljuk, hogyan írhatjuk az adatokat egy CSV-fájlba az SD-kártyán.

# A könyvtár
importál vexből import *

# Az agyat alapértelmezés szerint definiálni kell
brain = Brain()
brain_inertial = Inertial()

numOfDataEntries = 100
polling_delay_msec = 50
data_buffer = ""

# Időzítő inicializáló kód hozzáadása
brain.timer.clear()

# Adatgenerálás
az i tartományhoz tartományban (0, numOfDataEntries):

# Parancsok az adatok pufferbe írásához
data_buffer += "%1.3f" % brain.timer.value() + "\n"
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f"% brain_inertial.acceleration(ZAXIS) + "\n"

wait(polling_delay_msec, MSEC)

Az SD-kártya csatlakoztatása a VEX Brainhez

Mielőtt az adatokat egy SD-kártyán lévő fájlba írná, először helyezze be az SD-kártyát a VEX Brain SD-kártyanyílásába.

IQ (2. generációs) agy, kiemelve az SD-kártya foglalatával. Az SD-kártya foglalat a Brain oldalán található, az USB-C porttól jobbra.

Megjegyzés: Formázza az SD-kártyát FAT32-re az adatíráshoz. Javasoljuk, hogy 32 GB-os vagy kisebb méretű SD-kártyákat használjon.

Annak biztosítására, hogy az SD-kártyán lévő fájlba való adatírás megfelelő körülmények között végrehajtható legyen, kódot kell hozzáadnunk annak ellenőrzésére, hogy az SD-kártya megfelelően van-e behelyezve a VEX IQ Brainbe (2.).

  • A brain.sdcard.is_inserted() függvény segítségével ellenőrizze, hogy az SD-kártya be van-e helyezve. Ha az SD-kártya nincs behelyezve, jelenítse meg a megfelelő üzenetet a VEX IQ Brain képernyőn, és tartsa lenyomva a programot.
  • # A program felfüggesztése, ha az SD-kártya nincs behelyezve
    if not brain.sdcard.is_inserted():
    brain.screen.set_cursor(1,1)
    brain.screen.print("Hiányzik az SD-kártya")
    while(True):
    wait(5, MSEC)
  • Megjegyzés: a brain.sdcard.is_inserted() függvény Igaz értéket ad vissza, ha SD-kártyát helyeznek a Brainbe.

Az adatok írása egy CSV-fájlba az SD-kártyán

Programunk eddig a VEX IQ Brain (2.) segítségével tud adatokat gyűjteni. Az adatnaplózási projekt befejezéséhez az adatokat egy vesszővel elválasztott értékek (CSV) fájlba kell írnunk az SD-kártyán a jövőbeni vizsgálat és elemzés céljából.

  • Amikor különböző típusú adatokat írunk egy CSV-fájlba, tudni szeretnénk, hogy az egyes oszlopok milyen típusú adatokat tartalmaznak. Ehhez az adatok rögzítése előtt hozzáfűzhetjük a CSV fejléc szövegét a data_buffer változóhoz.
    Így adja hozzá a kódot egy változó deklarálásához csvHeaderText a CSV fejlécszöveg tárolásához, hogy megadja a CSV-fájl oszlopneveit, és deklaráljon egy sd_file_name változót a CSV-fájl nevének rögzítéséhez, amelyet a CSV-fájlra írhat. SD kártya.
  • csvHeaderText = "idő, x, y, z"
    sd_file_name = "myDataPY.csv"

Megjegyzés: Győződjön meg arról, hogy a fejlécek ugyanabban a sorrendben vannak, mint a data_buffer változóban tárolt adatok.

  • Ezután fűzze hozzá a CSV-fejléc szövegét a data_buffer karakterlánchoz a for loop előtt az adatgyűjtéshez.
  • # CSV fejléc létrehozása
    data_buffer = csvHeaderText + "\n"

    # CSV adatgeneráció
    for i in range(0, numOfDataEntries):

    # Parancsok az adatok pufferbe írásához
    data_buffer += "%1.3f" % brain.timer.value() + "\n"
    data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"

    wait(polling_delay_msec, MSEC)
  • Mielőtt adatokat írna egy fájlba az SD-kártyán, először ismerje meg a brain.sdcard.savefile() függvény használatát.

    A Python kód egy sorát darabokban emeltük ki a részletes magyarázat érdekében. A kódsor a következőt olvassa: brain.sdcard.savefile(sd_file_name, bytearray(data_buffer, 'utf-8')). Először is, a brain.sdcard.savefile szakasz van kiemelve, és a következő felirattal van ellátva: Bájtfájl mentése egy elnevezett fájlba az SD-kártyán. Ezután az sd_file_name szakasz kiemelésre kerül, és Fájlnév néven jelenik meg. Végül a végén található bytearray(data_buffer, 'utf-8') kiemelésre és Buffer feliratra kerül.


    Ez az utasítás a data_buffer változóban tárolt adatokat egy elnevezett CSV fájlba írja az SD kártyán.
    Bontsuk fel:
    • brain.sdcard.savefile(): A funkció egy bájttömböt ment el egy elnevezett fájlba az SD-kártyán. A függvény a fájlba írt bájtok számát adja vissza.

    • sd_file_name: A függvény első paramétere. Az írandó fájl nevét jelzi. Ebben a projektben a fájlnév a sd_file_name változóban van tárolva.

    • bytearray(datat_buffer,'utf-8'): A függvény második paramétere. A fájlba írandó bájttömböt jelöli.

        • bytearray(): A metódus módosítható bytearray-t hoz létre. Ebben az utasításban a kódolás megadásával egy karakterláncot bytearray-vé alakítunk.
        • data_buffer: A metódus első paramétere. Jelzi a bájttömbbé konvertálandó forrást. Ebben a projektben a forrás a data_buffer változóban tárolt adatok. 
        • 'utf-8': A metódus második paramétere. A karakterlánc kódolásához használt megadott kódolást jelzi. Ebben az utasításban a kódolás 'utf-8'. 
  • A for loop után az adatgyűjtéshez használja a brain.sdcard.savefile() függvényt, hogy a data_buffer változóban tárolt adatokat az SD-kártya CSV-fájljába írja. Ezenkívül add hozzá a kódot, amely ellenőrzi a brain.sdcard.savefile() függvény visszatérési értékét, hogy ellenőrizze, az adatok sikeresen beírásra kerültek-e a fájlba, és megjeleníti a megfelelő üzenetet a VEX IQ agyképernyőjén a valós idejű visszajelzés érdekében. Az if utasítás a végén egy üzenetet ad hozzá a fájl állapotáról, amely vagy SD Write Error , vagy Data Writtenüzenetet ír ki.
  • # CSV adatgeneráció
    for i in range(0, numOfDataEntries):

    # Parancsok az adatok pufferbe írásához
    data_buffer += "%1.3f" % brain.timer.value() + "\n"
    data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"

    wait(polling_delay_msec, MSEC)

    # Adatok írása SD-kártyára
    brain.screen.set_cursor(4,1)
    if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
    brain.screen.print("SD írási hiba")
    else:
    brain.screen.print("Adatok írva")
  • Megjegyzés: A brain.sdcard.savefile() függvény visszaadja a fájlba írt bájtok számát. Ebben a projektben az összegyűjtött adatokat CSV fájlba írjuk, így a fájlba írt bájtok számának nullánál nagyobbnak kell lennie. Más szóval, ha a brain.sdcard.savefile() függvény 0 értéket ad vissza, akkor arra a következtetésre juthatunk, hogy az adatok nem lettek sikeresen kiírva a fájlba. Egyébként az adatok a fájlba lettek írva.

Gratulálunk! Kifejlesztettünk egy adatnaplózási projektet, amely a VEX IQ Brain (2.) segítségével összegyűjti a gyorsulási adatokat, és egy CSV-fájlban tárolja az SD-kártyán. Ezután megvizsgáljuk, hogyan lehet megnyitni a CSV-fájlt adatelemzés céljából. 

# A könyvtár
at importál vexből import *

# Az agyat alapértelmezés szerint definiálni kell
brain = Brain()
brain_inertial = Inertial()

csvHeaderText = "time, x, y, z"
sd_file_name = "myDataPY.csv"
polling_delay_msec = 50
numOfDataEntries = 100
data_buffer = ""

# A program felfüggesztése, ha az SD-kártya nincs behelyezve
if not brain.sdcard.is_inserted():
brain.screen.set_cursor(1,1)
brain.screen.print("SD-kártya hiányzik")
while(True):
wait(5, MSEC)

# Bármilyen érzékelő hozzáadása & időzítő inicializáló kód ide
brain.timer.clear()

# CSV fejléc létrehozása
data_buffer = csvHeaderText + "\n"

# CSV adatgenerálás
for i in range(0, numOfDataEntries):

# Parancsok az adatok pufferbe írásához
data_buffer += "%1.3f" % brain.timer.value() + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"

wait(polling_delay_msec, MSEC)

# Adatok írása SD-kártyára
brain.screen.set_cursor(4,1)
if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
brain.screen.print("SD írási hiba")
else:
brain.screen.print("Adatok kiírva")

A CSV-fájl megnyitása adatelemzéshez

Miután az adatokat az SD-kártyán lévő CSV-fájlba írtuk, egy táblázatkezelő alkalmazás segítségével megnyithatjuk a fájlt az adatok olvasásához és elemzéséhez. 

Megjegyzés: A két leggyakoribb táblázatkezelő alkalmazás a Google Táblázatok és a Microsoft Excel. Ebben a cikkben a Google Táblázatok (web alapú) segítségével nyitjuk meg az SD-kártyán lévő CSV-fájlt. Más alkalmazások használatának folyamata hasonló.

  • Vegye ki az SD-kártyát a VEX IQ Brain SD-kártyanyílásából. Ha a számítógép rendelkezik beépített Micro SD kártyanyílással, akkor az SD kártyát közvetlenül ebbe a nyílásba helyezhetjük. Ellenkező esetben helyezze be az SD-kártyát egy SD-kártya-adapterbe, majd csatlakoztassa az adaptert a számítógéphez. 
  • Jelentkezzen be Google fiókunkba, és nyissa meg a Google Táblázatokat. Hozzon létre egy új táblázatot.
  • A táblázatban nyissa meg a „Fájl” menüt, válassza az „Importálás” -> „Feltöltés” -> „Tallózás” gombot, majd válassza ki a CSV-fájlt a számítógépen. A CSV fájl feltöltése után kattintson a „Import Data” gombra. Az adatok importálása után kattintson a „Megnyitás most” gombra az összegyűjtött adatok CSV-fájlban való megtekintéséhez.

    A projekt CSV-adatai megnyíltak egy Google Táblázatok dokumentumban. Négy oszlopban olvashatók az idő, X, Y és Z értékek. Sok sornyi adat dokumentálja az egyes időbélyegek gyorsulását.

  • (Opcionális) Az adatok elemzésének egyik egyszerű módja, ha rajzol egy grafikont, majd megkeresi az adatok tendenciáit. A táblázatban nyissa meg a „Beszúrás” menüt, és válassza a „Chart” lehetőséget, hogy a CSV-fájl adatai alapján grafikont rajzoljon. A következő grafikon a VEX IQ Brain (2.) segítségével gyűjtött gyorsulási adatok eredménye.

    Chart of the data is opened in Google Sheets, showing the acceleration of the X, Y, and Z axes over time. The Z value stays near negative one, and the X and Y values stay near zero.


    Megjegyzés: A Diagramszerkesztővel igény szerint választhatunk másik diagramtípust, vagy szerkeszthetjük a diagramot.

Eddig a pontig befejeztük az adatnaplózási projektet, amely adatokat gyűjt a VEX IQ Brain (2.) segítségével, és CSV-fájlba menti az SD-kártyára. Azt is megtanultuk, hogyan kell beolvasni az SD-kártyán lévő CSV-fájlt a Google Táblázatok segítségével, és még grafikont is készíthetünk további elemzéshez. Mi a következő? Próbáljunk meg izgalmasabb kísérleteket tervezni a VEX Robot adatnaplózással, hogy megfigyeljük, hogyan hatnak a változó környezeti tényezők a különböző típusú adatokra, és mélyebben megérthetjük a minket körülvevő világot.

For more information, help, and tips, check out the many resources at VEX Professional Development Plus

Last Updated: