Rejestrowanie danych za pomocą mózgu/czujników VEX (wersja Pythona)

Wstęp

W tym artykule omówimy, jak stworzyć projekt rejestracji danych, który instruuje Robota VEX, aby zbierał dane za pomocą VEX Brain i zapisywał je w pliku CSV na karcie SD w celu analizy danych.

Rejestrowanie danych to potężne narzędzie, które możemy wykorzystać do wspomagania badań naukowych, przeprowadzania własnych eksperymentów i rozwiązywania konkretnych problemów. Istnieje wiele zabawnych i ekscytujących zadań, które możemy wykonać za pomocą robota VEX za pomocą rejestrowania danych. Oto kilka przykładów:

  • Zbieranie danych za pomocą czujnika odległości w celu obliczenia prędkości robota
  • Prowadzenie robota po klasie i zbieranie danych za pomocą czujnika optycznego w celu obserwacji zmian oświetlenia w różnych miejscach.
  • Zabierz robota na przygodę i zapisz współrzędne GPS, aby stworzyć mapę.

Umiejętności kodowania potrzebne do opracowania projektu rejestrowania danych

  • Użyj różnych poleceń, aby zebrać dane za pomocą VEX Brain/Sensors i dodać je do struktury danych.
  • Zapisz dane w pliku wartości rozdzielanych przecinkami (CSV) na karcie SD.

Sprzęt wymagany do rejestrowania danych:

  • Mózg VEX (IQ, V5, EXP)
  • Karta SD
  • Czujnik lub wiele czujników (opcjonalnie, w zależności od wymaganych danych)

Pobieranie danych z czujnika

Możemy zaprogramować Robota VEX (IQ, V5, EXP) tak, aby zbierał dane z następujących czujników:

  • Czujnik inercyjny
  • Czujnik odległości
  • Czujnik optyczny
  • Czujnik wizyjny
  • Czujnik obrotu (V5, EXP)
  • Czujnik GPS (V5)

Uwaga: Brain VEX IQ (2. generacji) i VEX EXP Brain mają wbudowany czujnik bezwładnościowy. Za pomocą tych Brianów VEX możemy zbierać dane z czujnika inercyjnego.

W tym artykule opracujemy projekt rejestrowania danych, który zbiera dane dotyczące przyspieszenia za pomocą VEX IQ Brain (2.) i zapisuje je na karcie SD. 

Najpierw musimy napisać krótki program, który pobierze odczyty z timera i czujnika inercyjnego wbudowanego w mózg VEX IQ (2. miejsce).

  • Na początku tego programu będziemy musieli zaimportować moduły Pythona do sterowania VEX IQ Brain (2. miejsce) i pobrać z niego dane. Zatem zacznij od dodania tych instrukcji do projektu.
  • # Biblioteka importuje
    z vex import *

    # Brain powinien być zdefiniowany domyślnie
    brain = Brain()
    brain_inertial = Inertial()
  • Następnie dodaj kod deklarujący zmienną numOfDataEntries do przechowywania liczby wpisów danych do rejestracji, zadeklaruj zmienną polling_delay_msec do przechowywania wartości przedziału czasu do odczytu danych i utwórz pustą zmienną łańcuchową data_buffer do przechowywania dane odczytane z czujnika.
  • numOfDataEntries = 100
    polling_delay_msec = 50
    data_buffer = ""
  • Ponieważ do dodania znacznika czasu do danych użyjemy bieżącej wartości licznika czasu, musimy zresetować wartość licznika czasu do 0 sekund przed rozpoczęciem zbierania danych.
  • # Dodaj kod inicjalizacji timera
    brain.timer.clear()
  • Zanim skorzystamy z instrukcji pobierającej dane z VEX IQ Brain (2. miejsce) i zapisującej dane w buforze, musimy ją najpierw zrozumieć.
    Poniższa instrukcja dołącza aktualną wartość licznika do zmiennej data_buffer w określonym formacie.

    Fragmenty kodu Pythona są wyróżnione, aby szczegółowo go wyjaśnić. Linia kodu wygląda następująco: data_buffer += 1.3f % brain.timer.value() + przecinek. Najpierw wyróżniono operator += i oznaczono go etykietą Dołącz dane do ciągu data_buffer. Następnie wyróżniony jest ciąg 1.3f i oznaczony etykietą Ciąg formatujący. Następnie znak procentu zostaje podświetlony i oznaczony jako Operator modulo ciągu znaków. Następnie polecenie brain.timer.value() zostaje wyróżnione i oznaczone etykietą Bieżąca wartość timera. Na koniec wyróżniono dodanie przecinka na końcu i wpisano tekst Dodaj przecinek na końcu, aby oddzielić dane.

    Rozłóżmy ciąg formatujący „%1.3f”

    • „%”: wprowadza specyfikator konwersji.
    • „1”: Wskazuje minimalną liczbę cyfr w ciągu znaków
    • „.3”: Określa liczbę miejsc dziesiętnych, które należy uwzględnić w sformatowanej liczbie.
    • „f”: wskazuje, że wartość do sformatowania jest liczbą zmiennoprzecinkową.

    W ten sposób możemy użyć ciągu formatującego „%1.3f” do sformatowania liczby zmiennoprzecinkowej o minimalnej szerokości 1 cyfry i dokładności do 3 miejsc po przecinku.

  • Teraz możemy odczytać licznik czasu i wartość przyspieszenia czujnika bezwładnościowego wbudowanego w mózg VEX IQ (2. miejsce), a następnie dołączyć dane do zmiennej data_buffer w określonym formacie.
  • # Polecenia zapisu danych do bufora
    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"

    Poprzedni kod jest szczegółowo wyjaśniony. Pierwszy wiersz data_buffer używający brain.timer.value() nosi etykietę Dodaj znacznik czasu do bufora. Następne trzy wiersze są zatytułowane Dodaj wartość przyspieszenia wzdłuż osi X, Y i Z do bufora.

  • Uwaga: „\n” to znak nowej linii. Oznacza to, że linia kończy się w tym miejscu i oznacza początek nowej linii.
  • Następnie, aby zapisać pewną liczbę wpisów danych w zmiennej data_buffer , możemy użyć pętli for , aby wielokrotnie wykonać instrukcje, które pobierają dane i dołączają dane do zmiennej data_buffer przez pewną liczbę iteracji. Naszą strategią jest użycie wartości zmiennej numOfDataEntries do określenia liczby iteracji.
  • # Generowanie danych
    dla i w zakresie (0, numOfDataEntries):

    # Polecenia zapisu danych do bufora
    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"
  • Póki co nasz program rejestruje dane najszybciej jak to możliwe. Chcemy jednak rejestrować dane w określonych odstępach czasu. Dlatego możemy użyć funkcji wait() w pętli for , aby wstrzymać program w celu dodania określonego odstępu czasu między dwoma odczytami. Do określenia wartości przedziału czasowego wykorzystujemy wartość zmiennej polling_delay_msec.
  • # Generowanie danych
    dla i w zakresie (0, numOfDataEntries):

    # Polecenia zapisu danych do bufora
    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)

Gratulacje! Zakończyliśmy program uzyskiwania odczytów (danych dotyczących przyspieszenia) z czujnika bezwładnościowego wbudowanego w mózg VEX. Następnie przyjrzymy się, jak zapisać dane w pliku CSV na karcie SD.

# Biblioteka importuje
z vex import *

# Brain powinien być zdefiniowany domyślnie
brain = Brain()
brain_inertial = Inertial()

numOfDataEntries = 100
polling_delay_msec = 50
data_buffer = ""

# Dodaj kod inicjalizacji timera
brain.timer.clear()

# Generowanie danych
for i in range(0, numOfDataEntries):

# Polecenia zapisu danych do bufora
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)

Podłączanie karty SD do VEX Brain

Przed zapisaniem danych do pliku na karcie SD, włóż najpierw kartę SD do gniazda kart SD w VEX Brain.

Mózg IQ (2. generacji) pokazany jest z zaznaczonym gniazdem na kartę SD. Gniazdo na kartę SD znajduje się z boku urządzenia Brain, po prawej stronie portu USB-C.

Uwaga: Aby móc zapisywać dane, sformatuj kartę SD w systemie FAT32. Zalecamy używanie kart SD o pojemności 32 GB lub mniejszej.

Aby mieć pewność, że zapis danych do pliku na karcie SD będzie możliwy w odpowiednich warunkach, będziemy musieli dodać kod sprawdzający, czy karta SD jest prawidłowo włożona do VEX IQ Brain (2. miejsce).

  • Użyj funkcji brain.sdcard.is_inserted() , aby sprawdzić, czy karta SD jest włożona. Jeśli karta SD nie jest włożona, wyświetl odpowiedni komunikat na ekranie VEX IQ Brain Screen i przytrzymaj program.
  • # Wstrzymaj program, jeśli karta SD nie jest włożona
    if not brain.sdcard.is_inserted():
    brain.screen.set_cursor(1,1)
    brain.screen.print("Brak karty SD")
    while(True):
    wait(5, MSEC)
  • Uwaga: funkcja brain.sdcard.is_inserted() zwraca wartość True, jeśli do Brain włożono kartę SD.

Zapisywanie danych do pliku CSV na karcie SD

Jak dotąd nasz program może zbierać dane za pomocą VEX IQ Brain (2. miejsce). Aby ukończyć projekt rejestrowania danych, musimy zapisać dane w pliku wartości rozdzielanych przecinkami (CSV) na karcie SD w celu przyszłego sprawdzenia i analizy.

  • Zapisując różne typy danych w pliku CSV, chcemy wiedzieć, jaki typ danych zawiera każda kolumna. Aby to zrobić, możemy dołączyć tekst nagłówka CSV do zmiennej data_buffer przed zarejestrowaniem danych.
    Zatem dodaj kod deklarujący zmienną csvHeaderText przechowujący tekst nagłówka CSV określający nazwy kolumn dla pliku CSV i deklarujący zmienną nazwa_pliku przechowujący nazwę pliku CSV do zapisania na Karta SD.
  • csvHeaderText = "czas, x, y, z"
    sd_file_name = "myDataPY.csv"

Uwaga: Upewnij się, że nagłówki są w tej samej kolejności, co dane zapisane w zmiennej data_buffer.

  • Następnie dołącz tekst nagłówka CSV do ciągu data_buffer przed pętlą for w celu gromadzenia danych.
  • # Utwórz nagłówek CSV
    data_buffer = csvHeaderText + "\n"

    # Generowanie danych CSV
    for i in range(0, numOfDataEntries):

    # Polecenia zapisu danych do bufora
    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)
  • Zanim zapiszemy dane do pliku na karcie SD, przyjrzyjmy się najpierw, jak używać funkcji brain.sdcard.savefile().

    Fragmenty kodu Pythona są wyróżnione, aby szczegółowo go wyjaśnić. Linia kodu wygląda następująco: brain.sdcard.savefile(sd_file_name, bytearray(data_buffer, 'utf-8')). Najpierw zaznaczamy sekcję brain.sdcard.savefile i nazywamy ją Zapisz tablicę bajtów do nazwanego pliku na karcie SD. Następnie sekcja sd_file_name jest zaznaczana i oznaczana etykietą Nazwa pliku. Na końcu wyróżniony jest element bytearray(data_buffer, 'utf-8') i oznaczony etykietą Buffer.


    Ta instrukcja zapisuje dane zapisane w zmiennej data_buffer do nazwanego pliku CSV na karcie SD.
    Rozłóżmy to na czynniki pierwsze:
    • brain.sdcard.savefile(): Funkcja zapisuje bajtarray do nazwanego pliku na karcie SD. Funkcja zwraca liczbę bajtów zapisanych do pliku.

    • nazwa_pliku sd: Pierwszy parametr funkcji. Wskazuje nazwę pliku do zapisania. W tym projekcie nazwa pliku jest przechowywana w zmiennej sd_file_name.

    • bytearray(datat_buffer,'utf-8'): Drugi parametr funkcji. Reprezentuje tablicę bajtową, która ma zostać zapisana w pliku.

        • bytearray(): Metoda tworzy zmienną bajtarray. W tej instrukcji używamy go do konwersji ciągu znaków na tablicę bajtową poprzez określenie kodowania.
        • data_buffer: Pierwszy parametr metody. Wskazuje źródło, które ma zostać przekonwertowane na tablicę bajtową. W tym projekcie źródłem są dane zapisane w zmiennej data_buffer. 
        • „utf-8”: Drugi parametr metody. Wskazuje określone kodowanie użyte do kodowania ciągu. W tej instrukcji kodowanie to „utf-8”. 
  • Po pętli for do zbierania danych użyj funkcji brain.sdcard.savefile() w celu zapisania danych przechowywanych w zmiennej data_buffer do pliku CSV na karcie SD. Dodatkowo dodaj kod sprawdzający wartość zwracaną przez funkcję brain.sdcard.savefile() w celu weryfikacji, czy dane zostały pomyślnie zapisane do pliku, i wyświetl odpowiedni komunikat na ekranie mózgu VEX IQ, aby uzyskać informacje zwrotne w czasie rzeczywistym. Instrukcja if na końcu dodaje komunikat pokazujący stan pliku, wyświetlając albo SD Write Error albo Data Written.
  • # Generowanie danych CSV
    for i in range(0, numOfDataEntries):

    # Polecenia zapisu danych do bufora
    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)

    # Zapis danych na kartę SD
    brain.screen.set_cursor(4,1)
    if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
    brain.screen.print("Błąd zapisu na SD")
    else:
    brain.screen.print("Zapisane dane")
  • Uwaga: Funkcja ()zwraca liczbę bajtów zapisanych w pliku W tym projekcie wykorzystujemy go do zapisania zebranych danych do pliku CSV, więc liczba bajtów zapisywanych do pliku musi być większa od zera. Innymi słowy, jeśli funkcja brain.sdcard.savefile() zwróci 0, możemy wnioskować że dane nie zostały pomyślnie zapisane do pliku. W przeciwnym wypadku dane zostaną zapisane w pliku.

Gratulacje! Opracowaliśmy projekt rejestrowania danych, który zbiera dane dotyczące przyspieszenia za pomocą VEX IQ Brain (2.) i zapisuje je w pliku CSV na karcie SD. Następnie dowiemy się, jak otworzyć plik CSV w celu analizy danych. 

# Biblioteka importuje
z vex import *

# Brain powinien być zdefiniowany domyślnie
brain = Brain()
brain_inertial = Inertial()

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

# Wstrzymaj program, jeśli karta SD nie jest włożona
jeśli nie brain.sdcard.is_inserted():
brain.screen.set_cursor(1,1)
brain.screen.print("Brak karty SD")
while(True):
wait(5, MSEC)

# Dodaj tutaj dowolny czujnik & kod inicjalizacji timera
brain.timer.clear()

# Utwórz nagłówek CSV
data_buffer = csvHeaderText + "\n"

# Generowanie danych CSV
for i in range(0, numOfDataEntries):

# Polecenia zapisu danych do bufora
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)

# Zapisz dane do Karta SD
brain.screen.set_cursor(4,1)
if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
brain.screen.print("Błąd zapisu na SD")
else:
brain.screen.print("Zapisane dane")

Otwieranie pliku CSV do analizy danych

Po zapisaniu danych do pliku CSV na karcie SD możemy za pomocą aplikacji arkusza kalkulacyjnego otworzyć plik w celu odczytu i analizy danych. 

Uwaga: Dwie najpopularniejsze aplikacje arkuszy kalkulacyjnych to Arkusze Google i Microsoft Excel. W tym artykule użyjemy Arkuszy Google (internetowych) do otwarcia pliku CSV na karcie SD. Proces korzystania z innych aplikacji jest podobny.

  • Wyjmij kartę SD z gniazda karty SD VEX IQ Brain. Jeżeli komputer posiada wbudowany slot na kartę Micro SD, możemy włożyć kartę SD bezpośrednio do tego slotu. W przeciwnym razie włóż kartę SD do adaptera karty SD, a następnie podłącz adapter do komputera. 
  • Zaloguj się na nasze konto Google i otwórz Arkusze Google. Utwórz nowy arkusz kalkulacyjny.
  • W arkuszu kalkulacyjnym otwórz menu „Plik” , wybierz przycisk „Importuj” -> „Prześlij” -> „Przeglądaj” , a następnie wybierz plik CSV na komputerze. Po przesłaniu pliku CSV kliknij przycisk „Importuj dane”. Po zaimportowaniu danych kliknij „Otwórz teraz” , aby zobaczyć zebrane dane w pliku CSV.

    Dane CSV projektu zostały otwarte w dokumencie Arkuszy Google. Istnieją cztery kolumny: Czas, X, Y i Z. Istnieje wiele wierszy danych dokumentujących przyspieszenie dla każdego znacznika czasu.

  • (Opcjonalnie) Jednym z łatwych sposobów analizowania danych jest narysowanie wykresu, a następnie wyszukanie trendów w danych. W arkuszu kalkulacyjnym otwórz menu „Wstaw” i wybierz „Wykres” , aby narysować wykres na podstawie danych z pliku CSV. Poniższy wykres przedstawia wynik danych o przyspieszeniu zebranych za pomocą VEX IQ Brain (2. edycja).

    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.


    Uwaga: Możemy użyć edytora wykresów , aby wybrać inny typ wykresu lub edytować wykres według naszych potrzeb.

Do tego momentu zakończyliśmy projekt rejestrowania danych, który zbiera dane za pomocą VEX IQ Brain (2. miejsce) i zapisuje je w pliku CSV na karcie SD. Dowiedzieliśmy się także, jak odczytać plik CSV na karcie SD za pomocą Arkuszy Google, a nawet stworzyć wykres do dalszej analizy. Co następne? Spróbujmy zaplanować bardziej ekscytujące eksperymenty z wykorzystaniem Robota VEX do rejestracji danych, aby obserwować, jak zmieniające się czynniki środowiskowe wpływają na różne typy danych i uzyskać głębsze zrozumienie otaczającego nas świata.

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

Last Updated: