2016-09-16 45 views
0

我需要一种方法中利用手腕式加速度计来算个人手臂的动作,特别是微软频带2与手腕式加速度计(微软波段)

计数手臂的动作,我想算任何普通的手臂运动,在走路时摆动手臂,伸手去拿东西等等。例如,如果我伸出手,暂停一会儿,然后再放下,这将是两臂动作。如果我不停顿地再做同样的事情,那将是一次手臂运动。

不幸的是,我一直没能找到任何有关这个特定问题的资源。我目前的方法正在运作,但相当不准确。这是可以做到的吗?我能否加入一些其他传感器来帮助完成这项工作?任何帮助将不胜感激。

回答

0

在给了我更多的自己之后,我已经解决了一个可以接受的解决方案,尽管帮助和反馈仍然受到欢迎。

它需要预先定义阈值加速度和我所谓的“跳动时间”。这两个变量需要一些按摩来找到适当的平衡。我已经选定了以下情况:

private final long bounceTime = 750; 
private final double threshold = 0.3; 

的阈值变量定义了可以被视为运动加速度的最小量。

bounceTime变量被用作一种去抖动阈值。这是为了说明我注意到的一个效果,在移动你的手臂之后,在休息之前有一个非常轻微的跳动或反弹。这偶尔会被算作两次甚至三次手臂动作。基本上,bounceTime用于排除这些正在计数的移动,您将在下面的代码中看到。

@Override 
public void onBandAccelerometerChanged(BandAccelerometerEvent bandEvent) { 
    float x = bandEvent.getAccelerationX(); 
    float y = bandEvent.getAccelerationY(); 
    float z = bandEvent.getAccelerationZ(); 
    long time = bandEvent.getTimestamp(); 

    float sum = x + y + z; 
    if ((sum - offset > threshold || sum - offset < -threshold) 
     && bandEvent.getTimestamp() > lastActivated + bounceTime 
     && !moving) 
    { 
     lastActivated = bandEvent.getTimestamp(); 
     moving = true; 
     moveCount++; 
    } 
    else 
    { 
     moving = false; 
     offset = sum; 
    } 

我试图得到一个近乎平坦的零读数上的加速计,当它处于静止状态和总结了加速度计轴和减去offset变量。偏移量变量包含前一个加速度计和。

因此,如果当前加速度计总和减去前一个总和大于阈值或小于负阈值,则只能考虑移动手臂。如果满足此要求并且手臂尚未移动或弹跳,则会计算移动。