查看: 2992|回复: 20

FOXTracker:模拟飞行到我的开源模拟飞行头瞄之小记

[复制链接]
发表于 2022-9-30 15:08:52 | 显示全部楼层 |阅读模式
FOXTracker:模拟飞行到我的开源模拟飞行头瞄之小记-5720
我大约从初中开始接触模拟飞行,从此玩了十几年时间。模拟飞行类游戏最有趣的一点是把人类有史以来,对个人综合素质,身体性能,反应能力,空间感知能力最高的事业之一:战斗机驾驶,变成了人人可以体验的东西。
当然这种体验很难说是没有成本的。你可以使用鼠标游玩诸如WarThunder,GTA,或者战地里的飞机,来体验“飞行”,虽然他们本质是FPS。或者你是有大毅力的人,克服万难在DCSWorld里面用键鼠满头大汗的把飞机发动机起来。但是相信我,这远不如“真正”的模拟飞行所能带来的体验。
真正的模拟飞行大约需要一台主流配置(指你买不到的3060)的PC,三到四件极为重要的外设,包括摇杆(操作杆),油门杆,脚舵,头瞄或者VR。



圈内知名的“罗技”蜂窝的摇杆油门套装。

FOXTracker:模拟飞行到我的开源模拟飞行头瞄之小记-9753

友人傻娜设计生产的ERGE脚舵,图源自淘宝“傻娜外设屋”。在此特别感谢傻娜对FOXTracker开发中提供的帮助。

有无合理的模拟飞行设备几乎决定了玩家从模拟飞行中能获得多少乐趣。
例如,在格斗中,玩家必须需要保持对敌机的目视持续跟踪,并且需要在盯着敌机的时候对自身状态有一定的感知能力。因此头瞄对于战斗机玩家几乎是必不可少的工具,通过使用头瞄,玩家可以直接使用头部移动来控制视野。当然,正常人不可能一边把头拧到背后(这是司马家限定技能,鹰视狼顾)还能看到屏幕,所以通常会有曲线映射,扭头二三十度视角就会转180度。
我在入坑模拟飞行的大约前十年,是玩得很痛苦的,其中原因当然是外设不得法,买了“名气最大”的赛钛克,后来证明这玩意就是垃圾,任何和赛钛克,罗技有关的模拟飞行设备都是出厂即电子垃圾。换了T16000m(后来又升级了成都造,成都造yyds)摇杆以后,在这方面体验大大提升,可另一个问题就是头部追踪了(头瞄)。
模飞空战最重要的事情就是飞行基础(控杆),对能量的把控,和态势感知能力。其中几乎所有的(21世纪之前的)空战格斗机动,都是围绕着“保持目视敌机的同时机动到敌机后半球”。
于是我理所应当的尝试过很多方案,包括国产对TrackIR的山寨品TrackNP

FOXTracker:模拟飞行到我的开源模拟飞行头瞄之小记-852

TrackIR,他们另一个在无人机圈人尽皆知的产品是OptiTrack动态捕捉系统

FOXTracker:模拟飞行到我的开源模拟飞行头瞄之小记-6164
TrackIR这类方案可谓非常的直接,使用几个反光球通过摄像头捕捉,很容易就能实现对头部的6D定位。不过这一方案的缺点也很明显,需要佩戴额外的设备,必须在FoV之内。很多年前我买了TrackNP(山寨版),使用体验十分感人(想打人):简单来说就是想打人,一度认为这种方案不靠谱,后来才知道是自己买错东西了。
还有通过IMU实现头部追踪,我直接装了一个pixhawk飞控在脑门上:
这个方案的好处倒是没有FoV限制了,也没有山寨TrackNP那些几乎不能使用的bug,但是问题也很明显,就是所使用的航向全靠磁罗盘和角速度计,这俩传感器就没有一个靠谱的。磁罗盘会受各种各样东西干扰,角速度计本身积分会飘。所以在飞行中需要不断修正视角。。。。。。另一个问题是IMU只能追踪头部旋转(那年头还没有ARKit)。对于一些设计的不是那么合理的战机,比如海盗,头部不能移动降落会变得非常困难。
于是我还是在用键鼠控制战斗
这里面还有一个有趣的方案我找不到存档了,是我使用手机IMU作为头瞄输入,用nvidia的串流功能把游戏串流到手机,使用一个手机屏幕放大镜,大概这种东西,来把手机带到头上

FOXTracker:模拟飞行到我的开源模拟飞行头瞄之小记-8319

我当时买的版本就是俩玻璃,没啥IMU之类的东西。。。

居然达到了一部分VR的效果,就是延迟十分感人,除了我这种天生不敏感的其他人秒晕。也就当做一个奇思妙想没有深挖下去了。
由于缺乏好的头瞄,我的模拟飞行成绩一直十分感人,战争雷霆全真(一个“所谓的”模拟飞行模式,气动没有那么好)一度DK(Death to Kill)远高于10.
在这期间,我还买了DCSWorld的F14战机,枭龙战机,但是由于缺乏合适的头瞄,也就偶尔飞飞。
在这期间,我一直在思考一个问题,如何能做出来一个靠谱的头瞄,于是很早就萌生了一个想法,直接使用人脸识别他不香吗?
是的,很香,其实很早就有人做过类似的尝试,诸如FaceTrackNoIR,这是一个欧洲大爷(指年龄)的“泣血”之作,也是诸多开源头瞄的老祖宗,算是最早的人脸识别头瞄实现,并且一开始是开源的,诸多后来的头瞄都和他沾亲带故,包括这位老哥开发的滤波算法,接口实现等等。
后来这个最新版本变得收费了,理由实在有点令人心酸:
For almost 30 years I (Wim) have suffered from a progressive and painful disease called Arthritis. Unfortunately, that was not enough: I was diagnosed with cancer a couple of years ago. Luckily I responded well to the chemo- and radiotherapy and I survived. One problem though: I lost my left leg as a result. Since then I have managed to work only part-time and our financial situation suffers greatly from it. You will understand that this also affects my wife Mary and my twin-daughters a lot.
近30年来,我(Wim)一直患有一种名为 "关节炎 "的渐进性痛苦疾病。不幸的是,这还不够:几年前我被诊断出患有癌症。幸运的是,我对化疗和放疗反应良好,我活了下来。但有一个问题:我因此失去了左腿。从那时起,我只能做兼职工作,我们的经济状况也因此受到很大影响。你会明白,这对我的妻子玛丽和我的双胞胎女儿也有很大影响。
来源:http://www.facetracknoir.nl/home/default.htm DeepL翻译
在他的官网上看到这段话,我瞬间兔死狐悲,对这个作者十分钦佩。并且非常高兴他还有赖以生存的手段,于是花了20欧元买了收费版。但是尴尬的事情来了:
这个程序和我的笔记本摄像头不兼容,我完全用不了。
得,二十欧元就当向先行者致敬,咱自己来。

FOXTracker初始

其实几年前我就想过开发一款人脸识别头瞄,苦于我一直认为自己不懂计算机视觉,更不懂机器学习和深度学习。居然连Computer Vision: Algorithms and Applications 一书都只读了一般,怎么能叫懂视觉呢!直到后来我发现炼丹真不用懂视觉(手动狗头)。
好了不开玩笑,是后来在视觉技术上有一定精进以后发现这事情没有那么难,又恰好遇到了2020年的疫情,在疫情期间整日宅在家里自然少不了打开我最喜欢的模拟飞行,于是想了想干脆把多年以来的夙愿,开发模拟飞行头瞄(并且去战争雷霆里面用12.7毫米机枪打爆敌人的狗头)实现了好了。
经过一些快速的搜索,发现这事真没有那么难搞,至少人脸6D Pose(6自由度,包括XYZ和姿态)识别的Demo GitHub上就有,效果居然还不错

FOXTracker:模拟飞行到我的开源模拟飞行头瞄之小记-2236

https://github.com/yinguobing/head-pose-estimation

在此之前,我一直以来的一个误区是认为使用CNN(卷积神经网络)进行6D Pose估计的方法应该是端对端的,直接从输入到输出,这里才发现业界对于人脸这种较为固定的目标比较常见的一个办法还是传统的路数,先找到二维特征点,再使用PnP进行姿态估计。
于是使用这个Github的提供的网络,我很快搞出来了第一个版本
然而这个版本的代码是基于TensorFlow的,虽然精度不错,但是效率十分感人,而且TensorFlow是一个你学了就会质疑Google 开发人员智力和开发策略的深度学习框架(指是否在通过不断更换API来制造话题得到免费PR,并且获得大量的commit从而增加年终奖走上人生巅峰,这波Google在平流层)。于是我很快就迁移到了OpenCV上,
还是同样的路数,先使用人脸识别抓取boundingbox,再使用OpenCV进行特征点识别,最后进行PnP。为了提高效率,有不少工程上的技巧,比如引入滤波而不是一直进行识别,合理的多线程机制等等。并且使用了OpenTrack作为后端,实现了自己的EKF滤波,当然测试以后发现EKF不太适合这个事情,所以一般使用opentrack里面的accela滤波器
然而考虑到OpenCV中模型的精度,这一版本同样只能看看风景。这个时期我接触到了傻娜生产的“傻瞄”,PointTracker硬件,三个灯配合一个索大法的PS3摄像头进行姿态识别,居然效果十分不错。于是干脆把自己的头瞄放着了,转而使用PointTracker进行愉快地游戏(指在DCS里面被AIM120C 10海里外打爆狗头)
这故事本来到此为止,我也继续干正事了,头瞄也有不错的解决方案:使用Pointtracker完全可以胜任各项模拟飞行任务,我的战争雷霆KD也慢慢变得多了起来,DCS也终于开上了我心爱的枭龙战机和最爱的大猫。直到我看到了@6的一个演示视频,
@6,圈内人称老六,算是国内模拟飞行元老,DOF(任我飞)时期就活跃的任务。国内头瞄的半壁江山是老六主持开发的Aimxy头瞄,和我之前自制的飞控头瞄相似,Aimxy也是基于IMU的,只不过很巧妙的一点是使用了三个IMU模块绑到身体的各个部位,来实现对头部移动的估计,这一产品最早是好友陈博介绍给我的,在他那体验了单头瞄版本。陈博也是一个会玩得,非常富有“创新精神”,其实和某些坐井观天的认知完全想法,中国人最不缺的就是这玩意,认为中国人缺乏创新精神的多半是没有接触到正确的圈子。陈博的把头瞄贴到了大疆的FPV 头盔上,早期这玩意是可以接HDMI,于是又是一个伪VR诞生了。效果居然十分不错。
言归正传,老六的Aimxy最早选用了IMU-磁力计融合的方案,这东西的特点是容易受干扰,有些飞友的眼镜耳机都会干扰到头瞄,于是被圈内一些飞友开玩笑为“风水头瞄”。另一个问题是三个模块才能实现6D估计。于是老六团队花了几年搓了一个大招,也就是上面视频介绍的AimxyZ头瞄。(然鹅硬件拖了半年发售还没有消息)
我这一看,同样是无佩戴的视觉方案,老六这效果怎么这么好!一定是有高人进行了魔法调参(思想逐渐迪化)!我一定要搞个一样好用的!于是展开了新的探索。。。直到我的效果开始接近老六的六七成以后,我才发现一个悲伤的事实:老六的方案好像大概也许根本不是基于单目摄像头的。这令我想到了一个典故:
89式重机枪:现在世界上最轻的重机枪质量的保持者就是这款机枪,全重仅25千克。这款机枪研发的成功源于一个错误情报,当时苏中交恶,苏联撤走了在中国所有的研究人员,后来听说苏联设计出25千克的NSV重机枪,中国不甘落后,费尽千辛,终于研发出这款重25千克的4.89式重机枪,最后才得知,苏联的那款25千克不是全重。
来源:https://www.sohu.com/a/293898116_607689
大概就是这种心情吧。
FOXTracker:从Demo到实用

看了老六的视频,我的判断是由于后脑勺他都能识别,大概率是基于端对端的模型,于是我也应该往这方面尝试,经过一番Google Scholar和Github以后,我找到了FSANet(https://github.com/shamangary/FSA-Net),一个很不错的端对端的网络,原作是基于Pytorch的,恰巧我彼时正在搞一些深度网络部署的工作,用来加速我部署在无人机上的神经网络(后来成功使用TensorRT加速了Yolo,SuperPoint, NetVLAD),于是很快就把Torch的FSANet转化为了onnx模型,并且给我的FoxTracker里面嵌入了FSANet。
不过,事情也许没有那么简单,FSANet和之前的路数有一点小小的矛盾,FSANet只能估计三轴姿态,而且测试表明,由于投影关系的原因,平移身体会带来相对于boundingbox一块小图中姿态的变化。需要做一些转换到正确的姿态。同时,FSANet需要先截取一个小图用来识别(和基于landmark的差不多),由于FSANet识别的姿态是相对这个box而言,转化后如果box抖动也会十分抖动,于是需要一些滤波的工作。最后,FSANet的数据最理想的使用方法当然是融合pnp姿态一起使用,但是FSANet和pnp出的姿态有一个10度左右的俯仰偏角,同样需要修正。当混合FSANet和PnP测量以后,系统的效果一下有了质的飞跃:
此时距离老六的视频发布过去了一周,其实就是肝了一个周末。这大概就是数据融合的魅力吧。FSANet的rotation(旋转姿态)测量和PnP虽然都来源于图像,但是本质上已经算完全不同的measurement,两个完全独立的高斯分布融合平均以后当然能得到更小的方差。
后来,又试着换了摄像头,使用从傻娜那搞的PS3 Eye摄像头白光版本,经过一些开发和对滤波器的调试,效果居然还不错
从这开始,FoxTracker算是从“作者都懒的用的玩具软件”变成了一个“作者觉得拿来飞飞空战格斗不错的软件”。在空战格斗项目上,FoxTracker已经算是合格了,虽然还是有点小小的抖动,但是已经完全可以灵敏的追踪头部运动,而格斗精度要求不高,平滑即可。FSANet的作者也到我的Github repo留言,对我把他的工作推向应用非常开心。
但是,这仍然不够,DCSWorld这样的拟真游戏很大的乐趣是在其航电系统,使用HOTAS(手不离杆系统)操作现代战机MFCD(通用多功能显示器)才是DCSWorld最有魅力的一点。而这需要很高的显示精度,毕竟屏幕上的MFCD已经很小了,再晃就晕了。

FOXTracker:模拟飞行到我的开源模拟飞行头瞄之小记-3378

就凭枭龙的这三个大屏幕,谁说中国战机航电不好我和谁急。整个DCSWorld里面最人性化最先进最好的航电就是枭龙了。中国航空看起来很以人为本,而不是毛子那种风格。来源:DCSWorld官网

同时DCS很有趣的一点是模拟了飞机的各个子系统,体现出来就是可以进行“冷舱启动”。逐一启动价值数千万美元的各个子系统。但是飞机上这些开关位置通常在侧后,这就需要转头低头动作较大。这个时候已有的版本就没法好好工作了。
FOXTracker:从实用到更好

恰巧有人在老六视频留言,有一款AITrack(https://github.com/AIRLegend/aitrack)的软件在GitHub上,效果很不错。老六于是转发了我。我一看,哎呦这个效果确实不错,尤其是低头抬头处理很不错,当然AITrack的问题也很明显,这老哥没做多线程机制,所以实时性非常拉胯。顺藤摸瓜,找到了AITrack使用的网络模型的来源,OpenSeeFace(https://github.com/emilianavt/OpenSeeFace)。这是个模型作者一个二次元老哥,大致有点想虚拟偶像出道,于是开发了一款开源软件做虚拟偶像,不可避免的用到了人脸识别相关技术,尤其是特征点的提取。这也是我见过效果最好的开源特征提取模型

FOXTracker:模拟飞行到我的开源模拟飞行头瞄之小记-998

https://github.com/emilianavt/OpenSeeFace

https://github.com/emilianavt/OpenSeeFace
这个模型好就好在,转头过去也能把被遮挡住的特征点捕捉出来。
于是我很快就把他加入了我的软件,FOXTracker的性能进了进一步的飞跃:
(这个视频也是最全面的体验,知乎视频压得太厉害,清晰版还是看下面b站吧)
但是问题也来了,OpenSeeFace的模型非常吃计算资源,在我的i7笔记本上用他的中级模型只能跑出20fps,最好的模型更是调到10+了。这会使得延迟感很高,而剧烈的空战是非常吃延迟的。为此,我也尝试自己对OpenSeeFace性能进行了大量的优化,包括从整个软件从32bit到x64的迁移,网络本身的优化等等。尤其是OpenSeeFace开发者老哥是个无私奉献的大好人,得知我的需求以后为我量身训练了一个版本的模型。这样,FoxTracker就提供了多种精度的模型供大家选择。效果也是非常的好。不仅能够操作MFCD,也能使用游戏中的头盔瞄具+AIM9X一键删除敌机瞪谁谁死了。
对于作者本人,更进一步的飞跃来自于硬件的升级,当更新了一台有AMD的5900x的电脑以后,可以直接把最大的模型跑满60fps,如果摄像头允许甚至能到90(amd yes!虽然要加价买。。。。)!这个时候限制程序发挥的反而是好的摄像头高帧率比较贵了。
至此,FOXTracker已经非常成熟,可以作为一个合格的头瞄来用了。作者甚至一度考虑过挂steam
结束

有时候巅峰往往是绝唱,换装了5900x+3080之后,怎么会放过VR呢?于是我很快入手了一套Oculus Quest 2,戴上Q2进入DCS以后。我承认我再也不想用任何头瞄了。再好的头瞄都无法带来VR的临场感和体验感,而Q2恰好是清晰度刚刚好够用的标杆产品。更别说VR远好于头瞄对姿态的掌控了。在Q2的加持下,我的战雷KD在某些强势机型上一度破10。至此以后,我的头瞄开始退居二线,只在我vr飞累了或者想轻松一下飞飞。
不得不说,头瞄属于过去,VR才是未来。然而对于有追求的模拟飞行玩家,有机会上真机(哪怕只能开开塞斯纳)才是终极目标。所以现在在我的头瞄群里,我鼓励每一个有条件的朋友都搞套VR试试。
这款软件的开发对我来说也是乐趣本身,认识了不少朋友,模飞圈的朋友,GitHub上的朋友,体会到了Github这个全世界最大同性交友网站的乐趣。自己儿时最喜欢的事情被自己搞的更好玩,多年以来的想法被实现,都是很有趣的事情。同时虽然我自己头瞄用的慢慢不多了,但是我的头瞄仍然帮助了很多飞友,国内的飞友,国外的飞友,除过开飞机的,还有开欧卡的开赛车的。前阵子打开邮箱,突然收到了一封来自北欧的感谢信,就觉得做点对世界有益的事情(哪怕只是非常微小,对一个很小的团体有用的),还是挺有成就感的。
头瞄早就放在了GitHub,也欢迎有兴趣的朋友试用,成为飞友中的一员了。
发表于 2022-9-30 15:17:22 | 显示全部楼层
很有趣的文章,VR 果然对开车开飞机这类坐着玩的游戏更友好。

顺便发个牢骚:说 GitHub 是同性交友网站这个破梗...作者可能没有恶意但是女性工程师研究员看了不知道会是什么感觉
回复 支持 反对

使用道具 举报

发表于 2022-9-30 15:29:48 | 显示全部楼层
[捂脸]你别说,还真有女性程序员也在刷这个梗而且刷的更起劲……
回复 支持 反对

使用道具 举报

发表于 2022-9-30 15:43:55 | 显示全部楼层
这个梗身边也有女程序员也没有啥太在意的。
回复 支持 反对

使用道具 举报

发表于 2022-9-30 15:55:07 | 显示全部楼层
送给你这篇文章:写给女性的盟友们 - nell nell的文章 - 知乎
https://zhuanlan.zhihu.com/p/363069771
回复 支持 反对

使用道具 举报

发表于 2022-9-30 16:00:21 | 显示全部楼层
……讨论两性话题请绕道谢谢
回复 支持 反对

使用道具 举报

发表于 2022-9-30 16:09:12 | 显示全部楼层
fox瞄真好用(白嫖超快乐)
回复 支持 反对

使用道具 举报

发表于 2022-9-30 16:14:36 | 显示全部楼层
tracknp加个主动架其实很好使,用视觉的话最好用是其实是April tag,耳机架上贴几个就能稳定用c++算法解决6dof pose问题。非要人脸6dof现在最好的是iPhone的结构光,还开放api,有几款app就是用的这个。 用NN的问题就是算得快的不好使,算得慢的和游戏抢显卡资源。
回复 支持 反对

使用道具 举报

发表于 2022-9-30 16:25:47 | 显示全部楼层
大佬还在继续开发吗?
回复 支持 反对

使用道具 举报

发表于 2022-9-30 16:37:15 | 显示全部楼层
牛[赞],顺便想问一下vr怎么看按键,带上vr之后就只能盲操了吗
回复 支持 反对

使用道具 举报

发表于 2022-9-30 16:51:49 | 显示全部楼层
这都能打拳?
回复 支持 反对

使用道具 举报

发表于 2022-9-30 17:02:29 | 显示全部楼层
这都能被说是打拳?
回复 支持 反对

使用道具 举报

发表于 2022-9-30 17:07:33 | 显示全部楼层
同性交友有限制男性?和女性有一毛钱关系?讨论个技术问题,非得在这扯女性
回复 支持 反对

使用道具 举报

已绑定手机
发表于 2022-9-30 17:20:35 | 显示全部楼层
5000多  这是要把我小金库掏空的节奏啊
回复 支持 反对

使用道具 举报

发表于 2022-9-30 17:31:15 | 显示全部楼层
hotas就是手不离杆操作系统,凭手感拨开关就行
回复 支持 反对

使用道具 举报

发表于 2022-9-30 17:45:25 | 显示全部楼层
Oculus Quest 2玩pc只能串流吧,会不会有延迟
回复 支持 反对

使用道具 举报

发表于 2022-9-30 17:57:21 | 显示全部楼层
感谢大佬!大佬辛苦了!
回复 支持 反对

使用道具 举报

发表于 2022-9-30 18:02:59 | 显示全部楼层
老六的Aimxyz居然是单目摄像头,技术上感觉和Fox瞄差不多,可能799就出了个摄像头吧
回复 支持 反对

使用道具 举报

发表于 2022-9-30 18:09:10 | 显示全部楼层
大佬您好。请问win11如何使用foxtracker。望回复
回复 支持 反对

使用道具 举报

发表于 2022-9-30 18:23:39 | 显示全部楼层
你好作者,我想请教一下Oculus Quest 2有关的问题,我有轻微近视,在使用quest2游玩dcs的时候hud和面板我看着十分的模糊,是不是存在设置可以使清晰度变高
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

快速回复 返回顶部 返回列表