|
- import sensor, image, time
- from pid import PID
- from pyb import Servo
- pan_servo=Servo(1)
- #tilt_servo=Servo(2)
- s1 = Servo(3) # P9 Only for OpenMV3 M7
- myservo=s1.angle
- s2 = Servo(2) # P9 Only for OpenMV3 M7
- myservow=s2.angle
- red_threshold = (90, 30, -8, -43, 21, 65)
- time.sleep(800)
- myservo(40)
- time.sleep(1000)
- myservo(-50)
- time.sleep(1000)
- myservo(10)
- time.sleep(1000)
- #for i in range(5):
- myservow(20)
- time.sleep(800)
- pan_pid = PID(p=0.09, i=0, imax=90) #脫機(jī)運(yùn)行或者禁用圖像傳輸,使用這個(gè)PID
- tilt_pid = PID(p=0.05, i=0, imax=90) #脫機(jī)運(yùn)行或者禁用圖像傳輸,使用這個(gè)PID
- #pan_pid = PID(p=0.1, i=0, imax=90)#在線調(diào)試使用這個(gè)PID
- #tilt_pid = PID(p=0.1, i=0, imax=90)#在線調(diào)試使用這個(gè)PID
- sensor.reset() # Initialize the camera sensor.
- sensor.set_pixformat(sensor.RGB565) # use RGB565.
- sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
- sensor.skip_frames(10) # Let new settings take affect.
- sensor.set_auto_whitebal(False) # turn this off.
- clock = time.clock() # Tracks FPS.
- K=913#the value should be measured
- def find_max(blobs):
- max_size=0
- for blob in blobs:
- if blob[2]*blob[3] > max_size:
- max_blob=blob
- max_size = blob[2]*blob[3]
- return max_blob
- while(True):
- clock.tick() # Track elapsed milliseconds between snapshots().
- img = sensor.snapshot() # Take a picture and return the image.
- blobs = img.find_blobs([red_threshold])
- if blobs:
- max_blob = find_max(blobs)
- pan_error = max_blob.cx()-img.width()/2
- tilt_error = max_blob.cy()-img.height()/2
- #print("pan_error: ", pan_error)
- img.draw_rectangle(max_blob.rect()) # rect
- img.draw_cross(max_blob.cx(), max_blob.cy()) # cx,
- #print(tilt_servo.angle())
- #print(pan_servo.angle())
- pan_output=pan_pid.get_pid(pan_error,1)/2
- tilt_output=tilt_pid.get_pid(tilt_error,1)
- #print("pan_output",pan_output)
- pan_servo.angle(pan_servo.angle()+pan_output)
- #tilt_servo.angle(tilt_servo.angle()-tilt_output)
- if len(blobs) == 1:
- b = blobs[0]
- Lm = (b[2]+b[3])/2
- length = K/Lm
- print(length)
- print(max_blob.cx(),max_blob.cy())
- widtha=(img.width()/2)*11/10
- widthb=(img.width()/2)*9/10
- heighta=(img.height()/2)*11/10
- heightb=(img.height()/2)*9/10
- if widthb<max_blob.cx()< widtha or heightb< max_blob.cy() < heighta:
- print(231)
- if length < 15:
- print (123)
- for t in range(4):
- myservow(70)
- time.sleep(50)
- if widthb<max_blob.cx()< widtha or heightb< max_blob.cy() < heighta and length < 13 :
- while(True):
- myservo(-40)
- time.sleep(600)
復(fù)制代碼
|
|