• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

openmv模板匹配+控制舵机来控制小车使P点触碰到靶心

武飞扬头像
~柠檬味~
帮助1

(注:每行代码的解释均已标注,适合复习使用和openmv新手学习)

  1.  
    import sensor, time, image
  2.  
    from image import SEARCH_EX, SEARCH_DS
  3.  
    from pyb import UART
  4.  
    from pid import PID
  5.  
    from pyb import Servo
  6.  
    import ustruct
  7.  
    import json

定义舵机,servo(1)用的是openmv的p7引脚,servo(2)用的是openmv的p8引脚,servo(3)用的是openmv的p9引脚

pan_servo=Servo(1)#舵机1

设置对应的脉宽,分别对应为:允许的最小脉宽:500、允许的最大脉冲:2500、中心/零位置对应的脉宽:500

pan_servo.calibration(500,2500,500)

pid包的函数,设置舵机的pid参数,一般只需要调整p,如果云台抖动的很厉害(速度过快),可以将p调小

pan_pid = PID(p=0.07, i=0, imax=90)

接下来就是常规设置

  1.  
    # Reset sensor
  2.  
    sensor.reset()#c初始化摄像头
  3.  
  4.  
    # Sensor settings
  5.  
    sensor.set_contrast(3)#设置对比度
  6.  
    sensor.set_gainceiling(16)#设置图像增益
  7.  
    sensor.set_framesize(sensor.QQVGA)#设置图像分辨率
  8.  
    sensor.set_windowing((320, 240))#将相机的分辨率设置为当前分辨率的子分辨率
  9.  
    sensor.set_pixformat(sensor.GRAYSCALE)#设置图像格式为灰度图
  10.  
  11.  
    sensor.skip_frames(time = 2000)# 跳过2000s,使新设置生效,并自动调节白平衡
  12.  
    sensor.set_auto_gain(False, value=100)#关闭自动自动增益。默认开启的,在颜色识别中,一定要关闭白平衡。
  13.  
  14.  
    clock = time.clock() # 追踪帧率
  15.  
  16.  
  17.  
    uart = UART(3, 115200)#初始化串口号及其波特率
学新通

设置给32传递数据的函数

  1.  
    def sending_data(cx,cy):
  2.  
       global uart;
  3.  
       #frame=[0x2C,18,cx%0xff,int(cx/0xff),cy%0xff,int(cy/0xff),0x5B];
  4.  
       #data = bytearray(frame)
  5.  
       data = ustruct.pack("<bbhhb",      #格式为俩个字符俩个短整型(2字节)
  6.  
                      0x2C,                      #帧头1
  7.  
                      0x12,                      #帧头2
  8.  
                      int(cx), # up sample by 4   #数据1
  9.  
                      int(cy), # up sample by 4   #数据2
  10.  
                      0x5B)
  11.  
       uart.write(data);   #必须要传入一字节的数组,这个函数似乎不能发送单个字节,必须得一次发送多个字节

通过在IDE视图窗口的截图,保存目标模板,如进行多模板匹配则保存多个

  1.  
    templates2 = ["/2.1.pgm", "/2.2.pgm", "/2.3.pgm", "/2.4.pgm"] #保存多个模板
  2.  
    templates1 = ["/1.1.pgm", "/1.2.pgm", "/1.3.pgm", "/1.4.pgm"] #保存多个模板
  3.  
    templates4 = ["/2.1.pgm", "/2.2.pgm", "/2.3.pgm", "/2.4.pgm"] #保存多个模板
  4.  
    templates3 = ["/1.1.pgm", "/1.2.pgm", "/1.3.pgm", "/1.4.pgm"]

设置舵机转到的角度

  1.  
    pan_servo.angle(45)#可以直接设置舵机直接转到45度
  2.  
    #控制舵机的相关代码
  3.  
    #s1 = Servo(1) # 设置引脚
  4.  
    #s1.angle(45) # 转到45度
  5.  
    #s1.angle(-60, 1500) # 1.5s内转到-60度
  6.  
    #s1.speed(50) # 用于连续旋转舵机时的速度设置

最后就是小车的运行过程(根据比赛要求编写):

  1.  
    while (True):
  2.  
       clock.tick()
  3.  
       img = sensor.snapshot()# 从感光芯片获得一张图像
  4.  
       for t1 in templates1:
  5.  
           template1 = image.Image(t1)
  6.  
           #对每个模板遍历进行模板匹配
  7.  
           r1 = img.find_template(template1, 0.70, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))
  8.  
       #find_template(template, threshold, [roi, step, search]),threshold中
  9.  
       #的0.7是相似度阈值,roi是进行匹配的区域(左上顶点为(10,0),长80宽60的矩形),
  10.  
       #注意roi的大小要比模板图片大,比frambuffer小。
  11.  
       #把匹配到的图像标记出来
  12.  
           if r1:
  13.  
               img.draw_rectangle(r1)
  14.  
               print(t1) #打印模板名字
  15.  
               #发送数据让小车转向靶子
  16.  
               sending_data(0,0)
  17.  
               break
  18.  
       for t2 in templates2:
  19.  
           template2 = image.Image(t2)
  20.  
           #对每个模板遍历进行模板匹配
  21.  
           r2 = img.find_template(template2, 0.70, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))
  22.  
       #find_template(template, threshold, [roi, step, search]),threshold中
  23.  
       #的0.7是相似度阈值,roi是进行匹配的区域(左上顶点为(10,0),长80宽60的矩形),
  24.  
       #注意roi的大小要比模板图片大,比frambuffer小。
  25.  
       #把匹配到的图像标记出来
  26.  
           if r2:
  27.  
               img.draw_rectangle(r2)
  28.  
               print(t2) #打印模板名字
  29.  
               print('1,1')
  30.  
               sending_data(1,1)#发送信号小车STOP
  31.  
               pan_servo.angle(-45)
  32.  
               time.sleep_ms(5000)
  33.  
               sending_data(2,2)#发送信号小车倒车
  34.  
               time.sleep_ms(800)
  35.  
               break
  36.  
       for t3 in templates3:
  37.  
           template3 = image.Image(t3)
  38.  
           #对每个模板遍历进行模板匹配
  39.  
           r3 = img.find_template(template3, 0.70, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))
  40.  
       #find_template(template, threshold, [roi, step, search]),threshold中
  41.  
       #的0.7是相似度阈值,roi是进行匹配的区域(左上顶点为(10,0),长80宽60的矩形),
  42.  
       #注意roi的大小要比模板图片大,比frambuffer小。
  43.  
       #把匹配到的图像标记出来
  44.  
           if r3:
  45.  
               img.draw_rectangle(r3)
  46.  
               print(t3) #打印模板名字
  47.  
               #发送数据让小车转向靶子
  48.  
               sending_data(3,3)
  49.  
               break
  50.  
       for t4 in templates4:
  51.  
           template4 = image.Image(t4)
  52.  
           #对每个模板遍历进行模板匹配
  53.  
           r4 = img.find_template(template4, 0.70, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))
  54.  
       #find_template(template, threshold, [roi, step, search]),threshold中
  55.  
       #的0.7是相似度阈值,roi是进行匹配的区域(左上顶点为(10,0),长80宽60的矩形),
  56.  
       #注意roi的大小要比模板图片大,比frambuffer小。
  57.  
       #把匹配到的图像标记出来
  58.  
           if r4:
  59.  
               img.draw_rectangle(r4)
  60.  
               print(t4) #打印模板名字
  61.  
               print('4,4')
  62.  
               sending_data(4,4)#发送信号小车STOP
  63.  
               break
  64.  
               #pan_servo.angle(-45)
  65.  
               #time.sleep_ms(5000)
  66.  
               #sending_data(2,2)#发送信号小车倒车
  67.  
               #time.sleep_ms(800)
  68.  
       # Draw FPS
  69.  
       #打印帧率。
  70.  
       img.draw_string(0, 0, "FPS:%.2f"%(clock.fps()))
  71.  
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhhkjjgg
系列文章
更多 icon
同类精品
更多 icon
继续加载