簡體   English   中英

每秒從加速度計計算運動

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM