0

對於需要使用加速度計識別手勢的類項目。 我目前在x,y和z值上使用了明確的if語句方法。Android加速度計 - 動態時間扭曲

我讀過Dynamic Dynamic Wrapping是一種更高效的方式,因爲它檢查手勢和以前存儲的手勢之間的匹配。

我該如何去編碼這在Android中,因爲我似乎無法在網上找到任何東西。

public void onSensorChanged(SensorEvent event) { 

    final float alpha = (float) 0.8; 

    // Isolate the force of gravity with the low-pass filter. 
    gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; 
    gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; 
    gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; 

    // Remove the gravity contribution with the high-pass filter. 
    linear_acceleration[0] = event.values[0] - gravity[0]; 
    linear_acceleration[1] = event.values[1] - gravity[1]; 
    linear_acceleration[2] = event.values[2] - gravity[2]; 

    float x1 = linear_acceleration[0]; 
    float y1 = linear_acceleration[1]; 
    float z1 = linear_acceleration[2]; 

    x.setText("X: "+ x1); 
    y.setText("Y: "+ y1); 
    z.setText("Z: " + z1); 

    if(y1 < -2 && z1 > 2) 
    { 
     action.setText("Phone Moved Forward!!"); 
     image.setVisibility(View.VISIBLE); 
     image.setImageResource(R.drawable.forwardarrow); 
    } 
    else if(y1 < -2 && z1 < -2) 
    { 
     action.setText("Phone Moved Toward Face!!"); 
     image.setVisibility(View.VISIBLE); 
     image.setImageResource(R.drawable.backarrow); 
    } 
    else if(y1 < -2 && x1 > 2)//y down, x up = left tilt 
    { 
     action.setText("Phone Titled Left!"); 
     image.setVisibility(View.VISIBLE); 
     image.setImageResource(R.drawable.leftarrow); 
    } 
    else if(y1 < -2 && x1 < -2)//y down, x down = right tilt 
    { 
     action.setText("Phone Titled Right!"); 
     image.setVisibility(View.VISIBLE); 
     image.setImageResource(R.drawable.rightarrow); 
    } 
    else 
    { 
     image.setVisibility(View.GONE); 
     action.setText("Stable"); 
    } 

} 

回答

0

動態時間扭曲計算兩個時間序列之間的距離。您存儲用於比較的模板並將實際移動用作候選項。如果您使用所有頻道,您將擁有三種不同的時間序列和距離。如果累計距離低於特定閾值,該移動將被標記爲已識別。困難的部分是你有連續的時間序列。很難找到手勢。不過,該算法找到了兩個時間序列之間的最佳對齊方式。

該方法onSensorChanged給你一個點的時間序列。所以你必須建立一個先進先出(FIFO)數據結構(例如一個隊列),它存儲最後一秒的所有變化。

也許FastDTW庫是有幫助的:https://code.google.com/archive/p/fastdtw/

1

我已經上傳了一個存儲庫的GitHub這表明動態時間彎曲的an example爲acceleromter數據;你可能會覺得它很有用!