導入
この記事では、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 Brains を使用して慣性センサーのデータを収集できます。
この記事では、VEX IQ Brain (第 2 世代) で加速度データを収集し、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変数に追加します。フォーマット文字列
“%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"注: 「\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 カードを挿入してください。
注意: データを書き込む場合は、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 カードが挿入されていません") while(True): wait(5, MSEC)
注: ()SD カードが Brain に挿入されている場合に True を返します。
SDカードのCSVファイルにデータを書き込む
これまでのところ、私たちのプログラムは VEX IQ Brain (第 2 世代) を使用してデータを収集できます。データ ログ プロジェクトを完了するには、将来の調査と分析のためにデータを SD カード上のカンマ区切り値 (CSV) ファイルに書き込む必要があります。
-
さまざまな種類のデータを CSV ファイルに書き込む場合、各列にどの種類のデータが含まれているかを知りたいと思います。これを行うには、データを記録する前に、CSV ヘッダー テキストを
data_buffer変数に追加します。2
、CSV ファイルの列名を指定する CSV ヘッダー テキストを格納する変数csvHeaderTextを宣言し、SD カードに書き込む CSV ファイルの名前を保持する変数sd_file_nameを宣言するコードを追加します。csvHeaderText = "時間、x、y、z" sd_file_name = "myDataPY.csv"
注: ヘッダーが data_buffer 変数に格納されているデータと同じ順序であることを確認してください。
-
次に、データ収集のための
for loopの前に、CSV ヘッダー テキストをdata_buffer文字列に追加します。# 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()関数の使用方法を理解しましょう。
この命令は、変数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 Screen に表示してリアルタイムのフィードバックを取得します。# 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() 関数が返す場合、データがファイルに正常に書き込まれなかったと結論付けることができます。それ以外の場合は、データはファイルに書き込まれています。
おめでとう! 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 ファイルに書き込まれたら、スプレッドシート アプリケーションを使用してファイルを開いて、データを読み取り、分析することができます。
注: 最も一般的なスプレッドシート アプリケーションの 2 つは、Google Sheets と Microsoft Excel です。この記事では、Google スプレッドシート (Web ベース) を使用して、SD カード上の CSV ファイルを開きます。他のアプリケーションを使用するプロセスも同様です。
- VEX IQ Brain の SD カード スロットから SD カードを取り外します。コンピューターにマイクロ SD カード スロットが内蔵されている場合は、そのスロットに SD カードを直接挿入できます。それ以外の場合は、SD カードを SD カード アダプターに挿入し、アダプターをコンピューターに接続します。
- Google アカウントにログインし、Google スプレッドシートを開きます。新しいスプレッドシートを作成します。
-
スプレッドシートで「ファイル」 メニューを開き、 「インポート」 ~>「アップロード」 ~> 「参照」 を選択し、パソコン上のCSVファイルを選択します。 CSVファイルをアップロード後、「データインポート」 ボタンをクリックします。データのインポート後、「今すぐ開く」 をクリックすると、収集されたデータが CSV ファイルで表示されます。
-
(オプション) データを分析する簡単な方法の 1 つは、グラフを描いてデータの傾向を探すことです。スプレッドシートで「挿入」 メニューを開き、「グラフ」 を選択して、CSV ファイルのデータを使用してグラフを描画します。以下のグラフは、VEX IQ Brain(第2世代)で収集した加速度データの結果です。
注: チャートエディタを使用して、 別のチャートタイプを選択したり、必要に応じてチャートを編集したりできます
ここまでで、VEX IQ Brain (2nd gen) でデータを収集し、SD カードに CSV ファイルとして保存するデータロギングプロジェクトが完了しました。また、Google スプレッドシートを使用して SD カード上の CSV ファイルを読み取り、さらに分析するためのグラフを作成する方法も学びました。次は何?データロギングに VEX ロボットを使用して、よりエキサイティングな実験を計画して、変化する環境要因がさまざまな種類のデータにどのような影響を与えるかを観察し、私たちの周囲の世界をより深く理解してみましょう。