本方案的思路是最簡單的不涉及復(fù)雜算法:識別矩形框,標(biāo)記矩形框,輸出坐標(biāo)和中心點(diǎn),計(jì)算長度,控制舵機(jī)移動(dòng)固定長度!僅供完成基礎(chǔ)功能參考,不喜勿噴!
# 實(shí)現(xiàn)運(yùn)動(dòng)目標(biāo)控制與自動(dòng)追蹤系統(tǒng)
## 任務(wù)概述
本文將介紹如何使用OpenMV開發(fā)板和舵機(jī)構(gòu)建一個(gè)運(yùn)動(dòng)目標(biāo)控制與自動(dòng)追蹤系統(tǒng)。該系統(tǒng)包括模擬目標(biāo)運(yùn)動(dòng)的紅色光斑位置控制系統(tǒng)和指示自動(dòng)追蹤的綠色光斑位置控制系統(tǒng)。通過本文的實(shí)現(xiàn),我們可以在圖像中識別目標(biāo),控制舵機(jī)沿著目標(biāo)移動(dòng),并輸出目標(biāo)矩形框的中心位置和長度。
## 硬件準(zhǔn)備
1. OpenMV H7 Plus開發(fā)板
2. 紅色和綠色激光筆
3. 兩個(gè)舵機(jī)(連接到OpenMV開發(fā)板)
## 硬件連接
將兩個(gè)舵機(jī)分別連接到OpenMV開發(fā)板的舵機(jī)引腳(根據(jù)實(shí)際引腳選擇)。
## 相機(jī)設(shè)置
在代碼中,我們將相機(jī)設(shè)置為QVGA分辨率和RGB565格式。
import sensor, image, math, pyb
# 初始化相機(jī)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
# 其他代碼...
## 目標(biāo)檢測與跟蹤(目標(biāo)檢測部分代碼實(shí)測過?。?br> ### 尋找矩形函數(shù)
為了在圖像中識別目標(biāo)矩形框,我們需要編寫一個(gè)尋找矩形函數(shù)。該函數(shù)將返回第二大的矩形區(qū)域,以便我們可以找到目標(biāo)的位置。
# 尋找矩形函數(shù),返回第二大的矩形區(qū)域
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
## 主循環(huán)
在主循環(huán)中,我們將不斷獲取圖像并進(jìn)行目標(biāo)檢測和跟蹤。
while True:
img = sensor.snapshot() # 獲取圖像
blobs = img.find_blobs([black_threshold], pixels_threshold=200, area_threshold=200)
if blobs:
# 尋找第二大的矩形區(qū)域
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) # 繪制第二大的矩形框,顏色為紅色
# 其他代碼...
## 舵機(jī)控制
為了實(shí)現(xiàn)目標(biāo)跟蹤,我們需要控制舵機(jī)使其沿著矩形框移動(dòng)一圈,并回到中心點(diǎn)。這里我們使用了`pyb.Servo()`來控制舵機(jī)運(yùn)動(dòng)。
# 舵機(jī)參數(shù)
servo_pan_pin = 1 # 舵機(jī)1的引腳編號
servo_tilt_pin = 2 # 舵機(jī)2的引腳編號
servo_pan = pyb.Servo(servo_pan_pin) # 初始化舵機(jī)1
servo_tilt = pyb.Servo(servo_tilt_pin) # 初始化舵機(jī)2
servo_speed = 50 # 舵機(jī)轉(zhuǎn)動(dòng)速度(0-100,越大越快)
servo_pan_range = (0, 180) # 舵機(jī)1轉(zhuǎn)動(dòng)范圍(角度)
servo_tilt_range = (0, 180) # 舵機(jī)2轉(zhuǎn)動(dòng)范圍(角度)
# 控制舵機(jī)沿著矩形框移動(dòng)一圈,并回到中心點(diǎn)
for angle in range(servo_pan_range[0], servo_pan_range[1], servo_speed):
servo_pan.angle(angle) # 控制舵機(jī)1水平旋轉(zhuǎn)
servo_tilt.angle(angle) # 控制舵機(jī)2垂直旋轉(zhuǎn)
pyb.delay(100) # 延時(shí)一段時(shí)間,控制舵機(jī)轉(zhuǎn)動(dòng)速度
# 將舵機(jī)回到中心點(diǎn)
servo_pan.angle((servo_pan_range[0] + servo_pan_range[1]) // 2)
servo_tilt.angle((servo_tilt_range[0] + servo_tilt_range[1]) // 2)
## 結(jié)果輸出
在檢測到目標(biāo)后,我們將輸出目標(biāo)矩形框的中心位置和長度。同時(shí),我們會在圖像中標(biāo)記出矩形框的位置。(測試坐標(biāo)和長度還是比較準(zhǔn)備?)
# 獲取矩形框的中心點(diǎn)坐標(biāo)
x, y = second_max_blob.cx(), second_max_blob.cy()
# 計(jì)算矩形框的長度和寬度(單位:厘米)
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())
# 輸出矩形框的中心點(diǎn)坐標(biāo)和長度(單位:厘米)
print("Rectangle Center Coordinates (cm): x={}, y={}".format(x, y))
print("Rectangle Width (cm): {}, Height (cm): {}".format(width_cm, height_cm))
# 繪制黃色圓點(diǎn)標(biāo)記矩形框中心位置
img.draw_circle(x, y, 5, color=(255, 255, 0), thickness=2)
## 運(yùn)行效果
將硬件連接好后,上傳代碼到OpenMV開發(fā)板,并調(diào)整舵機(jī)參數(shù)和位置。運(yùn)行代碼后,你將看到舵機(jī)沿著目標(biāo)矩形框移動(dòng),并在圖像中標(biāo)記出矩形框的位置和中心點(diǎn)。
## 結(jié)束語
通過本文的實(shí)現(xiàn),我們成功搭建了一個(gè)運(yùn)動(dòng)目標(biāo)控制與自動(dòng)追蹤系統(tǒng)。通過使用OpenMV開發(fā)板和舵機(jī),我們能夠在圖像中識別目標(biāo),并控制舵機(jī)使其跟蹤目標(biāo)。
## 參考鏈接
1. OpenMV官方網(wǎng)站: https://openmv.io/
2. Pyb Servo文檔: https://docs.openmv.io/library/pyb.Servo.html文章來源:http://www.zghlxwxcb.cn/news/detail-625119.html
歡迎大家提出寶貴的意見和建議,共同探討學(xué)習(xí)和改進(jìn)。謝謝閱讀!文章來源地址http://www.zghlxwxcb.cn/news/detail-625119.html
到了這里,關(guān)于【2023年電賽】運(yùn)動(dòng)目標(biāo)控制與自動(dòng)追蹤系統(tǒng)(E 題)最簡單實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!