VEX 브레인/센서를 사용한 데이터 로깅(Python 버전)

소개

이 글에서는 VEX 로봇이 VEX Brain으로 데이터를 수집하고 데이터 분석을 위해 SD 카드에 CSV 파일로 저장하도록 지시하는 데이터 로깅 프로젝트를 생성하는 방법에 대해 설명합니다.

데이터 로깅은 과학 연구를 지원하고, 자체 실험을 수행하고, 특정 문제를 해결하는 데 사용할 수 있는 강력한 도구입니다. 데이터 로깅을 통해 VEX 로봇을 구동하여 수행할 수 있는 재미있고 흥미로운 작업이 다양합니다. 다음은 몇 가지 예입니다.

  • 거리 센서로 데이터를 수집하여 로봇의 속도 계산
  • 로봇을 교실 안을 돌아다니며 광센서로 데이터를 수집해 다양한 위치의 빛의 변화를 관찰합니다.
  • 로봇을 모험에 데려가 GPS 좌표 데이터를 기록하면 지도가 생성됩니다.

데이터 로깅 프로젝트 개발에 필요한 코딩 기술

  • 다양한 명령어를 사용하여 VEX Brain/Sensor로 데이터를 수집하고 데이터 구조에 추가합니다.
  • SD 카드의 CSV(쉼표로 구분된 값) 파일에 데이터를 씁니다.

데이터 로깅에 필요한 하드웨어:

  • VEX 두뇌(IQ, V5, EXP)
  • SD 카드
  • 센서 또는 여러 센서(선택 사항, 필수 데이터에 따라)

센서에서 데이터 가져오기

VEX 로봇(IQ, V5, EXP)을 프로그래밍하여 다음 센서에서 데이터를 캡처할 수 있습니다.

  • 관성 센서
  • 거리 센서
  • 광학 센서
  • 비전 센서
  • 회전 센서(V5, EXP)
  • GPS 센서(V5)

참고: VEX IQ(2세대) Brain과 VEX EXP Brain에는 관성 센서가 내장되어 있습니다. 이러한 VEX Brian을 사용하여 관성 센서 데이터를 수집할 수 있습니다.

본 글에서는 VEX IQ Brain(2차)으로 가속도 데이터를 수집하여 SD 카드에 저장하는 데이터 로깅 프로젝트를 개발하겠습니다. 

먼저, VEX IQ Brain(2차)에 내장된 타이머와 관성 센서로부터 판독값을 얻기 위한 짧은 프로그램을 작성해야 합니다.

  • 이 프로그램을 시작할 때 VEX IQ Brain(2nd)을 제어하기 위해 Python 모듈을 가져와서 데이터를 가져와야 합니다. 따라서 먼저 프로젝트에 이러한 지침을 추가하세요.
  • # 라이브러리는 vex에서
    가져옵니다. import *

    # Brain은 기본적으로 정의되어야 합니다.
    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(2차)에서 데이터를 가져와서 버퍼에 기록하는 명령어를 사용하기 전에 먼저 이에 대한 이해가 필요합니다.
    다음 명령어는 현재 타이머 값을 특정 형식으로 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 Brain(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"

    이전 코드는 자세히 설명되어 있습니다. brain.timer.value()를 사용하는 첫 번째 data_buffer 줄은 버퍼에 타임스탬프 추가라는 라벨이 지정되어 있습니다. 다음 세 줄은 X, Y, Z축을 따라 가속도 값을 버퍼에 추가라는 라벨이 붙어 있습니다.

  • 참고: "\n"는 개행 문자입니다. 이는 줄이 여기서 끝나고 새로운 줄의 시작을 알립니다.
  • 그런 다음 특정 수의 데이터 항목을 data_buffer 변수에 기록하기 위해 for 루프 사용하여 데이터를 가져오고 여러 반복 동안 데이터를 data_buffer 변수에 추가하는 명령을 반복적으로 실행할 수 있습니다. 우리의 전략은 변수 numOfDataEntries 의 값을 사용하여 반복 횟수를 결정하는 것입니다.
  • # 데이터 생성
    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 의 값을 사용합니다.
  • # 데이터 생성
    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 Brain에 내장된 관성 센서로부터 판독값(가속도 데이터)을 가져오는 프로그램을 완료했습니다. 다음으로 SD 카드의 CSV 파일에 데이터를 쓰는 방법을 살펴보겠습니다.

# 라이브러리 가져오기
from 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.가속도(ZAXIS) + "\n"

wait(폴링_지연_밀리초, MSEC)

VEX Brain에 SD 카드 연결하기

SD 카드의 파일에 데이터를 쓰기 전에 먼저 VEX Brain의 SD 카드 슬롯에 SD 카드를 삽입하세요.

IQ(2세대) Brain은 SD 카드 슬롯이 강조되어 표시됩니다. SD 카드 슬롯은 Brain 측면, USB-C 포트 오른쪽에 있습니다.

참고: 데이터 쓰기를 위해 SD 카드를 FAT32로 포맷하세요. 32GB 이하의 SD 카드 사용을 권장합니다.

적절한 조건에서 SD 카드의 파일에 데이터 쓰기가 수행될 수 있도록 하려면 SD 카드가 VEX IQ Brain(2차)에 올바르게 삽입되었는지 확인하는 코드를 추가해야 합니다.

  • SD 카드가 삽입되었는지 확인하려면 Brain.sdcard.is_inserted() 함수를 사용하세요. SD 카드가 삽입되지 않은 경우 VEX IQ 브레인 화면에 해당 메시지를 표시하고 프로그램을 보류합니다.
  • # SD 카드가 삽입되지 않은 경우 프로그램을 중단합니다.
    if not brain.sdcard.is_inserted():
    brain.screen.set_cursor(1,1)
    brain.screen.print("SD 카드가 없습니다")
    while(True):
    wait(5, MSEC)
  • 참고: brain.sdcard.is_inserted() 함수는 SD 카드가 Brain에 삽입되면 True를 반환합니다.

SD 카드의 CSV 파일에 데이터 쓰기

지금까지 우리 프로그램은 VEX IQ Brain(2차)을 사용하여 데이터를 수집할 수 있었습니다. 데이터 로깅 프로젝트를 완료하려면 향후 조사 및 분석을 위해 SD 카드의 CSV(쉼표로 구분된 값) 파일에 데이터를 기록해야 합니다.

  • 다양한 유형의 데이터를 CSV 파일에 쓸 때 각 열에 어떤 유형의 데이터가 포함되어 있는지 알고 싶습니다. 이를 위해 데이터를 기록하기 전에 CSV 헤더 텍스트를 data_buffer 변수에 추가할 수 있습니다.
    따라서 변수를 선언하는 코드를 추가합니다. csvHeaderText CSV 헤더 텍스트를 저장하여 CSV 파일의 열 이름을 지정하고 변수 sd_file_name 에 쓸 CSV 파일의 이름을 담습니다. SD 카드.
  • csvHeaderText = "시간, x, y, z"
    sd_file_name = "myDataPY.csv"

참고: 헤더가 data_buffer 변수에 저장된 데이터와 동일한 순서인지 확인하세요.

  • 다음으로, 데이터 수집을 위해 루프앞에 있는 data_buffer 문자열에 CSV 헤더 텍스트를 추가합니다.
  • # 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 섹션이 강조 표시되고 파일 이름으로 레이블이 지정됩니다. 마지막으로, 마지막에 있는 bytearray(data_buffer, 'utf-8')이 강조 표시되고 Buffer라는 레이블이 지정됩니다.


    이 명령어는 data_buffer 변수에 저장된 데이터를 SD 카드의 명명된 CSV 파일에 씁니다.
    분석해 보겠습니다.
    • Brain.sdcard.savefile(): 이 함수는 바이트 배열을 SD 카드의 명명된 파일에 저장합니다. 이 함수는 파일에 기록된 바이트 수를 반환합니다.

    • sd_file_name: 함수의 첫 번째 매개변수입니다. 쓸 파일의 이름을 나타냅니다. 이 프로젝트에서는 파일 이름이 변수 sd_file_name에 저장됩니다.

    • bytearray(datat_buffer,'utf-8'): 함수의 두 번째 매개변수입니다. 파일에 기록될 bytearray를 나타냅니다.

        • bytearray(): 이 메서드는 변경 가능한 bytearray를 생성합니다. 이 명령어에서는 인코딩을 지정하여 문자열을 바이트 배열로 변환하는 데 사용합니다.
        • data_buffer: 메소드의 첫 번째 매개변수입니다. bytearray로 변환할 소스를 나타냅니다. 이 프로젝트에서 소스는 변수 data_buffer에 저장된 데이터입니다. 
        • 'utf-8': 메소드의 두 번째 매개변수입니다. 문자열을 인코딩하는 데 사용되는 지정된 인코딩을 나타냅니다. 이 명령어의 인코딩은 'utf-8'입니다. 
  • 데이터 수집을 위한 for 루프 이후에 Brain.sdcard.savefile() 함수를 사용하여 data_buffer 변수에 저장된 데이터를 SD 카드의 CSV 파일에 씁니다. 또한, 데이터가 파일에 성공적으로 기록되었는지 확인하기 위해 brain.sdcard.savefile() 함수의 반환 값을 확인하는 코드를 추가하고, VEX IQ Brain 화면에 해당 메시지를 표시하여 실시간 피드백을 받습니다. 마지막 if 문은 파일 상태를 보여주는 메시지를 추가하며, SD 쓰기 오류 또는 데이터 쓰기출력합니다.
  • # 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 파일에 기록하므로 파일에 기록되는 바이트 수는 0보다 커야 합니다. 즉, brain.sdcard.savefile() 함수가 0을 반환하면 데이터가 파일에 성공적으로 기록되지 않았다는 결론을 내릴 수 있습니다. 그렇지 않으면 데이터가 파일에 기록됩니다.

축하해요! VEX IQ Brain(2차)으로 가속도 데이터를 수집하여 SD 카드에 CSV 파일로 저장하는 데이터 로깅 프로젝트를 개발했습니다. 다음으로 데이터 분석을 위해 CSV 파일을 여는 방법을 살펴보겠습니다. 

# 라이브러리 가져오기
from 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 카드 없음")
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 파일 열기

데이터가 SD 카드의 CSV 파일에 기록되면 스프레드시트 애플리케이션을 사용하여 파일을 열어 데이터를 읽고 분석할 수 있습니다. 

참고: 가장 일반적인 스프레드시트 애플리케이션 중 두 가지는 Google Sheets와 Microsoft Excel입니다. 이 문서에서는 Google 스프레드시트(웹 기반)를 사용하여 SD 카드에 있는 CSV 파일을 엽니다. 다른 애플리케이션을 사용하는 과정도 비슷합니다.

  • VEX IQ Brain의 SD 카드 슬롯에서 SD 카드를 제거하세요. 컴퓨터에 Micro SD 카드 슬롯이 내장되어 있는 경우 해당 슬롯에 SD 카드를 직접 삽입할 수 있습니다. 그렇지 않은 경우 SD 카드를 SD 카드 어댑터에 삽입한 다음 어댑터를 컴퓨터에 연결하십시오. 
  • Google 계정에 로그인하고 Google 스프레드시트를 엽니다. 새 스프레드시트를 만듭니다.
  • 스프레드시트에서 "파일" 메뉴를 열고 "가져오기" -> "업로드" -> "찾아보기" 버튼을 선택한 다음 컴퓨터에서 CSV 파일을 선택합니다. CSV 파일을 업로드한 후 “데이터 가져오기” 버튼을 클릭합니다. 데이터를 가져온 후 “지금 열기” 클릭하면 CSV 파일로 수집된 데이터를 볼 수 있습니다.

    프로젝트의 CSV 데이터가 Google 시트 문서에서 열렸습니다. 시간, X, Y, Z를 나타내는 4개의 열이 있습니다. 각 타임스탬프에서의 가속도를 기록한 여러 행의 데이터가 있습니다.

  • (선택 사항) 데이터를 분석하는 쉬운 방법 중 하나는 그래프를 그린 다음 데이터의 추세를 찾는 것입니다. 스프레드시트에서 “삽입” 메뉴를 열고 “차트”를 선택하여 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(2차)으로 데이터를 수집하여 SD 카드에 CSV 파일로 저장하는 데이터 로깅 프로젝트를 완료했습니다. 또한 Google Sheets를 사용하여 SD 카드에 있는 CSV 파일을 읽는 방법과 추가 분석을 위한 그래프를 만드는 방법도 배웠습니다. 다음은 무엇입니까? 데이터 로깅을 위해 VEX 로봇을 사용하여 더욱 흥미로운 실험을 계획하고 변화하는 환경 요인이 다양한 유형의 데이터에 어떤 영향을 미치는지 관찰하고 우리 주변 세계에 대해 더 깊이 이해해 봅시다.

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

Last Updated: