Featured image of post RoboMaster 回忆录

RoboMaster 回忆录

我的 RM 故事。

跟着队伍去深圳打 RoboMaster,本来是想好好静下心来读读论文,奈何着天气太燥热潮湿,让我心头也浮躁,总想写点什么东西,于是想起来之前说的,正好现在时间也合适,不如写一篇 RoboMaster 回忆录,记录一下,这贯穿我人生五年的比赛。

高中概况

说起来是比较抽象的,大多数人参加 RoboMaster,还是只有一年或者两年,自然也不难理解,大一或者大二加入,打到大三大四,最近可能会有四年的,但本身大一的梯队留下来的就不多,而直接成为正式队员又太难,所以还是以两三年为主。

那假如说广义的 RoboMaster,那么我已经从高一就开始接触了,大概是由于什么北京的所谓素质教育,而且高中里面就存在着一些科技向的社团,有着很优秀的老师,也让我有了接触这些机器人比赛的途径。不过说到头,这些比赛真的是素质教育吗?我看也未必。

感觉到了最后,就算我拿了省冠军,倒也没有什么作用,毕竟确实技术难度很低,远远远远低于奥赛一类的竞赛,而又需要投入成本,大多数学校也负担不起,不够亲民。

所以说到底,机器人比赛还是一些富裕地区的富裕学校小打小闹的产物,让学生们体验一下一些创造感,虽然貌似这些技能在大学中的同样类型的比赛中还能起到作用,然而个人的感觉是,相较于大学中的那些专业竞赛,此类比赛依然算是小打小闹。

高中的时候我还觉得我自己多少有些天赋,自认为是要裸分上清北的,平时和那一帮学霸一类有说有笑,虽然成绩不是最顶尖那一批,但是课余时间的松弛感还是和他们对齐了。我和我的胞弟是同等岁数,在大学期间加入的社团也并非机器人社,而是自己出钱捣鼓一些桌游,创办了一个桌游社。说起来这个社团现在应该依然存在,我们当初留下来的桌游估摸着价格也有大几百元,对于一个月生活费只有五十元的高中生来说,可以说是一笔慷慨捐赠了。

我所在的高中有一种实验班,叫做项目实验班,其实有点类似于培养学生的科创能力那种感觉,而是事实上,聚集的就是那一帮想考理科实验班,但没进去的学生。

我记忆里面真正有项目能力的同学,可能不超过五个,其他的人基本还是经典的做题家,到了毕业,说不定也不会工程制图,代码也写不出几行,当时还没有 GPT,那大伙的水平还要再降一等。

项目实验班有一系列的创客课程,类似于物化生信,选择一个感兴趣的方向,几个同学弄一个小的发明创造,当然也不全是创造,基本就是在网上已经有的东西,大家用一个学期跑一遍流程。

别的不说,我从小应该还算对电脑接触得很多,不是那种单纯的手机用户。在这里并没有鄙视的意思,然而个人感觉,在同时具有使用电脑和手机的条件下,基本只使用手机,而从未接触过电脑,这种人到了大学里面,能力都很差。不少人是本来电脑接触的就不多,开始接触了之后也就了解了其中魅力,更是变成了很厉害的水平,这种自然不在上述范围之内。

虽然我之前使用电脑,最最主要的可能还是以玩游戏为主,然而为了玩游戏(我的父母均是北邮研究生毕业,那时候北邮的分数和北大可能都差不多,毕业可以去 Oracle/Microsoft/IBM 这种国际大厂,在互联网行业从业三十多年),和父母斗智斗勇,可不只是删掉浏览记录,并且让电脑凉下来这么简单,还是触类旁通过不少的技术,代码也会写上几行,姑且在同学们里面也算是有基础的了。

我之前也对电脑感兴趣,加上网瘾少年的游戏制作梦想,所以说就选择了机器人的项目,然后用 Arduino 写写东西。基本的 Arduino 确实没什么好说的,就是很基础的技术,随便来个 GPT 都能写出来比我当时好的程序,然而正是那时候,认识了机器人社团里的两位老师,Q 老师和 S 老师。

Q 老师貌似是北大计算机毕业,很是厉害,管理机器人社和天文社两个社团,平时自己还搞搞书籍翻译,感觉有点像那种已经精神富足了的计算机大佬,而且符合那种搞计算机的刻板印象,幽默风趣,有的时候偏好发滑稽,和学生们打成一片。S 老师我接触的更多,本人非常好说话,非常的和蔼可亲,不过关于老师的其他细节,我倒是不是很清楚,大多数时候和老师聊天,要不然是日常,要不然是比赛相关,聊老师自己几乎没有。

尤其我这个人比较脸盲,而且其实大多数时候比较内向。我非常乐于助人,而且可以和很多人打成一片,然而事实上,我并不愿意结识新的朋友,或者说这令我恐惧且疲惫。可能只有在新环境中,我才会尝试扩展自己的社交圈,而在此之后,这个圈子多半不会有很大的变动。值得一提的是线上并非如此,线上我还是十分积极的。

初识 RM

其实本质上,高一的时候我并没有接触 RM,然而和机器人社还有很多的往来,尤其是用机器人社的电脑偷着打游戏,这件事我乐此不疲,而且老师虽然嘴上严厉教育,但实际上管得不严。

到了高二的时候,有一次我去机器人社,碰到了我的好朋友 CX,CX 是机器人社的主力之类的。我们学校对于那些类似提前批进入学校实验班的同学,会有一个类似于夏令营的东西,他在里面已经提前做了一些机器人相关的内容了,然后在后续,也一直在里面打比赛。

CX 当时说自己在写 RM 的循线程序,在之前的时候,我就已经知道机器人社搞来了几台 RoboMaster S1,麦轮的机器人可以平移,看上去确实现代感十足。我当时说要一起去看看,所以去了我们的另一个场地,看他写这个程序。

高中的 RM,只有工程机器人需要自己写程序,而且写的也不算多,其他的机器人基本上就是图形化编程,我看那些说明也不算难,提供的接口都很简单,所以就干脆写了写,出现了第一版的跑图程序。

随后我就开始了我的 RM 生涯,有点像是说之前的一些同学似乎不打了,反正我可以写步兵的程序,同时作为步兵的操作手。

像是之前说的一样,RM 的程序不算很难,但是图形化接口也意味着很难去使用自己的一些算法,包括说像是 OpenCV 一类的程序更是别谈。现在回忆起来,当初有一位 ZQ 同学在项目班的另一个项目里,貌似学了 OpenCV,当时我问能不能写一个装甲板检测出来,他展示的那个效果很不错,我还问能不能放到我们的机器上,现在来看,好像只是一个单纯的 threshold,甚至没有 findContours,难以评价。

甚至说当时 Dji 没有开放装甲板识别的接口,只有数字识别,所以我们也没指望自瞄。当时的任务是击打能量机关和基地,能量机关是从小到大打一到五的数字,Dji 会提供数字识别的借口,返回数字以及图像坐标系坐标;基地的击打则是需要跑图到对面半场,然后自瞄。

这里面有必要解释一下,RM 高中组的赛制,和大学有一些区别,加上读者可能也不了解 RM,干脆从头解释。

RM 本质上是一个类 DOTA 游戏,其实说角色变成了纯物理世界的机器人,可以用键鼠控制。高中组有限制对机器人的改装幅度,不像大学组是自己做机器人,我们都是用大疆的 S1 机器人。

既然是类 DOTA,肯定是涉及击杀以及血量等等的,RM 具有一套所谓的皮肤系统,说白了就是几个装甲板,或者说传感器,有人说是压力传感器,也有人说是声音传感器,具体也不得而知。高中组的机器人分为步兵/工程/无人机,步兵可以发射子弹,是那种水弹,所以打在装甲板上就可以造成伤害;工程有机械臂或者其他的机构,可以获得弹药瓶,步兵机器人的发弹量是被系统限制的,用完了之后只能等待系统发放的低保,或者用相机模块扫描弹药瓶上的标志获得补充,弹药瓶的获得自然有不同难度,区分度在于高度或者位置,其扫描后可以获得的发弹量也自然不同,最多的貌似是三百,可以爽打一局;无人机也是一个大疆提供的无人机,只需要控制它飞到对面基地的特定位置,让对面的摄像头扫到,基地就会破甲。比赛有补给区,补给区里面有一个标志,扫到就可以回血。

比赛主要分为两个阶段,一阶段是自动的,二阶段是手动的,现在貌似划分更多了,但我只说我当时经历的。基地的护甲默认是五十,假如对面机器人阵亡了就会扣二十,最低是零,但是无人机可以给它扣到负的,一发子弹的伤害是十,护甲与伤害有一种计算关系,假如满护甲,那打一下好像才扣两点血。

另一个机制是能量机关,可以理解为是一个在场地中心的机构,有五个可击打的传感器,显示数字一到五,需要按顺序打,就可以获得攻击增益 ATK。自动阶段激活是一个永久的 1.5,手动阶段激活是暂时的,但貌似是 2。能量机关有冷却。

所以说,不难理解的是,自动阶段需要步兵先激活能量机关,再去打基地;工程拿弹药瓶,而且要跑得快一些;无人机不需要做什么。到了手动阶段,大家就开始 FPS,然后攻打对面的基地。

冠军之路

我加入了 RM 队伍之后,和大家一起努力,程序可以说完成的差不多,不过需要说的是,确实还是接口好用,技术含量不高。

甚至说因为曝光问题,我们在坡上无法识别对面的基地,所以需要循线准确一些,然后再撞墙矫正位置,之后手动抬到一定高度,完全是开环。

工程机器人确实十分给力,我们的速度很快,所以说不至于打低保,弹药脸足够的情况下,基本上是稳赢的。

高中的队伍其实就是打打闹闹,大伙都没什么含金量,不过确实有的学校,本身教育水平可能差点意思,所以打算把这个作为宣传招牌,也是我们当时的劲敌,民大附,不过到最后这个队伍有一些唐,到时候再说。

当时我其实发现了一个问题,这些队伍普遍操作能力不太强,RM 的机器人,毕竟是物理控制,操作有一些粘滞感,一般人很难适应,基本上不能跑打,打移动的目标也不太行,尤其是在没有自瞄的时候(我们当时没人有自瞄)。而我可能说恰好有一些天赋,当时队伍里面的训练,和两个高一的同学加上一个老师打,我可以一个人打三个,而且地图不大,我可以倒着跑全图,一边逃跑一边还手。另一位操作手是 CX 同学,也很厉害,我们属于是强强联合。

当时我们发现了一个简单清晰的盲点,大家貌似都很笨,在基地护甲没有到 0 的时候就在打基地,两点两点的扣,根本无济于事(基地貌似三千还是多少血量,反正很多),而对战欲望很低,让我一度怀疑我在打 RM 单机版。

战术的前置是,我们有比较充足的弹量,两个厉害的步兵操作手,这些恰好我们都符合,于是理论如下:我们在自动阶段获得充足弹药,并且获得永久 ATK,基地的击打其实无所谓,在比赛的前期专注 PVP 而非打基地,杀掉对面三辆车,同时无人机破甲,激活临时能量机关。这时候我们一发子弹对基地可以造成 50 点伤害,两辆车一起不到十秒钟就可以结束比赛。

靠着这套战术,我们很轻易的就在比赛里面披荆斩棘,当然,写的一些程序可能也是有帮助的。

正像是前面所说的,大多数的队伍的操作手都没有灵性,基本上在站桩,所以就一路杀出重围,到了决赛。决赛的队伍就是之前说的民大附,在这里不得不好好诋毁一下,相关问题也无需抵赖,只要是当时那一届参赛的队员都会有印象。

民大附这支队伍,我个人感觉是没有什么含金量的,貌似是请了外援还是什么的,写了些程序,我是不知道这些程序有啥必要找外援,然后还找了赞助之类的,最后实际上比赛没什么意思,基本上轻松取胜,主要说一些小插曲。

当时印象很深刻的是,他们的无限火力机关枪。在 RoboMaster 中对于发射的限制主要分为弹量限制和热量限制。弹量限制很好理解,你只能发射那些你赚到的子弹,更多的不能发;热量则是说,你每段时间只能发一定数量的子弹,这被量化为热量,热量会不断下降,同时开火会热量上升,热量满了就不能开火了。抛开没有明确证据的,在和他们对战的过程中,他们貌似就已经开了无限火力模式一样,就算三百的弹药瓶不在他们这边,依然可以全场一直在打,甚至没有热量的感觉;民大附的战队在比赛的自动阶段打出过 1700 伤害,按照理论计算,最高伤害也不到 1500,所以就有点匪夷所思了;之后还有过民大附机器人失控实录,在自动阶段演都不演,直接启动无限火力,无论是射速还是弹量,都比正常的高无数倍,获得“机关枪”美誉,最后紧急暂停。他们自然也有解释,认为是 BUG 之类的,但是这种现象频繁出现在他们身上,而其他队伍从来没出现过,是不是他们自己动的手脚,自然也就不言而喻了。

同时还有一位仁兄,胖胖的,感觉凶神恶煞。上文说道他们队伍有赞助商,这个赞助并非用来建设队伍,而是打钱之后大家平分,当然,也有一个前提,那就是获得冠军。一共一万多块钱的赞助,每个队员都能分到小几千块,自然是对高中生来说的一笔巨款。然而我们队伍的强势打破了他们这一幻想,基本上我们夺冠是势在必得的,这位仁兄就守在我们队伍旁边聆听我们的战术,不知道是想要帮我们指点一二还是什么。在别的队伍的备赛区逗留本身就是违规,我们尝试驱逐无果,他依然硬着脖子说要站在这里,然后又开始打电话,装作放狠话的样子。不知道是不是民大附就是这种职高氛围,还是怎样,反正一股子小混混的味道。随后更是忽然暴起,把我们备场区的一张木头的桌子用手砸裂了。我不太理解这个行为是什么意思,是类似于混混在街头打架斗殴前,先把玻璃瓶子在自己脑袋上砸一下,显得自己一脸血很勇敢吗?有一种脑子不好使的感觉,最后搞得满手是血,还溅到我们同学的衣服上了,最后是骨折了还是怎样,他们就弃权比赛,把这位仁兄送到医院了。

综合来看,几场比赛都没什么悬念,我们就拿下了北京市和华北赛区的双冠军,也没啥难度和压力。之前比赛之前设想过很多的情况,高手如云等,但是事实上到了比赛才发现,原来我们才是那个唯一的高手。

随后就是备赛国赛,准备了半天,最后因为疫情也成为了线上评分。我们队伍的一大优势在于操作手,最后纸面实力排了一个国家二等奖,倒也说得过去。

基本上 RM 比赛可以算得上高中最后的疯狂了,紧接着的暑假里面还可以有一些新生培训,算是夏令营,事实上新生的素质也有一些堪忧,机器人队成为了打游戏的地方,后面也就禁止游戏了。

事实上我们几个老队员也有打游戏,也可以说这种行为,或者说不好的表率是我们先开始的,但是老队员们一是早已经完成了测试,任务都做完了,二是当下确实没什么要紧的事;新的这些同学,倒是觉得机器人社是玩游戏的避风港了,实在是令我头疼不堪,更是有人说出了“要不是因为可以玩游戏,谁来机器人社”这种荒谬的言论。

事到如今,我也就在玩碧蓝航线一款二游,之前我是经典的单机玩家,游戏时长几千小时,联机游戏也是暴雪那套,可以说半个婆罗门,现在倒是没什么游戏有吸引力了,也就渐渐不玩了。身边还是有不少同学玩游戏,玩 MC 的不少是 CS 领域高手,其他的玩游戏的人大多数表现正常,但是表现有点唐的几个人多半都是游戏玩家,我不知道这种必要不充分是否有什么隐藏其中的道理,但是也开始慢慢认同游戏害人不浅这件事情了。游戏在我的生活中给我带来的不愉快很多,主要是作用在一些我认识的人身上,有时间以后再说。

第二年 RM,我基本上也就是有时间回来看看,算不上深度参与,因为高考所以也没有时间和他们一起去比赛。据说这一年民大附他们又有技术的提升之类的,我们输了,但是具体我也没有了解太多。

高中的 RM 就在这种不知不觉之间结束了,唯一留给我的只有两个冠军奖杯,数不尽的回忆,以及当初的热血沸腾。

在这里再补充一些内容,以免将来忘记,由于我的记录是以事件为主的,所以说对于人的记录其实甚少,甚至说在前面提到的 Q 老师和 S 老师在后面也没有提及,当然很大程度也是因为大多数事情我已经记不清了。

我们队伍的主力一共有四个人,都是和我一个年级的同学,除了我,CX 同学,还有 HY 同学和 TR 同学,这两位同学共同负责的工程机器人。

后来加入了大学的 RoboMaster 比赛,有一定原因就是因为 HY 同学是 RMUC 的忠实粉丝,在高中期间就不断地说比赛里的一些情况,也让我对大学组的比赛有了了解,否则我可能连大学组的比赛都不知道。

除此之外,还有几个高一的同学,名字我也都记着,但是就缩写而言,和后面的一些人产生了冲突,所以就不一一写了,然而依然有必要说的是,这些高一的梯队同学在比赛中也做出了卓越的贡献。因为疫情原因,全国赛改为了线上比赛,此时我们这些主力队员都已经高三了,需要准备高考,而线上比赛又需要录制视频,这些都是他们做出来的。

大学概况

不少读者应该知道我在大学的情况,但是为了回忆的完整性,还是重新说明一次,把内容进行完全记录。

大学的时候,我进入了人工智能专业,老实说我之前是想选数学的,可以理解为某些对于自己数学天赋的自信,虽然这种天赋近期貌似遗失了。然后进了人工智能专业之后,我也就开始想要了解这个专业里的东西了,当时我能想到的,无论是和编程还是人工智能,唯一能擦上边的就是 RoboMaster。

于是我就在专业群里面发问,当时我在专业群里还算活跃,所以大家的回复也很有效,大概的意思就是说,我们专业里面有 RM 视觉组的组长,也是我的学长,比我大两年。

于是后来我就联系了这位学长,即 JH 学长,然后他带我进了 RM 招新群。

在大学一开始的时候,事实上我对一些学习之类的事情不是很上心,我的目标就是保研而已,而且是保研本校。我刚开始的时候做过很多心理建设,类似于既来之则安之,因此没有去想再追赶上我那帮高中的同学,当然后来的前进的理由,也已经不是追赶。

尽管我现在在一些新生指南中说,大家可以在假期把高数/线代/概率论全学完,然而这并非我当初做到的事情,准确的说,我没学概率论。在此基础上更加糟糕的是,我对于编程的学习知之甚少。

尽管我之前说过我有一定的编程基础,但是事实上,也只是在一些算法竞赛中做过最粗浅的学习,使用的也是 Dev C++,同时做过项目和写过算法题的同学,应该自然有所了解,基本可以说除了他们的语言相同之外,很少可以见到共同点,包括一些 C++的特性,设法中更是没有涉及。老实说,算法竞赛用 C++,只是因为快而已。

视觉梯队

我当时基本上也没有做什么准备,因为之前和 JH 学长说的也是,对于大一同学基本上没什么要求,但是可能也无法成为正式队员。当时我没有做过多的了解,记得当时面试的时候,是一个非常简单的问题,如何在一串数组里面找到最大的元素,需要手写代码,可以说十分的水。

当时在视觉组里面的有四位学长,分别是人工智能专业的 JH/MD/JXY 以及电气的 YZ,都是很厉害的人。

RM 拥有一套属于自己的培训与筛选的体系,这套体系的根本目的并非培训,而是进行筛选。之前的队伍其实倒也还好,然而最近随着内卷的风气越发严重,而最近我们的成绩很不错,有了一个加智育分的招牌,也就吸引得不少学生呼啸而来。

老实说我非常痛恨这些人,因为 RM 本来就并非像是腾飞杯一样的水赛,不是说来几个人拿一个实验室里的项目,自己包装包装,就可以混一个奖项加分的。倒也不是说这类为了分数来的人没有水平,只是说他们确实很难坚持下去,可以说混这个字已经刻在了一些人的骨子里。一开始在队伍里的培训的时候,大家也都是知道轻重缓急的,都是一副很卷的样子,后面一旦发现自己进入了梯队,也就全都兴致全无了,又或者呆在主力队员的位置上,但不太做事。

我大一时候的培训更加偏向于压力,培训的内容和考核的内容基本上关联不大,当时可能说培训的是计算机视觉的理论,但是考核是让你写 C++ 的 OpenCV。

OpenCV 的本体其实是 C++为主,然而因为 Python 的易用性,导致网上的教程基本都是和 Python 相关,当时 ChatGPT 也还没有横空出世,所以代码基本上都是在没有人教的情况下慢慢摸索。

其中当时教学中的几个很大的坑,包括说 OpenCV 和 C++的一些配置,以及 ROS 等等,在后面我也都有慢慢去自己学习,当时的任务也算基本完成了,然而由于组长告知大一同学只能是梯队,完成最后的任务没有什么意义,我在简单看出了思路之后也就没有再继续写代码。

当时的那段时间是疫情期间,基本上也都是网课,所以说对于点名之类的问题,要求也不算很高,加上我更加倾向于自学,那段时间的作息可以说全乱套了。当时我基本上一个循环是六个小时,可能学习四到五个小时,然后剩下的时间睡觉,之后又醒来,接着学习,尽管从那段时间对我后来的提升很明显,包括说对于编程的一些基础/思维方面/计算机视觉的理解。

大概也就是在国庆结束之后,我们刚刚结束了培训,准备公布正式队员的名额,此时 JH 学长和 MD 学长忽然就离队了。由于本人并不是非常热衷于社交,而且也并不是十分八卦,这其中一大部分的原因来自于本人的脸盲,剩余的可能是懒惰。因此假如读者想在本篇回忆中,找到一些关于队伍历史上的秘密,那么可能就失望了。事实上关于这两位学长离队的原因,我也没有太多打听,有人说是因为加分,有人说是因为压力,具体我也不得而知。

正式队员

由于两位学长的离队,我也从之前的只能成为梯队,变成了一名正式队员,所以接下来理论来说就是完成剩余的任务,这里面我首先负责的是相机取流的任务。

我从头去阅读海康相机的 sdk,然后去写取流程序,当时的疫情已经越来越严重,基本上能够开展工作的时间不算很多,大多数时候我就呆在地下室(也就是我们社团的活动场地),然后看一些代码,顺便学习一些课内知识。

后来因为更多的疫情,期末考试也取消了,基本上整个学校全部封禁,本来我们说 RM 要办冬训,这也算是一个传统,为了下半年的正式比赛打一下基础,把大多数的事情都做好,但是也被迫转到线上了。

现在还有印象的是,当时听说了地下室也要封,我们的能量机关被放在另一个地方,当时我和视觉组的组长 YZ 学长骑车去一个挺远的楼里面,用相机拍视频,这样用来到时候在家里进行调试。虽然貌似最后,因为能量机关的改版,以及楼道里的反光太过于严重,所以说这些视频并没有很派上用场。

之前我的任务是负责相机的取流,直到后来,在冬训的时候,开始和 YT 一起负责能量机关的识别和预测,我负责识别,预测则由 YT 负责。YT 适合我同年加入队伍的大二学长,比我大一个年级,预测当时主要就是通过拟合,然后弹道模型算出来飞行时间,去求出来云台需要转动的角度。比较朴素的预测是通过迭代法进行的,我们当时建立了一个模型,发现这个最终的角度虽然是超越的,但是是存在一个方程的,所以后面直接可以用牛顿法进行解决,然后求出来 pitch 和 yaw。

寒假的时候我主要在读之前的能量机关代码,之前的代码主要使用了 ROS 框架,但是讲实话并不好评价,因为这套框架对于 ROS 的运用仅限于把串口通信和运算分成了两个线程,我们后面觉得在这里使用 ROS 是完全浪费的,而且也会被迫要求新人也重新学习 ROS,这是巨大的教学开销,也没什么必要。

大多数的代码有很多的嵌套,而且有一些算法,如今来看,可能确实十分的精妙,但是有的耗时太多,有的效果不太明显,而且并非 clean code。

当时我把能量机关识别的流程完整的写了出来,然后一个一个梳理,写了一套新的比较简单的流程,跑起来也没有什么问题,可以说十分的流畅,而且也没有误识别的现象;在培训的时候也有这个识别任务,当时我用了漫水处理,这并非一个主流的写法,但我也把它作为一个方法封装进去了。

当时我们商量的是,因为自瞄还在老代码的框架里面,但是我已经新写了一套取流+能量机关的框架,把两个融合在一起并不简单,而且我当时也不是很会 ROS,所以说留一辆车给新代码,其他的都是老代码的。

自瞄当时还处于需要检测装甲板的这个阶段,最大的难度其实是灯条匹配,车辆的每一块装甲板都有两个灯条,怎么确定这两个灯条是属于同一块板子还是两块,这是一个难题。通过几何上的特征,可以保证大多数情况不出错,然而这并非全部,后面有不少的队伍出了一些异形车,使得这种朴素方法的误识别率更高了。

当时已经把能量机关做的差不多了,所以想着做一下自瞄,一开始是 yolo 识别一个 bbox,然后加一个灯条匹配,后面看到了沈航的开源,他们做了一个四点回归,直接求了装甲板的四个顶点,我的手比较快,直接把这套流程缝合到了新框架里面。

记忆中比较深刻的是当时的一次交流赛,是西安联盟里面的几个学校一起打,当时队长的意思是需要稳定性,所以说不允许换新代码,我偷偷在一个车上面放了新代码,可以说是效果拔群,事后队长来找我说,这个代码效果确实好,把每个车上都放上这个代码吧。

还有其他的事情是,能量机关也换了样子,所以说老的传统视觉不好用了,当时已经有了训练神经网络的技术,其实说是训练,主要是包括标注在内的一套框架,以及最后部署的代码,所以说我们对能量机关也做了一个神经网络去识别,同时我也写了一套新的视觉逻辑,也没什么问题。

后面就是联盟赛,联盟赛办在本校,肯定是要打出气势的。当时队伍里面除了组长 YZ,还有我、YT、同样是新人的 SY 以及 JXY 学长。JXY 学长招来了 ZH,他们两个人一起做了这个赛季的另一个重大项目,哨兵的 SLAM 和导航。

我们在联盟赛打的还算不错,最后拿了冠军,其中很大一部分原因就是哨兵出力了,同时当时的操作手也很有水平。那时候我的课余精力还很充沛,所以也报名了操作手选拔,当时说的是大家一起打一打,然后看看水平,具体叫谁去打会在群里说,结果我就被叫了两次,一共才打了两局,其他人貌似就已经十多局了,后面操作手出来了,我甚至都没有第一时间知道。再之后有人说,压根就不打算让视觉组当操作手,这句话是不是真的我就不得而知了。

再之后,组长 YZ 和其他的学长们,因为都已经大四了,所以开始要准备毕设,我是其他人里面代码写的最多的,所以说隐隐约约间有一种要成为组长的架势,也开始负责一些东西。

值得一提的是,当时的视觉圈子里面出了一个很厉害的开源,忘了是哪个大学了,作者叫陈君,所以大家称之为君瞄,用的也是 ROS 框架。我们的代码后面把他们的一些程序解耦了,然后做了修改,放进了自己的框架里面,我这个人特别手快,对这种解耦的事情非常擅长,后续调了调也就没啥大问题,现在我们的程序基本上沿用的还是这一套框架。

虽然说君瞄确实很不错,但是整体的氛围却让我感到非常反感,有点造神的感觉,当时陈君把他们录制的视频放到网上,大家都很吹捧,但是好像也没什么人在实战中打出来这个效果。

后来作者说是因为和人吵架,被人嘲讽了,所以把自己的程序删库跑路了,但是据传说,在此之前他用这个几百个 star 的 repo 拿到了大疆的 offer,所以是懒得搭理开源社区,还是真的恼羞成怒,还是要画一个问号的。

当时分区赛,陈君还和我聊过,拿着他们那个库的贴纸,问我要不要,然后就像是在推销一样,我说不用了,他依然说个不停。令我印象很深刻的是道具训练,这个环节大概就是每一个队伍调试一下能量机关以及飞坡之类的,他们队伍能量机关不行,就在场地里面调自瞄。这种行为其实有点行为艺术,因为自瞄完全在任何地方都可以,这个地方光线也不一定正确,完全就有种秀肌肉的感觉,事实上我印象里命中率也不高,车离的还很近。

有读者可能好奇,我们既然拿了他们很多程序,为什么我还对他如此诋毁,岂不是吃饱了骂厨子,这还要从比赛本身开始说起。

事实上,就像是我之前说的一样,我对于陈君的反感主要来自于造神以及饭圈的氛围。我们小组赛和他们分散了一个组,当时我们在他的算法上做了不少改进,自然要碰一碰,当时我们打他们,打到了一比零,我们落后,因为裁判系统的故障,比赛暂时暂停。那时候没什么人看好我们,毕竟君瞄威名远扬,这倒也可以理解,更何况他们已经先下一城。然而陈君在视觉群里面直接说,假如他把西交打败了,他就去无偿给每一个队伍调车,群里立刻席卷了一片西交必输的恶毒言论。当时我印象很深刻的深圳大学依然支持我们,我们现在和深圳大学关系也很不错,在分区赛也是和他们一个场地。这个事情也就导致我们之间确实结下了梁子,不过因为抽签的运气好(说起来,当时还是队长和我两个人去抽的签),我们在一比一平了之后,小组第二出线,反而战胜了劲敌晋级八强以及四强,遇到的都是状态不太好的队伍,而陈君则止步十六强,去打复活赛了。

另一件印象深刻的事情是哨兵,当时两位学长都来不了现场,而队长在申请建图的时候,因为疏忽没有通过申请,我当时负责哨兵的维护,也是出了不少的状况,最后基本上哨兵是通过在家里的巡逻获得了一点点的贡献。

后面到了国赛的时候,视觉组这边一直负责雷达的 LXY 接管了哨兵的工作,但令我印象深刻的是他把工控机一拿到手之后就让我做了格式化,出于谨慎,我对工控机中的内容进行了备份,不然估计程序都要消失了。

事实上,在第一个赛季的时候,视觉组主要起到作用的还是能量机关的激活,而且因为各种各样的原因,最后激活的效果其实不尽如人意,自瞄因为只能识别不能预测,或者说没有调过预测,所以说不能打高速旋转的小陀螺,在实际的赛场中作用不是很大,主要是一个辅助。

当然,我们做的工作还是很多的,我们完全地重新写了一套框架,包括说串口的通信/相机取流/识别和预测/能量机关,在这里面值得一提的是串口的一个奇怪的 bug。

很久以前,我们的通信就已经可以使用了,但是事实上还有不小的问题。因为 Linux 系统的特性,串口的通信本质上就是对文件的读和写,然而在细节上来说,还有不少的内容需要设置,我们使用了网上的开源程序,封装之后放到了我们自己的框架里面,但是出现了一个很奇怪的问题。我们的通信协议的长度是 64,也就是说,只有在我们接到一段长度是 64 的内容之后,我们才会对其进行解码,然而事实上我们经常收到长度为 63 的内容。这个问题我们想过很多方法解决,包括说是串口线的问题/串口的问题,甚至到了最后,我们感觉将线稍微弯曲一下,就会持续地发出 63,而将其恢复,通信就正常了。这种感觉就好像我们将那一个字节捏在了手里一样,让我们百思不得其解。最后是视觉组的 YT 发现了问题所在,在看了几篇博客之后,修改了代码,这时候我们才知道,原来是因为串口的收发会将回车不认为是字符而是真回车,导致这个字符不会被记录,从而少了一个字节。

到了国赛的时候是去深圳,在这里顺便说一下两个城市的住宿条件。我们出去比赛主要是学校出钱,或者使用社团的经费,当然我们每个人也都垫付了一些,其中甚至有的没要回来,这是后话。为了省钱,我们每次出行肯定都不是那种豪华酒店,往返一般是硬卧,酒店也很难安排到每人一张单人床,可能要很多人挤在一起。

长沙的条件一直都很好,我们住的是 LOFT,在市区里面,旁边也有吃饭的地方,车辆调试一般在晚上进行,我们会租一个篮球场,也在住的地方不远处;深圳在当时则是一个酒店,因为长沙的时候我已经实在无法忍受住宿,所以干脆特立独行,让家里人给我单开了一间房,酒店的条件也很舒适,市区里面,旁边还有商场。去深圳之后,我们是在一个羽毛球馆里进行调试,当时我负责反前哨站,基本可以做到百发百中,但是有些玄学,而且因为机械装配的问题,在离得比较远的时候,会出现怪异的情况:我发给电控一个坐标,希望他瞄准,瞄准的时候会抬高枪管,我就看不到目标了,导致在离的很远的时候不能正常的自瞄,这个问题在下一个赛季通过修改机械结构解决了。

国赛的时候,在调试的时候,视觉能做的事情已经不多了,能量机关差不多的打,自瞄的识别很稳,反前哨站则因为机械结构而爱莫能助。除了哨兵,由于上述的问题,导致本来还算能用的框架又出了不少问题,LXY 需要通宵调车。其他的我们几个视觉组的,前半夜把已经没问题的程序跑上几遍,然后就在一边聊天,等夜宵,我经常去场地边上的便利店里买几包酒鬼花生,很是好吃。

国赛倒是没什么好记录的,我们的水平,老实说,在当时并不配得上群魔乱舞的国赛,但是运气好,分在的小组竞争并不算很激烈。我们第一赛季的全部比赛,可以说能够胜出,都是因为有运气在里面,而这一点在国赛体现的尤为明显。小组赛的三个对手,要不然机器人出了常规问题,要不然哨兵出去了没有回来,导致我们几个在观赛席的反应是:“Nice,他们哨兵出去了,这下应该回不来了”或者“果然没回来,基地已经展开了,该去偷家了吧”,因为相较于今年,去年的对手普遍没有击杀哨兵或者上环高打基地的能力,或者是因为被我们主动的盯防而阻止的。

在这样的情况下,我们开始了两场比赛全部胜利,然后莫名其妙的,就出线小组赛了。从观赛席回到备厂区的时候,我们几个人问彼此,这就国一了?显然是有点不太相信这件事情的发生。

国赛的后续碰到的真高手,自然也就赢不下去了,我们的名次也就止步十六强了,但是好歹是在很多年后再次追平了队史。

组长之路

事实上,在第一个赛季结束之前,我们就已经基本确定了视觉组组长的人选,也就是我,抛开别的不谈,我可能确实做的工作比较多。

然而在国赛之后,LXY 也对组长的位置起了觊觎之心。大概是因为加分的缺乏之类的,他在国赛负责的是哨兵,可能认为加上了组长的身份,就可以获得不止两分的加分,于是便开始和我竞争。

我因为有事情,比赛结束之后就回了西安,大多数的队员还留在深圳,因为有大疆举办的青工会。据说是因为当时,之前定好的队长去打别的比赛,耽误了这边的进度,老队员对一大堆定好管理层都有一些意见,所以打算大洗牌。当时是队长和老组长找到我,我也记不清先后顺序了,包括 YT 也问我,视觉组组长是不是要换人。我心里倒觉得奇怪,我的培训教程都已经写得差不多了,为什么忽然有人提换人的事情?

后来大概了解了一下才知道,估计是视觉组在深圳期间没做什么事情(开始的时候需求就是那么多,我们都做完了,我之前还说过要不要调试一下防陀螺,队长也不让,我们还能做什么呢),估计是看 LXY 做的事情多(毕竟工控机都格式化了),所以打算把组长的位置换人。

LXY 其人,倒也不坏,但是干活的积极性确实不好说,当时我们几个其实关系都不错,但是这件事情确实把我气得不轻。之前他做的是雷达,来队里的次数就不算很多,雷达是老代码,相较于之前据说是需要删,都不需要写什么。后面接手了哨兵,也就需要经常来一段时间了。

我们当时拉了一个群,讨论组长人选的事情,现在来看,我其实对于组长是谁没什么所谓,只是说对于莫名有人说我贡献度什么的,心里确实不满。包括说后面有一段让我气愤的话:

唉,其实我说一下就是我看其他组的同学每天通宵熬夜调车感觉很心疼,感觉视觉组就这样走了很对不住其他组,所以我一般选择了陪伴”

视觉组工作做完了,留一个人守夜,其他人走,不也很正常吗?难道说让大家在这里空耗才是正确的吗?再说陪伴,怎么不见你分区赛陪伴了,我因为 RM,这一年来少说也熬夜了五六十天,估计上百,那时候你怎么不心疼了,不陪伴了?

这是我第一次隐约对 RM 产生了一丝失望。我高中就是打 RM 的,给我留下的都是快乐的回忆,但是大学的 RM 显然并非如此,越往后,越不是一个安心搞技术的地方。人情世故,责任推诿,勾心斗角,层出不穷。只是说我打了一年,一是舍不得一些朋友们,二是对得起一些人的期望,三是确实还抱有改变一些事情的念头,所以打算留下来。在今天来看,我还是不知道自己做的是否是对的,我不需要加分,第一赛季的分数早就够了,更多的分数也没有任何价值;科研的性价比远高于 RM,要我操心的事情也没有那么多,但是我还是留下来了,虽然可能没人因此感动。为什么呢,我会问自己,有太多人给了我太多的期待,我想,至少不要辜负太多。

考虑了许久,YT 打圆场,说暂时就先考察我,假如没问题,我继续当组长,我也和前队长保证,好,那就没问题,我就正式成为组长了,虽然说事实上我履行这个职责已经将近半年之久。

比赛也结束了,下一任管理层也都定下来了,那这个赛季基本上也就告一段落了,收拾收拾再出发,要准备下一个赛季了。

我们的招新工作其实有点混乱,早在暑假开始的时候,我们办理过一个综能课,当时就是说培训之类的,但是最后讲了一点点就不了了之,后面就要进行训练了,综能课快速完结。到了比赛结束,已经八月十多号,也已经到了需要开始下一轮招新的时候了。

我一向认为自己是有一些新人亲和力的,在招新的环节也比较下功夫,一方面我大二的时候确实更多时间会投身于科研,当初写了一些程序,可能还是需要新队员来继续开发,另一方面,我也确实认为,新鲜血液才是个队伍的未来所在。

之前的招新工作其实一个重点在于压力培训,我们培训的内容和讲的内容并不是很相关,而最后做的事情和培训的内容关系也不是很大,只能说确实是作为筛选所设计。而今年培训的难点,另一方面则在于人工智能的兴起,不像我当初的情况,大多数的代码都需要我顺着其他人的博客去查,而且质量也参差不齐,如今只需要和模型说上几句话,大多数问题就迎刃而解。

因此一方面,视觉组的培训应该更着重于帮助大家快速掌握一些基础技能,这些事情是人工智能也不能真正速成的,所以我在家的时候,大概录制了八期课程,去讲解视觉所需要用到的 C++知识,本身长度也不长,这样可以在线上就完成这最费时间的一步。在之后的培训,我也是主要从计算机视觉的基础说起,讲了一些通俗易懂的概念,然后就带大家上手代码。

事后来看,这种选择不一定是正确的,培训的效果确实很好,对于任务,大家也可以比较出色的完成,但是事实上视觉组的主要工作在于后期的长期调试,代码上的一些东西,一是没有必要再去找轮子,二是那些需要写出来的难度都不算很高,导致任务缺乏区分度。

一些同学确实是三分钟热度,很快就离开了,剩下的不少人都可以完整的跟下来整个培训。然而一方面出于一些交情,因为培训和新人走得太近,不太好意思通过打卡时间将他们开除;另一方面,大家的实力确实尚可,导致之后选拔不出来可以坚持下来的人,按照现在来看,当时选拔下来估计七八个人,现在只留下来了三个人。

要是将来还是由我来办培训,双盲的打分是肯定要存在的,而且估计任务的难度还要进一步提升。

当了视觉组组长之后,确实有参与一些行政相关的事情,然而到了赛季的后半程,这些事情又莫名其妙的消失了。我们队伍本来打算使用飞书,然而从结果上来看,除了项管还在坚持,大多数人其实用的不多,这种特别小型的团队,确实没有必要使用飞书进行管理的地步。同时也是因为熟人,物资管理到最后做的也不是很好,尽管我三令五申过,视觉组的物资,在使用之前要和我说一下,但从结果上来看,不只是我的键盘和设备丢的差不多,像是相机之类的东西,其他组拿走之后,我也要花不少时间才能溯源,还好最后没丢什么。

第二年的技术发展也算是日益完善,之前没有的视觉兑矿,以及更好的反陀螺自瞄,更好的能量机关算法,更好的 SLAM(最后是交给了电控组的同学,LXY 因为到勤时间不够被移出队伍了),也都陆陆续续地出来了,总体上发展还算平稳。我把去年我做的一些开发,陆陆续续的都交出去了,分配给其他同学,他们在我的基础上也有做很多的调整,或者独立做了很多的开发。

成为组长之后的一个明显的体验是,没必要再去亲力亲为的进行调试了,虽然说因为我还负责反前哨站的工作,所以和实际工作还有一些接轨,但是绝大多数时候,我只需要了解大家大致的情况就已经可以了。

这个赛季之中还有一些人员变化,但是因为我也不太了解具体情况,可能也就不会过多的介绍了,万一说错了,可能反而还要被其他人说。不过可以说的是,从体感来讲,我身边的队员普遍对于管理层都不太满意,而且一些进度上确实也有太过于 push 的嫌疑,现在比赛还没有结束,所以说换届还不会开始,事后怎么清算我自然也就不太清楚了。不过事实上我倒是观感不是很大,一方面现在的这些人基本都和我同届,而且我也都已经有了加分之类的,也可以说是死猪不怕开水烫,反正我事先定的什么目标,我就按照这个目标去执行,也不管别人催什么的,定的 ddl 之前肯定也可以完成。

一开始因为本身的自瞄,对于远距离的目标的识别和建模也都不太准确,所以说我的调试也不是很顺利,但是后面考虑到前哨站的特性,使用了更加 simple yet effective 的策略,总体来说就还算准确了。之前说的是命中率百分之七八十,后面我基本可以做到百分之百,但是因为发射之类的原因,有的时候可能卡一下,就会有一定偏差,但是这种问题也不是某一方的责任,确实是长期需要改进的。现在另外的问题是通讯,我发出去的信息在另一边不能很好的接受,似乎是因为电控的总线上挂了太多电机导致的,现在随着头越来越重,控制的死区也开始增大,这一点我暂时也没有想到很好的解决方法。

这些策略在学校的时候,还算很不错,一开始用的是大疆的 Gen1 弹丸,基本上可以说很稳,到了后面用 Gen2,事实上弹道就和电控的弹道模型有了很大的差距,这个事情在视觉这边可以用算法比较方便的解决。在电控端重新标定一个弹道模型,玄学成分太大,我也没有指望。后续的基本全部操作,都是为了弥补弹道上的问题,对弹道做了一阶多点的标定,不过显然的是,在没有解决本质问题之前,视觉的方案终究只是治标不治本。

这个赛季依然选择的是去长沙参加分区赛,然后再晋级国赛。相较于去年来说,一些视觉的方案确实已经被落地了,加上我们也派上了一些如平衡以及吊射英雄的一些比较前沿的兵种,所以说最后打出来的效果很是不错。

去年如此来看,确实运气不错,最后还拿了一个分区赛四强,今年就不是那么顺利了,但是还是打出了自己的水平,晋级国赛。

结语

一开始打算写回忆录,还是比较激情澎湃的,想着自己至少也打了这么多年,一定也有很多有意义的东西可以记录,然后我到后面却发现,好多事情早已无法让我兴奋起来。一些内容我记不清了,一些内容我也不太确定,太多的琐事太多无趣的瞬间,让我开不了口,也落不下笔,记叙也从顺叙变成的插叙,索性将故事收拾一下,等将来想写了,再做一些补充。

大学的 RM,一开始做技术的时候是很有趣的,不断自我提升的感觉也很棒,然而出一些自尊或者其他的情结,想要接任组长之后,我是反而慢慢地对这个比赛失去了一开始的激情,而回忆路越往后写,反而越觉得没什么事情好写。一些事情我已经记不清了,时间也仿佛飞快的流逝,那些古老的回忆,反而在我的印象十分深刻。两年的 RM 大学生涯,我好像做了很多,但是对一切又似乎没什么改变。机械依然是比赛的焦点,视觉组从重构到各项技术都达到新标准,我确实也或多或少都有参与,然而组员们的功劳,我倒也不能全都一个人拿下。

我忽然间想起来,在第一年去国赛的时候,YZ 学长和我说的话。他说自己虽然是组长,但是好像这一个赛季也没有帮上什么忙,我一个人向前做得太快了,大家都没有追上很多。YZ 学长的技术能力是我至今见过最顶级的一批人,一开始的很多探索也都是他牵的头,那时的他想的会不会和如今的我想的一样呢?

我或许给一切开了个头,然后每名组员就向前冲刺了,而我还呆在原地,缠身于生活中的琐事,回过神来的时候,自己却已经帮不上忙了。

好在结果不差,也算是没有辜负大家一路以来的努力,尽管我的参与也不算很多,但或许也还值得厚着脸皮说上一句,没有辜负当时大家的嘱托。

未来的比赛我还会不会打,我想了很久,假如没有人赶我走的话,大概还是会再厚着脸皮待上一段时间,不过未来还是属于新人的,我嘛,暂且日拱一卒吧。