![](/img/trans.png)
[英]Best way to get peak g-force from accelerometer every second in Android?
[英]Calculate movement from accelerometer every second
我正在嘗試舉一個如何從加速度計數據計算運動的示例。 我想做的是在Java中實現以下算法 :
每秒(32個樣本)使用以下方法匯總加速度數據:
sum + = max3(abs(buffX [i]-prevX),abs(buffY [i]-prevY),abs(buffZ [i]-prevZ));
然后對輸出進行過濾:
平均=平均* 0.9 +(總和/ 32)* 0.1;
我對這種工作不太熟悉,因此我對如何將編寫的算法轉換為Java代碼有一些疑問。 請參閱我為解決此問題所做的嘗試:
calculateMovementG = new Runnable() {
@Override
public void run() {
if (isRecording) {
double sum = 0.0;
for (int i = 1; i < accelRawValues.size(); i++) {
sum += Math.abs(accelRawValues.get(i).getX() - accelRawValues.get(i - 1).getX());
sum += Math.abs(accelRawValues.get(i).getY() - accelRawValues.get(i - 1).getY());
sum += Math.abs(accelRawValues.get(i).getZ() - accelRawValues.get(i - 1).getZ());
}
double result = 0.0;
result = result * 0.9 + (sum/accelRawValues.size() - 1) * 0.1;
if(result > 3.0) movementData.add(new GsrConverted(result, accelRawValues.get(0).getTimestamp()));
accelRawValues.clear();
//repeat every second
accelHandler.postDelayed(calculateMovementG, 1000);
} else Log.i(TAG, "isRecording flag false, stopping thread.");
}
};
我從該算法獲得的最低值大約是0.08
,而如果我大力握手,我可以得到的最高值是13.50
。 加速度計附在手腕上。
如文檔所示,使用官方軟件時,我會在-2.0到2.0之間。 如何調整已記錄的算法(此問題頂部的鏈接)以達到此范圍內的值?
我對什么是“意思不清楚max3
”,與不同之間的逗號abs
在算法的第一道防線。 我將abs
解釋為Math.abs
。 我已將計數器i
初始化為1,以免獲得ArrayIndexOutOfBoundsException
。
感謝您通過評論和回答獲得的任何幫助!
max3(abs(buffX [i]-prevX),abs(buffY [i]-prevY),abs(buffZ [i]-prevZ))就是max(max(abs(buffX [i]-prevX),abs( buffY [i]-prevY)),abs(buffZ [i]-prevZ))。
double result = 0.0; result = result * 0.9 + (sum/accelRawValues.size() - 1) * 0.1;
double result = 0.0; result = result * 0.9 + (sum/accelRawValues.size() - 1) * 0.1;
您將結果設置為0.0,所以結果* 0.9始終為0,它在算法中並未明確說明,但我認為結果應該是前一次迭代的結果(但我不確定)。
並與(sum/accelRawValues.size() - 1)
我認為應該是
(sum/ (accelRawValues.size() - 1) )
因為它不一樣。
嘗試這個
calculateMovementG = new Runnable() {
@Override
public void run() {
if (isRecording) {
double sum = 0.0;
for (int i = 1; i < accelRawValues.size(); i++) {
int absX = Math.abs(accelRawValues.get(i).getX() - accelRawValues.get(i - 1).getX());
int absY = Math.abs(accelRawValues.get(i).getY() - accelRawValues.get(i - 1).getY());
int absZ = Math.abs(accelRawValues.get(i).getZ() - accelRawValues.get(i - 1).getZ());
sum += Math.max(Math.max(absX, absY), absZ)
}
double result = // get the result of the previous iteration
result = result * 0.9 + (sum/ (accelRawValues.size() - 1)) * 0.1;
if(result > 3.0) movementData.add(new GsrConverted(result, accelRawValues.get(0).getTimestamp()));
accelRawValues.clear();
//repeat every second
accelHandler.postDelayed(calculateMovementG, 1000);
} else Log.i(TAG, "isRecording flag false, stopping thread.");
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.