ICRA 2019 RoboMaster AI Challenge

2018年12月,备战RoboMaster国赛主队中的一个研究生找到我,想要组建一支队伍参加2019年的ICRA AI挑战赛,他作为队长管理队伍,我作为技术领导管理技术路线。当时,我也是我们学校RoboMaster国赛队伍视觉部的顾问,之前帮他们规划了新赛季的技术路线。上个赛季主队里也有一批人尝试参加这个AI挑战赛,但是技术报告没有通过,没有获得赴澳大利亚参加比赛的资格。当时我是主队里的核心技术负责人,并没有分出精力参加这个比赛。今年,官方为了减低难度,提供了官方机器人和软件框架,让参赛者专心设计核心的战斗策略。我也退居了二线,想尝试一下这个比赛。于是,我们又找了几个主队里的队员和自己的同学,初步组建了7个人的队伍。

下一步的任务就是争取学校里学生创新中心的支持。官方虽然提供了机器人作为标准开发平台,但是一台售价高达三万,还不包括摄像头、机载电脑和激光雷达。不过官方提供了递交技术提案的机会,如果得到很高的评级,就可以获得购买机器人的优惠券,将总的参赛成本压到五万左右。同时,这也可以用来给指导老师证明我们的技术能力,毕竟去年没有参加成功,需要经过组委会认证过的优秀提案来说服指导老师。

技术提案的工作开展比较顺利。一方面是因为只是需要论证可行性,并不需要做出实物,所以成本很低;另一方面国赛主队之前的技术积累也可以用上,比如自动瞄准。官方开源的框架给了我们初步的方向。我们一起分析讨论官方框架的结构后,把技术分成了SLAM定位、自动瞄准和战斗策略。队长负责SLAM定位,从国赛主队拉来的队员负责自动瞄准,我和另一个同班同学负责战斗策略。SLAM定位其实在官方框架中已经很完善了,主要是希望理解其中的原理,便于之后定位出错的时候找到并解决问题。自动瞄准的技术路线在之前国赛的赛季规划上已经讨论过了,两边共享技术。去年的自动瞄准就是我开发的,主要是用传统的视觉算法实现。今年希望改成双目方案测出深度,进行更精准的打击。战斗策略希望能用强化学习实现,这也是目前研究的前沿。我和我的同学都是计算机系的学生,编程基础较好,这段时间主要是构建出战场模拟器,给之后的强化学习训练用。之后我们一般保持一周开一次会的节奏。每次开会先检查一下进度,如果进度不如意的话,一起探讨一下遇到的困难,尝试找到解决方案。到寒假的时候,大部分工作都完成了,准备撰写技术提案。我们提前两周开始写各自部分的初稿,然后提前一周写最终版本。期间很感谢一位在德国交换的老队员,隔着时差帮我们整理技术提案。最终技术提案拿到了A级评价,可以获得两辆官方机器人的6折优惠券。我们借此争取到了指导老师的支持,并准备接下来的技术报告。

新学期开始前,机器人还没有到学校,所以主要的工作是完善模拟器。之前的模拟器只实现了移动、射击等基础功能,这段时间里我们又陆续添加了路径规划、补弹、Buff区等功能,最大程度地模拟真实赛场环境。新学期开始后,官方机器人终于到学校了。我们就分成了两拨,我、我的同班同学和德国回来的老队员继续完善模拟器,并且开始开发强化学习。剩下的队员负责在真车上调通官方框架、激光雷达SLAM定位和自动瞄准。他们遇到困难时我也会帮助他们解决。印象最深的Bug就是,发现车跑得太快,定位就会错乱。检查各种参数都没问题,最后发现是激光雷达的旋转速度不够,如果车跑得太快,激光雷达扫描到的信号就会产生畸变,影响了定位。解决方案也很简单,换了一个更好的激光雷达,感谢学校的大力支持。还有各种大大小小的问题,比如激光雷达供电不足、激光雷达TF树的设置、机载电脑上PyTorch和TensorFlow的安装等等。幸好最终都顺利解决了,离提交技术报告的时间也越来越近了。

提交技术报告前一周,大部分的功能都在真车上实现了,不过都存在一些小问题。SLAM定位算法是官方框架里已经包含的,解决激光雷达的问题后就很稳定了。自动瞄准虽然换成了双目,但是稳定性不佳,经常晚上能用,白天就不行了。战斗策略已经可以用强化学习训练了,可以实现追击敌方,不过如果看不到敌人,就会经常收敛到一个静止的状态,没有设想中自动巡逻的功能。最后,尽量把各个功能调稳定之后,提交了技术报告。最终技术报告拿到了A级评分,获得了参数资格和1000美元的补贴。比起去年已经有很大的进步了,不过我们在撰写技术报告的时候,就觉得现在这样去参加比赛是不行的,需要变更一些模块的技术路线。

变更最大的是自动瞄准模块,稳定性实在难以适应真实的比赛。在一个队员的建议下,我们转向了深度学习。那个队员也负责起了模型的训练,选用了tiny YOLO做目标检测。真车试验下来,稳定性的确好很多了,速度上能达到10+fps,也足够用了。最终我们到ICRA比赛现场也是用的这套方案。

战斗策略方面,撰写技术报告前,我们首先尝试了DQN,发现不是很适应这个场景,之后又转向了Policy Gradient,效果上好了很多,不过收敛很慢。技术报告出结果后,我们一起观看了DeepMind的演讲,发现了很多之前被忽略的细节,总体结构上也转向了ActorCritic。另外也放弃了完全用强化学习实现,而是尽量复用官方框架中已有的手工策略,只有不好手工编写的追击部分用强化学习实现,而且还增加了额外的保护程序,限制追击时的活动范围,防止撞墙。这种混合的战斗策略在实车上运行得很好,手工编写的宏观策略控制巡逻、追击、逃跑、补弹和触发buff,强化学习只负责追击的具体行为。具体效果见如下视频:

拿到参赛资格后,技术外另一个大问题是差旅费。由于这个比赛刚开始举办,并不在我们学校的科创竞赛名单上,因此没有办法报销差旅费,我们需要自己寻找赞助。幸运地是,我们机缘巧合地找到了赞助商,赞助商也答应赞助我们两张机票,不过要用上他们的产品。正好他们的产品可以用来作为机载电脑使用,我们就达成了愉快的合作。再加上资助的1000美元,基本上就可以支持比赛时的住宿了。

最终我和德国回来的老队员一起去加拿大蒙特利尔参赛了。我们几乎可以说是最艰苦的一支队伍了。其他队伍都有十几个队员参赛,可以分担任务。而我们只有两个人,却要带两辆车,每辆车都要25千克,只能一人搬一台车,遇到没有电梯只有楼梯的地方更是痛苦。我们打包行李的时候,几乎达到了托运的极限。学校的航空箱是特意为VEX比赛和美国航空公司订做的尺寸,刚好不超。但是我们的机器人大一圈,只能把底盘放进去,云台拆掉放其他行李箱。另外,为了在加拿大运输航空箱,我们还自备了两个折叠小推车。我们出发时最终的行李为:两个航空箱分别放两辆车的底盘,一个大的行李箱放两个云台,另一个大的行李箱放两辆折叠推车和各种工具,每人一个小行李箱带自己的行李,还有每人一个背包。航空箱和大的行李箱托运,小行李箱带上飞机。

正式比赛第一场,我们其实输的很可惜,对方两辆车都不能移动,我们还有一辆车正常工作,并且打出了伤害,但是由于软件版本同步错乱的原因,枪口热量的限制没有改成新规则的数值,导致自己的血量扣得更多。第二场比赛确实是实力不如对方,输掉了比赛。

其实这样的结果我们来之前已经有心理准备了,所以很乐观。毕竟我们是第一次正式参赛,能够完赛并且人和车安全地回去就已经很好了。被淘汰之后,最主要的是和其他队伍技术交流。我们在机场就遇见了吉林大学和浙江大学,他们看到我们只有两个人,也很大方地表示,愿意给我们提供力所能及的帮助。我们还和加州大学伯克利分校的同学交流了一下强化学习的用法。我们是用强化学习实现具体的策略,而他们是用强化学习实现整体的策略,暂时也没有发现其他队伍有用强化学习的。另外我们还去了 ICRA 的会场参观,感受了一下顶级机器人会议的氛围。遗憾的是我们比赛完就直接回国了,没有在蒙特利尔多游玩一阵。

参加这样比赛的感觉是很奇特的。当比赛打得非常激烈时,子弹乱飞发出乒乒乓乓声,周围就马上聚集起很多的与会人员。他们对这种全自动的对抗非常感兴趣,甚至询问如何购买参赛用的机器人。我们也非常热情地给他们介绍这个比赛的规则,需要通过发射子弹到对方机器人的装甲板上造成伤害,然后交流一下各自的研究兴趣。我就遇到了一个研究无人机的研究生,他对这个比赛非常感兴趣,还想了解比赛场地里的各种区域各自有什么作用,我也一一给他解释了启动区、补弹区和Buff区的作用。不过当他问我成绩怎么样的时候,我只能遗憾地说被淘汰了。总之,只有亲身参加了RoboMaster系列比赛的人才能真正体会到其中的魅力,这种机甲战斗的场面,对于一个男孩而言,是无法抵挡的。

回国后,我们开会总结了一下。从目前比赛的发展阶段来看,其实还没有到比拼核心战斗策略的地步,更多地还是比拼基础功能的稳定性,和自动瞄准的能力。从拿奖的角度来看,做好这两点其实就可以得到很不错的成绩了。不过,从技术的角度看,还是很希望能够用上强化学习,真正地把近年来的科研成果落地,做出成品。随着比赛的发展,各支参赛队技术的积累,相信未来对战的水平会越来越高,期待更加精彩的对局!