光荣与梦想 | XMove动作捕捉系统(一)
XMove是我和几个死党从2010年开始开发的一套人体动作捕捉系统,软硬件全部自行开发,投入了大量的精力,历经三年,发展四个版本。

今年春节回到老家,翻出了2011年春节时焊电路用过的松香和和硬盘角落里的代码。感慨万分,遂有此文。文章过长,分为两部分,本文为2010-2011年,XMove从第一代到第三代的故事。
诞生于考研的第一代
保研尚未确定,我挤在考研自习室里非常无趣,看到了一篇关于加速度传感器的新闻。也许是弥漫在空中的泡面味和臭脚味刺激到了我,我灵光一现,想到了利用这种传感器开发游戏控制器的想法。彼时,市面上还没有这样的成熟产品,更谈不上AR和VR了。
我似乎都忘记了考研,之后是疯狂的元器件采购,我创下了一天拿6个快递的记录,跑了无数趟电子市场。也许你不不信,我的第一代电路板竟然是自动布线的!
第一代XMove非常简陋,只使用了一枚MMA7455加速度计,裸露的电线,伸出来的无线发射器,非常山寨,只有位于双手和双脚的四个节点。

回家之后,别人都在看考研书,我在盛夏的酷热中通宵达旦地焊电路调代码,终于在某天夜里的凌晨两点,我迷迷糊糊地发现了bug,程序被我调通了!当时兴奋地差点撞到天花板。
我妈妈给我缝了一个简单的手套,能把传感器套在手上而不影响操作,很贴心:

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

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

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

第一代版本非常简陋,却赢得了一致好评,在当时的全国大学生创新竞赛中轻松拿了一等奖。想起来都要偷笑,总共的开发时间也不超过10天...
第二代:手持控制器
开发完第一代的XMove,我得知自己已顺利保研,在那段现在想起来最无忧无虑的时光里,我开始着手第二代系统的研发。
第一代系统没有按键,加速度计只能检测线性动作,精度不够。在那个街机还是诺基亚N97的时代,陀螺仪很稀奇,比米粒还小却几百块钱一枚。这套控制器的硬件堪称豪华。有了硬件大神的加盟,我们的硬件比之前做的精细多了。
第二代的主要进步是下面这个带有按键和彩色LCD的手持手柄,还内置了我为其在裸机上开发的操作系统,从底层调度,硬件驱动到上层的GUI控件,都是纯手工打造的,C代码约一万行。

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


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

那段时间,我每天早上起来先打两个小时的游戏,中午吃过饭拿根雪糕,慢悠悠地在北邮的主干道上遛弯,之后便拿着电脑去实验室写代码。看得出当时的我是有多闲,能投入那么多时间。
小学有个梦想,就是拥有一个无所不能的掌上电脑,换了三台文曲星都不过瘾。这个自底向上设计的“电脑”算是实现了这个梦想,大四那年,我把它随时随地地装在身上,没事就看看现在几点,气压多少,还用它的指南针导航。现在想想真是好中二。
第三代黄金岁月
2011年春天,大四的我边写毕业论文,边将上两代的硬件进行了充分的整合,优化软件,开发了当时比较完善的XMove第三代。这是硬件的全家福:

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

不过当时最酷的莫过于用来玩使命召唤(一种风靡全球的第一人称射击游戏),用双手柄控制枪,用脚部传感器控制跳跃和行走,动作数据可以送入SVM(一种分类算法)中,能够识别上膛,标准,扔手雷等动作。不过我当时机器学习刚入门,对于流式的动作识别就无能为力了。
这是我当时为其设计的宣传册,是不是比第一代的强很多?我居然为了它,放弃了当时实验室的春游,现在想起来好后悔~
外页:

内页:

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

有两个特别有趣的演示一定要提一下:
远程机械手控制
把传感器绑在自己的胳膊上,就能通过XMove的动作捕捉,实时地1:1 远程控制机械手。
整个结果非常流畅,不过机械手是淘宝购入,自行组装,受限于舵机的扭矩,手臂速度太快就跟不上了。当年一天的演示就烧掉了三个舵机!演示也很吸引眼球,但我居然一张照片都没有留下来,好郁闷。
虚拟现实(VR)
六年之前,我们就自行实现了VR系统。我在淘宝上用2300大洋买了头戴显示器,分辨率640*480, VGA接口,不支持立体显示,不过那是当时能找到的最好的头戴了。包装盒外面印刷了比基尼美女,看着特别像羞羞电影的设备,我都不好意思拿出来给人看...
某一天晚上,我把笔记本电脑背在书包后面,把XMove的传感器装在全身四个位置,戴上头戴显示器,开启了使命召唤2。 那是反映二战的一道关卡,虽然设备简陋,但我在空旷而黑暗的实验室楼道里,蹦蹦跳跳,左躲右闪,竟然真的融入了那个场景,15分钟的体验让我至今印象深刻。虽然比不了现代的VR设备,但身边同学不停地喊“SB”,就知道那时有多么欢乐了。
然而不幸的是,这些我也一张照片没留下来。VR眼镜后来上交学校,这样的体验有且只有最后一次。
结语: 那是我的黄金时代
大四的这一年,我对XMove达到了几乎狂热的程度,连电脑桌面都是我设计的XMove主题。这三代,综合起来花费了我大四一年近500小时的开发时间。由于要做PCB,要焊接,要在文本编辑器写C代码和调试,要与其他传感器的通信和协同,还要面对不少外部困难,最终还是完成了。XMove带给了我数不清的荣誉和进步,我的技术栈也基本上是那个时代发展起来的。
大四毕业了,它的故事才刚刚开始。我着手进行第四代的开发,它的目标堪称宏伟,技术难度异常复杂。不过,它带给我的不仅是进步的喜悦,更是深陷泥潭中的痛苦,过度设计的教训。这些会在下一篇文章里,容许我慢慢地讲给各位读者听。
光荣与梦想 | XMove动作捕捉系统(一)的更多相关文章
- 自述创业史 | XMove动作感应系统(二)
XMove是沙漠君和几个死党从2010年开始开发的一套人体动作捕捉系统,软硬件全部自行开发,投入了大量的精力,历经三年,发展四个版本.文章分上下篇,本文为下篇,前三代的故事在<光荣与梦想| XM ...
- 光学动作捕捉系统中的反光标识点(Marker点)
动作捕捉系统本质上是一种定位系统,通常需要在目标物布置定位设备进行追踪.以红外光学为原理的动作捕捉系统,主要由由光学镜头.动作捕捉软件.反光标识点.POE交换机.和若干配件组成,其中反光标识点(Mar ...
- 真人动作捕捉系统 for Unity
真人动作捕捉 在Asset Store中浏览Mecanim相关的资源时,发现了这个 资源信息 Asset Store:https://www.assetstore.unity3d.com/#/cont ...
- AI动作捕捉技术,会让制造业大幅度降低成本吗?
现代动作捕捉系统应该是起源于100多年前的动画工业,通过一种叫做"动态遮罩或影像描摹"的技术,动画师们可以获得流畅的.栩栩如生的动作:后来到了20世纪80年代,动画师们设计出带有活 ...
- VUP虚拟直播与光学动作捕捉技术
虚拟直播将虚拟场景.虚拟形象实时显示在观众面前,虚拟场景与人物替代了原有的耗费较大搭建成本的实景场景与真人出镜,为观众带来全新的视觉体验,同时新技术降低了原有场景搭建成本,是近些年继AI.VR.动作捕 ...
- 短期连载 第1回 万代南梦宫工作室动画的流派 BNS动作捕捉汐留工作室的采访
原文链接:http://cgworld.jp/interview/201607-bandainamco.html 因开发了[偶像大师],[铁拳],[XX传说]系列等各种游戏而被广为人知的万代南 ...
- 梦想CAD控件系统变量说明
这里介绍一些常用系统变量有String.double.long.McGePoint3d等类型,其中有部分系统变量是随图纸保存,再次打开时就会读取图纸中的系统变量,有些系统变量不随图纸保存,其作用来控制 ...
- (Java实现) 光荣的梦想
光荣的梦想 Time Limit:10000MS Memory Limit:65536K Total Submit:110 Accepted:45 Description Prince对他在这片大陆上 ...
- 人体动作捕捉格式之BVH
BVH简介 BVH是BioVision公司推出的一种人体动作捕捉文件格式.这种文件以节点为核心元素,记录连续数帧内人体骨架的运动. BVH=? 研究一个东西的时候我比较喜欢先研究它的名字.BVH可以认 ...
随机推荐
- sublime text 主题推荐
Soda Spacegray Flatland Tomorrow Base 16 Solarized Predawn itg.flat 其他所有的配色方案和主题.
- windows矢量字体点阵数据的提取(转)
源:windows矢量字体点阵数据的提取 问题参考:windows api 获取字库点阵的问题 1.提取原理 在windows系统当中提取矢量字体的字模有很多方法,下面介绍一种利用GetGlyphOu ...
- DMLC深度机器学习框架MXNet的编译安装
这篇文章将介绍MXNet的编译安装. MXNet的编译安装分为两步: 首先,从C++源码编译共享库(libmxnet.so for linux,libmxnet.dylib for osx,libmx ...
- Extjs4 up 和down的用法
Extjs4.x中,每个组件都新增加了两个方法up()和down()方法.这两个方法都是用来获取组件的,下面我们来看下up()方法和down()方法的官方解释. Extjs4.x中,新增加了两个方法u ...
- Application_Start和Application_End事件执行时间
Application_start: 第一个访问网站的用户会触发该方法. 通常会在该方法里定义一些系统变量,如聊天室的在线总人数统计,历史访问人数统计的初始化等等均可在这里定义. Applicatio ...
- Js apply call方法详解
Js apply方法详解 我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...
- POJ 2395 Out of Hay
这个问题等价于求最小生成树中权值最大的边. #include<cstdio> #include<cstring> #include<cmath> #include& ...
- xml常用四种解析方式优缺点的分析×××××
xml常用四种解析方式优缺点的分析 博客分类: xml 最近用得到xml的解析方式,于是就翻了翻自己的笔记同时从网上查找了资料,自己在前人的基础上总结了下,贴出来大家分享下. 首先介绍一下xml语 ...
- 关于IP网段间互访的问题—路由是根本(转)
源: 关于IP网段间互访的问题—路由是根本
- [Angular Tutorial] 9 -Routing & Multiple Views
在这一步中,您将学到如何创建一个布局模板,并且学习怎样使用一个叫做ngRoute的Angular模块来构建一个具有多重视图的应用. ·当您现在访问/index.html,您将被重定向到/index.h ...