光荣与梦想 | XMove动作捕捉系统(一)


640?wx_fmt=jpeg

今年春节回到老家,翻出了2011年春节时焊电路用过的松香和和硬盘角落里的代码。感慨万分,遂有此文。文章过长,分为两部分,本文为2010-2011年,XMove从第一代到第三代的故事。

诞生于考研的第一代

保研尚未确定,我挤在考研自习室里非常无趣,看到了一篇关于加速度传感器的新闻。也许是弥漫在空中的泡面味和臭脚味刺激到了我,我灵光一现,想到了利用这种传感器开发游戏控制器的想法。彼时,市面上还没有这样的成熟产品,更谈不上AR和VR了。

我似乎都忘记了考研,之后是疯狂的元器件采购,我创下了一天拿6个快递的记录,跑了无数趟电子市场。也许你不不信,我的第一代电路板竟然是自动布线的!

第一代XMove非常简陋,只使用了一枚MMA7455加速度计,裸露的电线,伸出来的无线发射器,非常山寨,只有位于双手和双脚的四个节点。

640?wx_fmt=jpeg

回家之后,别人都在看考研书,我在盛夏的酷热中通宵达旦地焊电路调代码,终于在某天夜里的凌晨两点,我迷迷糊糊地发现了bug,程序被我调通了!当时兴奋地差点撞到天花板。

我妈妈给我缝了一个简单的手套,能把传感器套在手上而不影响操作,很贴心:

640?wx_fmt=jpeg

玩极品飞车9看起来是这个样子,怎么刹车呢?左右脚的传感器能很好地实现加速和刹车,不过肯定没有力回馈啦。

640?wx_fmt=jpeg

我给它开发了第一版的宣传册,现在看来感觉好浮夸:

640?wx_fmt=png


我还用MFC设计了第一版服务器端的控制软件,所有的C++代码都在一个文件里,路子特别野,连图表控件都是一个个的点画出来的(80后可能听过有种叫GDI的技术):

640?wx_fmt=png

第一代版本非常简陋,却赢得了一致好评,在当时的全国大学生创新竞赛中轻松拿了一等奖。想起来都要偷笑,总共的开发时间也不超过10天…

第二代:手持控制器

开发完第一代的XMove,我得知自己已顺利保研,在那段现在想起来最无忧无虑的时光里,我开始着手第二代系统的研发。

第一代系统没有按键,加速度计只能检测线性动作,精度不够。在那个街机还是诺基亚N97的时代,陀螺仪很稀奇,比米粒还小却几百块钱一枚。这套控制器的硬件堪称豪华。有了硬件大神的加盟,我们的硬件比之前做的精细多了。

第二代的主要进步是下面这个带有按键和彩色LCD的手持手柄,还内置了我为其在裸机上开发的操作系统,从底层调度,硬件驱动到上层的GUI控件,都是纯手工打造的,C代码约一万行。

640?wx_fmt=jpeg

这个手持终端在2KB内存的单片机上,实现了漂亮的动态菜单,支持人机对战的五子棋,俄罗斯方块:这些游戏都可以通过旋转控制器来实现,几乎不需要按键:

640?wx_fmt=jpeg

系统主菜单:

640?wx_fmt=jpeg

甚至我还在上面开发了能通过旋转操作的中文输入法,只要旋转它就能输入全部的文字,单手利器,也算是当时一个很超前的创新吧:

640?wx_fmt=jpeg

那段时间,我每天早上起来先打两个小时的游戏,中午吃过饭拿根雪糕,慢悠悠地在北邮的主干道上遛弯,之后便拿着电脑去实验室写代码。

小学有个梦想,就是拥有一个无所不能的掌上电脑,因此换了三台文曲星都不过瘾。这个自底向上设计的“电脑”算是实现了这个梦想,大四那年,我把它随时随地地装在身上,没事就看看现在几点,气压多少,还用它的指南针导航。现在想想真是好中二。

第三代黄金岁月

2011年春天,大四的我边写毕业论文,边将上两代的硬件进行了充分的整合,优化软件,开发了当时比较完善的XMove第三代。这是硬件的全家福:

640?wx_fmt=jpeg

它的最主要功能就是玩游戏,演示效果相当好。这是当时用全身动作捕捉玩街霸4的场景,减肥利器,打5分钟就气喘吁吁,校领导相当喜欢把它介绍给外面的领导:

640?wx_fmt=jpeg

不过当时最酷的莫过于用来玩使命召唤(一种风靡全球的第一人称射击游戏),用双手柄控制枪,用脚部传感器控制跳跃和行走,动作数据可以送入SVM(一种分类算法)中,能够识别上膛,标准,扔手雷等动作。不过我当时机器学习刚入门,对于流式的动作识别就无能为力了。

这是我当时为其设计的宣传册,是不是比第一代的强很多?我居然为了它,放弃了当时实验室的春游,现在想起来好后悔~

外页:

640?wx_fmt=jpeg

内页:

640?wx_fmt=jpeg

之后我自学了C#,用WinForm技术开发了这一版本的桌面控制端,比第一代漂亮多了,能够监控每个传感器的实时运动数据,茶壶能够准确地展现每个传感器的姿态。这是我第一次在桌面端编写如此复杂的软件,不过代码非常乱…

640?wx_fmt=jpeg

有两个特别有趣的演示一定要提一下:

远程机械手控制

把传感器绑在自己的胳膊上,就能通过XMove的动作捕捉,实时地1:1 远程控制机械手。

整个结果非常流畅,不过机械手是淘宝购入,自行组装,受限于舵机的扭矩,手臂速度太快就跟不上了。当年一天的演示就烧掉了三个舵机!演示也很吸引眼球,但我居然一张照片都没有留下来,好郁闷。

虚拟现实(VR)

六年之前,我们就自行实现了VR系统。我在淘宝上用2300大洋买了头戴显示器,分辨率640*480, VGA接口,不支持立体显示,不过那是当时能找到的最好的头戴了。包装盒外面印刷了比基尼美女,看着特别像羞羞电影的设备,我都不好意思拿出来给人看…

某一天晚上,我把笔记本电脑背在书包后面,把XMove的传感器装在全身四个位置,戴上头戴显示器,开启了使命召唤2。 那是反映二战的一道关卡,虽然设备简陋,但我在空旷而黑暗的实验室楼道里,蹦蹦跳跳,左躲右闪,竟然真的融入了那个场景,15分钟的体验让我至今印象深刻。虽然比不了现代的VR设备,但身边同学不停地喊“SB”,就知道那时有多么欢乐了。

然而不幸的是,这些我也一张照片没留下来。VR眼镜后来上交学校,这样的体验有且只有最后一次。

结语: 那是我的黄金时代

大四的这一年,我对XMove达到了几乎狂热的程度,连电脑桌面都是我设计的XMove主题。这三代,综合起来花费了我大四一年近500小时的开发时间。由于要做PCB,要焊接,要在文本编辑器写C代码和调试,要与其他传感器的通信和协同,还要面对不少外部困难,最终还是完成了。XMove带给了我数不清的荣誉和进步,我的技术栈也基本上是那个时代发展起来的。

大四毕业了,它的故事才刚刚开始。我着手进行第四代的开发,它的目标堪称宏伟,技术难度异常复杂。不过,它带给我的不仅是进步的喜悦,更是深陷泥潭中的痛苦,过度设计的教训。这些会在下一篇文章里,容许我慢慢地讲给各位读者听。


以理性视角,分析数据,解构模式,发现洞见。欢迎关注沙漠之鹰。


原文地址: https://mp.weixin.qq.com/s/MCEIWJVJot19H6yxXFK-TA


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51nod1355-斐波那契的最小公倍数【min-max容斥】

正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId1355 题目大意 定义fif_ifi​表示斐波那契的第iii项,给出一个大小为nnn的集合SSS求lcm(fS)lcm(f_S)lcm(fS​) 解题思路 如果每个质数的次数分开考虑,那么gcdgcdgcd就是次数取min…

二分图相关结论及口胡证明

考虑点集A,B二分图 最小点覆盖: 概念:用最少的点覆盖二分图中所有边。 结论:最小覆盖点最大匹配 证明:选择点集A所有匹配点,如果还存在一条边的两个端点都不在匹配点中那么让该两点匹配则最大匹配数目会增加…

纪中A组模拟赛总结(2021.7.12)

成绩 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3t4t4t4131313lyflyflyf868686606060252525000111总结 T1考试的时候想出来DP,很复杂,但是有些细节没想好,打挂了,只拿了60分 T2没有想到方法,就先跳了…

牛客网 每日一题 7月23日题目精讲—wpy的请求

来源:牛客网: 文章目录wpy的请求题解:代码:wpy的请求 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 262144K,其他语言524288K Special Judge, 64bit IO Format: %lld题目描述 “题目…

大型科技公司架构:中台模式的爱与恨

大型企业面对快速变化的市场形势,需要有像创业公司一样快速的反应能力。然而由于复杂的人员和层级关系,大企业做到“拥抱变化”是很困难的。传统以职能部门分治的树状组织架构,若一个底层员工有个好点子,就不得不自下而上说服管理…

Codeforces Round #667 (Div. 3)

A - Yet Another Two Integers Problem 数学题&#xff0c;每次先加减10&#xff0c;最后一步缺多少加减多少 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> using namespace …

P6640-[BJOI2020]封印【SAM,二分】

正题 题目链接:https://www.luogu.com.cn/problem/P6640 题目大意 给出两个字符串s,ts,ts,t。qqq次给出l,rl,rl,r询问sl∼rs_{l\sim r}sl∼r​与ttt的最长公共子串。 解题思路 对于末尾的条件很好做&#xff0c;直接上SAMSAMSAM就好了&#xff0c;设fif_ifi​表示一个最大的…

牛客网 【每日一题】7月27日题目精讲—乌龟棋

来源&#xff1a;牛客网&#xff1a; 乌龟棋 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld文章目录乌龟棋题目描述题解&#xff1a;代码&#xff1a;题目描述 小明过生日的时候&…

【费用流】摘取作物(jozj 3447)

正题 jozj 3447 题目大意 给你一个n*m的矩阵&#xff0c;每个位置有一个数&#xff0c;每一行每一列都只能选两个数&#xff0c;问你所选数字之和最大是多少 解题思路 对于该矩阵&#xff0c;我们可以建立一个网络图&#xff08;如下图&#xff09; 对于每一行建立建立一个…

如何在.NET Core控制台程序中使用依赖注入

背景介绍依赖注入(Dependency Injection), 是面向对象编程中的一种设计原则&#xff0c;可以用来减低代码之间的耦合度。在.NET Core MVC中我们可以在Startup.cs文件的ConfigureService方法中使用服务容器IServiceCollection注册接口及其实现类的映射。例如&#xff0c;当我们需…

Codeforces Round #668 (Div. 2)

前20分钟做题&#xff0c;后面看题&#xff0c;二题战士&#xff0c;赛后补题www A - Permutation Forgery 直接逆序输出即可 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> …

CF438E-The Child and Binary Tree【生成函数】

正题 题目链接:https://www.luogu.com.cn/problem/CF438E 题目大意 每个节点有nnn个权值可以选择&#xff0c;对于1∼m1\sim m1∼m中的每个数字kkk&#xff0c;求权值和为kkk的二叉树个数。 解题思路 设fnf_nfn​表示权值和为nnn的方案数&#xff0c;gng_ngn​表示nnn这个权…

纪中A组模拟赛总结(2021.7.13)

成绩 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3121212lyflyflyf150150150100100100303030202020总结 比赛的时候TJH直接怒言&#xff1a;T1不是网络流吗&#xff01;&#xff01;&#xff01;然后想了想网络流&#xff0c;发现可以用费用流&#xff0c;但只…

牛客网 【每日一题】7月24日题目精讲—小A的柱状图

链接&#xff1a; 文章目录题目描述题解&#xff1a;代码&#xff1a;小A的柱状图时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 柱状图是有一些宽度相等的矩形下端对齐以后…

在asp.net core2.1中添加中间件以扩展Swashbuckle.AspNetCore3.0支持简单的文档访问权限控制...

Swashbuckle.AspNetCore3.0 介绍一个使用 ASP.NET Core 构建的 API 的 Swagger 工具。直接从您的路由&#xff0c;控制器和模型生成漂亮的 API 文档&#xff0c;包括用于探索和测试操作的 UI。项目主页&#xff1a;https://github.com/domaindrivendev/Swashbuckle.AspNetCore划…

Codeforces Round #669 (Div. 2)

那天晚上和同学打球打的有点晚&#xff0c;结果就鸽了&#xff0c;现在来补一下 A - Ahahahahahahahaha 直接看原数组中0的个数cnt0和1的个数cnt1&#xff0c;谁多留谁即可&#xff0c;注意留1的时候要留偶数个。 #define IO ios::sync_with_stdio(false);cin.tie();cout.ti…

P3235-[HNOI2014]江南乐【整除分块,SG函数】

正题 题目链接:https://www.luogu.com.cn/problem/P3235 题目大意 TTT组游戏&#xff0c;固定给出FFF。每组游戏有nnn个石头&#xff0c;每次操作的人可以选择一个数量不少于FFF的石堆并把它尽量均摊成MMM堆(M>1)(M>1)(M>1)。无法操作的人输&#xff0c;求每组游戏是…

【线段树】二进制(luogu 4428)

正题 luogu 4428 题目大意 给你一个01串&#xff0c;让你进行一下两种操作&#xff1a; 1.将其中一位取反 2.问你某一段中有多少个子串满足有一种排列方案&#xff0c;使得组成的二进制数是3的倍数 解题思路 不难发现&#xff0c;因为2%32&#xff0c;所以2的幂%3的结果按12…

牛客网【每日一题】7月29日题目精讲—Max Power

来源&#xff1a;牛客网&#xff1a; Max Power 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld题目描述 小卤蛋刚把dnf的技能点重新洗了一遍,现在他要重新加点,假设他的技能树一共有…

Swashbuckle.AspNetCore3.0的二次封装与使用

关于 Swashbuckle.AspNetCore3.0一个使用 ASP.NET Core 构建的 API 的 Swagger 工具。直接从您的路由&#xff0c;控制器和模型生成漂亮的 API 文档&#xff0c;包括用于探索和测试操作的 UI。项目主页&#xff1a;https://github.com/domaindrivendev/Swashbuckle.AspNetCore项…