RM圆桌005抢人头要靠自瞄

1.什么是自瞄?你们是怎么利用自瞄获取比赛胜利的?为什么要做自瞄?优势在哪?

所谓自瞄,就是利用机器视觉来实现自动瞄准敌方和辅助打击的一种技术,在以往的比赛中,都是以纯手动打击为主,但人的操作和反应能力往往不如机器的快,正确的使用自瞄,宛如“开挂”一般,可以大大提升各单位的命中率既输出能力,给己方的输出提供强有力的支持和保障,在赛场上,拥有自瞄的队伍通常能起到非常强大的震慑作用,给队伍带来很大的技术优势。

2.自瞄怎么做起?

1)编程语言选择

C++、python:

C++是编译型语言,是编译执行的,程序是先需要编译成二进制执行程序,既机器码,然后才能执行,编译的时候编译器可以进行一些优化,python是解释型语言,是解释执行的,和物理机CPU之间多了解释器这层,所以运行效率C++>>python。

通常最好的选择是用c++搭建辅助打击框架,不过python也可以用在部分算法的验证、辅助工具的编写上面,在编程能力有限的情况下,python也是个不二选择。

2)第三方库的运用

OpenCV:OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和MacOS操作系统上。它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

HALCON:HALCON是德国MVtec公司开发的一套完善的标准的机器视觉算法包,拥有应用广泛的机器视觉集成开发环境。它节约了产品成本,缩短了软件开发周期——HALCON灵活的架构便于机器视觉和图像分析应用的快速开发。

3)计算平台的选择

这里介绍两种主流的选择

A)NUC

NUC是intel推出的miniPC,性能和日常使用的笔记本甚至台式机的性能相当,优点是体积较小,而且由于是intel框架的,程序的移植非常容易,不需要做什么修改就能从自己的PC移植到NUC上,缺点是显卡用到是Intel的集成显卡,不易使用GPU加速的算法。

B)NVIDIAJETSON(TX1、TX2)

NVIDIAJetson是业内领先的AI计算平台,它面向移动嵌入式系统市场中的GPU加速并行处理。在深度学习和计算机视觉方面的高性能、低能耗计算,使得Jetson成为计算密集型嵌入式项目的理想平台。

因为该平台和PC的框架不同,所以使用过的人都会发现该平台有些很奇怪的坑,但如果用好了,该平台的性能是远大于NUC的,尤其是它在神经网络上的加速,是NUC无法比的,此外,TX1、TX2的体积和质量比NUC小很多,非常适合在对重量敏感的机器人上应用(如无人机)。

当然以上两个计算平台的共同特点就是贵……..

如果想要节省RMB,就只能牺牲计算的速度,退而求其次选择其他的开发平台,

3.自瞄算法的一般思路

2)图像预处理

因为灯条分为红蓝两色,预处理时可以采取颜色分割的方法将图像处理为二值图方便下一步的灯条提取。

HSV颜色空间分割:通常相机获取得到的图像都是RGB颜色空间,不方便直接进行颜色分离,因此转化为HSV颜色空间再进行分割。

HSV颜色空间由色调(Hue)、饱和度(Saturation)、亮度(Value)三个分量构成,HSV更接近于人眼的主观感受。我们可以通过下面的图来展示HSV颜色分布情况:

通过寻找红色蓝色对应的分量,将该颜色的区域划分出来,最后得到二值化的图像。

3)灯条提取

首先将上面处理好的二值图的轮廓提取出来(例如使用opencv的findContours函数),然后通过一系列条件排除掉假灯条,接着用最小包围矩形或最小包围椭圆去计算各个轮廓,选出最符合灯条特征的轮廓(例如判断灯条的长宽比、形状等等)。

4)装甲片识别

提取出所有可能的灯条之后,将“灯条”两两匹配,根据两“灯条”之间的距离、斜率之差、两灯条之间的长度之比等条件选出合适的待选装甲片,之后再通过筛选装甲片选择“最像”的那个(比如通过识别装甲片中间的数字判断是否为真装甲片),计算出装甲片的中点位置,至此完成了装甲片的识别。

5)云台控制

获得装甲片中点位置后,计算该点与图像中心(假设装甲片中心到达图像中心时云台正好对准装甲片中心)的差值,将图像x轴的差值作为云台yaw轴的控制输入量,y轴的差值作为云台pitch轴的控制输入量,不断地发送实时的“偏差”值,做一个闭环的控制。至此就实现了自瞄最基本的功能。

4.自瞄大家都有做,怎样才能做得稳呢?(做自瞄有什么诀窍?)

1)硬件的选型很重要,有个好的相机可以解决很多算法上的问题,并使算法效益最大化

相机通常有以下一些参数:

等等。

工业相机与普通相机的部分区别:

根据实际需求,选择一个合适的相机对结果非常重要。

2)专注于一点并做到极致,比哪里都做一点的效果更好

例如:大部分学校的自瞄都会出现“跟不上”既云台瞄准跟不上目标的移动,这里提供一个idea,与其想各种各样的预测算法,不如先把现有代码优化到极致,使它的实时性最高并最小化误识别率,最终效果可能会让你意料之外的好。

3)巧妙运用GPU加速

Opencv包含了CUDA(CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题)加速的版本,有些图像的操作在GPU上的速度会大大提高,而TX2、TX1这类嵌入式平台,往往CPU的处理能力有限,如果所有算法都在CPU上跑效率会大打折扣,而TX2、TX1恰巧完美支持CUDA和提供各种图像加速的API。

5.自瞄要在备赛的哪个阶段去做呢?你认为达成什么条件做自瞄才能发挥它的用处?

自瞄应该越早做越好,因为自瞄需要充分的鲁棒性测试和命中率测试,需要在不同的环境下测试可行性,测试最终效果是否真的比“手打”好,同时所说的“自瞄”大多数是有人的参与的,既不完全是全自动的瞄准+打击,通常的方案是人为控制是否开启自动瞄准,并且当多目标出现时人为选择要瞄准的目标,手动控制子弹的发射,因此操作手需要对该系统充分熟悉,只有达到人机合一的境界,自瞄才能充分发挥它的效果。

6.做自瞄最应该避免犯的错误是什么呢?

忽略电控部分的重要性:在视觉识别稳定的情况下,一个优良的控制算法会对效果大大加分,再例如利用响应更快的电机、为自瞄定制的电调,会明显提高自瞄的实时性和命中率。

以下为网友提问:

7.如果是用神经网络和机器学习去做跟踪处理,现在已经做到可以识别车了,那接下来是不是应该转化为识别灯条上的装甲板?华工是在tx2上面进行运算的吗?

答:我们用的都是传统算法识别装甲片的,神经网络的方法没有尝试过,觉得会比较慢;我们在大部分机器人上用的是nuc,无人机上用的是TX2。

8.请问自瞄过程中,怎样对目标进行预测,运用到什么策略或算法?

答:2018年的比赛中并没有在预测上做太大的功夫,不过可以尝试一下卡尔曼预测。

9.请问华工现在采用的是什么视觉方案呢?

答:参考上面回答的一般思路。

10.视觉算法设计到大量像素运算,为了保证实时性同时不牺牲性能,都有哪些优化方案?

答:如果用的平台是TX1、TX2的话,可以试试GPU加速。

11.请问视觉解算出角度后,与电控之间的配合,有什么需要注意的吗?

其实没有需要特别注意的地方,只要保证串口相互通信正常,和电控的控制算法相匹配即可。

12.请问在自瞄系统中高性能工业相机是否必要,算法效率真的可以发挥高性能工业相机的性能优势吗?

答:有必要,能,不过个人认为反过来也是对的,高性能工业相机反而能提高算法的效率。

13.深度学习做检测一般可以达到很高的准确率,但是一般比c+++opencv方案会更耗时,用深度学习做自瞄这个思路靠谱吗?

答:我会选择更加实时的方案。

14.请问进行目标跟踪时有哪些算法能有效帮助我们进行实时跟踪呢?

答:各种滤波算法。

15.工业摄像机,如果选择高帧率,那么就低像素;如果高像素,那么就帧率就会下降。请问你们是怎么选择的?

答:高帧率低像素。

16.想问下主讲人识别出装甲板后采用什么方法测距比较好呢?

答:利用小孔成像的原理测距。

17.自瞄摄像头的fov多少比较合适?

答:看实际情况,如果摄像头安装在云台上,可能60°就够了,但如果摄像头安装在地盘上,可能需要广角一点的摄像头防止目标跟丢。

18.GPU加速算法具体怎么实现呢?

答:cuda,TensorRT等等。

19.同问一下大佬识别出目标后除了重力都需要考虑那些补偿呢?

答:说实话,我们并没有把重力的因素写在算法里面。

20.识别出来之后单目测距有什么算法可以优化吗?

答:单目测距本来也不是很可靠,所以算出来的距离一般只是作为参考使用的,不会作为准确计算的数值使用。

21.请问大佬的测距用的深度还是双目呢?

答:单目。

22.请问要解算打击角度的时候弹道是怎么预测的呢,因为重力影响装甲在图像中心的时候发射弹丸并不能打中。

答:把准星参考点补偿高一点。

23.优先级的判断是要交给操作手吗?

答:战场的情况很复杂,不能保证算法的决策比人的决策可靠。

24.卡尔曼对于爆发运动预测效果还是比较差,请问有什么好的解决方案吗?

答:自己写相应的滤波算法,将所有可能的情况考虑进去。

25.有性价比高的工业相机推荐吗,或者是比较实用的上?

我们直接在淘宝上选的比较便宜的不知名品牌,不过比较好的牌子可以考虑海康威视、大华。

26.大佬们是怎么解决自瞄算法处理产生延迟,影响云台控制的?

答:我们的做法是将视觉算法的速度做到极致,来使延迟的影响最小化。

27.请问贵校有在自瞄系统中使用例如KCF跟踪一类的跟踪算法?

答:并没有使用。

28.如果要用卡尔曼预测的话,他的Q、R值应该如何整定?

答:可以参考这篇知乎:

29.想问一下大佬华工这样的顶级队伍分辨率采用多少呀,帧率能到达多少呢?

答:用的是640*480,帧率60。

30.请问贵校使用的摄像头图像采集的延迟有多大?150ms可以接受吗?

答:这个我们没测过;不过150ms延时可能有些大,移动目标基本很难打中。

31.那NUC是否运用加速算法呢?

答:NUC没有用GPU加速,都是用CPU跑的。

32.请问大佬有没有使用粒子滤波,KCF或者等等其他的跟踪算法吗?

答:没有,就只是自己写了一些防止数据跳动的滤波算法。

33.请问大佬是用什么机器学习模型算法呢,还是使用深度学习呢?

答:没有用到机器学习。

34.请问一下大佬有用yolov3这样的算法吗?

答:没有。

35.请问算法单帧耗时大概是个什么情况呢?跟随时又是怎么消除这个延时所带来的影响呢?

答:单帧大概20ms,我们并没有用上什么算法来消除延时,就只是尽量提高运行帧率,不过可以考虑卡尔曼滤波。

36.小白提问:请问提升识别的稳定性从哪些方面进行呢?识别时断时续

答:将所有可能的情况考虑进去,同时要充分测试各种环境下的识别率。

37.请问一下大佬,单目的话,距离信息怎么求解呢?pnp算法吗?

答:利用小孔成像的原理,pnp也可以求解出。

38.请问进行目标跟踪时有哪些算法能有效帮助我们进行实时跟踪呢?什么滤波算法比较优秀呢?

答:还是卡尔曼。

39.那一般来说,pnp的误差大概是多少呢?

答:需要实际测试,不同场景、摄像头、算法都有影响,给个参考,10%左右。

40.请问华工这些滤波算法是视觉做呢还是电控做呢?

答:视觉。

41.请问工业相机选择帧率多少的比较合适呢?在算法优化到最佳情况的条件下?

答:60以上。

42.想请问一下弹道的预测方面时使用了什么模型呢?实际测试中弹道比较散,请问出了摩擦轮闭环以外还有什么方法可以提高弹道的集中度吗?

答:我们做的时候没有特地考虑弹道的预测,有关弹道的问题要问机械组的成员,我不太清楚。

43.大佬对DSO算法有什么见解吗?

答:没用过、也没听说过。

44.问大佬,目前opencv的跟踪算法有哪些比较靠谱?

答:opencv没有提供很多跟踪算法,主要是用来提取特征、识别装甲片。

45.请问在识别过后是否使用了跟踪算法进行目标跟踪?

46.那请问大佬对于视觉识别到的目标信息是怎么处理的呢,是作为云台双环的输入量?还是代替云台位置环?

答:这个问题我不是很清楚,但输入的是相对量(偏差)。

47.刚才大佬说摄像头安装在云台上60°就够了,又说采用低分辨率高帧率,那这样远处的物体不很小很难识别吗,这样请问下大佬识别多远的物体呢?

答:的确不是很远,3m的效果是最好的。

48.请问一下除了采用PNP粗测,华工用于精确测距的算法是什么呢?

答:没用用其他的精确测距算法。

49.单目不可靠的话大佬没有考虑其他测距方式吗?

答:目前没有。

50.请问大佬队伍对于多目标同时出现是采用操作手手动筛选的,还是算法自己选择?我觉得靠操作手去手动筛选的这个程序写不来。

答:靠操作手。

51.同mym问,单目的粗测不靠谱只能用与参考,那该用什么数值作为准确计算用呢?

答:我们直接用粗测的值计算的。

52.小白的视觉算法一换光源就瞎了,总需要临场调试。大佬们的视觉是怎样适应不同光线条件,怎样高效的在比赛条件下调试的?

答:这个问题问的比较广,总的来说就是调整摄像头的参数,提高算法的鲁棒性,在比赛条件下通过录像后期调试,测试场地时最好能实现远程调试。

53.想问下大佬用多少分辨率,帧率又能达到多少?

答:同上。

55.请问您说的高帧率是指多少百帧以上呢?请问发给下位机的频率多少比较适中呢?

答:高帧率一般60以上够用,当然越高越好,只要算法的速度有那么快,发给下位机的频率要看串口波特率还有电控那边的处理能力。

56.请问大佬,识别装甲板,怎么区分大小装甲板呢?因为使用pnp,大小装甲板参数不一样啊。

答:可以考虑识别装甲片中间的数字。

57.60帧是不是有点保守?

58.请问大佬60帧不会发生卡顿吗?

参考上一问,没有明显的卡顿。

59.很多调好的参数改变光照后就检测不到装甲了,这个问题有解吗?

答:除了用鲁棒性更高的算法,就只能根据现场光照微调参数了。

60.请问大佬们是怎么选取最优目标的呢?

答:操作手选择。

61.自瞄的时候是完全把云台的控制权交给视觉吗?那这时候底盘的方向是怎么控制的?还是自动跟随云台吗?

答:是,地盘跟随云台。

62.请问大佬,看了下大佬的回复,我看到的是贵校没有用opencv的如KCF的跟踪算法也没有用到预测算法,贵校的自瞄是以计算装甲板中心与图像中心,并补偿为主嘛?

答:基本上是。

63.请问大佬,自瞄是怎么解决误识别问题呢?我在做自瞄,误识别很严重。

答:还是要将所有情况考虑进去,剔除伪装甲片,同时可以考虑识别装甲片的数字。

64.用于云台上的单目自瞄摄像头可以解决今年大符识别的问题吗?

答:这里不讨论大符的问题。

答:看需要,如果操作手适合打静距离目标就放在2-3m,如果喜欢狙击的话就用长焦。

66.看往届视频,很多学校会在底盘上面安装双目摄像头,这个主要是用来做什么的?

答:其他学校不清楚,我们前年用两个摄像头只是备用。

67.没有机器学习怎么识别贴纸和打符呢?

答:自瞄没用机器学习,打神符才用了。

68.请问大佬既然说单目测距不准那贵校是如何获取准确的距离信息呢?

热心网友帮答:

69.视觉算法设计到大量像素运算,为了保证实时性同时不牺牲性能,都有哪些优化方案?

答:在自瞄中,如果识别到了目标可以缩小区域而不是进行全局搜索,即采用ROI的方法减少图像的运算,提高算法速度。

70.请问在自瞄系统中高性能工业相机是否必要,算法效率真的可以发挥高性能工业相机的性能优势吗?

71.同问一下大佬识别出目标后除了重力都需要考虑那些补偿呢?

答:可以考虑空气阻力的影响

72.请问要解算打击角度的时候弹道是怎么预测的呢,因为重力影响装甲在图像中心的时候发射弹丸并不能打中。

答:子弹是一个抛物线模型,需要考虑重力的影响

73.大佬们是怎么解决自瞄算法处理产生延迟,影响云台控制的?

答:算法相对控制的延时是一定存在延迟的,所以要加入预测去补偿延迟

74.请问贵校使用的摄像头图像采集的延迟有多大?150ms可以接受吗?

答:竞培的小哥哥回答,采集图像延时150ms有点儿高,一般工业相机的帧率有100hz,延时可以控制在10ms左右。但如果是普通相机的话,延时就会比较高。

THE END
1.程序员高手必会的十大编程算法编程算法有哪些程序员高手必会的十大编程算法 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用https://blog.csdn.net/liuhaiabc/article/details/52663417
2.什么是GC算法?有哪些GC算法?–编程技术之美有哪些GC算法? GC算法指垃圾回收算法,是自动内存管理的一种方式。它的主要目的是回收未使用的内存,释放内存空间以供后续使用。 主要的GC算法有: 引用计数算法:给每个对象添加一个引用计数器,当有一个地方引用它时,计数器值加1;当引用失效时,计数器值减1;计数器值为0时回收对象。优点是实现简单,缺点是无法回收http://www.itzhimei.com/archives/4629.html
3.28个不得不看的经典编程算法发起人的描述:《来自圣经的证明》收集了数十个简洁而优雅的数学证明,迅速赢得了大批数学爱好者的追捧。如果还有一本《来自圣经的算法》,哪些算法会列入其中呢? ***名:Union-find 严格地说,并查集是一种数据结构,它专门用来处理集合的合并操作和查询操作。并查集巧妙地借用了树结构,使得编程复杂度降低到了令人难以置https://mobile.51cto.com/news-455988.htm
4.常用编程思想与算法JeffD本文是在阅读Aditya Bhargava先生算法图解一书所做的总结,文中部分代码引用了原文的代码,在此感谢Aditya Bhargava先生所作出的这么简单的事例,对基础算法感兴趣的朋友可以阅读原文。由于本人也是编程初学者,所以本书比较浅显易懂,所介绍的算法配上插图也十分易懂,这里只是介绍几种最基础的算法由浅入深以帮助理顺一些简单https://www.cnblogs.com/Jeffding/p/7425230.html
5.编程和数学有什么区别?编程和数学都需要很高的抽象思维能力,两者在很多地方都有共同之处。编程中的很多算法都来自于数学理论的支持,但两者在具体的应用逻辑上还是存在一定的差别。比如:对任意给定的一组数进行排序,使之从大到小进行排列。 这是一个编程的入门问题,但它就很难称得上是一个数学问题。类似这种问题,我们人类看起来可能很简单http://shaoer.cctv.com/m/a/index.shtml?id=ARTIiBhAaPjbYAQLuiq8b0jg170418
6.Java面试题大全(整理版)1000+面试题附答案详解最全面看完稳了Java 并发编程(一) 1、在 java 中守护线程和本地线程区别? 2、线程与进程的区别? 3、什么是多线程中的上下文切换? 4、死锁与活锁的区别,死锁与饥饿的区别? 5、Java 中用到的线程调度算法是什么? 6、什么是线程组,为什么在 Java 中不推荐使用? https://maimai.cn/article/detail?fid=1752437513&efid=uSgZIWSJqvkGwxf4vJW75w
7.Java集合面试问题40个「附答案」每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。 随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并发包中,阻塞接口以及它们的实现。 https://www.oh100.com/kaoshi/java/370200.html
8.Python基础知识Python编程基础算法Python作为目前编程开发的主流语言之一,在企业中的应用范围越来越广,广阔的发展前景吸引了很多小伙伴想要入行Python,在学习Python时,一定要对基础技术知识有一个良好的了解,这样才会事半功倍,今天八维职业学校就和大家一起来看看Python编程中的基础算法,希望对各位学子有帮助。 https://www.bwie.com/jsgh/66.html
9.机器学习常见算法类型都有哪些算法是程序员在学习软件编程开发技术的时候需要重点掌握的一个编程开发技术知识,而今天我们就通过案例分析来了解一下,机器学习常见算法类型都有哪些。 1.分类算法 这是一种监督学习方法。有很多算法帮助我们解决分类问题,比如K近邻、决策树、朴素贝叶斯、贝叶斯网络、逻辑回归、SVM等算法。人工神经网络和深度学习也往往用https://www.douban.com/note/782408490/
10.C程序设计常用算法代码litan1986一、计数、求和、求阶乘等简单算法 此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。 例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。 http://blog.chinaunix.net/uid-22327815-id-1775075.html
11.什么是机器学习常见的机器学习算法有哪些什么是机器学习常见的机器学习算法有哪些 机器学习是人工智能领域中的一个重要分支,它通过使用大量的数据和算法,使计算机系统能够自动学习和改进,而无需显式的编程指令。机器学习算法是机器学习的核心组成部分,它们对数据进行分析和模式识别,从而实现预测、分类和决策等任务。本文将介绍机器学习的基本概念,并介绍几种常见https://wenku.baidu.com/view/9b19f784dd80d4d8d15abe23482fb4daa58d1d9e.html
12.KeilFlashProgramming(1)闪存编程 Flash编程算法是一种用于擦除应用程序或将应用程序下载到Flash设备的软件。具有设备支持的包通常包含预定义的Flash算法,用于对DFP支持的设备进行编程。ARhttps://www.jianshu.com/p/4c1e08a4d5d1