完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
任务
比赛要求在三个不同颜色的球球中,识别绿球球的位置,并且用机械臂抓取。然后在通过门之后,识别路标,判断左右转。 串口通信 OpenMV与STM32通信的方式是串口通信,使用openmv简单的串口配置。 因为视觉部分有两个任务,所以用单片机给STM32发送“1”,开始颜色识别,发送“2”,开始特征点识别。不发送则不识别。 我串口一开始使用了正点原子的STM32精英板,串口就是发不出来,串口程序看了无数遍,心里想,自己虽然菜,但是串口还是能写的吧。 直到后来发现没有加跳线帽,感叹一下自己好蠢。 识别色块 代码使用了OpenMV内置函数来找色块,并且把红绿蓝三个颜色的中心位置保存起来,进行比较,串口输出绿球球所处的位置。 还没有写特征点识别的内容。 玄学报错 OpenMV在编译的过程中,如果没有变量提前初始化,直接写 cx = blob.cx() 会出现一定概率的报错,之前调试的过程中,大约60%的几率可以运行,40%的几率编译器会报错,这种同一片代码,同一个编译器,每次运行结果不同,我还是第一次遇到,解决方法也很简单只需要在使用变量前提前初始化即可,报错就不会出现了。有趣而又玄妙的OpenMV!! 虽然解决之后感觉简单,但是最后加上这句话花了我大概三天!!太恶心了!! cx = 0 随后附上代码 import sensor, image, time, math from pyb import UART threshold_index = 0 thresholds = thresholds = [(11, 15, 19, 35, -27, 35), #red (7, 17, -73, 14, -46, -16), #blue (11, 68, -87, -22, -27, 58)] #green sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time = 2000) sensor.set_auto_gain(False) # must be turned off for color tracking sensor.set_auto_whitebal(False) # must be turned off for color tracking clock = time.clock() def draw_keypoints(img, kpts): if kpts: print(kpts) img.draw_keypoints(kpts) img = sensor.snapshot() time.sleep(1000) #初始化串口 uart = UART(3, 115200) uart.init(115200, bits=8, parity=None, stop=1) #初始化变量 x = 0 Res = 0 green_position = 0 send_1 = 0 #颜色识别模块发送的内容 send_2 = 0 #特征点匹配模块发送的内容 x_red = 0 x_blue = 0 x_green = 0 Num_Blob = 0 while(True): if (uart.any()) : R=uart.readline().decode().strip() Res = int(R) #print(Res) #设定openmv模式,1为颜色识别,2为特征点匹配 #uart.writechar("Res") if(Res == 1): clock.tick() img = sensor.snapshot() #for blob in img.find_blobs(thresholds, pixels_threshold=200, area_threshold=200): #if(blob.code()==7): for blob in img.find_blobs([thresholds[0]], pixels_threshold=200, area_threshold=200): x_red = blob.cx() for blob in img.find_blobs([thresholds[1]], pixels_threshold=200, area_threshold=200): x_blue = blob.cx() for blob in img.find_blobs([thresholds[2]], pixels_threshold=200, area_threshold=200): x_green = blob.cx() if(x_green < x_red and x_green < x_blue): send_1 = 1 elif(x_green > x_red and x_green < x_blue): send_1 = 2 elif(x_green < x_red and x_green > x_blue): send_1 = 2 elif(x_green > x_red and x_green > x_blue): send_1 = 3 #发串口 uart.write('%d' %(send_1)) Res = 0 if(Res == 2): uart.write('%d' %(send_2)) Res = 0 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1856浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 22:45 , Processed in 1.157674 second(s), Total 81, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号