gpt4 book ai didi

ios - 使用核心运动和加速度计数据检测某人何时开始行走

转载 作者:IT王子 更新时间:2023-10-29 08:07:49 26 4
gpt4 key购买 nike

我正在尝试检测三种 Action :用户何时开始步行、慢跑或运行。然后我想知道什么时候停止。我已经使用以下代码成功检测到某人何时在行走、慢跑或运行:

- (void)update:(CMAccelerometerData *)accelData {

[(id) self setAcceleration:accelData.acceleration];

NSTimeInterval secondsSinceLastUpdate = -([self.lastUpdateTime timeIntervalSinceNow]);

if (labs(_acceleration.x) >= 0.10000) {
NSLog(@"walking: %f",_acceleration.x);
}
else if (labs(_acceleration.x) > 2.0) {
NSLog(@"jogging: %f",_acceleration.x);
}
else if (labs(_acceleration.x) > 4.0) {
NSLog(@"sprinting: %f",_acceleration.x);
}

我遇到的问题有两个:

1) 每次有运动时都会多次调用更新,可能是因为它检查得太频繁以至于当用户开始行走时(即 _acceleration.x >= .1000)当它再次调用更新时它仍然 >= .1000 .

示例日志:

    2014-02-22 12:14:20.728 myApp[5039:60b] walking: 1.029846
2014-02-22 12:14:20.748 myApp[5039:60b] walking: 1.071777
2014-02-22 12:14:20.768 myApp[5039:60b] walking: 1.067749

2) 我很难弄清楚如何检测用户何时停止。有没有人对如何实现“停止检测”有建议

最佳答案

根据您的日志,accelerometerUpdateInterval 大约是 0.02。如果您更改提到的 CMMotionManager 属性,更新频率可能会降低。

仅检查 x 加速度不是很准确。我可以将设备以这样的方式(比如说在左边缘)放在 table 上,使 x 加速度等于 1,或者稍微倾斜一点。这将导致程序处于行走模式(x > 0.1)而不是空闲

这是指向 ADVANCED PEDOMETER FOR SMARTPHONE-BASED ACTIVITY TRACKING 的链接出版物。它们跟踪加速度矢量方向的变化。这是两个连续加速度矢量读数之间夹角的余弦值。

cos(angle) formula

显然,在没有任何运动的情况下,两个向量之间的角度接近于零并且 cos(0) = 1。在其他事件期间 d < 1。为了滤除噪音,他们使用 d 的最后 10 个值的加权移动平均值。

WMA10 formula

实现后,您的值(value)观将如下所示(红色 - 步行,蓝色 - 运行):

WMA(d)

现在您可以为每个事件设置一个阈值以将它们分开。请注意,平均步进频率为 2-4Hz。您应该期望当前值在一秒钟内至少有几次超过阈值,以便识别操作。

另一个有用的出版物:

更新

_acceleration.x, _acceleration.y, _acceleration.z 是同一个加速度向量的坐标。您在 d 公式中使用这些坐标中的每一个。为了计算d,您还需要存储先前更新的加速度向量(在公式中使用 i-1 索引)。

WMA 只考虑 10 个具有不同权重的最后 d 值。最近的 d 值具有更大的权重,因此对结果值的影响更大。您需要存储 9 个以前的 d 值才能计算当前值。您应该将 WMA 值与相应的阈值进行比较。

关于ios - 使用核心运动和加速度计数据检测某人何时开始行走,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21957588/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com