Регистрация данных с помощью VEX Brain/сенсоров (версия Python)

Введение

В этой статье мы обсудим, как создать проект регистрации данных, который предписывает роботу VEX собирать данные с помощью VEX Brain и сохранять их в файле CSV на SD-карте для анализа данных.

Регистрация данных — это мощный инструмент, который мы можем использовать для содействия научным исследованиям, проведения собственных экспериментов и решения конкретных проблем. Существуют различные забавные и захватывающие задачи, которые мы можем выполнить с помощью робота VEX с помощью регистрации данных. Ниже приведены некоторые примеры:

  • Сбор данных с помощью датчика расстояния для расчета скорости робота.
  • Вождение робота по классу и сбор данных с помощью оптического датчика для наблюдения за изменениями освещенности в различных местах.
  • Отправляйтесь с роботом в приключение и записывайте данные координат GPS для создания карты.

Навыки кодирования, необходимые для разработки проекта регистрации данных

  • Используйте различные команды для сбора данных с помощью VEX Brain/Sensors и добавления их в структуру данных.
  • Запишите данные в файл значений, разделенных запятыми (CSV) на SD-карте.

Оборудование, необходимое для регистрации данных:

  • Мозг VEX (IQ, V5, EXP)
  • SD-карта
  • Датчик или несколько датчиков (опционально, в зависимости от необходимых данных)

Получение данных от датчика

Мы можем запрограммировать робота VEX (IQ, V5, EXP) для сбора данных со следующих датчиков:

  • Инерционный датчик
  • Датчик расстояния
  • Оптический датчик
  • Датчик зрения
  • Датчик вращения (V5, EXP)
  • GPS-датчик (V5)

Примечание: Мозг VEX IQ (2-го поколения) и Мозг VEX EXP имеют встроенный инерционный датчик. Мы можем собрать данные инерциального датчика с помощью этих VEX Брайанов.

В этой статье мы разработаем проект регистрации данных, который собирает данные об ускорении с помощью VEX IQ Brain (2nd) и сохраняет их на SD-карту. 

Во-первых, нам нужно написать короткую программу для получения показаний таймера и инерционного датчика, встроенных в мозг VEX IQ (2-й).

  • В начале этой программы нам нужно будет импортировать модули Python для управления VEX IQ Brain (2nd) и получить из него данные. Итак, начните с добавления этих инструкций в проект.
  • # Библиотека импортирует
    из vex import *

    # Мозг должен быть определен по умолчанию
    brain = Brain()
    brain_inertial = Inertial()
  • Затем добавьте код для объявления переменной numOfDataEntries для хранения количества записей данных для записи, объявите переменную polling_delay_msec для хранения значения временного интервала для чтения данных и создайте пустую строковую переменную data_buffer для хранения данные, считанные с датчика.
  • numOfDataEntries = 100
    polling_delay_msec = 50
    data_buffer = ""
  • Поскольку мы будем использовать текущее значение таймера для добавления временной метки к данным, нам необходимо сбросить значение таймера до 0 секунд, прежде чем начинать сбор данных.
  • # Добавить код инициализации таймера
    brain.timer.clear()
  • Прежде чем использовать инструкцию, которая извлекает данные из VEX IQ Brain (2nd) и записывает данные в буфер, нам необходимо сначала понять ее.
    Следующая инструкция добавляет текущее значение таймера к переменной data_buffer в определенном формате.

    Строка кода Python выделена по частям для более подробного объяснения. Строка кода выглядит так: data_buffer += 1.3f % brain.timer.value() + comma. Сначала оператор += выделяется и помечается как «Добавить данные в строку data_buffer». Далее строка 1.3f выделяется и помечается как Формат строки. Далее знак процента выделяется и обозначается как Оператор деления по модулю строки. Далее команда brain.timer.value() выделяется и помечается как Текущее значение таймера. Наконец, добавление запятой в конце выделено и читается как Добавьте запятую в конце для разделения данных.

    Давайте разберем строку формата «%1.3f»

    • «%»: представляет спецификатор преобразования.
    • «1»: указывает минимальное количество цифр, которое должно присутствовать в строке.
    • «.3»: указывает количество десятичных знаков, включаемых в форматируемое число.
    • «f»: указывает, что форматируемое значение представляет собой число с плавающей запятой.

    Таким образом, мы можем использовать строку формата «%1.3f» для форматирования числа с плавающей запятой с минимальной шириной в 1 цифру и точностью до 3 десятичных знаков.

  • Теперь мы можем прочитать значение таймера и ускорения инерционного датчика, встроенного в мозг VEX IQ (2-й), а затем добавить данные в переменную data_buffer в указанном формате.
  • # Команды для записи данных в буфер
    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"

    Предыдущий код подробно объяснен. Первая строка data_buffer, использующая brain.timer.value(), помечена как Add Timestamp to buffer. Следующие три строки озаглавлены «Добавить значение ускорения по осям X, Y и Z в буфер».

  • Примечание: «\n» — это символ новой строки. Он указывает на то, что линия здесь заканчивается, и отмечает начало новой линии.
  • Затем, чтобы записать определенное количество записей данных в переменную data_buffer , мы можем использовать цикл for для многократного выполнения инструкций, которые извлекают данные и добавляют данные в переменную data_buffer для нескольких итераций. Наша стратегия — использовать значение переменной numOfDataEntries для определения количества итераций.
  • # Генерация данных
    для i в диапазоне (0, numOfDataEntries):

    # Команды для записи данных в буфер
    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() в цикле for , чтобы приостановить программу и добавить определенный интервал времени между двумя показаниями. Мы используем значение переменной polling_delay_msec для определения значения временного интервала.
  • # Генерация данных
    for i in range(0, numOfDataEntries):

    # Команды для записи данных в буфер
    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)

Поздравляем! Мы завершили программу получения показаний (данных об ускорении) от инерционного датчика, встроенного в мозг VEX. Далее мы рассмотрим, как записать данные в файл CSV на SD-карте.

# Библиотека импортирует
из vex import *

# Brain должен быть определен по умолчанию
brain = Brain()
brain_inertial = Inertial()

numOfDataEntries = 100
polling_delay_msec = 50
data_buffer = ""

# Добавить код инициализации таймера
brain.timer.clear()

# Генерация данных
for i in range(0, numOfDataEntries):

# Команды для записи данных в буфер
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)

Подключение SD-карты к VEX Brain

Прежде чем записывать данные в файл на SD-карте, сначала вставьте SD-карту в слот для SD-карты VEX Brain.

На изображении IQ (2-го поколения) Brain выделен слот для SD-карты. Слот для SD-карты находится на боковой панели Brain, справа от порта USB-C.

Примечание: Отформатируйте SD-карту в FAT32 для записи данных. Мы рекомендуем использовать SD-карты объемом 32 ГБ или меньше.

Чтобы гарантировать, что запись данных в файл на SD-карте может выполняться при соответствующих условиях, нам нужно будет добавить код, проверяющий, правильно ли вставлена ​​SD-карта в VEX IQ Brain (2nd).

  • Используйте функцию () , чтобы проверить, вставлена ​​ли SD-карта. Если SD-карта не вставлена, отобразите соответствующее сообщение на экране VEX IQ Brain Screen и удерживайте программу.
  • # Приостановить программу, если SD-карта не вставлена
    if not brain.sdcard.is_inserted():
    brain.screen.set_cursor(1,1)
    brain.screen.print("SD Card Missing")
    while(True):
    wait(5, MSEC)
  • Примечание: функция brain.sdcard.is_inserted() возвращает True, если SD-карта вставлена в Brain.

Запись данных в файл CSV на SD-карте.

На данный момент наша программа может собирать данные с помощью VEX IQ Brain (2nd). Чтобы завершить проект регистрации данных, нам необходимо записать данные в файл значений, разделенных запятыми (CSV) на SD-карте для дальнейшего изучения и анализа.

  • При записи различных типов данных в файл CSV мы хотим знать, какой тип данных содержит каждый столбец. Для этого мы можем добавить текст заголовка CSV к переменной data_buffer перед записью данных.
    Таким образом, добавьте код для объявления переменной csvHeaderText для хранения текста заголовка CSV, чтобы указать имена столбцов для файла CSV, и объявите переменную sd_file_name для хранения имени файла CSV для записи в SD Card.
  • csvHeaderText = "время, x, y, z"
    sd_file_name = "myDataPY.csv"

Примечание: Убедитесь, что заголовки расположены в том же порядке, что и данные, хранящиеся в переменной data_buffer.

  • Затем добавьте текст заголовка CSV к строке data_buffer перед строкой for цикла для сбора данных.
  • # Создать заголовок CSV
    data_buffer = csvHeaderText + "\n"

    # Генерация данных CSV
    for i in range(0, numOfDataEntries):

    # Команды для записи данных в буфер
    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)
  • Прежде чем записывать данные в файл на SD-карте, давайте сначала разберемся, как использовать функцию Brain.sdcard.savefile().

    Строка кода Python выделена по частям для более подробного объяснения. Строка кода выглядит так: brain.sdcard.savefile(sd_file_name, bytearray(data_buffer, 'utf-8')). Сначала раздел brain.sdcard.savefile выделяется и маркируется как Сохранить байтовый массив в именованный файл на SD-карте. Далее раздел sd_file_name выделяется и обозначается как Filename. Наконец, bytearray(data_buffer, 'utf-8') в конце выделяется и помечается как Buffer.


    Эта инструкция записывает данные, хранящиеся в переменной data_buffer , в именованный файл CSV на SD-карте.
    Давайте разберемся:
    • Brain.sdcard.savefile(): функция сохраняет байтовый массив в именованный файл на SD-карте. Функция возвращает количество байт, записанных в файл.

    • sd_file_name: первый параметр функции. Указывает имя файла для записи. В этом проекте имя файла хранится в переменной sd_file_name.

    • bytearray(datat_buffer,'utf-8'): второй параметр функции. Представляет массив байтов, который будет записан в файл.

        • bytearray(): метод создает изменяемый байтовый массив. В этой инструкции мы используем ее для преобразования строки в массив байтов, указав кодировку.
        • data_buffer: первый параметр метода. Указывает источник, который необходимо преобразовать в байтовый массив. В этом проекте источником являются данные, хранящиеся в переменной data_buffer. 
        • 'utf-8': второй параметр метода. Указывает указанную кодировку, используемую для кодирования строки. В этой инструкции используется кодировка «utf-8». 
  • После для цикла для сбора данных используйте функцию Brain.sdcard.savefile() , чтобы записать данные, хранящиеся в переменной data_buffer , в файл CSV на SD-карте. Кроме того, добавьте код для проверки возвращаемого значения из функции brain.sdcard.savefile() , чтобы убедиться в успешной записи данных в файл и отобразить соответствующее сообщение на экране VEX IQ Brain Screen для получения обратной связи в режиме реального времени. Оператор if в конце добавляет сообщение, показывающее состояние файла, печатая либо SD Write Error , либо Data Written.
  • # Генерация CSV-данных
    for i in range(0, numOfDataEntries):

    # Команды для записи данных в буфер
    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)

    # Запись данных на SD-карту
    brain.screen.set_cursor(4,1)
    if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
    brain.screen.print("Ошибка записи SD")
    else:
    brain.screen.print("Данные записаны")
  • Примечание: Функция brain.sdcard.savefile() возвращает количество байтов, записанных в файл. В этом проекте мы используем его для записи собранных данных в файл CSV, поэтому количество байтов, записываемых в файл, должно быть больше нуля. Другими словами, если функция brain.sdcard.savefile() возвращает 0, мы можем сделать вывод, что данные не были успешно записаны в файл. В противном случае данные были записаны в файл.

Поздравляем! Мы разработали проект регистрации данных, который собирает данные об ускорении с помощью VEX IQ Brain (2nd) и сохраняет их в файл CSV на SD-карте. Далее мы рассмотрим, как открыть файл CSV для анализа данных. 

# Библиотека импортирует
из vex import *

# Brain должен быть определен по умолчанию
brain = Brain()
brain_inertial = Inertial()

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

# Удерживать программу, если SD-карта не вставлена
if not brain.sdcard.is_inserted():
brain.screen.set_cursor(1,1)
brain.screen.print("SD Card Missing")
while(True):
wait(5, MSEC)

# Добавить сюда код инициализации любого датчика & таймера
brain.timer.clear()

# Создать заголовок CSV
data_buffer = csvHeaderText + "\n"

# Генерация данных CSV
for i in range(0, numOfDataEntries):

# Команды для записи данных в буфер
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)

# Записать данные на SD-карту
brain.screen.set_cursor(4,1)
if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
brain.screen.print("Ошибка записи на SD")
else:
brain.screen.print("Данные записаны")

Открытие файла CSV для анализа данных

После того, как данные записаны в файл CSV на SD-карте, мы можем использовать приложение для работы с электронными таблицами, чтобы открыть файл для чтения и анализа данных. 

Примечание. Два наиболее распространенных приложения для работы с электронными таблицами — это Google Sheets и Microsoft Excel. В этой статье мы будем использовать Google Таблицы (веб-интерфейс), чтобы открыть файл CSV на SD-карте. Процесс использования других приложений аналогичен.

  • Извлеките SD-карту из слота SD-карты VEX IQ Brain. Если в компьютере есть встроенный слот для карты Micro SD, мы можем вставить SD-карту непосредственно в этот слот. В противном случае вставьте SD-карту в адаптер SD-карты, а затем подключите адаптер к компьютеру. 
  • Войдите в нашу учетную запись Google и откройте Google Таблицы. Создайте новую электронную таблицу.
  • В электронной таблице откройте меню «Файл» , выберите «>» «Загрузить» кнопку «> Обзор» , затем выберите файлна компьютере. После загрузки CSV-файла нажмите кнопку «Импортировать данные». После импорта данных нажмите «Открыть сейчас» чтобы просмотреть собранные данные в файле CSV.

    CSV-данные проекта открыты в документе Google Sheets. Имеется четыре столбца: Время, X, Y и Z. Имеется множество строк данных, документирующих ускорение для каждой временной метки.

  • (Необязательно) Один из простых способов анализа данных — нарисовать график, а затем найти тенденции в данных. В электронной таблице откройте меню «Вставить» и выберите «Диаграмма» , чтобы построить график, используя данные из файла CSV. Следующий график является результатом данных об ускорении, собранных с помощью VEX IQ Brain (2nd).

    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.


    Примечание: Мы можем использовать редактор диаграмм , чтобы выбрать другой тип диаграммы или отредактировать диаграмму в соответствии с нашими потребностями.

На данный момент мы завершили проект регистрации данных, который собирает данные с помощью VEX IQ Brain (2nd) и сохраняет их в файле CSV на SD-карте. Также мы научились читать CSV-файл на SD-карте с помощью Google Sheets и даже создавать график для дальнейшего анализа. Что дальше? Давайте попробуем спланировать более увлекательные эксперименты с использованием робота VEX для регистрации данных, понаблюдать, как изменяющиеся факторы окружающей среды влияют на различные типы данных, и получить более глубокое понимание окружающего нас мира.

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

Last Updated: