网站建设 需要注意什么,管理咨询师,淘宝客做网站可行么,厦门功夫广告设计网站建设工作室前言 #xff08;1#xff09;废话少说#xff0c;很多人可能无法访问GitHub#xff0c;所以我直接贴出可能要用的代码。此博客还会进行更新#xff0c;先贴教程和代码 #xff08;2#xff09;视频教程#xff1a; https://singtown.com/learn/49603/ #xff08;31废话少说很多人可能无法访问GitHub所以我直接贴出可能要用的代码。此博客还会进行更新先贴教程和代码 2视频教程 https://singtown.com/learn/49603/ 3有些人肯定说红点太小了OpenMV不行精度不够看这个C站上做出来的阈值代码https://blog.csdn.net/weixin_52385589/article/details/126334744 4**赛事方肯定不可能直接让你上现成的玩意不然比赛的意义在哪里**我看了一下网上的一些讨论。肯定是要用摄像头的K210好像有官方库K210的同学可以了解一下。 5OpenMV的话需要多训练建议最好做灯光补偿毕竟OpenMV对灯光要求很高环境光线一点要稳定 硬件注意事项
接线问题 1我们这里是使用的OpenMV的P8和P7引脚。所以建议引脚如下图引出。 2舵机一般是5V供电所以注意VCC是供5V的电压。而右边那两个GND和VCC是连接OpenMV的。如果右边的VCC是连接OpenMV的VIN引脚就可以供5V电。如果是连接OpenMV的3.3V引脚iu只能供3.3V电压。否则OpenMV会被烧掉 3舵机的VCC要直接连接电池因为如果通过OpenMV连接OpenMV的输出电流太小带不动舵机 出现Frame capture has timed out. 帧捕获超时了 1如果是我贴出来的代码出现这个bug。你重新开机启动应该就可以了。 2如果还不可以就说明你OpenMV坏了。要快点换一个。 main.py
代码
import sensor, image, timefrom pid import PID
from pyb import Servo #从内置pyb导入servo类也就是舵机控制类pan_servoServo(1) #定义两个舵机对应P7引脚
tilt_servoServo(2) #定义两个舵机对应P8引脚pan_servo.calibration(500,2500,500)
tilt_servo.calibration(500,2500,500)red_threshold (13, 49, 18, 61, 6, 47) #设置红色阈值pan_pid PID(p0.07, i0, imax90) #PID参数只需要调整P量即可
tilt_pid PID(p0.05, i0, imax90) #脱机运行或者禁用图像传输使用这个PID
#pan_pid PID(p0.1, i0, imax90)#在线调试使用这个PID
#tilt_pid PID(p0.1, i0, imax90)#在线调试使用这个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() # 追踪帧率影响不大#__________________________________________________________________
#定义寻找最大色块的函数因为图像中有多个色块所以追踪最大的那个
def find_max(blobs):max_size0for blob in blobs:if blob[2]*blob[3] max_size:max_blobblobmax_size blob[2]*blob[3]return max_blob#__________________________________________________________________
while(True):clock.tick() # 跟踪快照()之间经过的毫秒数。img sensor.snapshot() # 截取一张图片blobs img.find_blobs([red_threshold]) #识别红色阈值if blobs: #如果找到红色色块max_blob find_max(blobs) #调用上面自定义函数找到最大色块pan_error max_blob.cx()-img.width()/2tilt_error max_blob.cy()-img.height()/2print(pan_error: , pan_error)img.draw_rectangle(max_blob.rect()) # 在找到最大色块画一个矩形框img.draw_cross(max_blob.cx(), max_blob.cy()) # cx, cypan_outputpan_pid.get_pid(pan_error,1)/2tilt_outputtilt_pid.get_pid(tilt_error,1) #上面两个都说进行PID运算print(pan_output,pan_output)pan_servo.angle(pan_servo.angle()pan_output) #将最终值传入两个舵机中追踪目标tilt_servo.angle(tilt_servo.angle()-tilt_output)# 因为两个舵机方向和摆放位置不同所以一个是一个是-
舵机控制
舵机选择 1Servo是舵机控制类。因为我们使用from pyb import Servo直接从pyd导入了servo类。所以可以直接写成Servo()。 2引脚对应关系Servo(1)——P7Servo(2)——P8Servo(3)——P9。 3 1因此我们可以知道pan_servo.calibration就是对P7进行相应的控制因为pan_servoServo(1)。 2tilt_servo.calibration就是对P8控制因为tilt_servoServo(2) 舵机选择
颜色阈值设置 1因为我们要追踪红色所以是使用red_threshold (13, 49, 18, 61, 6, 47) 进行设置阈值。 2颜色阈值设置教程OpenMV颜色阈值设置 帧率禁用 1当OpenMV连接电脑端IDE的时候运行帧率和不连接电脑端IDE是不一样的。因为我们连接上电脑端IDE的时候OpenMV会向电脑端IDE传输数据所以会导致帧率下降。 2帧率下降会导致我们实际脱机跑的时候PID参数和连接上电脑端IDE时候的PID参数不一样。 3所以我们需要点击电脑端右上角的禁用或者是Disable。被禁用之后我们的效果就是脱机之后真实运行效果。 PID的P和I参数设置 1注意因为云台是比较稳定的不要求高反应速度所以我猜测只使用了PI而没有使用PID。因此我们可以看到pan_pid和tilt_pid只有P和I两个参数。 2I的参数不需要进行调整如果你的云台抖动厉害说明P过大了需要调小。 3如果你感觉你云台反应太慢就需要调高P值。 4最佳的P值是你云台有抖动的前一个值。这个才是P的最优值。但是我认为P没必要太大因为云台还是比较稳的。 pid.py 1这里面的代码我们不需要管就算PID的代码。 2再次强调这里请别擅自更改出现问题自己负责。 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, p0, i0, d0, imax0):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)E题官方解释
1问E题可以使用openmv吗 答E题只禁止笔记本和台式机。其他任意 2问E题目标运动追踪系统能用树莓派不 答同上。 3问E题云台和屏幕的高度关系是怎么样的 答自定。 4问请问e题基本要求(1)进行自动复位时屏幕的位置是一直固定吗 答当然只有绿色激光笔可以移动。 5问E题中主板能用stm32的战舰精英mini版吗E题中基本要求一测试完之后是否可以复位 6问请问E题运动目标控制与自动追踪系统中的屏幕对材质有什么特殊要求吗 答白色。 7问E题 1. 摄像头模块的摆放位置是否有要求题目中未提及2. 现场测试的屏幕材料是否确定可否提供材料名称 答屏幕可自带。其他自定。 8问E题封装时屏幕和靶纸要一起封入带去吗还是测试时由组委会提供所有队伍统一使用的 答封箱后自己带。赛区不提供屏幕和靶纸。 9问E题中的两种激光笔测试开始后是一直要亮着吗 答自定。 10问E题的基础部分第一问里边的“在任意位置按下按键可以复位”任意位置需要我们自己能达到还是说只需要把重点放在能复位 答题目已经说的很清楚光斑处在任意位置都可通过复位功能回到原点 11问E题屏幕高度有要求么 答自定。 12问E题基础部分第一问的“任意位置都可以复位”我们需要自己写程序让激光笔达到人意位置然后再按下按键复位还是说到哪个位置不需要管只要能做到复位就可以了 答题目已经说的很清楚光斑处在任意位置都可通过复位功能回到原点。 13问测试场地屏幕是否与外界环境线条分界明显 答没有要求。