Datenprotokollierung mit VEX Brain/Sensors (Python-Version)

Einführung

In diesem Artikel besprechen wir, wie man ein Datenprotokollierungsprojekt erstellt, das den VEX-Roboter anweist, Daten mit dem VEX Brain zu sammeln und sie zur Datenanalyse in einer CSV-Datei auf der SD-Karte zu speichern.

Die Datenprotokollierung ist ein leistungsstarkes Werkzeug, mit dem wir wissenschaftliche Forschung unterstützen, eigene Experimente durchführen und spezifische Probleme lösen können. Es gibt verschiedene unterhaltsame und spannende Aufgaben, die wir mit dem VEX-Roboter mithilfe der Datenprotokollierung erledigen können. Nachfolgend einige Beispiele:

  • Sammeln von Daten mit dem Distanzsensor zur Berechnung der Geschwindigkeit des Roboters
  • Fahren Sie den Roboter durch das Klassenzimmer und sammeln Sie Daten mit dem optischen Sensor, um Lichtveränderungen an verschiedenen Orten zu beobachten.
  • Nehmen Sie den Roboter mit auf ein Abenteuer und zeichnen Sie GPS-Koordinatendaten auf, um eine Karte zu erstellen.

Für die Entwicklung eines Datenprotokollierungsprojekts erforderliche Programmierkenntnisse

  • Verwenden Sie verschiedene Befehle, um Daten mit VEX Brain/Sensors zu sammeln und sie einer Datenstruktur hinzuzufügen.
  • Schreiben Sie die Daten in eine CSV-Datei (Comma-Separated Values) auf der SD-Karte.

Erforderliche Hardware für die Datenprotokollierung:

  • Ein VEX-Gehirn (IQ, V5, EXP)
  • Eine SD-Karte
  • Ein Sensor oder mehrere Sensoren (optional, je nach den erforderlichen Daten)

Daten vom Sensor abrufen

Wir können den VEX-Roboter (IQ, V5, EXP) so programmieren, dass er die Daten der folgenden Sensoren erfasst:

  • Trägheitssensor
  • Abstandssensor
  • Optischer Sensor
  • Vision-Sensor
  • Rotationssensor (V5, EXP)
  • GPS-Sensor (V5)

Hinweis: Das VEX IQ Brain (2. Generation) und das VEX EXP Brain verfügen über einen integrierten Trägheitssensor. Mit diesen VEX-Brians können wir die Daten des Trägheitssensors sammeln.

In diesem Artikel entwickeln wir ein Datenprotokollierungsprojekt, das die Beschleunigungsdaten mit dem VEX IQ Brain (2.) sammelt und auf einer SD-Karte speichert. 

Zuerst müssen wir ein kurzes Programm schreiben, um Messwerte vom Timer und dem im VEX IQ Brain integrierten Trägheitssensor zu erhalten (2.).

  • Zu Beginn dieses Programms müssen wir die Python-Module importieren, um VEX IQ Brain (2.) zu steuern und die Daten daraus abzurufen. Beginnen Sie also damit, diese Anweisungen zum Projekt hinzuzufügen.
  • # Bibliotheksimporte
    from vex import *

    # Brain sollte standardmäßig definiert sein
    brain = Brain()
    brain_inertial = Inertial()
  • Fügen Sie als Nächstes den Code hinzu, um eine Variable numOfDataEntries zu deklarieren, um die Anzahl der Dateneinträge für die Aufzeichnung zu speichern, deklarieren Sie eine Variable polling_delay_msec , um den Wert des Zeitintervalls zum Lesen von Daten zu speichern, und erstellen Sie eine leere Zeichenfolgenvariable data_buffer zum Speichern die vom Sensor gelesenen Daten.
  • Anzahl der Dateneinträge = 100
    Abfrageverzögerung_msec = 50
    Datenpuffer = ""
  • Da wir den aktuellen Wert des Timers verwenden, um den Zeitstempel zu den Daten hinzuzufügen, müssen wir den Timerwert vor Beginn der Datenerfassung auf 0 Sekunden zurücksetzen.
  • # Timer-Initialisierungscode
    hinzufügen brain.timer.clear()
  • Bevor wir die Anweisung verwenden, die die Daten vom VEX IQ Brain (2.) abruft und die Daten im Puffer aufzeichnet, müssen wir sie zunächst verstehen.
    Die folgende Anweisung hängt den aktuellen Timerwert in einem bestimmten Format an die Variable data_buffer an.

    Eine Zeile Python-Code wird stückweise hervorgehoben, um sie detailliert zu erklären. Die Codezeile lautet: data_buffer += 1.3f % brain.timer.value() + comma. Zunächst wird der += Operator hervorgehoben und mit „Daten an die Zeichenkette data_buffer anhängen“ beschriftet. Als nächstes wird die Zeichenkette 1.3f hervorgehoben und mit „Formatzeichenkette“ beschriftet. Als Nächstes wird das Prozentzeichen hervorgehoben und mit „String-Modulo-Operator“ beschriftet. Als nächstes wird der Befehl brain.timer.value() hervorgehoben und mit „Der aktuelle Wert des Timers“ beschriftet. Abschließend wird die Hinzufügung der Kommazeichenfolge am Ende hervorgehoben und lautet: Fügen Sie am Ende ein Komma hinzu, um Daten zu trennen.

    Lassen Sie uns die Formatzeichenfolge „%1.3f“aufschlüsseln: 

    • „%“: Führt den Konvertierungsspezifizierer ein.
    • „1“: Gibt die Mindestanzahl an Ziffern an, die in der Zeichenfolge vorhanden sein müssen
    • „.3“: Gibt die Anzahl der Dezimalstellen an, die in die formatierte Zahl einbezogen werden sollen.
    • „f“: Gibt an, dass der zu formatierende Wert eine Gleitkommazahl ist.

    Somit können wir mit der Formatzeichenfolge „%1.3f“ eine Gleitkommazahl mit einer Mindestbreite von 1 Ziffer und einer Genauigkeit von 3 Dezimalstellen formatieren.

  • Jetzt können wir den Timer und den Beschleunigungswert des im VEX IQ Brain (2.) integrierten Trägheitssensors lesen und die Daten dann im angegebenen Format an die Variable data_buffer anhängen.
  • # Befehle zum Schreiben der Daten in Puffer
    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"

    Der vorherige Code wird im Detail erläutert. Die erste data_buffer-Zeile, die brain.timer.value() verwendet, trägt die Bezeichnung „Zeitstempel zum Puffer hinzufügen“. Die nächsten drei Zeilen sind mit „Addiere den Beschleunigungswert entlang der X-, Y- und Z-Achse zum Puffer“ beschriftet.

    Hinweis: „\n“ ist das Zeichen für die neue Zeile. Es zeigt an, dass die Zeile hier endet und eine neue Zeile beginnt.
  • Um dann eine bestimmte Anzahl von Dateneinträgen in der Variablen data_buffer aufzuzeichnen, können wir eine for-Schleife verwenden, um die Anweisungen, die die Daten abrufen und die Daten für eine Reihe von Iterationen an die Variable data_buffer anhängen, wiederholt auszuführen. Unsere Strategie besteht darin, den Wert der Variablen numOfDataEntries zu verwenden, um die Anzahl der Iterationen zu bestimmen.
  • # Datengenerierung
    für i in range(0, numOfDataEntries):

    # Befehle zum Schreiben der Daten in den Puffer
    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"
  • Bisher zeichnet unser Programm Daten so schnell wie möglich auf. Wir möchten jedoch Daten in bestimmten Zeitintervallen aufzeichnen. Daher können wir eine wait() Funktion in der for-Schleife verwenden, um das Programm anzuhalten, um das spezifische Zeitintervall zwischen zwei Messwerten hinzuzufügen. Wir verwenden den Wert der Variablen polling_delay_msec , um den Wert des Zeitintervalls zu bestimmen.
  • # Datengenerierung
    für i in range(0, numOfDataEntries):

    # Befehle zum Schreiben der Daten in den Puffer
    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)

Glückwunsch! Wir haben das Programm abgeschlossen, um Messwerte (die Beschleunigungsdaten) vom im VEX Brain integrierten Trägheitssensor zu erhalten. Als Nächstes erfahren Sie, wie Sie die Daten in eine CSV-Datei auf der SD-Karte schreiben.

# Bibliotheksimporte
from vex import *

# Brain sollte standardmäßig definiert sein
brain = Brain()
brain_inertial = Inertial()

numOfDataEntries = 100
polling_delay_msec = 50
data_buffer = ""

# Timer-Initialisierungscode hinzufügen
brain.timer.clear()

# Datengenerierung
for i in range(0, numOfDataEntries):

# Befehle zum Schreiben der Daten in den Puffer
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)

Anbringen der SD-Karte am VEX Brain

Bevor Sie die Daten in eine Datei auf einer SD-Karte schreiben, stecken Sie zunächst die SD-Karte in den SD-Kartensteckplatz des VEX Brain.

EXP Brain wird mit hervorgehobenem SD-Kartensteckplatz dargestellt. Der SD-Kartensteckplatz befindet sich an der Seite des Brain, rechts neben dem USB-C-Anschluss.

Hinweis: Formatieren Sie die SD-Karte zum Schreiben von Daten auf FAT32. Wir empfehlen die Verwendung von SD-Karten mit einer Größe von 32 GB oder weniger.

Um sicherzustellen, dass das Schreiben von Daten in eine Datei auf der SD-Karte unter geeigneten Bedingungen durchgeführt werden kann, müssen wir Code hinzufügen, um zu überprüfen, ob die SD-Karte ordnungsgemäß in das VEX IQ Brain (2.) eingelegt ist.

  • Verwenden Sie die Funktion brain.sdcard.is_inserted() , um zu überprüfen, ob die SD-Karte eingelegt ist. Wenn die SD-Karte nicht eingelegt ist, zeigen Sie die entsprechende Meldung auf dem VEX IQ Brain-Bildschirm an und halten Sie das Programm gedrückt.
  • # Programm anhalten, falls keine SD-Karte eingelegt ist
    falls nicht brain.sdcard.is_inserted():
    brain.screen.set_cursor(1,1)
    brain.screen.print("SD-Karte fehlt")
    while(True):
    wait(5, MSEC)
    Hinweis: Die Funktion () gibt True zurückwenn eine SDKarte in das Brain eingelegt ist.

Schreiben der Daten in eine CSV-Datei auf der SD-Karte

Bisher kann unser Programm Daten mit dem VEX IQ Brain (2.) sammeln. Um das Datenprotokollierungsprojekt abzuschließen, müssen wir die Daten zur späteren Prüfung und Analyse in eine CSV-Datei (Comma-Separated Values) auf der SD-Karte schreiben.

  • Wenn wir verschiedene Datentypen in eine CSV-Datei schreiben, möchten wir wissen, welche Datentypen jede Spalte enthält. Dazu können wir den CSV-Headertext vor der Datenaufzeichnung an die Variable data_buffer anhängen.
    Fügen Sie daher den Code hinzu, um eine Variable csvHeaderText zu deklarieren, um den CSV-Headertext zu speichern, um die Spaltennamen für die CSV-Datei anzugeben, und deklarieren Sie eine Variable sd_file_name , um den Namen der CSV-Datei zu speichern, in die geschrieben werden soll SD-Karte.
  • csvHeaderText = "Zeit, x, y, z"
    sd_file_name = "myDataPY.csv"

Hinweis: Stellen Sie sicher, dass die Header in derselben Reihenfolge sind wie die in der Variablen data_buffer gespeicherten Daten.

  • Als nächstes hängen Sie den CSV-Headertext an die Zeichenfolge data_buffer vor der Zeichenfolge für Schleife zur Datenerfassung an.
  • # CSV-Header erstellen
    data_buffer = csvHeaderText + "\n"

    # CSV-Datengenerierung
    for i in range(0, numOfDataEntries):

    # Befehle zum Schreiben der Daten in den Puffer
    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
  • Bevor wir Daten in eine Datei auf der SD-Karte schreiben, wollen wir zunächst verstehen, wie die Funktion brain.sdcard.savefile() verwendet wird.

    Eine Zeile Python-Code wird stückweise hervorgehoben, um sie detailliert zu erklären. Die Codezeile lautet: brain.sdcard.savefile(sd_file_name, bytearray(data_buffer, 'utf-8')). Zunächst wird der Abschnitt brain.sdcard.savefile hervorgehoben und mit „Speichern eines Byte-Arrays in einer benannten Datei auf der SD-Karte“ beschriftet. Als nächstes wird der Abschnitt sd_file_name hervorgehoben und mit „Dateiname“ beschriftet. Schließlich wird das Bytearray(data_buffer, 'utf-8') am Ende hervorgehoben und mit Buffer beschriftet.


    Diese Anweisung schreibt die in der Variablen data_buffer gespeicherten Daten in eine benannte CSV-Datei auf der SD-Karte.
    Lassen Sie es uns aufschlüsseln:
    • brain.sdcard.savefile(): Die Funktion speichert ein Bytearray in einer benannten Datei auf der SD-Karte. Die Funktion gibt die Anzahl der in die Datei geschriebenen Bytes zurück.

    • sd_file_name: Der erste Parameter der Funktion. Gibt den Namen der zu schreibenden Datei an. In diesem Projekt wird der Dateiname in der Variablen sd_file_name gespeichert.

    • bytearray(datat_buffer,'utf-8'): Der zweite Parameter der Funktion. Stellt das Bytearray dar, das in die Datei geschrieben werden soll.

        • bytearray(): Die Methode erstellt ein veränderbares Bytearray. In dieser Anleitung verwenden wir es, um einen String in ein Bytearray umzuwandeln, indem wir die Codierung angeben.
        • data_buffer: Der erste Parameter der Methode. Gibt die Quelle an, die in ein Bytearray konvertiert werden soll. In diesem Projekt sind die Daten, die in der Variablen data_buffer gespeichert sind, die Quelle. 
        • 'utf-8': Der zweite Parameter der Methode. Gibt die angegebene Codierung an, die zum Codieren der Zeichenfolge verwendet wird. Die Kodierung in dieser Anleitung ist „utf-8“. 
  • Verwenden Sie nach der for-Schleife zur Datenerfassung die Funktion brain.sdcard.savefile() , um die in der Variablen data_buffer gespeicherten Daten in die CSV-Datei auf der SD-Karte zu schreiben. Fügen Sie außerdem den Code hinzu, um den Rückgabewert der Funktion ( zu überprüfen und festzustellen, ob die Daten erfolgreich in die Datei geschrieben wurden. Zeigen Sie die entsprechende Meldung auf dem VEX IQ Brain Screen an, um Echtzeit-Feedback zu erhalten.
  • # CSV-Datengenerierung
    für i in range(0, numOfDataEntries):

    # Befehle zum Schreiben der Daten in den Puffer
    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)

    # Daten auf die SD-Karte schreiben
    brain.screen.set_cursor(4,1)
    if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
    brain.screen.print("SD-Schreibfehler")
    else:
    brain.screen.print("Daten geschrieben")
    Hinweis: Die Funktion ()gibt die Anzahl der in die Datei geschriebenen Bytes. In diesem Projekt verwenden wir es, um die gesammelten Daten in eine CSV-Datei zu schreiben, daher muss die Anzahl der in die Datei geschriebenen Bytes größer als Null sein. Mit anderen Worten: Wenn die Funktion brain.sdcard.savefile()zurückgibt, können wir daraus schließen dass die Daten nicht erfolgreich in die Datei geschrieben wurden. Andernfalls wurden die Daten in die Datei geschrieben.

Glückwunsch! Wir haben ein Datenprotokollierungsprojekt entwickelt, das die Beschleunigungsdaten mit dem VEX IQ Brain (2.) sammelt und in einer CSV-Datei auf der SD-Karte speichert. Als Nächstes erfahren Sie, wie Sie die CSV-Datei für die Datenanalyse öffnen. 

# Bibliotheksimporte
from vex import *

# Brain sollte standardmäßig definiert sein
brain = Brain()
brain_inertial = Inertial()

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

# Programm anhalten, falls keine SD-Karte eingelegt ist
if not brain.sdcard.is_inserted():
brain.screen.set_cursor(1,1)
brain.screen.print("SD-Karte fehlt")
while(True):
wait(5, MSEC)

# Hier beliebigen Sensor- & Timer-Initialisierungscode hinzufügen
brain.timer.clear()

# CSV-Header erstellen
data_buffer = csvHeaderText + "\n"

# CSV-Datengenerierung
for i in range(0, numOfDataEntries):

# Befehle zum Schreiben der Daten in den Puffer
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)

# Daten auf SD-Karte schreiben
brain.screen.set_cursor(4,1)
if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
brain.screen.print("SD Write Error")
else:
brain.screen.print("Data Written")

Öffnen der CSV-Datei zur Datenanalyse

Sobald die Daten in die CSV-Datei auf der SD-Karte geschrieben wurden, können wir die Datei mit einem Tabellenkalkulationsprogramm öffnen, um die Daten zu lesen und zu analysieren. 

Hinweis: Zwei der häufigsten Tabellenkalkulationsanwendungen sind Google Sheets und Microsoft Excel. In diesem Artikel verwenden wir Google Sheets (webbasiert), um die CSV-Datei auf der SD-Karte zu öffnen. Der Vorgang bei der Verwendung anderer Anwendungen ist ähnlich.

  • Entfernen Sie die SD-Karte aus dem SD-Kartensteckplatz des VEX IQ Brain. Wenn der Computer über einen integrierten Micro-SD-Kartensteckplatz verfügt, können wir die SD-Karte direkt in diesen Steckplatz einlegen. Andernfalls stecken Sie die SD-Karte in einen SD-Kartenadapter und schließen Sie den Adapter dann an den Computer an. 
  • Melden Sie sich bei unserem Google-Konto an und öffnen Sie Google Sheets. Erstellen Sie eine neue Tabelle.
  • Öffnen Sie in der Tabellenkalkulation das Menü „Datei“ , wählen Sie die Schaltfläche „Importieren“ -> „Hochladen“ -> „Durchsuchen“ und wählen Sie dann die CSV-Datei auf dem Computer aus. Klicken Sie nach dem Hochladen der CSV-Datei auf die Schaltfläche „Daten importieren“. Klicken Sie nach dem Importieren der Daten auf „Jetzt öffnen“ , um die gesammelten Daten in der CSV-Datei anzuzeigen.

    Die CSV-Daten des Projekts wurden in einem Google Sheets-Dokument geöffnet. Es gibt vier Spalten mit den Bezeichnungen Zeit, X, Y und Z. Es gibt viele Datenzeilen, die die Beschleunigung zu jedem Zeitpunkt dokumentieren.

  • (Optional) Eine einfache Möglichkeit, die Daten zu analysieren, besteht darin, ein Diagramm zu zeichnen und dann nach Trends in den Daten zu suchen. Öffnen Sie in der Tabelle das Menü „Einfügen“ und wählen Sie „Diagramm“ aus, um ein Diagramm mit den Daten in der CSV-Datei zu zeichnen. Die folgende Grafik zeigt die mit dem VEX IQ Brain (2.) erfassten Beschleunigungsdaten.

    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.


    Hinweis: Mit dem Diagrammeditor können wir einen anderen Diagrammtyp auswählen oder das Diagramm an unsere Bedürfnisse anpassen.

Bis zu diesem Punkt haben wir das Datenprotokollierungsprojekt abgeschlossen, bei dem Daten mit dem VEX IQ Brain (2.) gesammelt und in einer CSV-Datei auf der SD-Karte gespeichert werden. Außerdem haben wir gelernt, wie man die CSV-Datei auf der SD-Karte mit Google Sheets liest und sogar ein Diagramm zur weiteren Analyse erstellt. Was als nächstes? Versuchen wir, weitere spannende Experimente mit dem VEX-Roboter zur Datenprotokollierung zu planen, um zu beobachten, wie sich die sich ändernden Umweltfaktoren auf verschiedene Arten von Daten auswirken, und um ein tieferes Verständnis der Welt um uns herum zu erlangen.

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

Last Updated: