当前位置:网站首页>Openmv realizes color tracking
Openmv realizes color tracking
2022-07-16 06:54:00 【The endeavor】
One 、 Driver code
from pyb import Pin, Timer
inverse_left=False #change it to True to inverse left wheel
inverse_right=False #change it to True to inverse right wheel
# The four pins respectively control the direction of motor movement of the two pins
ain1 = Pin('P0', Pin.OUT_PP)
ain2 = Pin('P1', Pin.OUT_PP)
bin1 = Pin('P2', Pin.OUT_PP)
bin2 = Pin('P3', Pin.OUT_PP)
# First set the four pins to low level
ain1.low()
ain2.low()
bin1.low()
bin2.low()
pwma = Pin('P7')
pwmb = Pin('P8')
tim = Timer(4, freq=1000) # Set the timer 4
ch1 = tim.channel(1, Timer.PWM, pin=pwma) # Set up channels 1
ch2 = tim.channel(2, Timer.PWM, pin=pwmb) # Set up channels 2
ch1.pulse_width_percent(0) # Set the duty cycle of the channel 0
ch2.pulse_width_percent(0) # Set the duty cycle of the channel 0
def run(left_speed, right_speed): # Define a RUN function
if inverse_left==True:
left_speed=(-left_speed)
if inverse_right==True:
right_speed=(-right_speed)
if left_speed < 0:
ain1.low()
ain2.high()
else:
ain1.high()
ain2.low()
ch1.pulse_width_percent(int(abs(left_speed)))# Set the left wheel duty cycle
if right_speed < 0:
bin1.low()
bin2.high()
else:
bin1.high()
bin2.low()
ch2.pulse_width_percent(int(abs(right_speed)))# Set the duty cycle of the right wheel
Two 、PID Adjustment code
from pyb import millis
from math import pi, isnan
class PID:
_kp = _ki = _kd = _integrator = _imax = 0
_last_error = _last_derivative = _last_t = 0
_RC = 1/(2 * pi * 20)
def __init__(self, p=0, i=0, d=0, imax=0):
self._kp = float(p)
self._ki = float(i)
self._kd = float(d)
self._imax = abs(imax)
self._last_derivative = float('nan')
def get_pid(self, error, scaler):
tnow = millis()
dt = tnow - self._last_t
output = 0
if self._last_t == 0 or dt > 1000:
dt = 0
self.reset_I()
self._last_t = tnow
delta_time = float(dt) / float(1000)
output += error * self._kp
if abs(self._kd) > 0 and dt > 0:
if isnan(self._last_derivative):
derivative = 0
self._last_derivative = 0
else:
derivative = (error - self._last_error) / delta_time
derivative = self._last_derivative + \
((delta_time / (self._RC + delta_time)) * \
(derivative - self._last_derivative))
self._last_error = error
self._last_derivative = derivative
output += self._kd * derivative
output *= scaler
if abs(self._ki) > 0 and dt > 0:
self._integrator += (error * self._ki) * scaler * delta_time
if self._integrator < -self._imax: self._integrator = -self._imax
elif self._integrator > self._imax: self._integrator = self._imax
output += self._integrator
return output
def reset_I(self):
self._integrator = 0
self._last_derivative = float('nan')
3、 ... and 、 Main function code :
# Blob Detection Example
#
# This example shows off how to use the find_blobs function to find color
# blobs in the image. This example in particular looks for dark green objects.
import sensor, image, time
import car
from pid import PID
# You may need to tweak the above settings for tracking green things...
# Select an area in the Framebuffer to copy the color settings.
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. In color recognition , Be sure to turn off white balance , Otherwise, the effect of color tracking will be affected
clock = time.clock() # Tracks FPS.
# For color tracking to work really well you should ideally be in a very, very,
# very, controlled enviroment where the lighting is constant...
green_threshold = (76, 96, -110, -30, 8, 66)
red_threshold = (55 , 80 , 20 , 70 , 0 , 25)
size_threshold = 2000 # Pixel point . You can adjust pixels , Adjust the range of color tracking
x_pid = PID(p=0.5, i=1, imax=100) # Control the direction of the motor , If the angle of the corner is very large , Adjust the p value
h_pid = PID(p=0.05, i=0.1, imax=50) # Control the speed of the trolley , If the speed is too fast , Can be adjusted P value
def find_max(blobs): # This function is to find the field of view , The biggest color block
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 an image from the field of view
blobs = img.find_blobs([green_threshold])
if blobs:
max_blob = find_max(blobs)
x_error = max_blob[5]-img.width() # Setting adjustment PID Parameters of
h_error = max_blob[2]*max_blob[3]-size_threshold
print("x error: ", x_error)
''' for b in blobs: # Draw a rect around the blob. img.draw_rectangle(b[0:4]) # rect img.draw_cross(b[5], b[6]) # cx, cy '''
img.draw_rectangle(max_blob[0:4]) # rect
img.draw_cross(max_blob[5], max_blob[6]) # cx, cy
x_output=x_pid.get_pid(x_error,1) # obtain PID The final result
h_output=h_pid.get_pid(h_error,1)
print("h_output",h_output)
car.run(-h_output-x_output,-h_output+x_output)# control PID The duty cycle from the rear to the trolley
else:
car.run(18,-18)
In this paper openMV You can find it on the official website of ( It is only convenient for me to find ):openMV Tracking car
边栏推荐
猜你喜欢
![[introduction to go language] 05 go language branch statement](/img/cb/9830418c0e14b40fb15cfb68966426.png)
[introduction to go language] 05 go language branch statement

学完C语言能干啥?先来做个推箱子吧~(有图片呦)

The use of gy-53 infrared laser ranging module and the realization of PWM mode code

使用Idea IntelliJ查看字节码文件

将字符串s1中所有出现在字符串s2中的字符删除

寶塔面板在同一服務器下創建多個端口部署項目(輕量應用服務器一鍵部署網站、博客、GltLab完整版)

2022.6.24~2022.8.26 假期学习计划

ArkUI路由跳转概览

How to use the virtual oscilloscope in keil5 for software simulation

Chapter 4 stm32+ld3320+syn6288+dht11 realize voice acquisition of temperature and humidity values (Part 1)
随机推荐
C language converts arrays into binary trees
Chapter I use of DHT11 temperature and humidity sensor
Promise --- synchronize? Asynchronous?
Virtual memory location structure (reserved area, code area, stack area, heap area, literal constant area) and variable modifiers (const, auto, static, register, volatile, extern)
Pagoda panel creates multiple port deployment projects under the same server (lightweight application server one click deployment website, blog, gltlab full version)
Using idea IntelliJ to view bytecode files
I learned JWT single sign on with a cup of tea
go语言websocket库Gorilla Websocket
快速入门ElasticSercher
Overview of arkui route jump
Summary of working methods
Holiday study plan from June 24, 2022 to August 26, 2022
002 pointers and functions
JVM annual ecosystem report - 2020
Summary of some usage methods of mpu6050
[introduction to go language] 11 go language functions
Friendly zeropi uboot, kernel compilation,
01 machine learning: evaluation indicators
Supervisor series: 4. Sub process
3.6 formatting numbers and strings