CVRM 系列自瞄 - 使用说明

对应预测器更新日期 2022年7月27日 15:46。因为预测器更新可能有逻辑变动,最好先查看小电脑上 ~/Workspace/CVRM2022-infantry/armor/predictor/readme.md 中显示的预测器更新日期

假设鼠标右键为 自瞄跟随,右键 + 左键 为 自瞄跟随打击

视觉相机并不是图传相机,图传相机紧连在枪口上面,步兵视觉相机在枪口下方 5cm,且 视野范围更小,长宽约为图传的 1 / 2

使用建议

  1. 3m 以内命中率高
  2. 视觉看同一个敌人越久,预测越准。根据剩余子弹评估是否应该多看一会儿再打
  3. 自身在左右急停、或者目标在左右急停时 用自瞄需谨慎,自瞄容易被甩飞好几发子弹
  4. 打陀螺需先 手动看它 0.5 ~ 1s,然后自瞄打。看越久,半径计算越准,命中率越高
  5. 对于高速电容陀螺,可以尝试打击,也可以等几秒钟后对方电容耗尽再打
  6. 如果枪口热量满后射频极低,可以松开左键等待冷却,与对方周旋一段时间或撤离现场几秒,再回来打一梭子
  7. 如果自瞄消失了,或者打很简单的目标都不行了,果断手瞄,赛后反馈给视觉

操作经验

情况推荐操作说明
如何选择自瞄目标不按鼠标右键,将准心移动到目标附近;然后按下右键开启自瞄模式,当前目标将保持(若自瞄模式下该目标从视觉相机视野中消失,则自瞄将立即选择距离准心最近的目标)不按右键时,自瞄将收到电控的 MANUAL 信号,此时每一帧都会尝试捕获距离准心最近的敌人,注意前哨站等部分敌人会被保持为目标零点几秒;按右键时,自瞄收到 AUTOAIM 信号,并保持捕获当前目标。目前自瞄不针对敌人编号设置优先级
关于距离推荐保持在 0.5 ~ 3m 使用自瞄太近视觉相机看不见,太远处命中率下滑,7 ~ 8m 外神经网络难以识别
敌人装甲板静止快速追到对方 3m 内开始 自瞄跟随打击/
敌人在前后方向任意平移pitch 仅须改变抬头补偿,压力较小
敌人向左或向右平移yaw 变化较大,压力大
敌人左右刹车、左右急转弯自瞄跟随,不打弹,等它加速度小了再打自瞄容易被左右急停甩飞子弹
敌人在近处非电容陀螺 60rpm-先手动让对方保持在视野中心 1s,然后用 自瞄跟随打击立刻自瞄打击会被甩飞,因为反陀螺模型未激活。反陀螺模型需要一些时机去算对方的半径,因此 看陀螺再久一点,比如 2 ~ 3s,可以进一步提高命中率。越近的敌人,半径算的越准,3m 以外半径有点难算
敌人一边平移一边陀螺自瞄跟随打击此时敌人的平移和陀螺往往都不是匀速的,所以需把握好时机使用自瞄才能保证命中率
敌人高速电容陀螺 100rpm+可试试自瞄打。若命中率低于 30%,推荐等待对方电容耗尽后自瞄打。必要时手打中心/
敌人半个身子 被遮挡 且在陀螺调整自己位置使对方暴露后打击;或者不打反陀螺在这种情况下无法被激活
某号敌人是平衡步兵赛前视觉调参设置对方为平衡或者设置自动识别平衡平衡的挨打模式不同
敌人是侧身赖皮平衡步兵抓对方装甲板暴露的机会打击;或者和队友配合围攻/
敌人是平衡陀螺先手动让对方保持在视野中心 1s,然后 自瞄跟随打击打击平衡也有反陀螺
敌人是哨兵评估发射的延迟,避免子弹飞行时对方刚好弹射规避加速度对当前运动模型很不友好
打击旋转的前哨站让视觉先观察 2s 再打击/
自身子弹十分有限使用自瞄时,先 手动瞄准自瞄跟随 一定时间,再用 自瞄跟随打击视觉连续看到一个敌人越久,算的越准
自身枪口热量已满,冷却未提升,每秒仅 2 发左右,且敌人血多于 100松开左键让自己冷却几秒钟,再回来打一梭子。冷却期间可以撤离现场或者与对方位移周旋每秒 2 发就算全中也不怎么下血,实战时对方会获得很长的机动时间撤退回血。而且此时打陀螺,冷却发弹的时间点可能 刚好全是打不中的时间点,或者刚好全是打得中的时间点,命中率很不稳定
自瞄命中率很不理想 / 自瞄未运行果断手瞄。赛中可再次尝试几次自瞄,观察自瞄是否恢复正常。赛后一定要反馈给视觉/

使用信息

步兵反陀螺实验期望命中率

自身静止,距离 1 ~ 2.5m 的四装甲板敌人原地陀螺,平地 无障碍物遮挡观察 3s 以上。在该距离,对于非电容陀螺来说 15 ~ 30 射速的命中率相差不大;对于 60rpm 以上陀螺则 30 射速命中率期望较高。自身陀螺造成的抖动自身平移带来的位移不稳定性起伏路段上的颠簸,都会导致自瞄命中率下滑 5% 到 10%(非相对值)。

反陀螺和非反陀螺的 射频 相差不大,热量未满时均应达到或接近 10发/s

自瞄会对敌方英雄和步兵同时进行装甲板分别预测和全车预测(反陀螺),计算目标时根据对方转速决定采纳前者还是后者的结果

敌人转速 rpm = 转每分钟期望命中率装甲板运动模型(常规预测)全车运动模型(反陀螺)
静止100%正常/(更新但不调用,因为跟随不如前者紧)
0 ~ 20rpm80%仅边缘甩飞一些子弹/
20 ~ 30rpm80%/(更新但不调用,因为甩飞逐渐增多)良好跟随,枪口随装甲板周期性转动,看起来跟常规预测差不多
30 ~ 50rpm70%/良好跟随
50 ~ 70rpm50% ~ 60%/跟随看似良好,但视觉预测开始受制于测量延迟的精度
70 ~ 100rpm30% ~ 50%/(?)跟随看似良好,但控制跟随速度受制于延迟的大小
100rpm+0%/跟随看似良好,但很可能全部打在装甲板的间隔中

其他情况预期,射频保持较高:

敌人情况期望命中率装甲板运动模型(常规预测)全车运动模型(反陀螺)
左右平移,陀螺 20 ~ 30rpm,距离 2m50%/对中心运动的预测较谨慎
1 ~ 3m 前后平移,陀螺 20 ~ 30rpm60% ~ 70%//
原地陀螺 30rpm, 距离 5m30% ~ 60%,弹速越高,期望命中率明显提高//
原地变速陀螺 10 ~ 40rpm, 距离 2m50% ~ 60%/对角速度跟随较谨慎

若跟随看似良好,但明显未达到期望命中率,一般都是出现了可排查的 bug

反陀螺模型未激活?

在对面旋转速度高于 20rpm 时,如果 自瞄跟随 被甩飞或者 自瞄跟随打击 打出的子弹被大量甩飞,一般是因为反陀螺模型未激活。有两种原因可以导致该情况:

  1. 由于距离太近或者有障碍物遮挡,对方在视觉相机视野中暴露很不完整。
  2. 手动观察时间不够。

四装甲板敌人的反陀螺模型需要敌人转速高于某阈值,且在视野中的出现的装甲板数量于 1、2 之间变化。在 0.5m 外观察陀螺 1s,基本都会进入反陀螺。

为什么普通预测会被陀螺甩飞(为什么陀螺难打)?

敌人陀螺下,装甲板是圆周运动,水平速度巨大,而且反复切换,出现时间短。普通预测不能良好预测出应该往哪里打子弹才能让对方接到子弹。

对于预测器来说,还需要考虑一些延迟:

  1. 视觉相机采样传输 + 神经网络识别的延迟(~15ms)
  2. 预测算法的延迟 (~3ms)
  3. 各种信号传输的延迟 (~20ms?)
  4. yaw pitch 电机跟随的滞后 (~30ms?)
  5. 发弹指令到拨盘转动、子弹下落后被加速的延迟(~60ms)
  6. 子弹飞行时间(可用打击点计算)(~150ms)

超高速陀螺的转速达 720+ degree/s。40 ms 的延迟即可让装甲板朝向角旋转 30 度,躲开子弹。

当前常见 bug(不是模型能力和操作方法的问题)

“改参数表”的方法见下一小节

问题可能原因如何确认原因解决方法
没自瞄相机离线观察相机指示灯检查相机线和相机寿命
 小电脑关机观察小电脑指示灯检查是否开机,检查接线和电压问题
 视觉电控协议不通自瞄会打击自己阵营的人且切换自身阵营后依然如此;电控或视觉查看是否收到对方信号检查视觉电控代码版本
 相机光圈或焦距不佳,看不见连网线看看相机视野连网线根据 flask 画面调节光圈和焦距
视觉能收到电控的数据,但收到的“敌人颜色”错误且闪烁式切换“敌人颜色”机器人遥控器没启动/启动遥控器
无法打击超远处目标神经网络未识别连网线检查神经网络检测结果可试调节焦距和光圈,如果实在无法识别,则需优化识别算法
 超远目标被预测器剔除检查预测结果;测量目标距离并查看参数表中的 NEW_ARMOR_MAX_DIS可适当增大 NEW_ARMOR_MAX_DIS
 抬头补偿后视野中无目标检查相机视野调节相机安装角度,或更换相机
自瞄无法自由地在两辆同色同号敌人之间切换瞄准自瞄认为太远的两个同色同号装甲板必存在误识别,会抛弃后来出现的那个/比赛时不会出现该情况
无法手动选择新敌人,按右键总是瞄向旧敌人为了打击前哨站、平衡,以及应对神经网络的漏帧,自瞄会保留非最优目标一定时间,因此需要松开右键手动看向新敌人零点几秒后,才会切换目标/预测器代码可修改不同敌人的目标保留时间,代码位于 armor/predictor/enemy_predictor.hpp,但修改后需要重新编译。注意目前普通步兵保留 0.02s,前哨站在旧版本中曾设置为保留 1.5s、较新的版本是 0.8s
自瞄落点普遍偏向一边视觉陀螺仪标定不佳连网线看看 flask 输出的敌人高度或全车模型绘制是否水平重新标定相机和陀螺仪
 视觉偏置参数不佳/调节参数表中的偏置数值,那里注释写了调节各个参数以后的效果
自瞄打近处和打远处目标落点偏差甚大视觉相机标定不佳flask 输出的距离均值与真实距离差很多重新标定相机和陀螺仪
自瞄打静止目标时枪口高频抖动且噪声巨大pid 参数不佳/调节 pid
自瞄打平移目标明显超前或滞后视觉延迟参数或 pid 参数设置不佳/配合调节 aimer_param.yml 延迟参数和 pid 参数
反陀螺打简单陀螺,大量打在两装甲板之间延迟参数设置不佳/调节 aimer_param.yml 延迟参数
反陀螺时枪口跟随的中点偏离敌人中心较远枪口和相机安装偏差对方不论往哪个方向陀螺,自身枪口都朝着同一方向偏离若打击命中率没问题,可以不调节。若调节相机安装方向,须重新调整 aimer_param.yml 偏置参数

如何调节自瞄参数

连接

配置网线的 IPv4 地址。用网线连接小电脑网线接口,按 Win + R 后输入 powershell,回车进入终端。

等待小电脑开机。在终端输入 ssh nvidia@192.168.137.xxx(xxx 与小电脑相关,可在 100 到 120 之间尝试),然后输入密码 nvidia,此时进入小电脑的用户文件夹。

输入 vim ~/Workspace/CVRM2022-infantry/assets/aimer_param.yml,终端开始编辑预测器参数表。

此时如何使用 vim 编辑器:按 i 键进入正常编辑模式,开始修改数值。编辑完后,按 Esc 退出编辑模式,输入 :w + 回车(英文冒号、小写字母 w、回车,中间无其他符号) 则保存。输入 :q + 回车 则退出 vim。

保存参数后,自瞄程序会在短暂延迟后读取并使用之。

在浏览器地址栏输入 192.168.137.xxx:3000(英雄为 192.168.137.xxx:8888),回车进入 flask,网页如下。

先勾选 网页下半部分“自定义复选框” 中 show armor aim 左边的小方框,然后点击 “实时视频” 中的 armor aim,跳转到预测器绘制的视频。

最终界面如下,左边是网页,右边是终端 vim。注意 网页图像中间有白色、黄色、橙色三个小圆点(对于静止目标,黄色圆点会刚好覆盖橙色圆点)。待会要用。

1) 调落点

每隔 24h、或者每经过 20min 的跑图、或者重新安装枪口或摄像头之后,建议重新调整落点。

在参数表中找到以下三个参数。

注意!为了确认 参数实时更新程序 在正常运行,可以先开启自瞄,瞄向静止目标后,试着调节 CAMERA_TO_BARREL_YAW 若干角度,譬如调大 5 度并输入 Esc + :w + 回车 以保存,观察枪口是否在短暂延迟后转动 5 度。若枪口未响应,请问视觉。

  1. CAMERA_TO_BARREL_Y: 测量视觉相机中心到枪口中心所需向下平移的距离。单位为米。例如此处为 -0.055,意思是枪口在视觉相机上方 5.5 cm 处。

  2. 找来一个静止装甲板作为目标,放在前方 2 ~ 4m 处,并且把它正对枪口。启动自瞄,发射 3 颗以上子弹。若落点的均值偏离装甲板中心较远,调节 CAMERA_TO_BARREL_YAWCAMERA_TO_BARREL_PITCH,角度制。直到落点基本在装甲板中心附近,调节效果在文档中均有注释

2) 调延迟

调延迟需先调好落点。

每隔 24h、或者调节过 pid 控制之后,建议重新调延迟。

在参数表中找到以下三个参数。数值都以 为单位。

不可颠倒延迟参数的调节顺序。

  1. 调节 ADDITIONAL_PREDICTION_TIME。开自瞄,先瞄准一个静止目标,观察视频中橙点和白点(注意,黄点可能覆盖橙点)的 左右相对位置。然后让目标较快地向左或向右匀速平移,此时白点不会动,橙点和黄点会动,观察橙点和白点相对稳定后的 左右相对位置。我们希望 目标平移时橙点和白点的左右相对位置目标静止时橙点和白点的左右相对位置 一致。调节参数方法为:若橙点过于接近 黄点,则调大该参数;若橙点反向偏离黄点过远,则调小该参数。实践会更形象。图示:

假设静止时,橙点和白点(橙点被黄点覆盖)相对位置如下:

我们希望平移时,相对稳定后的橙点和白点相对位置与之前一致。希望效果如下:

下图这种情况,橙点往箭头方向偏离原来位置太多,需调大 ADDITIONAL_PREDICTION_TIME 几十毫秒或一百多毫秒:

下图这种情况,橙点有点反向偏离原来位置了,需调小 ADDITIONAL_PREDICTION_TIME 几十毫秒:

  1. 调节 SEND_TO_CONTROL_LATENCY。开自瞄,跟随并发弹打击 匀速运动的目标。注意须等到跟随稳定后发弹,因为开始跟随时都会有点跟不上。若预测总体跟不上,调大 SEND_TO_CONTROL_LATENCY。若预测超前,调小 SEND_TO_CONTROL_LATENCY

一般调节 15 ~ 40ms 就会有肉眼可见的变化。本参数在调好后往往是一个负的值,比如 -0.020。

  1. 调节 DEFAULT_CONTROL_TO_FIRE_LATENCY。开自瞄,打击 2m 处匀速原地陀螺的目标,目标转速须在 20rpm 以上。观察子弹打击时机是否正确。若认为子弹需提早打击,则调大该参数;若认为需延缓打击时机,则调小该参数。

调节该参数之前,推荐将下方 TOP_AIM_MAX_ORIENTATION_ANGLE 参数暂时设为 0(只瞄中心),TOP_AIM_MAX_OUT_ERROR 暂时设为 0.2(收紧打击时机宽度)。调节完毕后再改回原数值。

调节 15 ~ 40ms 就会有肉眼可见的变化。注意,本参数不影响跟随效果,仅对反陀螺选择的打击时机有影响。

以上,准度参数已经调完。可能需要调节的还有(按从上到下顺序):

  1. UPDATING_ENEMY_MAX_NUM: 最多同时更新的敌人数目。目前算力开到 5 一般也不会出现卡顿,但是会加大小电脑负载。
  2. AUTO_RECOGNIZE_BALANCE_INFANTRY_ON: 自动识别平衡。除非敌方平衡亟须针对,且我们无从得知对面平衡的标号(若得知平衡标号,可设置下个参数),否则不建议开启。
  3. INFANTRY3_IS_BALANCE, INFANTRY4_IS_BALANCE, INFANTRY5_IS_BALANCE: 各辆步兵是否是平衡。需关闭自动识别平衡才能生效。
  4. BULLET_RESISTANCE_K: 子弹空气阻力系数。

    预测器中的滤波器包含 预测、观测 两个步骤。预测值 由前几帧的 观测值 推导而出。预测值和观测值总是存在误差。我们对这两个值先验地设定方差。方差越小,越相信该值。越相信预测值,跟随速度越慢,但跟随抖动越小。越相信观测值,跟随速度越快,但跟随抖动越大

  5. MOTION_EKF_Q_X: 调大此值若干倍,可加快位置追踪,但瞄点抖动也会增大。
  6. MOTION_EKF_Q_V: 调大此值若干倍,可加快速度跟踪,但瞄点抖动也会增大。
  7. MOTION_EKF_R_YAW: 调小此值若干倍,可加快左右追踪,但瞄点抖动也会增大。
  8. MOTION_EKF_R_PITCH: 调小此值若干倍,可加快上下追踪,但瞄点抖动也会增大。
  9. MOTION_EKF_R_DISTANCE_AT_1M: 调小此值若干倍,可加快抬头补偿追踪,但瞄点抖动也会增大。
  10. INFANTRY_AIM_MAX_ERROR: 调小此值,可更谨慎选择打击除哨兵外兵种的时机。
  11. SENTRY_AIM_MAX_ERROR: 调小此值,可更谨慎选择打击哨兵的时机。
  12. TOP_ACTIVE_W, TOP_INACTIVE_W: 激活反陀螺的最小角速度 和 维持反陀螺的最小角速度,单位 度/秒。旋转较慢时,装甲板运动模型打击效果其实优于反陀螺模型。
  13. TOP_CENTER_R: 调大此值,可降低打静止陀螺的摆动,但是也会降低动态陀螺的追踪速度。
  14. TOP_AIM_MAX_ORIENTATION_ANGLE: 调小此角,可缩小打击陀螺允许的敌方装甲板朝向角范围。英雄可设置为 0,步兵可设置为 30。
  15. TOP_AIM_MAX_OUT_ERROR: 调小此值,可缩小打击陀螺允许的宽度范围。
  16. PNP_DISTANCE_FIXER_A2: 当 pnp 测距不准时,可借助测距仪和文档上关于该参数的注释调节此值,上场前救急用。

如何更新自瞄(预测部分)代码

首先搞到一份较新的 CVRM2022-infantry。假设其在 D:/ 目录下。

配置网线的 IPv4 地址。连接小电脑 ssh nvidia@192.168.137.xxx 之后,新开一个终端窗口,在终端执行拷贝命令(如需要,密码为 nvidia):

scp -r D:/CVRM2022-infantry/armor/predictor nvidia@192.168.137.xxx:~/Workspace/CVRM2022-infantry/armor

scp D:/CVRM2022-infantry/assets/aimer_param.yml nvidia@192.168.137.xxx:~/Workspace/CVRM2022-infantry/assets/

之后 在 ssh 的终端窗口 执行(若需要,密码为 nvidia):

cd ~/Workspace/CVRM2022-infantry/build # 进入 build 文件夹

sudo date -s "2022-07-18 10:28" # 注意,这里设置为当前时间

rm -r * # 移除 build 文件夹中所有文件

cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=g++-10 -DCMAKE_C_COMPILER=gcc-10 # 生成编译配置

make -j8 # 编译

等待 2~5 分钟后,自瞄编译完成,此时执行 sudo reboot 重启小电脑。

画图定义

橙色点:如果我们能指向这里,那么发出去的子弹应该能打中。

黄色点:由于电控对斜坡输入的控制有稳态滞后,我们发送量包含额外的 yaw_v * delta_t,以使稳态时我们的指向就是橙色点。


作者 github 主页传送门: https://github.com/JulyFun.