前几天发现了一本很好的书 《The Ray Tracer Challenge》 这本书与其它讲编程或讲算法的书不一样的地方在于它全书没有提供可运行的代码,它只提供了伪代码和测试样例。

它要求读者根据书中的讲解和伪代码用读者自己熟悉的语言完成一个光追引擎,并根据书中提供的测试样例来判断有没有正确完成。

书中使用的测试工具是 cucumber 一个 BDD(行为驱动开发) 工具,书中用了 cucumberGherkin 语言作为书中测试案例的描述语言,这种语言用几乎自然语言的方式来描述测试案例。

说到这里读者可能要问了,那你为什么不用 cucumber 呢?标题中不是写着 Google Test 吗?

因为我没装上,或者说我装上了用不了。

阅读全文 »

背景

把手机、平板作为电脑第二屏幕是上个学期偶然想到的,那时我一边看网上的教程一边码代码。由于看的是视频教程,缩小了就看不清上面的字,放大了又会挡住打字区域。这时就想如果有个第二屏幕就很方便了,买个屏幕又不太方便,想到自己还有个平板天天吃灰,这不是就是现成的屏幕嘛。

在网上搜了搜发现真的有解决方案,windows和mac上有很多软件可以用,但我平时主要用的是Ubuntu系统,所以这里就讲一下在Ubuntu系统下要怎么做吧。

先决条件

网上目前能找到的解决方案都是基于 Intel集显 中的 Virtualheads 功能,所以如果你是用的 AMD 的 cpu 那肯定就用不了这个功能了,另外如果是有独显的电脑若要开启这个功能,需要把驱动切换为使用集显或干脆不装独显驱动,网上有使用 Intel 集显进行图形显示、NVIDIA 独显进行数据计算的教程,因为我没有这方面的需求就没有折腾。

阅读全文 »

这一系列教程终于写到最后一篇了,最开始设想还有两篇「程序自启以及进程守护」和「OpenCV GPU模块的使用与妙算 GPU 的 Zero Copy 」。

但是「程序自启」没什么好写的, Linux 程序自启无非就是在 /etc/rc.local 中添加我们的视觉程序的执行路径,或者在 bashrc 里把路径放进去达到登陆自动运行的效果。

而「进程守护」之前想做但一直搁置了,只在树莓派上试过用看门狗实现死机重启,自己没有实践过就不写了。

另外的一篇「OpenCV GPU 模块的使用与妙算 GPU 的 Zero Copy 」本来想总结一下今年备赛时试图用妙算 GPU 优化程序的一些尝试,但因为最后做的是负优化,用了 GPU 速度反而慢了不少,再加上自己也不太熟悉就不写了。

Zero Copy 是 Tegra 系列芯片(TK1, TX1, TX2 等)支持的特性,就是 GPU 与 CPU 可以共享同一块内存,可以实现 CPU 处理后直接把这块内存交给显卡处理,无需再有复制到显存这一过程。但在实际测试中可能只能是自己写 CUDA 核函数来实现了。虽然 OpenCV 对这个特性有支持,但几乎所有与 GPU 相关的处理函数都是先复制到显存再处理的,当初在这一部分折腾了好久……

阅读全文 »

目标预测应该是RM视觉中最难也是最重要的部分了,预测直接决定了子弹发射后的命中率,实话实说我预测做得不好。

预测之所以难做有很多原因,我觉得最困难的地方在于预测是需要上下位机配合的,也就是妙算/微型电脑与战车上的STM32需要配合起来才可以达到比较好的效果。

我虽然也会写一些嵌入式上的程序对STM32也比较了解,但水平太差。

17年比赛的时候基地的自瞄和电控都是我负责的,当时我连基地自转都控制不好比赛时候总撞墙,自瞄做了等于白做。。。

言归正传,虽然我预测做得不怎么样,但是对这方面也还是有点经验可以与大家分享的。

阅读全文 »

之前说能量机关的教程有很多了打算不写了,但是总有同学来问,想了想还是写一下吧。

风车能量机关我只做了识别,因为准备分区赛的时候没有实物可以测试就一直搁置了,之后复活赛视觉的打击和预测都是学弟们做的。所以如果问我预测方面的事我也只能给个大概的方向,因为毕业后就没有再做这个了。

风车能量机关识别的示例代码我放在了我的GitHub

有需要的可以自行下载,觉得有帮助的话可以点个赞给项目加个星。

图像预处理

阅读全文 »

概览

这几天一直在做一个小车打算做好了再往下写的,但是由于我两年没写stm32的程序了,写好程序还是很吃力的。再加上这几天要准备考科目三(考驾照好辛苦 T_T )准备开学考试(没错!开学就要考试,还要考三门我没学过的课 T_T )事比较多,就停更了两个星期,下一篇我也不清楚什么时候发不过有时间会一点一点地写。

在视觉识别中一般是用妙算或者其他迷你电脑作上位机完成复杂的识别功能,在识别到目标后通过串口向下位机传送命令指挥小车云台运动。

妙算或者其他使用linux系统的机器直接用DJI或者东南大学开源代码中的串口部分就可以了,使用windows系统的机器可以参考东北林大的开源代码中的串口部分。

DJI开源代码串口部分

阅读全文 »

今年的能量机关在识别的难度上降低了,难在怎么打中。

能量机关我只写了识别部分,因为没有道具可以做测试,焊灯条的同学焊的千辛万苦也没焊出可以用的灯条。

当然纯手工焊这么大面积的灯条非常困难。前几天打算做一个迷你版的风车能量机关,只焊了一个扇叶就放弃了,太耗时间了。

因为关于风车能量机关的教程已经有很多了,而且我自己写的程序没有经过实战,不好说好不好使,这篇就划划水给几个链接吧。

今年我写的能量机关识别主要是参考 西交RoboMaster机器人队 公众号上的教程:

阅读全文 »

概览

上篇文章讲到了可以用小孔成像原理得到图像中某点相对于摄像头的转角,可以用这个来对所需要转角的测量。

但是这个方法有很大的局限性,它只能得到 相对于摄像头中心的转角 。而在实际应用中摄像头肯定不会在云台的轴上,每次以相对摄像头中心的转角来指挥云台运动就会有误差。

如果摄像头是放在枪管上的,那其实这点误差没有大碍。

因为一般会用闭环控制算法来控制云台跟踪目标,这样如果目标静止不动则稳态时摄像头中心点正对目标,枪管则稍偏下,可以根据实际情况调整摄像头所瞄准的中心位置使枪管对准目标。

阅读全文 »

概览

在识别到目标后,有一个很重要的问题:我们的最终目的是瞄准、跟踪、打击,识别到目标后,
怎样利用得到的目标在图像中的像素坐标来确定在真实世界中目标的位置呢?

更清楚点说就是我识别得到的是图像中点的坐标,而我要输出告诉下位机的是它应该旋转或者移动到的目的地

直接使用像素坐标的缺陷

在RoboMaster视觉辅助瞄准中我们需要让枪管一直瞄准装甲板。由于摄像头是装在枪管上的,一种显而易见的方法是直接利用目标所在像素的坐标与图像中心坐标对比,然后利用一套控制算法移动摄像头使目标在摄像头的中心区域东北林业大学ARES战队的开源代码是这种方式 GitHub: https://github.com/moxiaochong/NEFU-ARES-Vison-Robomaster2018 )。

阅读全文 »

概览

装甲板识别是RoboMaster视觉识别中比较成熟的了,到现在有很多战队开源了他们的算法。

基本上的思路都是一样的:利用装甲板灯条发光的特性将摄像头曝光值调低屏蔽环境光干扰,二值化处理图像得到只含灯条的二值图,根据装甲板灯条的几何特征来设置约束筛选灯条灯条匹配筛选装甲板

每年都有很多战队将他们的算法开源,善于利用他人的成果可以极大地减少自己工作量。

我17年参加比赛的时候基本上是闭门造车,一开始不知道官方已经在16年开源了一套非常好的代码。

阅读全文 »
0%