本帖最后由 killerlist 于 2018-7-26 22:40 编辑
更新:
写在前面的话:本文采用 正经解说(我保证全是干货!)+聊天流(自我吐槽,只是为了大家看的开心),如果只想看干货或者无法忍受这种随性的文风
1. 可以直接忽略浅体字,不影响项目理解
2. 从0.开始阅读,前面(负数)都不是很重要
推荐的阅读方式:先 跳过所有不重要的,只看干货 然后从头 加上聊天流阅读,添加乐趣,每个吐槽我都是认真斟酌过好几遍写的,绝对没有水字数的想法(你能想象一个人非常认真严肃的写着轻浮搞笑的文字吗?估计只有我这种人了,连搞笑都很认真)
-4. 这篇帖子写的这么胡里花哨,仅仅只是我想要尝试一下写帖子能用到的所有功能,如果以后还要写帖子【划重点“如果”】,我会直接写的更正式一些,如果你们喜欢,请在评论区留言,谢谢你们谅解我想要尝试新的写作风格(正经解说+聊天流,主要是为了增强观众观感体验,一切都是for fun,不是吗?)【你确定不是因为你被强迫写了11年“八股文”然后疯掉了吗?】以及我作为一个年轻人的无知和冒昧【请不要将年少轻狂当做个性谢谢(请参考《攻壳机动队》里面对SAO的阐释,第二季:过度追求个性的人,反倒是最没有个性的人)】【还有,我没有人格分裂症,只是很久没睡了,脑子有点晕,思路反倒开始放飞自我了!!】
-3. 关于如何才能以最佳姿势迅速阅读完这篇帖子这件事情:【我就是在吐槽日本轻小说名字太长,略略略(前后方适量埋梗(有没有种看《头号***wan家》的感觉?(请不要吐槽我的思维和写作思路非常的奇葩,谢谢!)))】
For Chinese readers, if you can read in English, the answer for the problem above is to ... ...Come on... ...Just think about why I ask whether you can read in English... ...& ignore the color like this... ...
-2. 我一定要写在最前面的话 The note that I want you to notice before the formal part:
论坛不能用Markdown来写文章,我感到有点不爽!!!(笑)
I feel pretty sad that I can't use Markdown to write this report.
-1. 自我介绍 Introduction for myself:
诸位好,我是一名来自成都外国语学校的高二普高学生(马上高三),Bill Yin【抱歉,我并不想透露中文真名,在这个网络异常发达的时代】,即将成为美国出国党一枚,男的【请不要失望,还有,感到兴奋的,出门右拐】,在拿着Genuino 101想项目的时候,睡着,然后半夜惊醒,想出了智能小桶这个项目,利用暑假的时间【5天全身心爆肝投入,我现在困得想死(〃>皿<)】,尝试实现了这个想法,希望大家喜欢,如果有人能受到启发,通过自己的思索再现出来或者改进这个项目,亦或甚者能投入生产【(嫌弃)你在想什么呢?请想些实际的东西好吧!! (;¬_¬) (这些都是自我吐槽,请不要在意并自动屏蔽!(笑)),中英文都有,但不一样,可以看着耍】,那最好不过了
Hi! I'm Bill Yin from CDFLS (Chengdu Foreign Languages School), Grade 11. I figured out this project when I fell asleep, holding Genuino 101 in my hand. Spending six days on this product, I finally finished it with my team (only two members including myself) [If there are some sentence imcomplete, this can only improve that I fall asleep right now for I haven't sleep in nearly 2 days for this project ]. I hope you would enjoy it! If some one can get some inspiration from it, improve it, or even produce this product [What am I talking about? I think I need some ice to refresh myself...].
-----------------------------------------伪理智分割线-----------------------------------------【请不要吐槽基佬紫】
0. 先睹为快 ShowTime:【这个配色其实是我最喜欢的sublime配色,有点乐高玩具的感觉,用来web开发很有感觉】
【是不是很惊艳?是不是很NB?是不是想入手一个?但】这个【很明显】不是我做的【那你展示出来干嘛?!】,这是个日本dalao【据说是个宅男,恩恩,肯定又是个 技术宅拯救世界 的典例】做的,可以说是快达到伪人工智能的最高境界了,但是其实完整版的视频里面他自己说了【自己找去,不要问我】,正确率只有10%【逼格档次-1】。我是在想出项目后寻找轮子的时候发现已经有人做过了【而且还很吊很完善(大概)】,但是他没有进一步公开任何的细节,唯一的了解途径只有这个视频【快夸我!快快快!我可是基于极客理念开源了】,所以其实相当于我要从头造轮子,但是其中的三轮全向轮小车和Kinect【微软爸爸,请给我解释一下完全停产的理由(假笑+逼近)】的应用给了我破题思路的启发【你这可算是抄袭了1/5吧!喂!(你是怎么算的这么精准的?!)】
The product that you saw is made by a Japanese. He said that the correct rate is only about 10%. He did not open source on the Internet, so I have to start the project from scratch. But, the use of Kinect & omni wheels shows me a way to achieve my goal.
以下尚未添加英文,因为我现在想睡觉(逃) The explination for how the project works have not be translated to English yet... ...Sorry for I am a lazy bone... ...
1. 项目说明 Overview:
1-1 为什么要使用Kinect?
1. 我有渠道能借用别人的Kinect1.0【才,才不是因为我穷呢!哼!(你好恶心啊!请务必滚远一点!)】【最新的是2.0(买不起),微软,快给我解释为什么停产啊!这个黑科技的应用根本远远不止用于XBOX好吧】【当然并非说Kinect这个商业失败产品没有意义(你会为了开心的玩游戏,然后把自己玩的累死累活吗?开发商会会为了开发这个偏僻的游戏领域而专门请人学习微软写的贼恶心的API说明书?既没客户,又没供应商,不失败才怪了,只能说微软在自家的产品定位上一直都有问题),HoloLens上很多的技术就是直接从Kinect上挪用的】
2. Kinect的骨骼追踪很适合这个项目,具体怎么用骨骼追踪来预判轨迹请【这位客官】继续浏览
1-2 为什么要使用全向轮?
1. 全向轮能够直接向任何一个方向移动,不像普通的小车要先转向再移动,这样才能在落地前接住,毕竟落地前空中的停留时间再怎么最长也只有0.79秒(实测),而 时间成本=骨骼追踪+运动学逆向算解+信息传输+小车马达单独运动算解+小车移位(加速->匀速->减速),所以说任务是很艰巨而坎坷的(能够这么快的完成,离不开团队【虽然只有可怜的2个人】的支持大家的共同的努力,再次向你们致敬)【再次??】,但我还是想尝试一下,尽管之前完全没有接触过Kinect和全向轮【你就是个遇到难题就喜欢被虐的抖M和兴奋犯而已,请别说的这么伟大和装X,OK?】
1-3 大致的思路【写后端的经历告诉我,不先写好思路,web能TM写死你,事实告诉我们,网页终端的互动远远没有我们想的这么简单】【另外,我推荐一款浏览器,叫做Vivaldi,一款渗透linux,叫做Parrot(Kali之子),一个区块链应用,叫做IPFS(星际文件传输协议),一款VPN,叫做自由门(说些不相关的,总之,非,非常抱歉!)(你确定你的脑子现在很正常吗?)(请问您今天要来点些冰块冷静冷静吗?--某动漫,自行模拟高冷女王的音调)】
1. 我其实已经在上面时间成本算式暗示过了【我最讨厌那种为了炫技,说了一堆高大上的词汇,其实完全可以用一张图搞定的极客了(学习web的时候我曾无数次吐槽过这个问题)】
注:最后取消了Arduino在中间碍事,直接上从机(虽然用Arduino实现也完全没有问题的呢~)【没错,到最后其实根本没用到Arduino】
1-4 开发时间规划
1. 学习Kinect基本功:1天
2. 学习万向轮小车控制:1天
3. Kinect程序编写和测试:1天
4. 小车控制程序魔改测试+通讯硬件和程序编写及测试:1天
5. 两套独立开发的程序整合+Debug:1天
2. 原理解说1 Kinect抛物预判实现 Explination for Kinect prediction part:
2-1 硬件方面
1. 使用到的Kinect功能介绍
骨骼追踪:微软黑科技,不是一般的佩服,从此黑转粉【要不然你以为我之前为什么要叫一声微软爸爸?】,能够实时反馈20块骨骼的三维位置和帧序列以及帧时间,其实还有更多的可以采集的源信息,但因为用不到,所以不再枚举,具体原理是通过人工智能采集深度图像特征点【所以说你侧过身她就傻眼了】,Kinect内置,已经训练好了【废话!玩家只管玩和送钱】,所以其实理解起来也不是很难,重点在于数据处理以及和其他图像(彩色,红外等)结合,由于Kinect有三只眼睛【你的女票一定来自克鲁苏,说不定是黑山羊什么的(其实是奈亚子啦!)】,得到的图像不在统一的坐标系,就像你的两只眼睛看到的不是同一副图像,会有角度差,所以坐标如何统一也是个难题【我TM玩个游戏居然这么复杂!】,然而这些都是微软已经处理好的问题【微软爸爸(岳父(雾))!!】,所有的都已经封装成了API,但是即便如此,编写最简单的Kinect也仍然极其复杂,不理解Kinect运作原理,很多实际的优化问题根本无从下手,大量的Bug不知道产生的原因,所以还是很有必要。但是实际体验极佳,正如当年的宣传语:你就是传感器! You are the sensor!
2-2 软件方面
0. 基本功练习
由于Kinect只支持C#和C++开发,而C++开发Kinect的资料在国内几乎为0,有也只有零散的CSDN博客只有我手指头那么多【我确实只有10根,而且我确实数过有几篇博客】,所以肯定是要学学C#【自行度娘查读音】的,但也不用学的过于深奥,只要理解了面对对象的思维方式(学过JavaScript的同学肯定表示秒懂,可以直接跳过)和基本语法,就足够了,毕竟难点不在语言,而在API调用和算法设计【我想起了开心但是差点看算法书籍看瞎,还去医院开药的NOIP日子,还有参加Hack.init疯狂爆肝的日子,害怕.jpg】
学习的资源主要分为三类:【你绝对猜不到我在找资源这件事情上花了多久的时间】
1. 官方文档(要不然连API框架都搞不定),官网有一些,对应SDK上有一些,SDK里面的样例非常有用,非常有利于缩短开发周期,里面的算法实现很多时候可以说是醍醐灌顶
2. 中文专业书籍【妈妈再也不用担心我从零学习已经停产好几年且国内开发资源屈指可数的Kinect了呢!】,我在看过后,比较推荐《Kinect应用开发实战》,先是Kinect工作原理讲解,然后是Kinect编程讲解,里面的例子简单明了,从易到难,从控制台开发到体感水果忍者开发应有尽有,且源代码公开,是非常适合入门的书籍,最后甚至有应用的展望,一次性搞定Kinect基础学习
3. CSDN里面的博客,这些都非常的难懂,绝对不要尝试直接看,直接Kinect从入门到入坟【我花了半天直接零基础看博客,然后再次明白我简直不知道天高地厚,直接被教做人】,但是我还是列出来了,因为这些针对特定技术的讲解对缩短开发周期仍然有用,当然是指在搞定第二类的情况下且很容易被淹没在知识的海洋中,有用就拿走,没用就迅速跳过,切忌,切忌,切忌!
1. 编程软件选择
1. Processing: 我原本就打算用这个的,但是我就是死活都安装不对对应的版本(由于我用的是Kinect1.0,这个版本和2.0的开发环境完全不同,又老又旧,所以下载对应的软件版本和对应的非官方封装库十分重要【承认吧,你就是个非酋(少女前线死活不出WA2000和牛头王的某个人),欧洲人请务必滚开,谢谢!】),所以无可奈何只能放弃,用这个开发应该会更快些,毕竟比直接写C#多一层封装,Processing语法简单,容易看懂,哪像C#这种玩意儿【微软爸爸,请轻一点打我!】
2. Visual Studio 2013: 这个版本要对,具体怎么建立C#WPT或者控制台工程,怎么添加KinectAPI引用,请移步CSDN,谢谢!【赞美自动补全功能,赞美微软爸爸!】
2. 算法实现
重点来了,你怀疑我其他代码只是抄袭【就算是,这也叫科学借鉴,读书人的事能叫偷吗?---孔乙己】和拼凑,但是这个算法确实是我原创的,是我在测试了超过500遍代码后【感觉差点把手给甩脱臼(苦笑)】,一点一点改进出来的,每个参数我都测了几十遍,不停的记录,对比,分类统计分析才得出来的,下面进行理论讲解,但是实际的代码只会公布完成版本之前好几个版本,即不全有大量的BUG,但是能够看到基本雏形,如果能够看懂,相信你也能立马理解我的思路,也就能举一反三了【其实只是想要强迫你们读我的代码而已,你们都不看看,直接运行,怎么对得起我的肝呢?(此刻表情:空版本的阴笑---《游戏人生》)】
1. 主体理论:由于每个人的投掷动作相符,且动作在正常情况下也就那么几个:从下往上抛,从上往下扔,从前往后扔【你非要调戏(调教)这个小桶,我只能表示:你很适合表演杂耍呢!加油哦~~!你只要努力就一定能成为一位优秀的杂耍艺人呢!(笑,略显意味深长)】,大概就这三种,我只讲解第一种,因为其他的思路方向差不多,只要能够把握动作的特征点,就能举一反三。我先描述一下从下往上抛的动作过程:人手在基准线(可以是人的中心位置)以下,然后同时向前向上以弧线轨迹加速,在某个位置,突然开始减速,然而就在这个时候物体实际上已经脱离手掌【你非要在最后用小拇指用力改变运动轨迹来调戏小桶,请世界的尽头有多远你就滚多远好吧!---加勒比海盗】,之后的动作都无所谓了,其实之前所采集的信息已经完全足够预测了
运动位置波动分析图
减速的判断是靠三帧之间的位移除以时间得到的速度求导(可以特定简化)来算速度是否减弱(加速度),一旦加速度小于某个值,即可判断人体抛物的部分结束。大家都知道,视频是由图片组成的,即所谓的帧,每个帧之间的时间间隔相同,只要间隔够小,就能实现动态的效果,在Kinect中也相同,每次返回的数据都是一帧一帧的,大概每0.036秒一次,如果用上滤波和其他技术来帧润滑,可能会跳帧,即没用或者导致出现大误差的帧直接舍弃不用,但是我们处理的是动态的东西,所以需要冗余数据,方便在需要的时候提取使用,实现方法在下面会讲,在有了足够且有效的数据后,尽可能的截取时间间隔短的帧数据,然后用同一块骨骼的两次三维位置来计算位移,用两次的帧时间来算时间差(由于间隔过短,可能数会很小,下面会讲如何确保数据精读,且让计算机好算一些【看我多温柔,多体谅我的电脑(你TM有毒吧!!)】),然后用位移和时间计算三维矢量版本的抛物线线速度,然后通过x,y坐标系平面投影,拆分成两个抛物线,然后分别预判x和y两个落地坐标值【高中物理+数学题,很简单对吧(坏笑)】,然后合在一起,再减去小车本身的坐标,就是小车以自己为原点的相对坐标(尽可能的达到两个优化目的:减少传输成本来减少通讯时间成本,尽可能的把所有运算交给电脑和Kinect【论计算能力用树莓派或者Lattepanda还可以考虑考虑,Arduino请绕行】),然后小车上的单片机得到这两个值后进行运动学解析,通过PID控制,来精确调整速度和姿态,如果加上速度反馈和位置反馈【只要有带光电码盘的电机就可以逆向实现】,效果【味道】更佳【你以为是饮料哇?】
2. 主体框架:冗余数据-->速度向量-->抛物线求解-->落地点预测
3. 实现思路:
1. 冗余数据:通过类似于队列的数据类型,在任何时刻都会先把队伍向后挪一个位置,然后直接抛弃最末尾那个没用的数据,然后每一帧都会直接在提取需要的数据并简单的放大处理(和精度确保有关)后,直接录入队列头部,每次都这样执行,确保需要的数据一直在更新,这用类队列可以直接通过数组实现,以确保冗余不会无限增大,同样也可以用链这种特殊的数据结构来实现,可以通过两组数据模拟链,但能明显前者会更容易实现且资源占用更小【难得数组战胜了链表什么的,可喜可贺~】
2. 方程解算:通过函数式编程的抽象(其实就是函数啦~),为了方便解释,我还专门画了方程图【快快快!使劲夸我!用你们的呼喊和掌声砸死我(想的美!)】
数学部分 除去负值,尽可能提取相同的中间量,就可以得到 下面的4.3就是通过提前算好B/2A(换元的思想)来优化计算过程
物理部分 直接带入上面的数学方程,可以得到t,即在空中停留的时间 得到最终的相对于Kinect的X坐标值,Y轴同理,只要再减去小车坐标即可
4. 优化实现
1. 帧润滑:我本来打算用滤波,但是KinectAPI自带过滤,只要写入参数即可,但是参数的配置无法预测计算,只能瞎猜和查看实际效果,我得出的参数配置为Smoothing = 0.5f, Correction = 0.5f, Prediction = 0.5f, JitterRadius = 0.05f, MaxDeviationRadius = 0.04f
2. 精度确保【这么多的序号,用Dynalist写或许会更合适呢】:
1. 在浮点类型数据带入方程解算函数前,进行放大,我一般放大10000倍,然后转换成long型整数,然后计算完成后再缩小10000倍导出为浮点数即可
2. 固定常量采用实际测量的数据,比如这里的g重力加速度,我测出来是9.7964左右【出现了,强迫症狂魔!】
3. 方程计算优化:上面已写
5. 坐标系的转换(Kinect坐标,人体坐标,抛物坐标,小车坐标互相转化)
1. 这部分网上的教程也比较多,用矩阵运算转换是比较常用的方法【度娘正躺着等着你用】
3. 原理解说2 桥接通讯实现 Explination for communication part:
1. Arduino或者其他单片机如果是互相通信,采用串口(简单实用,尽管速度和宽带都不高【居家旅行必备】),高级一点的可以采用CAN总线的方式,非常快宽带又足【数据闪电返回不再是梦】
2. 从电脑到单片机,采用蓝牙或者WIFI(Kinect的C#有串口封装库,可以自己查找使用)【什么?你说用物联网?请继续你的表演,请!】【说到物联网,我再推荐几个资源,1. Ruff的JavaScript版本的物联网非常棒,我体验了一下,充分体现了面对对象语言在物联网上面的优势,而且他们家的物联网单片机非常的厉害且十分完善,甚至能自动计算引脚接口,简直不能再棒,几乎将物联网简化到了极致,就是物联网中的Arduino 2. Rokid(是的,就是那个卖音响的)的物联网方案也非常完善,在用户体验上面几乎无人能敌,整合度极其优秀,特别是语音识别的API简化,简直不能再简单,也是采用JavaScript语言写,各种开发的工具都准备好了,开发过程非常流利爽快,满分不解释 3. Microchip公司的物联网单片机开发过程很像Arduino,Arduino的大部分库稍加修改也可以直接移植,计算能力异常彪悍,支持!4. Intelligent Cloud,微软的黑科技【微软爸爸!】,值得信赖【你搞推销你都不收费的吗?】】
这些都是基本操作,网上的资料满天飞【自己找去】
4. 原理解说3 三轮全向轮小车控制实现 Explination for omni wheel robot control part:
0. DFrobot上面有相关的产品【DF爸爸!】,但是很贵,但是甚至直接有Kinect支持,有条件的朋友可以尝试尝试这个HCR家用机器人开源项目平台,很有潜力
1. 我目前实现的是P控制,以后有时间再尝试尝试其他PID控制,具体原理可以参考,连选材都讲解的十分详细的一篇帖子,大爱 Intel curienano 硬件试用 之 智能垃圾桶: 第一期(底盘篇)@饶厂长(非常感谢他所作出的努力,我在想出项目后,确实非常惊讶在中国,在DF论坛,在不久前,就已经有了先驱者,和我的想法不谋而合【如果你们应是要怀疑我抄袭,我也没有办法,毕竟谁叫欲加之罪何患无辞呢!】),我们的底层代码的魔改很多都是从这个帖子里面来的,极大的缩短了开发周期,再次表示感激,并十分期待这位道友能实现目标【人家要工作,有家庭,请不要催促别人,谢谢~】,毕竟要论能力和技能我们这个小团队是完全比不上的
2. ROS:这个是专业级别的机器人控制体系,非常高效厉害,我目前还在学习这个,没有用上,希望有人能用这个做个更智能的出来【什么一键导航,导航建模呀之类的高级玩意,都可以通过ROS直接实现,非常厉害,用过的都表示好评如潮】
-----------------------------------------Excalibur分割线-----------------------------------------【我要看黑saber开摩托.png】
最终的成果展示:
The result:
【什么?你问我在哪里?你以为谁在拍视频?】
5. 项目开源&相关资料分享 Resource share:
内容清单:
1. 各种版本的不完整版代码,可以学习思路,不要直接抄袭,反正给的也是有BUG的,里面除了上述的完成思路,这个还包括其他实现思路的半成品代码,说不定走得通
2. 部分版本带有C#版本的蓝牙串口通讯,可以看看,这方面的代码国内仅此一家,谢谢!
3. 单片机方面的代码没有公布,因为这个不是本文的重点难点,而且在读懂别人的控制教程后就可立马实现,所以没有上传【国内的Github速度你又不是不知道,很多我搜集的资料我想上传都不行,只能上传代码才能过日子的样子】
分享链接等我有空再传(我等会尝试用百度网盘来上传代码和相关资料
百度云链接更新:包括代码和我整理的Kinect和三轮全向轮小车控制学习资源
资源页跳转:【我就是这个作者本人】http://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=268032
请尽情抄袭,转载,转发到其他论坛,上传到其他网站,我只希望有人能够看到这个作品,这样我就很满足了!
Please share this project with others as soon as possible!
6. 改进方案 Improving solution:
图像识别:让人工智能算法追踪物体,可以真正实现物体实时追踪,然后直接修正预判轨道,可以直接消除阻力对较轻物体带来的影响,从一开始就打算用骨骼识别,所以没有采用这个方案,但是以后会考虑出个这个的版本,用DFrobot最近出的Pixy 2代 CMUcam5 开源图像识别传感器就可以做一个这种方案【赞美DF爸爸!】
手势手环:定位方案和手势识别方案整合,OYmotion的gForce开发套件(甚至可以用人工智能训练手势识别的精度,任何手势的识别都可以做到,做机械臂的dalao应该会非常感兴趣)应该可以做到,但是开发时间不够,暂时没有做着方面
7. 评价分析 Own judgement:
未来这项技术的应用非常丰富,比如空中接物【喂喂喂!这个命题早就有无数人研究过了好吧!】,各种球类的接球机,导弹拦截,跳楼救人等,Kinect是一项伟大的实验,微软的努力是不会白费被埋没的,极客本来就是一群化腐朽为神奇的人才,不是吗?这位极客!
8. 个人分享 Video&hoto Share:
下面的视频估计放不起(B站好像不支持),大家可以点击链接查看,顺带关注一波新人UP也是极好的呢~~
https://www.bilibili.com/video/av27584665/?p=3
https://www.bilibili.com/video/av27584665/?p=4
https://www.bilibili.com/video/av27584665/?p=5
9. 下期预告 The next project is coming:
应该会和物联网相关,用gForce肌电手势识别开发者套件(本来打算用Gest,但是国内国外死活没找到购买的途径,估计又是一个被埋没的黑科技)和Rokid智能语音识别开发者套件以及TFT LCD显示器做一个整合的物联网(JavaScript版本的)单人控制器,像游戏里面的特种部队一样,左手臂上有显示器,可以操控一切可用资源(打信息战专用),加上手势识别和语音识别一定用起来非常爽快【流口水ing!】,想想看,左手戴一个小显示器装X,很专业科幻的样子,然后有三种方式(红外,语音,触屏显示器)可以控制家里面的东西(加上红外发射器,可以模拟遥控板,电视机,空调,音响(在别人家现场模拟调制别人的控制器岂不NB哉),加上蓝牙模块,语音播报天气,控制音乐播放器,加上继电器,可以控制电器和电灯开关(搞个呼吸灯版本完全没有问题)),一切都在掌控中,这才是物联网真正的实力,让一个人随心所欲的直接控制一切,如果和WIFI和蓝牙渗透联合起来(Kali,Parrot等渗透Linux正等着你入坑),岂不是可以争夺邻居家一切电器的控制权,然后甚至可以写一个病毒,直接悄悄控制该片区所有的用户,然后。。。我估计就被警察带走了。总之,现在物联网需要的不是更多的传感器,不是更厉害的供应商,而是一个面向用户的综合单体控制平台,完全可以用手机就做到控制一切,但是集成度还是不够,要达到人一说话就能执行命令,人一伸手就能提供一切服务,是的,没错,最终版本的物联网其实就是《钢铁侠》里面的虚拟管家——贾维斯 是也!!!不得不承认,美国人的科技嗅探能力确实全球领先,如果是下棋,那就是永远都快人一步,而第一步的重要性,下过象棋的人都很清楚,对吧!
|