VEX Brain/センサーによるデータロギング (Python バージョン)

導入

この記事では、VEX Brain でデータを収集し、データ分析のために SD カード上の CSV ファイルに保存するように VEX ロボットに指示するデータ ロギング プロジェクトを作成する方法について説明します。

データログは、科学研究を支援したり、独自の実験を実施したり、特定の問題を解決したりするために使用できる強力なツールです。 データ ログを使用して VEX ロボットを駆動して実行できる、楽しくエキサイティングなさまざまなタスクがあります。 以下にいくつかの例を示します。

  • 距離センサーでデータを収集し、ロボットの速度を計算します
  • ロボットを教室内で動かし、光センサーでデータを収集し、さまざまな場所の光の変化を観察します。
  • ロボットを冒険に連れて行き、GPS座標データを記録して地図を作成します。

データロギングプロジェクトの開発に必要なコーディングスキル

  • さまざまなコマンドを使用して VEX Brain/Sensors でデータを収集し、データ構造に追加します。
  • データを SD カードのカンマ区切り値 (CSV) ファイルに書き込みます。

データロギングに必要なハードウェア:

  • VEX ブレイン (IQ、V5、EXP)
  • SDカード
  • 1 つまたは複数のセンサー (必要なデータに応じてオプション)

センサーからのデータの取得

VEX ロボット (IQ、V5、EXP) をプログラムして、次のセンサーからデータをキャプチャできます。

  • 慣性センサー
  • 距離センサー
  • 光学センサー
  • 視覚センサー
  • 回転センサー(V5、EXP)
  • GPS センサー (V5)

注: VEX IQ (第 2 世代) Brain および VEX EXP Brain には慣性センサーが内蔵されています。 これらの VEX ブライアンを使用して慣性センサー データを収集できます。

この記事では、VEX IQ Brain (2nd) で加速度データを収集し、SD カードに保存するデータロギング プロジェクトを開発します。 

まず、VEX IQ Brain (2 番目) に組み込まれているタイマーと慣性センサーから読み取り値を取得するための短いプログラムを作成する必要があります。

  • このプログラムの開始時に、VEX IQ Brain (2 番目) を制御し、そこからデータを取得するために Python モジュールをインポートする必要があります。 したがって、これらの命令をプロジェクトに追加することから始めます。
  • # ライブラリのインポート
    from vex import *

    # Brain はデフォルトで定義される必要があります
    brain = Brain()
    brain_inertial = Inertial()
  • 次に、記録するデータ エントリの数を保存する変数 numOfDataEntries を宣言するコードを追加し、データを読み取る時間間隔の値を保存する変数 polling_lay_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 文字列が強調表示され、「Format string」というラベルが付けられます。 次に、パーセント記号が強調表示され、「文字列モジュロ演算子」というラベルが付けられます。 次に、 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 行には、バッファにタイムスタンプを追加するというラベルが付けられています。 次の 3 行には、「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"
  • これまでのところ、私たちのプログラムは可能な限り迅速にデータを記録します。 ただし、特定の時間間隔でデータを記録したいと考えています。 したがって、 for ループwait() 関数を使用してプログラムを一時停止し、2 つの読み取りの間に特定の時間間隔を追加できます。 時間間隔の値を決定するには、変数 の値、polling_lay_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.acceleration(ZAXIS) + "\n"

wait(polling_delay_msec, MSEC)

SD カードを VEX Brain に接続する

SD カード上のファイルにデータを書き込む前に、VEX Brain の SD カード スロットに SD カードを挿入してください。

EXP Brain の SD カード スロットがハイライト表示されます。 SD カード スロットは Brain の側面、USB-C ポートの右側にあります。

注意: データを書き込む場合は、SD カードを FAT32 でフォーマットしてください。 サイズが 32GB 以下の SD カードを使用することをお勧めします。

SD カード上のファイルへのデータの書き込みが適切な条件で実行できるようにするには、SD カードが VEX IQ Brain (2 番目) に正しく挿入されているかどうかを確認するコードを追加する必要があります。

  • Brain.sdcard.is_inserted() 関数を使用して、SD カードが挿入されているかどうかを確認します。 SD カードが挿入されていない場合は、VEX IQ Brain 画面に対応するメッセージを表示し、プログラムを押し続けます。
  • # 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() 関数は、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 変数に格納されているデータと同じ順序であることを確認してください。

  • 次に、データ収集のために 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 変数に格納されているデータを SD カード上の名前付き CSV ファイルに書き込みます。
    分解してみましょう:
    • Brain.sdcard.savefile(): この関数は、バイト配列を SD カード上の名前付きファイルに保存します。 この関数は、ファイルに書き込まれたバイト数を返します。

    • sd_file_name: 関数の最初のパラメータ。 書き込むファイルの名前を示します。 このプロジェクトでは、ファイル名は変数 sd_file_name に格納されます。

    • bytearray(datat_buffer,'utf-8'): 関数の 2 番目のパラメーター。 ファイルに書き込まれるバイト配列を表します。

        • bytearray(): このメソッドは変更可能な bytearray を作成します。 この命令では、エンコーディングを指定して文字列を bytearray に変換するために使用します。
        • data_buffer: メソッドの最初のパラメータ。 bytearray に変換されるソースを示します。 このプロジェクトでは、ソースは変数 data_buffer に格納されているデータです。 
        • 'utf-8': メソッドの 2 番目のパラメーター。 文字列のエンコードに使用される指定されたエンコードを示します。 この命令ではエンコードは「utf-8」です。 
  • のループ のデータ収集の後、 Brain.sdcard.savefile() 関数を使用して、 data_buffer 変数に格納されているデータを SD カード上の CSV ファイルに書き込みます。 さらに、 brain.sdcard.savefile() 関数からの戻り値をチェックするコードを追加して、データがファイルに正常に書き込まれたかどうかを確認し、対応するメッセージを VEX IQ Brain 画面に表示してリアルタイムのフィードバックを取得します。
  • # 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 (2nd) で加速度データを収集し、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 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)
brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0の場合:
brain.screen.print("SD書き込みエラー")
else:
brain.screen.print("データ書き込み済み")

データ分析のために CSV ファイルを開く

データが SD カード上の CSV ファイルに書き込まれたら、スプレッドシート アプリケーションを使用してファイルを開いて、データを読み取り、分析することができます。 

注: 最も一般的なスプレッドシート アプリケーションの 2 つは、Google Sheets と Microsoft Excel です。 この記事では、Google スプレッドシート (Web ベース) を使用して、SD カード上の CSV ファイルを開きます。 他のアプリケーションを使用するプロセスも同様です。

  • VEX IQ Brain の SD カード スロットから SD カードを取り外します。 コンピューターにマイクロ SD カード スロットが内蔵されている場合は、そのスロットに SD カードを直接挿入できます。 それ以外の場合は、SD カードを SD カード アダプターに挿入し、アダプターをコンピューターに接続します。 
  • Google アカウントにログインし、Google スプレッドシートを開きます。 新しいスプレッドシートを作成します。
  • スプレッドシートで「ファイル」 メニューを開き、 「インポート」 ~>「アップロード」 ~> 「参照」 を選択し、パソコン上のCSVファイルを選択します。 CSVファイルをアップロード後、「データインポート」 ボタンをクリックします。 データのインポート後、「今すぐ開く」 をクリックすると、収集されたデータが CSV ファイルで表示されます。

    プロジェクトの CSV データが Google スプレッドシート ドキュメントで開かれました。 時間、X、Y、Z の 4 つの列があります。各タイムスタンプにおける加速度を記録するデータの行が多数あります。

  • (オプション) データを分析する簡単な方法の 1 つは、グラフを描いてデータの傾向を探すことです。 スプレッドシートで「挿入」 メニューを開き、「グラフ」 を選択して、CSV ファイルのデータを使用してグラフを描画します。 次のグラフは、VEX IQ Brain(2番目)で収集された加速度データの結果です。0

    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) でデータを収集し、SD カードに CSV ファイルとして保存するデータロギングプロジェクトが完了しました。 また、Google スプレッドシートを使用して SD カード上の CSV ファイルを読み取り、さらに分析するためのグラフを作成する方法も学びました。 次は何? データロギングに VEX ロボットを使用して、よりエキサイティングな実験を計画して、変化する環境要因がさまざまな種類のデータにどのような影響を与えるかを観察し、私たちの周囲の世界をより深く理解してみましょう。

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

Last Updated: