车辆控制器 - scutrobotlab/RM2021_simulation GitHub Wiki

2021 模拟器中,每台机器人都有对应的控制器代码。控制器用于实现机器人的移动、视角旋转、射击、超级电容、辅助瞄准等特性,可以理解为真车的车控代码。控制器主要分为两个部分:用于移动的运动模型和更高一级的超级电容、小陀螺、辅助瞄准等功能。

运动模型

为了尽量接近真车手感,模拟器需要实现一套合适的运动模型。由于 Unity 提供的载具物理方案不包括麦克纳姆轮车,很多车辆运动特性需要手动实现。整体上,麦克纳姆轮模拟还是基于原版 WheelCollider,在其基础上增加了横向移动、防止翻车等特性。另外,运动模型还需要控制云台俯仰、旋转。

车辆移动部分,在纵轴上的车辆移动使用了物理引擎的自带模型。在搭建模型时需要注意根碰撞箱的位置,控制好车辆重心。车辆重心过高或重量过轻会导致车辆严重抖动。借助轮碰撞器,可以通过控制轮扭矩实现加、减速。在没有按键输入的情况下,需要显式设定刹车扭矩来快速停下车辆,以模拟真车手感。车辆在横轴上的移动则需要手动实现,最简单的方式就是直接将整车进行平移,在启动和停止平移时添加阻尼,并限制最高平移速度。

车辆移动和平移需要注意一点:做阻尼的时候要对车辆所处姿态进行判断。车辆倾角会对阻尼程度造成影响。当车辆在坡上时,静止或死亡时就不应该设置阻尼,模拟车辆滑下坡道的效果。在坡道上的驱动扭矩可能要比平地上大,平移速度要比平地上小。具体数值调整必须按照运动模型设计和与操作手沟通确定。此处还应该加入底盘功率限制功能,可以简单实现为最高速度限制。

云台的俯仰是对云台对象进行简单旋转,并增加阻尼效果。2021 模拟器的阻尼效果实现都使用了积分的方式,用输入改变转变速度,每帧按比例削减速度。云台的旋转实现方式有两种。简单的方式是将整台车一起旋转,加上阻尼,可以实现不错的效果。此处还可以加入缓慢的自转效果,模拟真车的陀螺仪零偏。如果要更进一步,可以将云台与底盘分开,实现底盘差速跟随的效果,更加贴近真车。视觉效果接近真车的好处是可以进行更有效的视觉联调,后续会继续讨论这个话题。

防止翻车就是在监测到车辆倾角过大时重置车辆状态。如果希望做得更加细节,可以根据轮碰撞器返回的数据,将四轮的悬挂视觉效果做出来。不过这属于锦上添花的部分。

更多功能

车辆小陀螺功能的实现方式很多。为了简化代码,2021 模拟器的小陀螺实际上只是视觉效果:当开始小陀螺时,隐藏真实的底盘,显示一个用于旋转的,没有碰撞体积的底盘,同时降低弹丸命中检测概率。这样实现的好处是不用考虑全向移动的问题,车辆的平移和旋转如常。由于装甲板的旋转会改变对象重心,导致车辆旋转不稳定,2021 模拟器并没有对装甲板进行实际旋转。如果能在这个细节上进行改进,模拟会更加真实,也是视觉联调的基础。

在比赛中,经常出现机器人为己方单位挡子弹的操作。由于底盘与云台分开,实际上云台部分是没有碰撞体积的,导致机器人上半部分挡不住弹丸。这里的一种实现思路是在机器人上半部分添加一个触发区域,当脚本检测到弹丸进入触发区域时,将弹丸弹开,并加入方向上的一点点扰动和速度上的削减,可以模拟出较为真实的反弹效果。

超级电容就是一个同步数值。在没有开启超级电容时,数值缓慢增长到 100%。开启超级电容后,数值根据车辆速度变速下降,并按比例增加车辆功率上限,实现加速效果。超级电容值会在所有客户端间同步,目的是在裁判第一视角下正确显示数值。

机器人的辅助瞄准功能有两种实现方式,一种是内置实现,即利用模拟器的数据,直接进行解算;另一种是与视觉代码联调。辅助瞄准就是先识别出装甲板位置,再根据弹丸初速和车辆、目标位置,解算出理想的射击抛物线,然后驱动车辆、云台旋转和俯仰,到达对应射击姿态。重复这一过程,就可以实现瞄准锁定。具体的抛物线解算方式可以参照这里。在模拟器中,由于数据没有误差,加上简单的提前量预测后解算出的抛物线非常精确,需要加入扰动使精度接近真车水平。

除了地面车辆,其他类型的机器人也需要运动模型。哨兵机器人由于运动方式简单,只需要让其做线性平移,加入一些阻尼和不规则运动等效果即可。无人机的运动模型比较复杂,而且是使用遥控器控制的,模拟上比较困难。这里提供两种实现思路:第一种,不设飞手角色,无人机等运动由云台手代为操作。无人机本身只需要平移,可以视情况加入一些晃动,使飞手视角更加拟真。第二种,参照无人机的设计,在 Unity 中还原一架真实的无人机。由于没有很多扰动,只要正确实现一种控制算法,如 PID、ADRC 等,就可以用物理模拟的方式让无人机模型起飞。在此基础上,实现一个遥控器输入接口,用输入数据直接控制无人机模型。这个方案复杂度较高,且需要与无人机组同学充分沟通,优化模型;遥控器输入部分可能涉及到本机跨进程通信,在后面讨论联调的部分会再次提及。

一个想法,参照对抗强度,加入车损要素。可能对培养操作手车辆保护意识有帮助。

⚠️ **GitHub.com Fallback** ⚠️