代码是官方的代码,备注是自己加的,后续会改进
实验效果:

main.py:

import sensor, image, timefrom pid import PID
from pyb import Servopan_servo=Servo(1)# P7  底
tilt_servo=Servo(2)# P8 台
#s3 = Servo(3) # P9
pan_servo.calibration(500,2500,500)  #底  500-2500  中心值1500
tilt_servo.calibration(500,2500,500) #台red_threshold  = (9, 25, -28, -11, -33, 20)  #颜色阈值#pan_pid = PID(p=0.07, i=0, imax=90) #脱机运行或者禁用图像传输,使用这个PID
#tilt_pid = PID(p=0.05, i=0, imax=90) #脱机运行或者禁用图像传输,使用这个PID
pan_pid = PID(p=0.1, i=0, imax=90)#在线调试使用这个PID
tilt_pid = PID(p=0.1, i=0, imax=90)#在线调试使用这个PIDsensor.reset() # 初始化摄像机传感器。
sensor.set_pixformat(sensor.RGB565) # 使用RGB565
sensor.set_framesize(sensor.QQVGA) # 速度使用QQVGA
sensor.skip_frames(10) # 让新设置生效。
sensor.set_auto_whitebal(False) # 关白平衡。。。。(导致每次开机都会自动搞出一个颜色,颜色识别会有问题)
clock = time.clock() # 跟踪FPS。赋值clock为现在的fps,超级低def find_max(blobs):max_size=0for blob in blobs:if blob[2]*blob[3] > max_size:max_blob=blobmax_size = blob[2]*blob[3]return max_blobwhile(True):clock.tick() #跟踪快照之间经过的毫秒数().img = sensor.snapshot() # 拍一张照片,然后返回图像。blobs = img.find_blobs([red_threshold])  #赋值blobs为找到红色像素的值if blobs:max_blob = find_max(blobs)          #找最大的色块#print("cx: ", max_blob.cx())             #打印X的的位置#print("cy: ", max_blob.cy())             #打印Y的的位置pan_error = max_blob.cx()-img.width()/2    #底的误差为最大色块所在的X轴-宽(宽固定=160  /2=80)我理解为取XY中心点tilt_error = max_blob.cy()-img.height()/2  #台的误差为最大色块所在的Y轴-高(120)#        print("pan_error: ", pan_error)             #打印底的偏差print("tilt_error: ", tilt_error)             #打印台的偏差'比如说现在X的距离是159 目标中心偏差159-img.width()/2=79'img.draw_rectangle(max_blob.rect()) # 矩形img.draw_cross(max_blob.cx(), max_blob.cy()) # cx, cy 交叉pan_output=pan_pid.get_pid(pan_error,1)/2    #底的转动=获取的PID值    get_pid(self, error, scaler)/2tilt_output=tilt_pid.get_pid(tilt_error,1)   #台的转动=获取的PID值    get_pid(self, error, scaler) 也可以除以2 走慢一点罢了'可以这样子理解,这个pid的函数是想使偏差=0'
#        print("pan_output",pan_output)print("tilt_output",tilt_output)pan_servo.angle(pan_servo.angle()+pan_output)    #底部舵机转动的角度为上一个角度+现在的输出(偏差)角度tilt_servo.angle(tilt_servo.angle()-tilt_output) #上面舵机转动的角度为上一个角度-现在的输出(偏差)角度  因为是倒转 所以是减print("tilt_servo.angle:",tilt_servo.angle())

官方PID算法:
pid.py

from pyb import millis
from math import pi, isnanclass 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_toutput = 0if self._last_t == 0 or dt > 1000:dt = 0self.reset_I()self._last_t = tnowdelta_time = float(dt) / float(1000)output += error * self._kpif abs(self._kd) > 0 and dt > 0:if isnan(self._last_derivative):derivative = 0self._last_derivative = 0else:derivative = (error - self._last_error) / delta_timederivative = self._last_derivative + \((delta_time / (self._RC + delta_time)) * \(derivative - self._last_derivative))self._last_error = errorself._last_derivative = derivativeoutput += self._kd * derivativeoutput *= scalerif abs(self._ki) > 0 and dt > 0:self._integrator += (error * self._ki) * scaler * delta_timeif self._integrator < -self._imax: self._integrator = -self._imaxelif self._integrator > self._imax: self._integrator = self._imaxoutput += self._integratorreturn outputdef reset_I(self):self._integrator = 0self._last_derivative = float('nan')

Openmv云台寻找最大色块相关推荐

  1. 【毕业设计】基于STM32及OpenMV的云台追踪装置

    目录 修改记录 1.摘 要 2.整体功能分析 3.硬件选型 3.1 OpenMV4 Cam H7 3.2 STM32F103ZET6 3.3 DS3120舵机 3.4 LED补光板 3.5 供电及稳压 ...

  2. 匿名飞控openmv寻色块代码分析

    本人最近一段时间在学习匿名飞控(使用的是匿名拓空者),也去网上看了很多资料和一些大佬的见解,学到了一些东西,所以想和大家一起学习讨论一下,互帮互助,共同进步.同时也是为了方便查找,防止遗忘.若是我有什 ...

  3. OpenMV零基础教程

    一.资料导航 "工欲善其事,必先利其器".在正式学习OpenMV之前,你必须知道一条或几条OpenMV的学习途径.这里推荐星瞳科技的中文官网教程,这个教程里面包括了OpenMV I ...

  4. OpenMv学习总结

    入门阶段 简单来说,OpenMv就是一个可编程的摄像头,通过使用python语言,专门用作嵌入式当中的视觉感光元件.下面将介绍Openmv使用过程中的常用知识. 感光元件 感光元件即sensor模块, ...

  5. OpenMV:23串口发送数据

    文章目录 产品 Hello World 简单的数据发送 本节讲解 如何使用OpenMV通过串口来发送数据 OpenMV 是可以直接通过串口发送字符串的. 为什么要用串口呢?因为要时候需要把信息传给其他 ...

  6. OpenMV入门(下)

    之前的文章篇幅实在有点太大,找起东西来不太方便,我们接着新开的内容继续描述: 接下来我们要进行的内容是目标跟随,但是目前得到的问题是我们不知道我们要跟随的物体是不是固定的,所以我们先用颜色识别来替代 ...

  7. TI杯2019年全国电子设计大赛总结

    文章目录 准备 选题 准备材料 原理设计及仿真 代码部分 摄像头模块 Arduino模块 最后 准备 在比赛开始之前,我们团队对往年的国赛题目进行了分析比较,由于博主是计算机系(之前是电子信息)的小菜 ...

  8. 滚球经验总结(PID)

    1.正点原子STM32F407探索者 + openmv3--串口通信 最近在用stm32f407探索者做滚球,一开始使用的摄像头是openmv3(openmv4太贵)--实时检测小球坐标(x,y),然 ...

  9. 竞赛无人机搭积木式编程——以2022年TI电赛送货无人机一等奖复现为例学习(7月B题)

    在学习本教程前,请确保已经学习了前4讲中无人机相关坐标系知识.基础飞行控制函数.激光雷达SLAM定位条件下的室内定点控制.自动飞行支持函数.导航控制函数等入门阶段的先导教程. 同时用户在做二次开发自定 ...

最新文章

  1. 入门代码教程第一节 如何:定义服务协定
  2. 基于连通域字符分割的流程_基于改进连通域算法的车牌字符分割方法
  3. 携手长江天成转型 谋定·农业大健康-林裕豪:升级山茶油农产品
  4. 一文看懂async和“await”关键词是如何简化了C#中多线程的开发过程
  5. Redis应用场景汇总
  6. 小程序分享如何自定义封面?
  7. pt-query-digest查询日志分析工具
  8. hdu4318 最短路变形
  9. html中置顶的命令行是啥,html怎么把置顶
  10. 如何看待阿里云成立新零售事业部?
  11. schannel: next InitializeSecurityContext failed: SEC_E_ILLEGAL_MESSAGE (0x80090326)
  12. lesson - 7 课程笔记 vim
  13. Spring Boot+Vue项目打包部署
  14. RuntimeError: grad can be implicitly created only for scalar outputs
  15. 【coolshell酷壳】简明 Vim 练级攻略
  16. XMAPP+WordPress建立本地博客(修订2)
  17. mysql 8.0设置密码 (doc命令)
  18. Matlab二维线图对数坐标及与hold on结合的问题
  19. 公共计算机课的价值取向是什么意思,提问:1、新课改与新课程标准的价值取向是什么?...
  20. 关于同一个网络A电脑可以ping通B电脑,而B电脑却ping不通A电脑,但A可以远程连接上B解决方法

热门文章

  1. html a标签禁止跳转,a 标签禁用点击事件跳转
  2. a标签不跳转的3种实现方式
  3. 练习3: 基本数据类型 (第3周)
  4. 如何对语音信箱的多个号码设置不同的默认值
  5. 遇到 com.lowagie.text.DocumentException: Font 'STSong-Light' with 'UniGB-UCS2-H' is not recognized.
  6. GRE写作诀窍:提高运用和表达能力
  7. 什么是ABI? Swift ABI稳定有什么用?
  8. mybatis框架的介绍及使用
  9. table传统布局及实例
  10. Linux目录结构及详细介绍