基于openmv的板球控制系统(2020年电子设计竞赛赛后知识总结)

主要道具,星瞳科技的openmv单片机,两个舵机
主要算法,pid控制

代码不难,只要用心结合openmv的官方教程不难看懂,笔者当时从接触openmv,因为这个单片机是要用Python的。所以当时要学的东西太多了。笔者从接触到调出 这个板球系统用了整整一周的时间。
下面给出代码,里面有详细注释的

视频链接(下面的总结我放到b站上,优酷有广告)
http://v.youku.com/v_show/id_XNTA3MTExMTkwMA==.html?x&sharefrom=android&sharekey=4618fd9708d3175cf06e8f28fc44f53d6

openmv官方教程链接(两个结合着看)
https://docs.singtown.com/micropython/zh/latest/openmvcam/index.html
https://book.openmv.cc/quick-starter.html

当时才接触Python,不理解类,所以直接用函数写的pid效果一样的

import sensor, image, time
from pyb import UART   #开串口但是没有用上
from pyb import Servo  #控制舵机


g_threshold=(41, 65, 60, 85, 0, 65)
blob_res=0       #小球
zhong=0   #剔除一些干扰

#一堆变量和pid有关
setr_x=0.0
actualr_x=0.0
err_x=0.0
last_errx=0.0
kp=0.25
ki=0.02
kd=6
angle_x=0.0
integral_xx=0.0

setr_y=0.0
actualr_y=0.0
err_y=0.0
last_erry=0.0
angle_y=0.0
integral_yy=0.0

#pid
#X轴
def pid_x(x,cxx):
    global setr_x
    global actualr_x
    global err_x
    global last_errx
    global integral_xx
    global kp
    global ki
    global kd

    setr_x=x*1.0
    actualr_x=cxx*1.0
    err_x=setr_x-actualr_x
    integral_xx=integral_xx+err_x
    angle_x=kp*err_x+ki*integral_xx+kd*(err_x-last_errx) #核心
    last_errx=err_x
    return angle_x

#Y轴
def pid_y(y,cyy):
    global setr_y
    global actualr_y
    global err_y
    global last_erry
    global integral_yy
    global kp
    global ki
    global kd

    setr_y=y*1.0
    actualr_y=cyy*1.0
    err_y=setr_y-actualr_y
    integral_yy=integral_yy+err_y
    angle_y=kp*err_y+ki*integral_yy+kd*(err_y-last_erry)  #核心
    last_erry=err_y
    return angle_y


#初始化
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False)    #自动增益
sensor.set_auto_exposure(False,5000)
sensor.set_auto_whitebal(False,[10,0,0])
clock = time.clock()


se1 = Servo(1) # P7 X轴
se2 = Servo(2) # P8 Y轴



while(True):
    clock.tick()
    img = sensor.snapshot()


    #控制舵机并剔除干扰的代码
    blobs=img.find_blobs([g_threshold])
    c_xx=0
    c_yy=0
    print(len(blobs),'ww')  #看看一共有几个颜色在阈值之内的物体

    if blobs:
        for blob1 in blobs:
             zhong=10*blob1.roundness()-6 #因为我找的是一个球,所以这一个公式就可去掉干扰
             if zhong>0:
                 blob_res=blob1   #找到目标的球了
                 zhong=0
    if blobs:
        img.draw_cross(blob_res.cx(),blob_res.cy())   #开始pid
        angle_x=pid_x(78,blob_res.cx())+1
        angle_y=pid_y(95,blob_res.cy())+1
        angle_x=-int(angle_x)
        angle_y=int(angle_y)
        se1.angle(angle_x)  #控制舵机旋转
        se2.angle(angle_y)  #控制舵机旋转
        print(blob_res.cx(),blob_res.cy(),blob_res.area(),'sssss')
        print(angle_x,angle_y,'angle')




你不逼自己一把拥有不知道你有多优秀,只有经历过至暗时刻,才会更加懂得珍惜当下的美好!

上一篇:最美的C语言代码参上


下一篇:linux 命令