Jachin Shen
Jachin Shen

Categories

Tags

RoboMaster 2019 击打哨兵

RoboMaster2019中部地区赛结束后,我们学校拿到了年度总决赛的晋级资格。不过如果想要在总决赛更进一步,很多功能都需要完善,尤其是自动瞄准功能。队长找到我,希望我能够帮助视觉部,完善自动瞄准。看到他们今年有如此巨大的进步,我也很愿意帮助他们再上一层楼。本文主要介绍我设计的第一版英雄打哨兵方案。

在RoboMaster比赛中,哨兵作为基地的守卫,可以决定一局比赛的胜负。哨兵在一段固定的轨道上运动,今年规则虽然限制了底盘功率为30W,但是强队仍然可以做到相当快的移动速度,对于操作手来说,仅仅依靠手瞄击打是很困难的。英雄机器人虽然在今年被削弱了很多,但仍然是比赛里最强的输出单元,可以发射一发100伤害的大弹丸,是击打哨兵最有效率的单位。英雄打哨兵的主要困难点在于,由于枪口热量的限制,英雄无法连续发射弹丸,因此只有每一发都击中哨兵,才能实现高效率的击打。

第一版选择了最容易实现的方案。环境假设如下:

  • 哨兵在轨道上不断往复运动
  • 英雄固定在碉堡区域
  • 操作手手动选择击打位置
  • 由自动程序选择击打时机

如图,建立模型:

1567821240248

在t时刻,哨兵正沿轨道以v的速度运动,程序需要判断击打的时机是否合适。如果击打时机合适,在t‘时刻,弹丸就会刚好击打到哨兵。所以接下来需要解决的就是如何测量运动速度v和判断当前时间t是否合适。

如图,哨兵的运动可以近似看做一个正弦曲线:

1567996047239

图中横坐标表示时间,纵坐标表示位置,橙色线代表英雄机器人瞄准的位置。在橙色线附件,哨兵的运动可以近似看作匀速运动,这样就可以通过线性回归来测量速度v了。另一方面,如果想要刚好击打到哨兵,就需要在t‘时刻哨兵刚好到瞄准的位置,而t’时刻又由t时刻、摄像头延迟 $t_{camera}$、图像处理延迟 $t_{process}$、机器人发射延迟 $t_{shoot}$和弹丸飞行时间 $t_{fly}$决定。因此,判断的标准就是如下等式:

其中 $x_t, v$ 都需要在实际情况中测量,$x_{t’}$是事先设定好的。$t_{camera}, t_{shoot}$ 需要事先测量好,$t_{process}, t_{fly}$ 需要实时计算。

当然,在现实中,不可能完全相等,因此程序中真实的触发条件是误差小于一定范围:

这些都是理论上的推导,实际中最大的问题其实是延迟的不稳定。

  • $t_{camera}$的值很稳定,而且可以通过摄像头拍秒表的方式精确测量,我们测下来大概在 80 ms。
  • $t_{process}$的值视算法而定,如果用传统算法,可能会因为环境的不同,处理时间不同;如果用深度学习,由于模型确定,处理时间也确定。不过,可以通过记录系统时间的办法精确测量出 $t_{process}$ 的值,我们在二代妙算上使用深度学习,大约为 30 ms。
  • $t_{shoot}$的值就比较麻烦了,典型值在 100 - 200 ms,但是变动非常大。这个就需要机械和电控的同学帮忙,首要任务是减小方差,尽量稳定在一个值,否则视觉算法再好也无能为力。
  • $t_{fly}$ 也很麻烦,因为这个值由两个量决定,距离和弹丸速度。距离可以通过视觉算法测量,也可以通过固定位置来固定一个值,通常在 2 m 左右。弹丸速度一般在 15 - 20 m/s,算上距离,延迟就是 100 - 133 ms,距离越远,延迟越大,而且越不稳定。这里也是需要机械和电控的同学配合,尽量稳定弹丸速度。

如果能准确测量出各种延时,并且控制好延时的方差,就可以完成打哨兵的任务了,我们的测试视频如下:

总结起来,难点不在于延迟太大,而在于延迟不稳定。延迟不稳定主要来源于发射部分,需要机械和电控部分的全力配合。视觉算法的首要任务其实不是减低计算时间,而是提高识别的稳定性,保证每次都能识别到哨兵,才能计算出速度。