ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-01-19 12:29:57  阅读:361  来源: 互联网

标签:sensor angle err 电子设计 global integral 2020 0.0 板球


主要道具,星瞳科技的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')




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

标签:sensor,angle,err,电子设计,global,integral,2020,0.0,板球
来源: https://blog.csdn.net/peizhecpp/article/details/112807408

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有