检测 Android 设备上的运动模式

Posted

技术标签:

【中文标题】检测 Android 设备上的运动模式【英文标题】:Detect pattern of motion on an Android device 【发布时间】:2015-05-03 22:03:09 【问题描述】:

我想检测 android 手机上的特定运动模式,例如如果我做五个坐立式。

[注意:我目前正在检测运动,但所有方向的运动都是相同的。]

我需要的是:

    我需要区分向下、向上、向前和向后的运动。 我需要找到手机距地面的高度(以及手持手机的人的高度)。

有没有实现模式运动检测的示例项目?

【问题讨论】:

【参考方案1】:

这是不可能的。您可以通过比较加速度与主要重力来识别向下和向上,但是您如何知道您的手机是在您起身时在后袋中,还是在您打招呼时只是在挥手中?是5个站立还是5个你好? 前进后退更是不可预测。倒置电话的前向是什么?如果从电话的角度完全转发怎么办? 地面高度和高度完全无法测量。手机会以与侏儒或巨人完全相同的方式移动并产生加速度 - 它更多地取决于人的行为或静止而不是高度。

【讨论】:

我不同意。这并不完美——但对于 CS 的许多领域来说都是如此。鉴于当今传感器的准确性,建立模型来猜测佩戴者在做什么并不是不合理的。例如,新兴的无线健康领域/行业关注此类问题。我曾经与一位教授合作过,他使用传感器(与 OP 电话中的传感器不同)来检测中风患者,这可以帮助诊断步行步态的潜在问题。当然,在 OP 的情况下,您会得到误报,但通过查看传感器数据不难区分波浪和站立。【参考方案2】:

这不是不可能的,但它可能不是非常准确,因为手机中的加速度计和陀螺仪的准确性已经提高了很多。

您的应用将做的是获取传感器数据,并执行regression analysis.

1) 您需要构建一个数据模型,将其归类为五个坐姿和站姿。这可以通过要求用户进行五次坐姿和站姿来完成,或者通过使用您预先收集的数据中更精细调整的模型来加载应用程序。您可能会采取一些技巧,例如加载多个不同身高的人的模型,并要求用户在应用程序中提交自己的身高,以使用最佳模型。

2) 运行时,您的应用将尝试将data from the sensors(Android 有great libraries for this)与您创建的模型相匹配。希望当用户执行五次坐立式时,他会生成一组与您定义的五次坐立式足够相似的运动数据,您的算法会接受它。

这里的很多工作是组装和分类您的模型,并使用它直到获得可接受的准确度。关注是什么使站立坐姿与其他上下运动不同 - 例如,数据中可能有伸展腿的迹象,然后是完全伸直的不同形状。或者,如果您希望手机放在口袋里,您可能没有太多的旋转运动,因此您可以拒绝从陀螺仪记录大量变化的测试集。

【讨论】:

【参考方案3】:

我不一定同意亚历克斯的回答。使用加速度计、设备旋转以及大量试错和数据挖掘,这是可能的(尽管可能不如您希望的准确)。

我认为这可以起作用的方式是定义用户握住设备的特定方式(或设备被锁定并放置在用户的身体上)。当他们通过运动时,方向与加速度和时间相结合将决定正在执行哪种运动。您将需要使用类对象,如 OrientationEventListener、SensorEventListener、SensorManager、Sensor 和各种计时器,例如Runnables 或 TimerTasks。

从那里,您需要收集大量数据。观察、记录和研究用于执行特定动作的数字,然后得出定义每个动作和子动作的一系列值。我所说的子动作是指,仰卧起坐可能有五个部分:

1) 在时间 x 时手机方向为 x 值的静止位置

2) 仰卧起坐开始,手机方向是时间 y 的 y 值范围(大于 x)

3) Situp 处于最终位置,其中手机方向是时间 z 的 z 值范围(大于 y)

4) 仰卧起坐处于反弹状态(用户正在倒回地板),其中手机方向是时间 v 的 y 值范围(大于 z)

5) Situp 回到静止位置,手机方向在时间 n(最大和最后时间)为 x 值

也为此添加加速,因为在某些情况下可以假设加速。例如,我的假设是人们执行实际仰卧起坐(我上面分解中的第 1-3 步)的加速度比后退时更快。一般来说,大多数人跌得比较慢,因为他们看不到他们身后的东西。这也可以用作确定用户方向的附加条件。然而,这可能并非适用于所有情况,这就是您需要进行数据挖掘的原因。因为我也可以假设,如果有人做了很多仰卧起坐,最后的仰卧起坐会很慢,然后他们会因为筋疲力尽而倒回休息位置。在这种情况下,加速度将与我最初的假设相反。

最后,查看运动传感器:http://developer.android.com/guide/topics/sensors/sensors_motion.html

总而言之,它真的是一个数字游戏,结合了你自己的“猜测”。但是您可能会对它的效果感到惊讶。也许(希望)对您的目的足够好。

祝你好运!

【讨论】:

【参考方案4】:

这是一个研究主题,可能我在这里发布它已经太晚了,但无论如何我正在寻找文献,那又怎样?

已经针对这个问题设置了各种机器学习方法,我会在途中提到一些。 Andy Ng 的MOOC on machine learning 为您提供了进入该领域和进入 Matlab/Octave 的入口点,您可以立即将其付诸实践,它也揭开了怪物的神秘面纱(“支持向量机”)。

我想检测是否有人因手机加速或角度而喝醉了,因此我正在与神经网络调情来解决这个问题(如果你买得起硬件,它们基本上对every issue 有好处),因为我不想假设要寻找预定义的模式。

您的任务似乎可以基于模式来处理,一种方法应用于分类golf play motions、dancing、行为every day walking patterns,以及两次drunk driving detection,其中one 解决了为与其他所有方向相反,纵向运动实际上是什么,这可能有助于找到您需要的基线,例如地面水平。

这是一个密集的方面和方法,下面只是更多。

林 e.a. 2009:Real-time End Point Detection Specialized for Acceleration Signal

何寅2009:Activity Recognition from acceleration data Based on Discrete Consine Transform and SVM

Dhoble e.a. 2012:Online Spatio-Temporal Pattern Recognition with Evolving Spiking Neural Networks utilising Address Event Representation, Rank Order, and Temporal Spike Learning

Panagiotakis e.a.:Temporal segmentation and seamless stitching of motion patterns for synthesizing novel animations of periodic dances

这个使用视觉数据,但会引导您完成神经网络分类器的 matlab 实现:

Symeonidis 2000:Hand Gesture Recognition Using Neural Networks

【讨论】:

以上是关于检测 Android 设备上的运动模式的主要内容,如果未能解决你的问题,请参考以下文章

如何检测 iPhone 6 设备的运动? (确定 iPhone 设备是不是移动 - x,y,z- 上的最小可能运动)

如何使用 Unity3D 检测移动设备上的抖动运动? C#

Android - 相机作为运动检测器

如何检测安卓设备的移动?

检测加速度计在 y 轴上的运动方向

检测加速度计检测到运动的时间范围