我在RoboMaster那些年
昨晚和朋友聊到扫地机器人、无人机、视觉,就想起来“年轻”时候参加的RoboMaster机甲大师赛,因此想分享一下参赛那年的经历。
赛事规则每年都会有变化,因此本文所述的赛事规则对当前比赛大多已不适用。
RM是一项主要以大学生为目标人群的机器人对抗赛,有点像MOBA类游戏,但是玩家操控的“角色”是真实存在的物理设备。除了专门做研发的同学外,也有专门练习操作的同学,也有一些研发同学会做操作手。说到分工,大概有:队长、运营、电路、嵌入式、视觉、机械、操作手这几大类。
这场比赛的机器人分为:英雄机器人、步兵机器人、哨兵机器人、工程机器人、无人机、基地、补给站。主办方还会限制每一类型机器人的最大尺寸、功率等,以防威力过大破坏赛场或造成安全事故。这些机器人都是学生们自主设计和调试的,尽管赛场上看起来很多机器人长相差不多,但是不同团队在很多细节设计上都会有很多的差别,这也是比赛成败的关键之一。这项比赛每年都会举办,留给学生的准备时间大概是半年到一年,很多学生在完成学校的课业后,大部分时间都需要泡在团队里。
机器人怎么攻击的?通过发射弹丸。但是比如工程机器人是不允许攻击的,步兵、英雄和无人机是可以攻击的。但是英雄发射的是大弹丸(高尔夫球)。下图是哨兵和步兵对抗的画面,上方是哨兵机器人,这是一台全自动的机器人,但是只能在一条导轨上运动。
如何判定攻击是否有效呢?依赖裁判系统。比如上图中的“装甲板”(比如贴了1号的模块)就是属于裁判系统的一环。弹丸击中裁判系统后,被击中的机器人会被扣血,如果血量归零,那么就会被裁判系统断电,这时候就需要依靠工程机器人将阵亡的机器人拖回补给站等待复活。
上图右边9x9宫格就是神符系统,可以用来给团队加成。如何获得这个buff?需要机器人击打九宫格,九宫格上面的数码管会显示一串数字,届时九宫格中的每一格将会刷新出一个新的内容,这时候就需要机器人识别数码管,然后在九宫格上找到对应的数字击打,击中目标数字后,九宫格会刷新。这项功能可以由操作手完成,但是实际上九宫格会按照一定频率重新刷新内容,因此每次数字的位置是不一样的,依靠人眼观察是来不及的,所以需要视觉和嵌入式一起来执行自动操作。
我在团队的时候是在视觉组,做的是自动瞄准部分。当时的视觉大概分为两个方向,自动瞄准和神符。如上所述,打击神符需要需要识别数字或者图案,因此大多是通过ML的方案来做的。自动瞄准因为需要很高的检测频率,因此基本是通过传统视觉方案来做的。以下我会主要介绍自动瞄准。
自瞄要做的一方面是需要检测对方装甲的空间坐标,第二可能需要判断对方机器人的运动方向,第三是需要和嵌入式一起联调云台,以求最快将“枪管”移动到目标位置。
检测对方装甲主要是通过灯条的特征。通过上面哨兵机器人那张图也可以看到,装甲左右两边是有两个灯条的,红色或者蓝色,这是和所在队伍是哪方相关的。并且规则会规定,不允许在装甲周围投射灯光,因此可以保证装甲周围的灯光是比较纯净的。当然,这是理想情况,因为赛场也是会有灯光污染的,因此无法保证装甲周围的灯光环境一定干净。当时的规则也会存在一些漏洞,如下图,会有队伍在装甲周围安装衍射片以干扰对装甲的视觉检测。不过既然规则也没说明,这也是不违规的。(不是上交、这只是截图,来自知乎。)
如何检测?主要是通过颜色空间转换,使用颜色信息,滤掉很多无用的信息,可以得到很多候选灯条矩形块,然后再通过一些先验知识(比如装甲一定是一个矩形)等信息讲相应的矩形块组合,得到装甲区域,这时候就检测到了目标。除了软件方法,也可以采用一些硬件方法提高检测效果,比如在镜头前使用滤波片,使用高帧率的工业相机等,软件上也有额外可以做的,比如检测到目标装甲后,会通过AI目标识别方法,判断“装甲”是否在机器人身上,以降低误检测。
但是这时候仅可以得到像平面坐标,有用的是物理空间坐标。如何做?通俗方式可以使用双目视觉,但是会提高成本(如果使用工业相机,一个很贵),和需要比较高精度的机械装配。比较节省的方案是使用单目视觉,只要能够提高相机帧率和算法帧率,那么使用相邻帧计算空间坐标就是可行的,因为检测帧率很高,可以认为目标的实际位置距离计算位置不是很远,这时候可以通过一些预测方法得到目标的大致真实位置。
如何预测目标位置?为什么要预测?是因为从成像到检测到计算目标位置是存在时延的,而且在“子弹”出膛到击中目标也是需要消耗时间的,这些时间不可忽略(主要是子弹飞行时间),所以需要预测目标下一次的位置。主要做法就是通过目标的加速度(通过历史位置可以得到,是个矢量)和空间距离预估新位置。
仅有以上部分还是不够的,只是完成了视觉部分,要让子弹射出去,还需要依赖嵌入式。云台摆动到目标位置不是一条指令就可以达到的,因为存在抖动和加速度。因此很重要的一点是,如何让云台尽快响应到达目标位置。控制方法有很多种,比如模糊控制、PID控制等等。视觉在这套系统里作为上位机,需要给云台发送位置信息,嵌入式会控制云台运动到目标位置。因为软件架构设计的缺陷(我现在是这样认为的),当时发送数据需要考虑底层的响应速率,在云台开始摆动的时候,数据发送太快或者太慢都不行,都可能提高云台的响应时间。所以需要上层控制发送速率,比如目标丢失的时候,需要依赖历史信息,预测出目标的位置,以补充这些缺失的帧。
自动瞄准主要是运用在哨兵机器人上,但是比如步兵、英雄、无人机也是会应用的,只是一般需要操作手手动开启。
在RM的比赛中,每一个角色都起到了很重要的作用。仅凭我浅薄的记忆和理解,列一列每个角色的大概职能。
- 队长:赛务安排、资源分配、团队精神支柱等
- 运营:宣传、招聘,团队建设等
- 机械:所有机器的结构,需要考虑赛制规则,也需要很强的稳定性,以保证机器人下台阶、碰撞或者被高尔夫击中后不会散架或爆炸
- 视觉:目标检测、目标识别
- 电路:电路设计和制作,功率控制(大概是这样)等
- 嵌入式:云台、电机控制、通信
- 操作手:熟悉机器人操作和机器人特性
我离开团队很久了,也没再特意关注过这场比赛,但是在团队群里可以看到一些老队员对这场比赛依然保持着很高的热情。
我想起来有人对这个比赛的评论:这个比赛最重要的是过程,而不是最后的奖杯。很多人通过比赛的过程能收获很多,是学校教学给不了的,也是工作经验给不了的。
我记得的是,大家累了就坐在地上吃外卖,困了就躺在泡沫板上睡觉,也有同学为了能尽快调试出期望的效果刷了多少个夜(不是我),吵完架也会记得回来工作,大家还是兄弟。现在回过头去看,这就是热情呀。一群人为了同一个目标,日日夜夜,没心没肺,只为了同一个简简单单的目标。或者说有时候也没有目标,只是想着把自己的事情做好,做得更好。这种热情是我在团队的时候没有意识到的,也是在离开团队、参加工作后开始怀念和珍惜的,可能未来也很难有这样一个纯粹的团队了吧~