当前位置:   article > 正文

使用OPENMV实现寻迹功能_openmv循迹

openmv循迹

一、硬件准备

  1. OPENMV一个

  1. STM32F1系列开发板一个

  1. 小车模型

注意:这里小车模型和STM32F1系列开发板笔者不做演示

二、OPENMV的准备工作

  1. 使用OPENMV线性回归,然后通过串口将线条的水平偏移量和角度偏移量进行输出。

话不多说,直接上代码

  1. THRESHOLD = (59, 25, 127, 19, -128, 89)
  2. import sensor, image, time,lcd
  3. from pyb import LED
  4. from pyb import UART
  5. import ustruct
  6. LED(1).on()
  7. LED(2).on()
  8. LED(3).on()
  9. uart = UART(3,115200,bits=8, parity=None, stop=1, timeout_char = 1000)
  10. sensor.reset()
  11. sensor.set_pixformat(sensor.RGB565)
  12. sensor.set_framesize(sensor.QQQVGA) # 80x60 (4,800 pixels) - O(N^2) max = 2,3040,000.
  13. lcd.init() # Initialize the lcd screen.
  14. sensor.set_vflip(True)
  15. sensor.set_hmirror(True)
  16. #sensor.set_windowing([0,20,80,40])
  17. sensor.skip_frames(time = 2000) # WARNING: If you use QQVGA it may take seconds
  18. clock = time.clock()
  19. # to process a frame sometimes.
  20. def sending_data(data1,data2):
  21. global uart;
  22. data=bytearray([0xA5,data1,data2,0XA6])
  23. '''data1= ustruct.pack("<bbb", #格式为俩个字符俩个短整型(2字节)
  24. 0xA5, #帧头
  25. data1,
  26. data2,
  27. 0xA6
  28. ) ''' #数组大小为7,其中2,3,4,5为有效数据,0,1,6为帧头帧尾
  29. uart.write(data); #必须要传入一个字节数组
  30. #print("head",data[0],"status",data[1],"tail",data[2])
  31. while(True):
  32. clock.tick()
  33. img = sensor.snapshot().binary([THRESHOLD])
  34. #img.mean(0)
  35. line = img.get_regression([(100,100)], robust = True)
  36. #img.midpoint(1, bias=0.5, threshold=True, offset=5, invert=True)
  37. if (line):
  38. '''rho_err = abs(line.rho())-img.width()/2
  39. if line.theta()>90:
  40. theta_err = line.theta()-180
  41. else:
  42. theta_err = line.theta()
  43. img.draw_line(line.line(), color = 127)
  44. print(rho_err,theta_err)
  45. if line.magnitude()>8:
  46. sending_data((int)(rho_err),(int)(theta_err))'''
  47. rho_err = abs(line.rho())
  48. theta_err = line.theta()
  49. img.draw_line(line.line(), color = 127)
  50. if line.magnitude()>8:
  51. sending_data((int)(rho_err),(int)(theta_err))
  52. rho_err_temp = abs(line.rho())-img.width()/2
  53. if line.theta()>90:
  54. theta_err_temp = line.theta()-180
  55. else:
  56. theta_err_temp = line.theta()
  57. print(rho_err_temp,theta_err_temp,line.magnitude())
  58. pass
  59. lcd.display(img)
  60. #print(clock.fps())

注意:代码中THRESHOLD的值需要根据您当前环境进行更改,THRESHOLD为颜色阈值

代码中OPENMV进行串口输出需要注意帧头帧尾,所以STM32这边也需要进行相关数据处理。

下面是演示视频:

https://www.bilibili.com/video/BV1dT411T7Sv/?spm_id_from=333.999.0.0

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/591695
推荐阅读
相关标签
  

闽ICP备14008679号