本文记录了参加2019年全国大学生电子竞赛的一些体会。

准备过程😬

暑假期间,我和我们组的两个人一起在学校集中进行全国大学生电子竞赛的培训,虽然整个过程很苦,但是能取得省级二等奖的成绩(去测试的时候失误了~~在学校打得挺准的),也算是有一点回报吧。

我是负责视觉设计的,也帮写程序的同学想想控制算法,最后会附上我们的视觉程序供大家来学习。

一些体会👇

比赛过程中,三个人一定要配合好,各自把自己的任务干好,还有就是坚决不要放弃,我们就是比赛的最后一天才把电磁炮做出来,然后赶紧测试,晚上8点之前交作品还是绰绰有余的。

电赛找到一个好的指导老师非常关键,无论是在知识上还是精神上,都能够给你提供帮助。我们的指导老师就很好,整个过程陪着我们,帮我们想方案,帮我们找问题,看到他就觉得安心。

下边是我们的视觉代码,有兴趣的可以参考一下。

import  sensor, image, time, pyb
from pyb import UART
from struct import pack
import math
​
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_brightness(0)
#sensor.skip_frames(10)
sensor.set_auto_whitebal(False)
clock = time.clock() # 追踪帧率
​
​
uart = UART(3, 115200)
​
fx = 279.4808 #.4808
fy = 279.4204 #.4204
cx = 133.6368
cy = 123.6917
​
K = 5120
buf_d = [0,0,0,0,0]
​
​
BLACK = (0, 43, -12, 4, -10, 9)
BALL = (23, 97, 48, 127, -37, 62)
​
img = sensor.snapshot()
black_blobs = img.find_blobs([BLACK], pixels_threshold=9000)
board_roi = (1,1,500,500)
ball_blobs = img.find_blobs([BALL], roi=board_roi, pixels_threshold=100, merge=True, margin=1)
​
if ball_blobs:
    for ball_blob in ball_blobs:
        img.draw_rectangle(ball_blob[0:4])
        img.draw_cross(ball_blob[5], ball_blob[6], size=50)
if black_blobs:
    for black_blob in black_blobs:
        img.draw_rectangle(board_roi[0:4])
​
def find_max(blobs):
    max_size=0
    for blob in blobs:
        if blob.pixels() > max_size:
            max_blob=blob
            max_size = blob.pixels()
    return max_blob
​
​
while(True):
    frame_fps =clock.fps()
​
    img = sensor.snapshot()
    ball_blobs = img.find_blobs([BALL], roi=board_roi, pixels_threshold=100, merge=True, margin=1)
​
    if ball_blobs:
        max_blob = find_max(ball_blobs)
        target_x = 135
        target_y = 120
​
        img.draw_rectangle(max_blob.rect()) # rect
        img.draw_cross(max_blob.cx(), max_blob.cy()) # cx, cy
        #print(max_blob.cx(),max_blob.cy())
​
        yaw = math.atan((max_blob.cx() - cx) / fx) - math.atan((target_x - cx) / fx)
        pitch = math.atan((max_blob.cy() - cy) / fy) - math.atan((target_y - cy) / fy)
        #print(math.atan((last_x - cx) / fx))
        #print("yaw: ", yaw)
        #print("pitch: ", pitch)
        yaw*=180/3.141592
        pitch*=180/3.141592
​
        buf_d[0] = K / ((max_blob.w()+max_blob.h())/2)
        buf_d[4]=buf_d[3];buf_d[3]=buf_d[2];buf_d[2]=buf_d[1];buf_d[1]=buf_d[0];
        D_buf=sorted(buf_d)
        D = D_buf[2]
​
        print("yaw: ", yaw)
        print("pitch: ", pitch)
        print("Dis:", D)
        D = K/max_blob.w()
        #K = max_blob.w()*128
        #print(K)
        #print(D)
        datap = pack('bbbbfffbb',0x35,0x46,0x57,0x24, float(yaw), float(pitch), float(D), 0xBB, 0xAA)
        print('you send:',datap)
        uart.write(datap)

基本的思路非常简单,找到最大的红色块,然后通过小孔成像原理算出来舵机需要变换的角度。

写在最后🎃

虽然没能取得好的成绩,但是整个过程我觉得自己提升不少,希望自己能再接再厉,争取下一次取得更好的成绩!

对了,补充一点,去测试的过程心态一定要放平,还有就是最后一刻一定不要动结构!!!我们就是吃了这个的亏~~

本文结束,感谢阅读!

Time waits for no one!