このプログラムのアイデアは最もシンプルで、複雑なアルゴリズムは必要ありません。長方形のフレームを特定し、長方形のフレームにマークを付け、座標と中心点を出力し、長さを計算し、ステアリングギアを制御して一定の長さを移動します。基本機能を完了するための参考用です。気に入らない場合はスプレーしないでください。
# モーションターゲット制御と自動追尾システムを実現
## タスクの概要
この記事では、OpenMV 開発ボードとステアリング ギアを使用して、移動ターゲット制御および自動追跡システムを構築する方法を紹介します。このシステムには、ターゲットの動きをシミュレートする赤色スポット位置制御システムと、自動追跡を示す緑色スポット位置制御システムが含まれています。この記事の実装により、画像内のターゲットを識別し、ステアリングギアをターゲットに沿って移動するように制御し、ターゲットの長方形フレームの中心位置と長さを出力することができます。
## ハードウェアの準備
1. OpenMV H7 Plus 開発ボード
2. 赤と緑のレーザー ポインター
3. 2 つのサーボ (OpenMV 開発ボードに接続)
## ハードウェア接続
2 つのサーボを OpenMV 開発ボードのサーボ ピンに接続します (実際のピンに応じて選択します)。
## カメラ設定
コードでは、カメラを QVGA 解像度と RGB565 形式に設定します。
import sensor, image, math, pyb
# 初始化相机
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
# 其他代码...
## ターゲットの検出と追跡 (コードのターゲット検出部分はテスト済みです!)
### Find Rectangle 関数
画像内のターゲットの長方形を識別するには、Find Rectangle 関数を記述する必要があります。この関数は 2 番目に大きい長方形の領域を返すので、ターゲットの位置を見つけることができます。
# 寻找矩形函数,返回第二大的矩形区域
def find_second_largest_rectangle(blobs):
max_area = 0
max_blob = None
second_max_area = 0
second_max_blob = None
for blob in blobs:
area = blob.area()
if area > max_area:
second_max_area = max_area
second_max_blob = max_blob
max_area = area
max_blob = blob
elif area > second_max_area:
second_max_area = area
second_max_blob = blob
return second_max_blob
## メイン ループ
メイン ループでは、画像を継続的に取得し、オブジェクトの検出と追跡を行います。
while True:
img = sensor.snapshot() # 获取图像
blobs = img.find_blobs([black_threshold], pixels_threshold=200, area_threshold=200)
if blobs:
# 寻找第二大的矩形区域
second_max_blob = find_second_largest_rectangle(blobs)
if second_max_blob:
img.draw_rectangle(second_max_blob.rect(), color=(255, 0, 0), thickness=4) # 绘制第二大的矩形框,颜色为红色
# 其他代码...
## サーボ制御
ターゲットの追跡を実現するには、長方形の周りを移動して中心に戻るようにサーボを制御する必要があります。ここでは `pyb.Servo()` を使用してサーボの動きを制御します。
# 舵机参数
servo_pan_pin = 1 # 舵机1的引脚编号
servo_tilt_pin = 2 # 舵机2的引脚编号
servo_pan = pyb.Servo(servo_pan_pin) # 初始化舵机1
servo_tilt = pyb.Servo(servo_tilt_pin) # 初始化舵机2
servo_speed = 50 # 舵机转动速度(0-100,越大越快)
servo_pan_range = (0, 180) # 舵机1转动范围(角度)
servo_tilt_range = (0, 180) # 舵机2转动范围(角度)
# 控制舵机沿着矩形框移动一圈,并回到中心点
for angle in range(servo_pan_range[0], servo_pan_range[1], servo_speed):
servo_pan.angle(angle) # 控制舵机1水平旋转
servo_tilt.angle(angle) # 控制舵机2垂直旋转
pyb.delay(100) # 延时一段时间,控制舵机转动速度
# 将舵机回到中心点
servo_pan.angle((servo_pan_range[0] + servo_pan_range[1]) // 2)
servo_tilt.angle((servo_tilt_range[0] + servo_tilt_range[1]) // 2)
## 結果出力
ターゲットを検出したら、ターゲット長方形の中心位置と長さを出力します。同時に、画像内の長方形の位置をマークします。(テストの座標と長さはまだ比較的準備中です)
# 获取矩形框的中心点坐标
x, y = second_max_blob.cx(), second_max_blob.cy()
# 计算矩形框的长度和宽度(单位:厘米)
width_cm = 2 * distance_cm * math.tan(math.radians(H_FOV / 2)) * (second_max_blob.w() / img.width())
height_cm = 2 * distance_cm * math.tan(math.radians(V_FOV / 2)) * (second_max_blob.h() / img.height())
# 输出矩形框的中心点坐标和长度(单位:厘米)
print("Rectangle Center Coordinates (cm): x={}, y={}".format(x, y))
print("Rectangle Width (cm): {}, Height (cm): {}".format(width_cm, height_cm))
# 绘制黄色圆点标记矩形框中心位置
img.draw_circle(x, y, 5, color=(255, 255, 0), thickness=2)
## 走行効果
ハードウェア接続後、コードをOpenMV開発ボードにアップロードし、サーボパラメータと位置を調整します。コードを実行すると、サーボがターゲットの四角形に沿って移動し、画像内で四角形の位置と中心をマークするのがわかります。
## 結論
この記事の実装により、移動ターゲット制御および自動追跡システムを構築することに成功しました。OpenMV 開発ボードとサーボを使用することで、画像内のターゲットを識別し、サーボを制御してターゲットを追跡することができます。
## 参考リンク
1. OpenMV 公式サイト: https://openmv.io/
2. Pyb Servo ドキュメント: https://docs.openmv.io/library/pyb.Servo.html
学習と改善について一緒に話し合うために、貴重なご意見やご提案をお待ちしております。読んでくれてありがとう!