コンテンツにスキップ

スクリプトを使用して Connected VD® を実行する

Note

ここでは、Python スクリプトを用いて Connected VD® の判定を自動実行する方法を説明します。

サンプルを使ってスクリプトを理解する

AUTOmeal では Python 形式のスクリプトファイルに自動化したい制御・計測・判定の命令を記述し、そのスクリプトを読み込むことでテストを自動化させることができます。

使用するAPI

Connected VD® を制御・取得する主な API は以下です。

import automeal as am

# Connected VD® の判定を開始します。
# config_file_path: 設定ファイルのパス (必須)
# input_media_path: 入力メディアのパス (省略時は設定ファイルに従う)
# output_path:      出力先のパス (省略時は設定ファイルに従う)
# 戻り値はスレッドオブジェクトです。
am.start_vd_judge("Settings/vd_config.ini")
am.start_vd_judge("Settings/vd_config.ini", input_media_path="C:/videos/test.mp4")
am.start_vd_judge("Settings/vd_config.ini", output_path="C:/results")

# Connected VD® の判定を停止します。
am.stop_vd_judge()

# 判定結果のログリストを取得します。
log_list = am.get_vd_log_list()

start_vd_judge は非同期で実行されます。判定を継続しながら他の制御も並行して実施できます。

設定ファイルのパスには絶対パスと相対パスの両方が使用可能です。
相対パスは AUTOmeal のプロジェクトファイル (.amprj) からのパスとして解釈されます。

thread.join(timeout_ms) のタイムアウトはミリ秒単位で指定します。引数を省略した場合は無限待機になります。

ログリストの各要素には以下のフィールドがあります。

フィールド 説明
label_name ラベル名
detect_time 検知時間
detect_data 検知データ
detect_pattern 検知パターン
detect_info 検知内容
error_level エラーレベル

詳細はスクリプトリファレンスを参照してください。

サンプルスクリプト

Connected VD® を使用して LED の点灯を判定するスクリプトの例を説明します。

start_vd_judge は非同期で動作するため、Connected VD® の判定を継続しながら他の制御を行うことができます。
以下の例では、LED の点灯・消灯を繰り返しながら Connected VD® で変化を検知します。

  1. start_vd_judge で Connected VD® の判定を開始します。
  2. ターゲットへの操作を行います。
  3. stop_vd_judge で判定を停止します。
  4. get_vd_log_list で判定結果のログを取得し、内容を確認します。
import automeal as am

# Connected VD® の判定を開始
thread = am.start_vd_judge("Settings/vd_config.ini")

# 判定しながらターゲットを操作します
for i in range(3):
    am.write_logic_rpigp10("Board1", 1, True)   # LED 点灯
    am.sleep(1)
    am.write_logic_rpigp10("Board1", 1, False)  # LED 消灯
    am.sleep(1)

# 操作完了後に判定を停止
am.stop_vd_judge()
# 判定スレッドの終了を待機 (最大 5000ms = 5秒)
thread.join(5000)

# 判定結果を取得・確認
log_list = am.get_vd_log_list()
print(f"検知件数: {len(log_list)}", flush=True)

for log in log_list:
    print(
        f"ラベル名: {log.label_name}, "
        f"検知時間: {log.detect_time}, "
        f"検知データ: {log.detect_data}, "
        f"検知パターン: {log.detect_pattern}, "
        f"検知内容: {log.detect_info}, "
        f"エラーレベル: {log.error_level}",
        flush=True
    )

判定結果で合否を確認する

期待するラベル名で検知されたか、かつ判定開始から指定秒数以内に検知されたかを確認する例です。

import automeal as am
import datetime

# 期待するラベル名と、判定開始から検知までの制限時間 (秒)
EXPECTED_LABEL = "LED"
DETECT_LIMIT_SEC = 5

# 判定開始時刻を記録
start_time = datetime.datetime.now()

# Connected VD® の判定を開始
thread = am.start_vd_judge("Settings/vd_config.ini")

# テスト対象を操作します
am.write_logic_rpigp10("Board1", 1, True)
am.sleep(3)

# 判定を停止し、スレッドの終了を待機 (最大 5000ms = 5秒)
am.stop_vd_judge()
thread.join(5000)

# 判定結果を確認
log_list = am.get_vd_log_list()

# 期待ラベルが制限時間内に検知されたログを絞り込む
matched = []
for log in log_list:
    detect_time = datetime.datetime.strptime(log.detect_time, "%Y%m%d_%H%M%S")
    elapsed_sec = (detect_time - start_time).total_seconds()
    print(
        f"ラベル名: {log.label_name}, "
        f"検知時間: {log.detect_time}, "
        f"開始からの経過: {elapsed_sec:.1f}秒",
        flush=True
    )
    if log.label_name == EXPECTED_LABEL and elapsed_sec <= DETECT_LIMIT_SEC:
        matched.append(log)

# 期待ラベルが制限時間内に 1 件以上検知されていることを確認
assert len(matched) > 0, (
    f"ラベル '{EXPECTED_LABEL}' が {DETECT_LIMIT_SEC} 秒以内に検知されませんでした"
)

動画ファイルを指定して判定する

Connected VD® でライブのカメラ映像ではなく、録画済みの動画ファイルを入力として判定する例です。
Connected VD® の設定ファイル (.ini) で入力設定を「動画読込」にしてください。
input_media_path に動画ファイルのパスを指定します。

Connected VD® の判定は動画ファイルの終端に達すると自動的に終了します。
thread.join() で引数を省略すると、判定が自動終了するまで無限待機します。

import automeal as am

# 動画ファイルを指定して Connected VD® の判定を開始
thread = am.start_vd_judge(
    "Settings/vd_config.ini",
    input_media_path="C:/videos/test.mp4"
)

# 判定が終わるまで待機 (動画終端で自動終了するため stop_vd_judge は不要)
thread.join()

# 判定結果を取得
log_list = am.get_vd_log_list()

# 結果を出力
for log in log_list:
    print(
        f"ラベル名: {log.label_name}, "
        f"検知時間: {log.detect_time}, "
        f"検知データ: {log.detect_data}, "
        f"検知パターン: {log.detect_pattern}, "
        f"検知内容: {log.detect_info}, "
        f"エラーレベル: {log.error_level}",
        flush=True
    )

画像ファイルを指定して判定する

Connected VD® で画像ファイルを入力として判定する例です。
Connected VD® の設定ファイル (.ini) で入力設定を「画像読込」にしてください。
input_media_path に画像ファイルのパスを指定します。

import automeal as am

# 画像ファイルを指定して Connected VD® の判定を開始
thread = am.start_vd_judge(
    "Settings/vd_config.ini",
    input_media_path="C:/images/test.png"
)

# 判定完了後に自動終了するため stop_vd_judge は不要
thread.join()

# 判定結果を取得
log_list = am.get_vd_log_list()

# 結果を出力
for log in log_list:
    print(
        f"ラベル名: {log.label_name}, "
        f"検知時間: {log.detect_time}, "
        f"検知データ: {log.detect_data}, "
        f"検知パターン: {log.detect_pattern}, "
        f"検知内容: {log.detect_info}, "
        f"エラーレベル: {log.error_level}",
        flush=True
    )

検知されるまで待機してから次の処理に進む

get_vd_log_list() をポーリングすることで、Connected VD® が特定のラベルを検知した時点で即座に次の処理に進むことができます。

Note

get_vd_log_list() は判定開始からのすべての検知ログを返します。

import automeal as am

EXPECTED_LABEL = "LED"       # 検知を待つラベル名
POLLING_INTERVAL_SEC = 0.5  # ポーリング間隔 (秒)
TIMEOUT_SEC = 10             # タイムアウト (秒)

# Connected VD® の判定を開始
thread = am.start_vd_judge("Settings/vd_config.ini")

# テスト対象を操作
am.write_logic_rpigp10("Board1", 1, True)

# 期待するラベルが検知されるまでポーリング
detected = False
elapsed = 0.0
while elapsed < TIMEOUT_SEC:
    log_list = am.get_vd_log_list()
    if any(log.label_name == EXPECTED_LABEL for log in log_list):
        detected = True
        break
    am.sleep(POLLING_INTERVAL_SEC)
    elapsed += POLLING_INTERVAL_SEC

# 検知を確認できたら次の処理へ
assert detected, f"ラベル '{EXPECTED_LABEL}' が {TIMEOUT_SEC} 秒以内に検知されませんでした"
print("検知を確認しました。次の処理に進みます。", flush=True)

# 次の処理を実行
for i in range(3):
    am.write_logic_rpigp10("Board1", 1, True)   # LED 点灯
    am.sleep(1)
    am.write_logic_rpigp10("Board1", 1, False)  # LED 消灯

    am.sleep(1)

# 判定を停止
am.stop_vd_judge()
thread.join(5000)

出力先を指定して判定する

判定結果 (録画ファイルなど) の保存先を実行ごとに切り替えたい場合は、output_path を指定します。

import automeal as am
import time
import os

# 出力先を日時付きフォルダに指定して判定を開始
output_dir = f"C:/results/{time.strftime('%Y%m%d_%H%M%S')}"

# フォルダを作成
os.makedirs(output_dir, exist_ok=True)

thread = am.start_vd_judge(
    "Settings/vd_config.ini",
    output_path=output_dir
)

# テスト対象を操作します
am.write_logic_rpigp10("Board1", 1, True)
am.sleep(3)

# 判定を停止し、スレッドの終了を待機 (最大 5000ms = 5秒)
am.stop_vd_judge()
thread.join(5000)

# 判定結果を取得
log_list = am.get_vd_log_list()
print(f"結果の保存先: {output_dir}", flush=True)
print(f"検知件数: {len(log_list)}", flush=True)

実行結果を確認する

Connected VD® の実行結果は [テストログ] ペインに出力されます。
Connected VD® で検知されると、以下の形式でログが出力されます。

Connected VD検知:<番号>: ラベル名:<ラベル名>, 検知時間:<検知時間>, 検知データ:<データ>, 検知パターン:<パターン>, 検知内容:<内容>, エラーレベル:<エラーレベル>

出力例:

Connected VD検知:0: ラベル名:LED, 検知時間:20260331_154110, 検知データ:Result_Movie_Analysis_20260331_154109:0.72, 検知パターン:色変化検出, 検知内容:Red, エラーレベル:1

また、判定終了時には録画ファイルの保存先が以下の形式で出力されます。

Connected VD録画ファイルの保存先:<絶対パス>

この録画ファイルを確認することで、判定時の映像を後から確認できます。

Note

テスト終了後やレポート表示中、ログ横の再生ボタンを押下すると、検知動画の再生や検知画像の確認ができます。
詳細は TestRunner マニュアル を参照してください。

スクリプトを適切な場所に置く

スクリプトは <プロジェクトルート> の中のフォルダに置くことを推奨しています。 スクリプトを配置するフォルダとしては 2 種類あり、その違いは以下です。 自動テストの実行対象とするかどうかで、どちらに配置するか判断してください。

  • <Scripts>
    • 自動テストで実行の対象としたいスクリプトファイル。
  • <Macros>
    • 自動テストで実行の対象としたくないスクリプトファイル。
    • モジュールやライブラリ、特定動作をマクロ化したスクリプトなど、他のスクリプトから呼び出して利用することを想定したスクリプトファイルなどはこちらに配置してください。

スクリプトを TestRunner アプリ GUI 上から実行する

1. テスト実行中の状態で、メニューバーの [テスト] > [スクリプトの実行] をクリックします。

2. Macros または Scripts に配置したスクリプトを選択します。

3. コマンドプロンプトが立ち上がり、スクリプトが実行されるため終了を待ちます。

4. [テストログ] ペインに開始、完了の情報及び、スクリプトに記述したログが出力されます。

スクリプトをコマンドラインから実行する

スクリプトファイルの配置

作成したスクリプトファイルは <プロジェクトルート>\Scripts 以下に配置してください。 フォルダ内にさらにフォルダを作成することもできます。

📂Scripts
 📄FullTest.py
 📂FuncA
  📄FuncATest1.py
  📄FuncATest2.py
  
 📂FuncB
  📄FuncBTest1.py
  📄FuncBTest2.py
 

テストを実行する

プロジェクトルートでコマンドプロンプトを起動し、コマンドを実行します。

パターンの指定は <プロジェクトルート>\Scripts からの相対パスで指定します。

例 :

  • 全てのスクリプトを実行する

    TestRunnerCLI 
    
  • 特定のスクリプトのみ実行する

    TestRunnerCLI FuncA\FuncATest1.py
    
  • 特定のフォルダ以下すべてを実行する

    TestRunnerCLI FuncB\*.py
    
  • 特定のファイル名を含むスクリプトを実行する

    TestRunnerCLI **\Func*Test*.py
    

Note

一度の実行で実行されるスクリプトは順不同になります。 実行順を担保したい場合はコマンドを複数回に分けて実行してください。

実行中

実行中はコマンドプロンプトに実行ログと進捗の表示が行われます。

実行完了すると、次のコマンドが実行できるようになります。

結果を確認する

TestRunner アプリ上でのログの確認

アプリケーション下部の [出力] ペインには、動作ログやエラー詳細情報などが表示されます。 [テストログ] ペインにはテストログやテスト実行中のエラー情報などが表示されます。 テストスクリプトに print 文で記述した内容は [テストログ] ペインに表示されます。

種別 文字色 内容
Error 赤系 期待する動作の完了・継続に支障が出た場合の通知です。
Warn 黄系 何らかの不都合が生じたものの、処理の完了・継続に支障がない場合の通知です。
Info 黒系 動作開始・完了などユーザがアプリの状態を把握するための情報です。スクリプトで print を行った場合 Info レベルで出力されます。

全体サマリーの確認

Note

全体サマリーは TestRunnerCLI (コマンドライン) から自動テストを実行した場合のみ生成されます。

<プロジェクトルート>\Reports にあるテストランフォルダを確認します。

確認したい実行日時のテストランフォルダを開いてください。

テキストエディタや Excel 等でテストランフォルダ内にある Result.csv を開きます。

Result.csv には実行結果、実行日時、実行したスクリプト名が記載されています。

CSV 形式のため、必要に応じてツール等で結果を集計できます。