RM圆桌008 | 如何击打大风车

2019-03-26



点击此回顾活动


━━━━━


先看看打中大风车的效果:




一、前言

关于2019年能量机关,也就是“大风车”,作为2018年参赛者,一开始看到这道题的时候,大概有两个感觉:


(1)视觉难度降低了;

(2)弹道要求提高了。


估计很多人都有这种感觉,因为没了手写数字的识别,变成了一个8m定点打靶的任务,靶子的识别,相信做过自瞄的同学,会认为难度不大,关键是是否能打中。这么分析,今年的视觉难度真的就降低了吗?可能没那么简单。

这次能量机关分享,将会分享我在做能量机关的一个流程,不会涉及具体的算法(因为本人做出来的效果也不太好),主要涉及设计中的一些工程问题,希望可以给大家分享,其中的错误也欢迎指出,互相借鉴学习。


二、能量机关算法方案

拿到题目,第一步大概是审题,脑海里需要构建一个能量机关任务的一个轮廓,有了2018年参赛经验,不难得到这么一个流程:

获取图像——>图像处理——>运动预测——>转动云台及射击


获取图像:使用摄像头获取能量机关图像。

图像处理:识别算法部分,识别一些关键元素,如装甲板,旋转中心,旋转臂的灯效种类。

运动预测:由于大风车是在运动,还需要进行大风车运动预测,同时子弹的运动不是一条直线,也需要进行子弹弹道补偿。

转动云台及射击:预测过后,就能得到云台所要旋转的pitch,yaw角,发送给stm32底层,完成控制。


a. 获取图像

关于获取图像步骤,即需要考虑相机的要求,主要有两个因素需要考虑:

相机安装位置

相机镜头焦距选择

相机安装位置选择:

由于大风车在固定位置旋转,摄像头安装在底盘上,底盘保持不动,则摄像头相对大风车是静止的,可以大大简化图像计算,并且避免了不必要的干扰。

相对于安装云台上,提高了准确率和速度。

相机镜头焦距计算:

相机参数:

采用1/2” CMOS传感器芯片,130万像素分辨率

像素尺寸 4.8μm×4.8μm

分辨率 1280(H)×1024(V)

焦距计算公式:




具体计算:

风车半径为0.8m,则大小为1.6*1.6m,需要图像留有余量,方便机器人对位,这里视野取目标的3倍,则视野大小应为4.8*4.8m

大风车距离桥头(镜头)距离为8m

相机尺寸为4.8um*1024=4.8mm




所以,最终,考虑选择8mm的镜头。


b. 图像处理

根据比赛规则,能量机关具有大量发光特征,应该充分利用,可以方便视觉进行处理,相信做过自瞄算法的同学一定不会陌生。这里可以参考官方ICRA步兵开源项目RoboRTS,其中的roborts_detection 包中的armor_detection/constraint_set下的相关识别算法可以借鉴。

图像处理结果大致如下:(仅供参考)





左图为原图,右图为处理后的二值图

过滤掉背景噪音后,在二值图上可以方便的提取关键元素


提取关键元素:

装甲板:提取装甲板,后续可以使用pnp算法解算位置,得到打击目标位置。

旋转臂:由于需要区分激活状态的旋转臂和未激活的旋转臂,所以需要提取该部分元素进行区分。

旋转中心:发光R,由于大风车处于旋转状态,需要进行圆周预测,那么圆心位置是必不可少的。


如何提取关键元素:

相信大家在二值图上已经肉眼可见这些关键元素了,而且这些元素非常独立,非常容易进行提取。

这个就和自瞄算法提取装甲板用的方法一样,如果是使用opencv,可以使用两个非常强大的函数findcontours()和minAreaRect(),然后使用约束条件进行匹配选择,如长宽比,大小,角度等。当然这只是其中一种方法,限于才能,只能给大家介绍这一种了。

当然,上述列举的主要的普通关键元素,也不是所有关键元素都是必须的,也可以自己构建其它关键元素,如不使用装甲板,提取整个旋转臂元素,利用旋转臂来做PnP解算位置也是可以的。


c. 运动预测

大风车运动模型:

由于大风车旋转,对于识别到的打击目标,需要进行预测才能真正的打中目标。大风车做匀速圆周运动,需要获取圆周运动的圆心(待测),半径(已知)和速度(已知),通过建立大风车运动模型来进行预测。


这里给出几种预测方案:

方案一:记录多个装甲板点(开始只进行图像处理),建立装甲板运动在3维空间的圆的方程,从而进行预测。

方案二:平面简化版模型,在图像上,得到大风车中心点,得到装甲板目标中心,直接得到图像平面圆方程,从而进行预测。


由于方案一比较复杂,这里为大家介绍一种简单近似方案,即求平面圆的方案二。




并且,进一步简化模型,即固定预测时间t,从而固定的预测旋转角度theta。

固定预测时间t:在stm32端实现,采用一个定时器,固定延时发射子弹。

方案二的优、缺点很明显:

优点:简单,便于实现。

缺点:对于打击能量机关的位置很敏感,必须正对能量机关,不正对会带来预测误差。


子弹抛物模型:

由于距离较远,必须考虑重力对子弹的影响,可以建立重力模型,对子弹进行建模,从而对云台所需要的仰角进行补偿。

官方ICRA步兵开源项目RoboRTS中,有一个一个抛物线弹道修正模型,可以进行参考。

在这里,依然采用简化模型,主要考虑到是定点打靶,所以重力偏移变化不会太大,所以给出一下方案:

建立一个pitch偏移表,通过偏移量查表来进行补偿。


d. 方案总结

大致的能量机关方案设计如上所述,总结一下,就是下面一张(看似简单的)图。




三、误差分析

在经过测试后,对能量机关打击任务进行了分析,发现打不中目标的概率较大,对于打不中目标给出合理解释,对于误差来源大概从以下几个方面分析:

相机标定误差

相机安装位置误差

算法误差(图像识别与单目定位)

弹道误差


a. 相机标定误差

由于涉及视觉测量,相机参数在进行视觉测量中,具有重要的作用,其误差会直接导致视觉测量误差。所以,需要减小其相机标定误差。

减小误差方法:多次标定,去掉偏差较大的标定结果,取中位标定结果。


b. 机机安装位置误差

由于相机安装在底盘上,相机与发射云台有个坐标变换,包含一个平移向量和一组旋转参数,理想安装位置,相机与云台安装没有旋转关系,只有平移关系。

平移向量直接采用直尺测量,精度在mm级别,不会引入太大误差。

旋转参数选择参数采用欧拉角方式,理想状态均为0,由于误差,其真实值并不为0。

目前,通过经验补偿方式减小误差。


c. 算法误差

目前能量机关算法,通过识别装甲板矩形目标,采用PnP定位算法,来对目标进行定位。

在动态能量机关测试中:

装甲板矩形的像素大小大概为30×56,在识别过程中,像素波动在1个像素左右。

定位深度距离误差估计为8m*(1/50*100%)=16cm。

同时使用三维数据可视化软件,将所有定位结果画在3D散点图上,如下图所示:




第一个是正视图:理想是一个圆,效果较为理想。

第二个是俯视图:理想是一条直线,效果不理想。

所以,算法测量误差主要来源于深度信息的误差,经过测量,最大误差在基本上在20cm左右,与之前估计的16cm相差不大,定位的像素不稳定,这是误差的来源。

对于单目测距来说,远距离识别误差大,很大原因是被测量物体分辨率不够,像素波动对于定位误差影响很大。

可以考虑其他的一些高精度定位方案,如双目定位等,来减小算法误差。


d. 弹道误差

由于能量机关需要射击。弹道误差对于能量激光的实现也影响重大,在进行射击测试时,发现误差主要来源与两个因素。

机械因素:包含枪管等子弹发射经过的机构设计,导致子弹发射并不是平行于枪管中轴线,而形成散射的效果。

射速因素:由于远距离设计,子弹并不是直线发射,所以,还受发射速度的影响,不稳定的发射速度也会影响弹道的上下偏移。

射速影响理论计算:(理想抛物线模型)




在距离8m,速度为23m/s的情况下,计算速度波动1m/s情况下:

在0度仰角下,偏移误差为5cm左右。

在25度仰角下,为6cm。


e. 误差总结

总的来说,能量机关任务实现不了,误差是来自多方面原因的。

相机标定误差和相机位置误差是绝对误差,是可以通过修正方式进行补偿的。

算法定位误差(识别像素波动)和弹道误差是随机误差,只能通过改变手段来减小误差。

同时由于子弹射击目标,由于目标具有一定大小,是允许一定误差的,在进行方案设计时,需要考虑各个因素引入的误差,并不断减小误差。


四、结果

目前,在比较稳定的弹道下,测试了静止能量机关和动态能量机关(正常状态),可以达到的精度如下:

静止能量机关:平均击中一个目标所消耗子弹1-1.5。

动态能量机关:平均击中一个目标所消耗子弹2左右。


在实现能量机关算法的过程中,由于本身存在的一些误差,包括一些步骤由于采用了近似处理或近似方案而引入的误差,导致最后实现的结果并不是太乐观,没法达到百发百中,特别对于动态,效果不是很理想,本文介绍的方案也只是一种比较简单的方案,仅供参考,互相学习,要想达到更好的效果,还需要进行细致的分析。

对于2019年的能量机关,或许视觉算法真的不难,视觉难度真的降低了,但是确实是一个好的题目,整体难度并没有降低,比较锻炼人的综合能力,给了我们很大的空间去分析一个问题,你可以想的很简单,也可以想的很复杂,特别是对于这种精度要求较高的问题,不得不去做误差分析,本文分析的还比较粗略,远远达不到工程要求,也存在的不少错误,还请多多包涵,希望可以给同学们带来新的思路。


━━━━━


网友提问部分


1. 是否有不在桥头打的方案?个人觉得今年的能量机关更看重机械与电控。

应该是可以的,同时,比较赞同你的观点,机械和电控要求很高


2. 是否用Yolov3算法来考虑(深度学习)?

理论上可行,但不考虑,深度学习方法相对传统方法,计算量太大,很难达到实时要求,如果你打算在机器人上装一个Nvidia牌的燃气灶,那这话当我没说。


3. 可不可以利用大风车圆周运动设立相应的四个点(上下左右)来减轻弹道预测的负担?即提前将枪口对准到即将进入的下一个点。

理论可以,没试过。


4. 新参加队伍如何应对今年的能量机关(省钱)?

如果考虑省钱的话,树莓派+usb摄像头,500以内。我试过在树莓派上运行我的算法,可以达到10hz左右的图像处理速度,对于这种定点打靶任务,树莓派性能上理论是够的。对于自瞄来说,可能就不行了,树莓派的性能很难跟上。如果资金够的话,还是建议买好一点的装备吧。


5. 想了解下你们相机标定是使用怎样的标定板?我们是打印棋盘格或者圆点图然后粘在一块板上进行标定的,结果用solvepnp解算的误差还是蛮大的。

我使用的也是打印的棋盘图,如果条件允许的话,可以考虑标准的标定板。


6. 各位大佬,相机标定误差特别大怎么办?还有solvePNP 总是存在一些死区。在那一块解算出来的结果根本不对。

没遇见,貌似我用pnp还挺稳定的。


7. 传统方法如何让机器人区分已经击打过的和没击打过的?

非常简单,他们的旋转臂是不一样的啊,一个是流水,一个全亮,最简单的办法是根据面积大小来区分,明显击打过的灯效多一点,也就是面积大一点。


8. 摄像头有必要上工业级摄像头还是说快门方式是全局快门即可?

全局快门即可。


9. 那么远打能量机关,怎样克服弹丸落点偏差太大的问题,是因为摩擦轮掉速吗?

我文章中有提到误差分析,你可以依次排除,速度肯定有影响,但不一定是主要因素。


10. 摄像头安装在底盘和云台上哪种方式更好一些?

底盘,文章里有提到。


12. 请问你们用的是双目吗?

没有,单目。


13. 用能量机关视频来测试的和实际场地测试有多少影响?

视频只能用来测试识别,打不打得中还得实测,建议搭建一个场地。


14. 你们的自瞄和打能量机关是怎样协调操作的,是用两个摄像头吗?

我参与的是竞培营的项目,步兵没有自瞄。不过建议两个摄像头。


15. 打能量机关的摄像头是放在底盘上的吗?

是的,静止打靶,方便建立世界坐标系。


16. 摄像头放哪里好?

同上。


17. 风车旋转过程中,如何预判当前要打的装甲板下一步转到哪?

文中有提到一种简化的方案,可以参考一下,即匀速圆周运动模型。


18. 打的时候射速给的多少?

我给的25m/s,理论上速度高一点,减小重力下落的影响。


19. 有没有测过两个车同时打?

没试过。


20. 一顿扫射的效果如何?

靠手动打基本上是不可能的,扫射没试过,估计不太行。


21. 用的是什么摄像头?普通的摄像头背景灯光影响很大,无法通过颜色过滤背景。

工业摄像头,普通摄像头应该问题不大,可以参考官方ICRA开源项目RoboRTS,里面的自瞄有做如果提取蓝色或红色灯效的demo。


22. 机载PC用的妙算吗?

是的,性能很好,我的算法帧率可以达到40hz,非常够用。


23. 弹道下坠的话,是直接补偿,还是函数模拟?

我文章里有提到,都可以,我采用的直接补偿,建立一个pitch补偿表,因为距离固定。


24. 你们一般是距离大风车多远打,命中率怎么样?

文章中有提到,8m左右,命中率大概1-2发子弹命中一次,所以会经常激活失败。


25. 如何在机械与电控都不出色的情况下,打能量机关?

建议转方向,去搞机械或者电控。(逃


26. 击打错误又不会重置,按道理来讲朝着一个位置定点扫射,虽然需要的时间长一点,激活能量机关希望还是很大的吧?

官方已经考虑到了,它的旋转速度,就是为了不让你打一个点,把所有装甲板都刷一边,来激活能量机关。(不过,多个步兵合作还是有机会的)


27. 击打的时候是等子弹打出去再发送下一次的预测位置吗?还是一直预测一直打直到打中为止?

等子弹打出去再发送下一次的预测位置。


28. 请问大风车的预测是在电控方面做还是在视觉方面处理的好?

视觉吧,电控很忙的。


29. 相机标定结果不准确 fx fy 每一次都相差很大,怎么办? 能有几百的误差。

文章有提到,这时候就可以运用高大上的统计学知识了,标定n次,取中位结果。(逃


30. 请问没打中你们是一直发弹击打,还是每隔一段时间发一次弹?

隔一段时间发弹。


31. 请问使用双目摄像机,自己搭的摄像头,标定和计算都没问题,为什么测距误差特别大呢?能差几十厘米。

视觉测量肯定是有误差的,双目不清楚,单目的话,我文章有提到可能是被测物体分辨率的问题,一个像素的误差,可以带来16cm的误差。几十厘米的误差建议找一下原因吧,我也不清楚了。


32. 就是相机标定结果不准确,现在不知道该如何改善了,可以指导一下方向吗?

多标定几次,利用统计的方法得到最优值。

用标准的标定板。


33. 若是采用无人机击打能量机关,可行吗?

不建议。


34. 相机标定取中位的话,是直接取某一次?还是说对内参矩阵里面的每个值分别取中位?

我取的是某一次,其实大致中位就行,避免了标定引入过大的误差。


35. 你们测试激活能量机关的概率多大?

文章有提及,很低,20s左右激活一次吧。


36. 请问刚才你说的一个像素的误差,可以带来16cm的误差,那请问换一个高一点分辨率的相机可以减少这种误差吗?

理论是可以的。


37. 我想了解一下NUC与妙算相比有啥特点?

妙算的GPU强劲,NUC的CPU强劲。


38. 如何确定图像中大风车的旋转中心呢?

可以直接提取发光的R,也可以有点求圆的方程,得到圆心。


39. 怎么识别两种臂的区别,通过面积是先膨胀找外轮廓吗?还是别的方法呢?

两种臂的区别很明显,最简单的方法就是面积大小。


40. 装甲板使用opencv模板匹配好呢,还是传统方法?python速度会不会比较慢?还是c比较好呢?

传统方法速度快,本身目前比赛中图像处理就很简单,传统方法也够用了。推荐c++,python的话也可以做到不慢,使用numpy,opencv等库,底层都是c/c++实现的,避免python自带的数值计算还是可以满足需求的。


41. 可以说下使用的工业相机具体的参数和型号嘛,因为这容易走弯路。

具体参数不记得了,工业相机基本差不多,国产还是可以用的,像大华,大恒这类公司的产品可以看一下。