【RM2022-飞镖视觉1.0开源】基于FPGA和传统视觉的光点追踪
![花里胡哨的阿天](https://hz-rm-bbs-web-prod.oss-cn-hangzhou.aliyuncs.com/avatar/pre/v1/000042630_avatar_big.jpg)
hello各位RMer大家好,我是花里胡哨的阿天,这次我开源的内容是关于飞镖视觉的开发。飞镖作为2020年加入RM赛场的新机器人,经历了两年的发展,目前出现在赛场上的飞镖还没有自动锁定装甲板,命中率普遍偏低。于是我就在想是否能有一种飞镖自带视觉识别系统,能够在飞行途中修正自己的飞行的轨道,从而击中前哨战以及基地的装甲板。 首先贴上百度网盘链接:https://pan.baidu.com/s/1yT6X-8ZSO-BhuysknCTe-A 提取码:1234
![]()
飞镖视觉需求分析
![]()
![]()
效果展示
![]()
最后本次设计的所有工程我都会开源,有几点在说明一下彩色版本的mt9v034,我遍历了淘宝几乎没有现成的模块购买,现成模块基本都是灰度版本的,但是还好有单独的cmos芯片卖,因此我单独为这个cmos设计了一块pcb,功能很简单结构也不复杂,但是我收到货后发现是拆机片,还好最后上电后没什么问题,感谢淘宝良心商家没有卖我坏芯片。
![]()
![]()
最后这是我第一次对视觉算法经行尝试,算法整体结构比较简单,主要还是利用fpga实现了流水线的处理结构,让高速实时识别成为可能。本次设计中图像的大小被固定在了240*240的大小,这里也是我设计的失误,正常设计中应该将图像大小作为参数的形式在各个模块中传递,而我是直接写在了各种逻辑块中,这就导致了要修改图像的大小会非常的麻烦有众多参数要改。还有一点本次设计中没有加入SPI模块以及其他和32通信模块,在开发阶段,我采用了AXI总线的方式与ARM内核连接实现寄存器写入的操作,使用其他通信接口也是一样只要将通信模块的数接口合理的连接到模块中的阈值设定接口即可,这部分感兴趣的RMer可以自行设计完成,还是比较简单的。另外我也有想过在fpga中部署神经网络的想法,但目前任然还是一个想法,毕竟刚接触视觉没多久还需要学习学习。
![](https://bbs.robomaster.com/static/image/hrline/5.gif)
开源目录说明
开源文件主要分为四个目录rtl、bmp、vivado、lceda
rtl:这个文件夹是这次设计的源代码
bmp:这个文件夹存放了实测的各种截图
vivado:这个文件夹包含了设计的vivado工程其中VDMA_test1为主要工程,其他为相关ip核
lceda:这个文件夹存放了摄像头的PCB工程
飞镖视觉需求分析
首先,飞镖作为一个高速飞行的物体,飞行时间短。能留给系统做识别的时间也是非常短暂的,因此我们需要一颗高帧率的摄像头以保证在短暂的飞行时间中能够采集到足够多的图像用来调整飞行姿态。
第二点是飞镖识别的目标,幸运的是组委会在飞镖检测的装甲板下安装了一颗绿色的飞镖引导灯,正是这颗引导灯大大降低了飞镖视觉设计的难度,我们只需要过滤掉场上红色蓝色以及白色的光源,再经过腐蚀膨胀,就可以获得一张干净的只包含绿色光点的图像。
第三点飞镖视觉的运算平台,飞镖的视觉算法可以说是一个对实时性要求非常高的算法,而目前常见的几种运算平台minipc,妙算把这些装上飞镖。。。emmm想想都有些。而openmv以及K210这些平台在处理视觉数据的时候都是采用先缓存在运算的方式,实时性无法满足需求,另外openmv虽然能跑到比较高的帧率,但是一旦加上一些算法,帧率马上就掉了下来。那么是否有一种平台能够一边读取图像数据一边对其经行处理和运算,就像流水线一样,数据读取完毕,图像也处理完毕。诶嘿还真有。他就是我们今天的主角FPGA。
飞镖视觉总体结构
结合飞镖的需求,我选用了mt9v034作为飞镖的识别摄像头,这个摄像头的最高帧率据官方说可以达到500而且是全局快门,当然500帧的时候画面只有80*60有点小。最后通过配置寄存器我把画面固定在了240*240的大小上,帧率为132。测试平台选用了赛灵思的zynq7020。选用这个平台的目的之一是能够很方便的搭建测试平台,通过VDMA和HDMI能过够实时显示摄像头的画面,另外它内置的arm处理器可以方便的对摄像头参数经行配置。测试成功后也只需要去除开发阶段用到的外部测试电路,只保留处理核心,就可以很方便的移植到别的fpga平台上。应为fpga的结构基本都差不多,只要逻辑资源足够,在一定程度上,无论你用什么fpga效果都是一样的。
在飞镖视觉的处理部分,首先经行的是bayer整列到rgb数据转换模块,因为mt9v034这个摄像头分为彩色和灰度两个版本,而本次设计采用的是彩色版本的摄像头,摄像头本身没有ISP模块,因此输出的数据是原始的bayer图像阵列的数据。摄像头进入fpga的第一个模块就是Bayer转rgb模块,转换原理可以自行百度了解,这里不再过多赘述。转换出来的rgb数据会经过RGBdisplay模块,这个模块有两个作用,一个是将rgb图像转化为二值化图像,另一个是将后面模块计算出的目标的坐标叠加到输出的图像上,并且能够选择输出到显示器的是二值化图像还是rgb图像。
这里二值化图像转换的阈值很重要,为了能够过滤掉白光,红光蓝光对图像的干扰。二值化的规则设定为像素点红色和蓝色通道小于阈值且绿色通道大于阈值的时候才输出1,其它输出0。而阈值的选择则是通过摄像头拍照存入sd卡然后通过windows的画图工具分析目标的rgb数据以及干扰光源的rgb数据得到的。
进过二值化后其实最好还是经过一波腐蚀和膨胀算法,本次设计中没有加入,用为我发向二值化后图像中也只剩下了目标的图像。当然,腐蚀和膨胀我也会在后面的研究中加入进来,因为这个对与干扰的清除还是很有帮助的。
最后二值化图像坐标的计算,应为经过的二值化后图像中也只剩下目标光点,是将二值化图像映射到x和y轴坐标中计算出最大值,即是目标中心。
整个图像处理的过程还是很简单的,整个流程全都采用了流水线设计,即图像一边传输一边处理,数据传输完成的同时,坐标的计算也完成。帧率和处理速度完全同步。
效果展示
这个是在窗外环境干扰的情况下的图片
这两张图片是在灯光干扰下的识别结果,第一章是原图,第二章是二值化后的图像
最后本次设计的所有工程我都会开源,有几点在说明一下彩色版本的mt9v034,我遍历了淘宝几乎没有现成的模块购买,现成模块基本都是灰度版本的,但是还好有单独的cmos芯片卖,因此我单独为这个cmos设计了一块pcb,功能很简单结构也不复杂,但是我收到货后发现是拆机片,还好最后上电后没什么问题,感谢淘宝良心商家没有卖我坏芯片。
第二点关于移植的平台,我会尝试移植到tang nano 4k和tang premier这两块核心板上,优先考虑tang premier这块板子的io口比较丰富,考虑到飞镖镖体的控制以及陀螺仪的姿态解算以及摄像头参数的配置会用到32来经行处理,而fpga与32的连接方式我目前设想的是,灰度转换的阈值通过spi接口传递给fpga,而坐标数据通过16bit的总线传回给32,另外可以再加一条中断线来保证数据接收的稳定。另外这两块板子的体积都比较小企鹅功耗低适合放入飞镖中。
最后这是我第一次对视觉算法经行尝试,算法整体结构比较简单,主要还是利用fpga实现了流水线的处理结构,让高速实时识别成为可能。本次设计中图像的大小被固定在了240*240的大小,这里也是我设计的失误,正常设计中应该将图像大小作为参数的形式在各个模块中传递,而我是直接写在了各种逻辑块中,这就导致了要修改图像的大小会非常的麻烦有众多参数要改。还有一点本次设计中没有加入SPI模块以及其他和32通信模块,在开发阶段,我采用了AXI总线的方式与ARM内核连接实现寄存器写入的操作,使用其他通信接口也是一样只要将通信模块的数接口合理的连接到模块中的阈值设定接口即可,这部分感兴趣的RMer可以自行设计完成,还是比较简单的。另外我也有想过在fpga中部署神经网络的想法,但目前任然还是一个想法,毕竟刚接触视觉没多久还需要学习学习。
![](https://bbs.robomaster.com/static/image/hrline/5.gif)
开源目录说明
开源文件主要分为四个目录rtl、bmp、vivado、lceda
rtl:这个文件夹是这次设计的源代码
bmp:这个文件夹存放了实测的各种截图
vivado:这个文件夹包含了设计的vivado工程其中VDMA_test1为主要工程,其他为相关ip核
lceda:这个文件夹存放了摄像头的PCB工程
请问这篇文章对你有用吗?
【RM2022-飞镖视觉1.0开源】基于FPGA和传统视觉的光点追踪