ビジョンセンサー#

導入#

ビジョンセンサーは、カメラをベースとしたセンサーで、色の特徴や色コードを検知・追跡することができます。これにより、ロボットは周囲の状況を分析し、視覚的な入力に反応することが可能になります。

以下の例では、構成済みのビジョンセンサーは vision_1名前になり、構成済みのカラーシグネチャオブジェクト RED_BOX などは、この API ドキュメント を通して Vision クラスのメソッドを参照する際に、以降のすべての例で使用されます。

以下にすべてのメソッドの一覧を示します。

ゲッター — ビジョンセンサーからデータを取得します。

  • take_snapshot — 特定の署名のデータをキャプチャします。

  • installed — ビジョンセンサーが IQ (第 2 世代) ブレインに接続されているかどうか。

プロパティ — take_snapshot から返されるオブジェクトデータ。

  • largest_object — Vision Sensor スナップショットから最大のオブジェクトを即座に選択します。

  • .exists — 現在の検出でオブジェクトが存在するかどうか。

  • .width — 検出されたオブジェクトの幅。

  • .height — 検出されたオブジェクトの高さ。

  • .centerX — オブジェクトの中心の X 座標。

  • .centerY — オブジェクトの中心の Y 座標。

  • .angle — カラーコードの向き。

  • .originX — オブジェクトの左上隅の X 座標。

  • .originY — オブジェクトの左上隅の Y 座標。

コンストラクター — センサーを手動で初期化および構成します。

  • Vision — ビジョンセンサーを作成します。

  • Signature — カラー署名を作成します。

  • Code — カラーコードを作成します。

ゲッター#

take_snapshot#

take_snapshot は、ビジョンセンサーフレームからのデータを単一のシグネチャ(センサーが認識できるものの保存された説明、構成済みのカラーシグネチャやカラーコードなど)にフィルタリングし、タプルを返します。

この方法で使用する前に、カラーシグネチャとカラーコードをVision Utilityで最初に設定する必要があります。

The tuple stores objects ordered from largest to smallest by width, starting at index 0. Each object’s properties can be accessed using its index. An empty tuple is returned if no matching objects are detected.

Usage:
vision_1.take_snapshot(SIGNATURE)

パラメータ

説明

SIGNATURE

指定されたシグネチャのデータのみを含むようにデータセットをフィルタリングします。使用可能なシグネチャは
のとおりです。0

  • カラーシグネチャまたはカラーコード - ビジョンセンサーの名前、アンダースコア2つ、カラーシグネチャまたはカラーコードの名前。例: vision_1__RED_BOX.

# Move forward if a red object is detected
while True:
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)
    if red_box[0].exists:
        drivetrain.drive_for(FORWARD, 10, MM)
    wait(5, MSEC)

カラーシグネチャー#

カラーシグネチャとは、ビジョンセンサーが認識できる固有の色です。これらのシグネチャにより、ビジョンセンサーは色に基づいて物体を検出および追跡できます。カラーシグネチャが設定されると、センサーは視野内のその特定の色を持つ物体を識別できます。カラーシグネチャは、take_snapshot で使用され、色付き物体をリアルタイムで処理および検出します。

プロジェクトで設定済みのカラーシグネチャを使用するには、その名前はビジョンセンサーの名前、アンダースコア2つ、そしてカラーシグネチャの名前の順である必要があります。例: vision_1__RED_BOX。

# Display if any objects match the RED_BOX signature
while True:
    brain.screen.set_cursor(1, 1)
    brain.screen.clear_row(1)
    # Change to any configured Color Signature
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)
    if red_box[0].exists:
        brain.screen.print("Color signature detected!")
        wait(100, MSEC)

カラーコード#

カラーコードとは、特定の順序で並べられた色の組み合わせで構成される構造化されたパターンです。これらのコードにより、ビジョンセンサーはあらかじめ定義された色のパターンを認識できます。カラーコードは、複雑な物体を識別したり、自律航行のための固有のマーカーを作成したりするのに役立ちます。

プロジェクトで設定済みのカラーコードを使用するには、その名前はセンサー名、アンダースコア2つ、そしてカラーコード名でなければなりません。例: vision_1__BOX_CODE。

# Display if any objects match the BOX_CODE code
while True:
    brain.screen.set_cursor(1, 1)
    brain.screen.clear_row(1)
    # Change to any configured Color Code
    box_code = vision_1.take_snapshot(vision_1__BOX_CODE)
    if box_code[0].exists:
        brain.screen.print("Color code detected!")
        wait(100, MSEC)

installed#

installed 、ビジョンセンサーが現在 IQ (第 2 世代) Brain に接続されているかどうかを示すブール値を返します。

  • True — ビジョンセンサーはIQ(第2世代)ブレインに接続されています。

  • False — ビジョンセンサーはIQ(第2世代)ブレインに接続されていません。

Usage:
vision_1.installed()

パラメータ

説明

このメソッドにはパラメータがありません。

# Display a message if the Vision Sensor is connected
if vision_1.installed():
    brain.screen.print("Installed!")

物件#

largest_object#

largest_object は、take_snapshot の最新の使用から返されたタプルからデータを取得するために検出された最大のオブジェクトを取得します。

この方法を用いると、インデックスを指定せずにタプルから常に最大のオブジェクトを取得できます。

Usage:
vision_1.largest_object()

# Turn slowly until the largest object is centered in
# front of the Vision Sensor
drivetrain.set_turn_velocity(10, PERCENT)
drivetrain.turn(RIGHT)

while True:
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)

    if red_box[0].exists:
        if 140 < vision_1.largest_object().centerX < 180: 
            drivetrain.stop()

    wait(10,MSEC)

Tuple Properties#

take_snapshot を使用した後にタプルに格納される各オブジェクトには、8 つのプロパティが含まれます。

すべてのプロパティ値は、 take_snapshot が使用された時点における、ビジョンセンサーの視野内での検出されたオブジェクトの位置とサイズを表します。これらの値は、センサーの316×212ピクセルの解像度に基づいて、ピクセル単位で測定されます。

.exists#

.exists 、インデックスがタプル内に存在するかどうかを示すブール値を返します。

  • True — インデックスが存在します。

  • False — インデックスが存在しません。

# Check if at least one red objects is detected
# You will receive an error if no objects are detected

while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1, 1)
    red_objects = vision_1.take_snapshot(vision_1__RED_BOX)

    if red_objects[0].exists:
        brain.screen.print("At least 1")
            
    else:
        brain.screen.print("No red objects")

    wait(0.5, SECONDS)

。幅#

.width 、検出されたオブジェクトの幅をピクセル単位で返します。これは 1 から 316 までの整数です。

# Move towards a blue object until its width is
# larger than 100 pixels
while True:
    blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)

    if blue_box[0].exists:
        if blue_box[0].width < 100:
            drivetrain.drive_for(FORWARD, 10, MM)
    else:
        drivetrain.stop()

    wait(50, MSEC)

。身長#

.height 、検出されたオブジェクトの高さをピクセル単位で返します。これは 1 から 212 までの整数です。

# Move towards a blue object until its height is
# larger than 100 pixels
while True:
    blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)

    if blue_box[0].exists:
        if blue_box[0].height < 100:
            drivetrain.drive_for(FORWARD, 10, MM)
    else:
        drivetrain.stop()

    wait(50, MSEC)

.centerX#

.centerX 、検出されたオブジェクトの中心の x 座標をピクセル単位で返します。これは 0 から 316 までの整数です。

# Turn slowly until the largest blue object is centered
# in front of the Vision Sensor.
drivetrain.set_turn_velocity(10, PERCENT)
drivetrain.turn(RIGHT)

while True:
    blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)

    if blue_box[0].exists:
        if 140 < vision_1.largest_object().centerX < 180: 
            drivetrain.stop()

    wait(10,MSEC)

.centerY#

.centerY 、検出されたオブジェクトの中心の y 座標をピクセル単位で返します。これは 0 から 212 までの整数です。

# Move towards a blue object until its
# center y-coordinate is more than 140 pixels
while True:
    blue_box = vision_1.take_snapshot(vision_1__BLUE_BOX)

    if blue_box[0].exists:
        if blue_box[0].centerY < 140:
            drivetrain.drive(FORWARD)
    else:
        drivetrain.stop()

    wait(50, MSEC)

。角度#

.angle 、検出されたオブジェクトの向きを度数で返します。これは 0 から 359 までの整数です。

# Turn left or right depending on how a
# configured box code is rotated
while True: 
    box_code = vision_1.take_snapshot(vision_1__BOX_CODE)

    if box_code[0].exists: 
        if 50 < box_code[0].angle < 100:
            drivetrain.turn(RIGHT)
            
        elif 270 < box_code[0].angle < 330:
            drivetrain.turn(LEFT)
        
        else:
            drivetrain.stop()
    else:
        drivetrain.stop()

    wait(50, MSEC)

.originX#

.originX 、検出されたオブジェクトのバウンディングボックスの左上隅の x 座標をピクセル単位で返します。これは 0 から 316 までの整数です。

# Display if a red object is to the
# left or the right
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1,1)
    
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)
    
    if red_box[0].exists:
        if red_box[0].originX < 160:
            brain.screen.print("To the left!")
        else: 
            brain.screen.print("To the right!")

    wait(50, MSEC)

.originY#

.originY 、検出されたオブジェクトのバウンディングボックスの左上隅の y 座標をピクセル単位で返します。これは 0 から 212 までの整数です。

# Display if a red object is close or far
# from the robot
while True:
    brain.screen.clear_screen()
    brain.screen.set_cursor(1,1)
    
    red_box = vision_1.take_snapshot(vision_1__RED_BOX)

    if red_box[0].exists:
        if red_box[0].originY < 80:
            brain.screen.print("Far")
        else: 
            brain.screen.print("Close")

    wait(50, MSEC)

建設業者#

Constructors are used to manually create Vision, Signature, and Code objects, which are necessary for configuring the sensors outside of VEXcode.

Vision Sensor#

Vision はビジョンセンサーを作成します。

使用法

Vision(port, brightness, sigs)

パラメータ

説明

port

ビジョンセンサーが接続されているスマートポートを1~12のいずれかで示してください。

brightness

オプション。ビジョンセンサーの輝度値(1~100)。

sigs

オプション。1つ以上のカラーシグネチャまたはカラーコードオブジェクトの名前。

例

# Create a new Signature "RED_BOX" with the Signature class
RED_BOX = Signature(1, -3911, -3435, -3673,10879, 11421, 11150,2.5, 0)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the "RED_BOX" Signature.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX)

# Move forward if a red object is detected
while True:
    red_object = vision_1.take_snapshot(RED_BOX)
    if red_object[0].exists:
        drivetrain.drive_for(FORWARD, 10, MM)
    wait(5, MSEC)

Color Signature#

Signature はカラーシグネチャを作成します。ビジョンセンサーには、最大 7 種類の異なるカラーシグネチャを同時に保存できます。

使用法:

Signature(index, uMin, uMax, uMean, vMin, vMax, vMean, rgb, type)

パラメータ

説明

index

Signature オブジェクトのインデックス (1 ~ 7)。注: 同じインデックス番号で 2 つの Signature オブジェクトを作成すると、2 番目に作成されたオブジェクトが最初のオブジェクトを上書きします。

uMin

Vision Utilityにおける uMin の値。

uMax

Vision Utilityにおける uMax の最大値。

uMean

Vision Utilityにおける uMean の平均値。

vMin

Vision Utilityにおける vMin までのvMin値。

vMax

Vision UtilityにおけるvMaxの値は vMax。

vMean

Vision Utilityにおける vMean までの平均値。

rgb

Vision Utilityにおける rgb RGB値。

type

Vision Utilityでは、値は type 変化します。

カラーシグネチャを作成するための値を取得するには、ビジョンユーティリティを開きます。カラーシグネチャが設定されたら、構成ウィンドウからパラメータ値をコピーします。

例

# Create a new Signature RED_BOX with the Signature class
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440,2.5, 1)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the RED_BOX Signature.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX)

# Move forward if a red object is detected
while True:
    red_object = vision_1.take_snapshot(RED_BOX)
    if red_object[0].exists:
        drivetrain.drive_for(FORWARD, 10, MM)
    wait(5, MSEC)

Color Code#

コードCode カラーコードを作成します。使用するには、少なくとも2つのカラーシグネチャが既に定義されている必要があります。ビジョンセンサーには、最大8つの異なるカラーコードを同時に保存できます。

使用法:

Code(sig1, sig2, sig3, sig4, sig5)

パラメータ

説明

sig1

以前に作成された カラーシグネチャ。

sig2

以前に作成された カラーシグネチャ。

sig3

オプション。 以前に作成された カラーシグネチャ。

sig4

オプション。 以前に作成された カラーシグネチャ。

sig5

オプション。 以前に作成された カラーシグネチャ。

例

# Create two new Signatures for a red and blue box
RED_BOX = Signature(1, 10121, 10757, 10439,-1657, -1223, -1440, 2.5, 1)
BLUE_BOX = Signature(2, -4443, -3373, -3908,6253, 7741, 6997, 2.5, 1)
# Create a Color Code for a red box to the left of a blue box
RED_BLUE = Code(RED_BOX, BLUE_BOX)
# Create a new Vision Sensor "vision_1" with the Vision
# class, with the red_box and blue_box Signatures.
vision_1 = Vision(Ports.PORT1, 100, RED_BOX, BLUE_BOX)

# Display a message if Color Code is detected
while True:
    brain.screen.set_cursor(1, 1)
    brain.screen.clear_row(1)
    # Change to any configured Color Code
    box_code = vision_1.take_snapshot(RED_BLUE)
    if box_code[0].exists:
        brain.screen.print("Color code detected!")
        wait(100, MSEC)