本报道对 Google I/O 2015 上“ Making apps context aware ”议程的内容进行概述。在本次议程中,来自 Android 地理位置和情景团队的工程师 Waleed Kadous 与 Marc Stogaitis 介绍了现在的 Google 应用(如 Google Now)中是如何收集情景数据、识别用户情景并以此提供对用户有用的服务,并列出了一些面向其他开发者的建议。
围绕情景进行设计,从底到上分别涉及传感器(硬件)、算法、以及用户交互这三个层面。传感器是情景发现的起点,算法将传感器收集的数据进行分析和理解(如用户在什么位置?用户是在走路吗?用户是在开车吗?),而交互则是最终将“抽象的”情景转化为功能的所在。
下面以几个已经实现的案例介绍基于场景的设计当前的进展情况。这些案例目前已经可以通过情景 API(context APIs)来直接使用,包括 activity recognition(动作识别)、 places(地点)、 geofencing(位置范围)、 fused location provider 等。
动作识别
用户是在走路还是在跑步,在坐着还是在躺着,是上楼还是下楼,是骑车还是坐车,手机是在用户的屁股口袋里还是在车里座位上还是在家里的桌面上?要实现这样的动作识别有三个步骤:
- 从已知动作中收集数据,将数据标记为该动作。比如让志愿者带着手机手表走路,记录期间的加速度传感器、气压传感器数据,将该原始数据标记为“走路”。
- 拿大量的原始数据交给机器学习集群做训练,直到它们能够相对准确的从一套原始数据中判断它很可能是“走路”的数据。
- 将这套判断加入 API 当中,给应用开发者用起来。
目前可以识别的动作可以在 DetectedActivity 中看到,包括:
int IN_VEHICLE int ON_BICYCLE int ON_FOOT int RUNNING int STILL int TILTING int UNKNOWN int WALKING
相当直观的返回参数,无需多说。事实上除了这些动作之外,现场还演示了另外两种已经可以被识别的动作,分别是深蹲起和仰卧起坐。这个动作识别库肯定还会继续增加壮大。
接下来,识别了动作之后,有什么应用呢?本讲座提供了一个示范:贴身携带免解锁。假设一个场景,用户用完手机后一直把手机揣口袋里走来走去,走了几分钟又拿出手机来,这两次使用手机之间是手机不离身的,因此理论上无需要求用户再次输入解锁密码。有了动作识别,就可以实现这个功能啦。当然,健身数据记录、运动相关的游戏,有了这种动作识别的能力也很有用。
动作识别 + 地理位置识别
动作识别配合地理位置识别,还可以实现更多其他的效果。Google Now 上展示的“我的车停在哪儿了”的功能,就是由“动作识别”和“fused location provider”这两个 API 的组合实现的。Fused Location 也就是地理位置识别,只不过是综合使用了手机的 GPS、WiFi、加速度传感器、陀螺仪、以及磁力感应器的数据来判断地理位置,从而实现了降低能耗又尽可能提升位置识别准确度的效果。
“车停在哪儿了”的功能大致通过三个步骤完成:
- 通过动作识别,判断用户在车里。
- 根据倾斜传感器的数据,判断用户从“坐着”转变到“站立”状态的时间点,即用户“下车”的时间点。
- 自动记录下这个时间点的 Fused Location 数据。
据说现在 Fused Location 数据已经可以精确到 2-3 米,这样的精确度下找到一辆车是基本没问题的。
以上就是针对情景设计 App 的一些经验分享。两位分享者也提供了其他的一些思路作为参考,比如在用户驾车的时候自动将短信内容用语音阅读出来,或者是基于地理位置的挖宝游戏设计等。这个就要靠大家发挥自己的想象力了。
前方危险警告
接下来,两位分享者提出了三条建议——可以算是针对情景设计的一些“敏感地带”:
- 用户信任的问题。Google 方面的建议是只收集你真正需要的数据,并且对用户解释清楚这样对用户有何好处,以此赢得用户的信任。
- 算法不靠谱的替代方案。比如用户这一天开车开了好几十里地,算法却说他只开了几里地,你有没有设计让用户能够手动更改数据的入口?比如用户一直把手机放在口袋里,算法却认为手机曾经离身,又让用户输入解锁密码,又应当如何修正?
- 电量消耗问题。正常应用不会长期开启,在短期开启的期间主要耗电来自屏幕。而这种情景收集类应用则是长期开启,会长时间让设备处于耗电状态。
关于这种持续收集数据的电量消耗,现在已经有了比较重大的技术突破,原理如下:
传感器本身的耗电很低,大约 0.3mW。App 进程的耗电量很高,大约 100mW。单纯是传感器收集数据,并不会耗很多电;但问题是每次传感器收集数据,都会把数据 update 给进程,于是进程只能一直醒着,造成电量消耗。那么,就不要如此频繁的吵醒进程就可以了!我们在传感器和进程之间加入一个低功耗的硬件——称之为 Hub。这个 Hub 以高频率从传感器收集数据,然后以低频率向 App 进程发送 batch update(这个跟桌面 / 服务器 OS 的节能原理是一样的)。
这样就有一个很 happy 的结果:80% 的能耗降低。
另一方面,能耗方面的控制也仍然需要开发者的人工介入,这主要与该应用所需的数据更新频率和准确度要求有关。这个应用是天气预报类,还是导航类,因此它对位置数据的更新频率与准确度有何要求?这只能由开发者来告知系统。
未来的可能性
最后,两位分享者对未来五年的情景设计进行了展望。持续的小改进仍然会源源不断,同时我们也有望看到一些飞越性的改良。这其中可能有三个关键因素:
- 2-3 米精确度的地理位置信息,包括在室内如果也能达到这个准确度的话,很多事情将有很大的不同。
- 多设备,物联网。这会带来怎样的变化,现在甚至还难以预知。
- 低功耗带来的 always-on app,又会带来更多的可能性。
回顾过去,会感到很多事情是如此的不可思议。10 年前的奔腾芯片,100MIPS 的能力,15W 的功耗,尺寸达到 60mm。而上文所提到的 Hub 硬件,使用的 STM32F411 芯片,该芯片的能力为 125MIPS,功耗最低在 0.005W,正常在 0.018W,按照目前的电池能力可以连续运转 3-10 周不等,而尺寸只有 3mm。在机器中加入这样一个 Hub,就好像人的大脑有了脑干一样,具备了自我维持生命的能力。
继续这样发展下去,会不会有一天,我们能够像幻想世界中的魔法师一样,手中凌空画几道符咒,就能释放了不起的“魔法”呢?还真是一切皆有可能啊。
评论