簡體   English   中英

如何在Android中使用加速計跟蹤路徑?

[英]How to track path using accelerometer in android?

我想創建一個在android中跟蹤路徑的應用程序。 我使用以下代碼來計算不同方向的加速度。

package com.example.usrivast.accelerometer;

import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;


public class MainActivity extends Activity implements SensorEventListener{

Sensor accelerometer = null;
SensorManager sm = null;
TextView acceleration = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sm = (SensorManager)getSystemService(SENSOR_SERVICE);
    accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    sm.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);
    acceleration = (TextView)findViewById(R.id.acceleration);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

@Override
public void onSensorChanged(SensorEvent event) {

    acceleration.setText("x: " + event.values[0] + "\ny: " + event.values[1] + "\nz: " + event.values[2]);
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
   }
}

但是我無法理解這些值的輸出。 它們變化非常快。 同樣,如果我的手機處於靜止狀態,那么這些值也會更改。 當我的手機在桌上休息時,這些值的一個示例是x:-0.1278 y:0.2968 z:9.6323它們變化非常快。 我正在使用Nexus 5。

智能手機中的加速度計非常便宜而且很小。 這意味着它們的輸出質量很差。

您會注意到的第一件事是您已經注意到的,這是因為這些值會非常嘈雜 這意味着這些值將一直隨機且非常迅速地上下反彈。 這只是典型的信號噪聲或白噪聲 ,便宜的傳感器有很多,尤其是當它們裝在一個裝有許多數字電子設備和天線(wifi,電池頻率等)的小包裝中時。 找出消除噪聲的方法是它自己的整個科學領域(稱為信號處理 ),並且它比您可能想象的要復雜得多。 基本思想是使用某種低通濾波器

您現在不會注意到的第二件事,但是如果您嘗試對信號做更多的事情(尤其是將其集成),您將會發現。 此問題與傳感器中的偏壓有關。 基本上,這個問題是關於零加速度,在傳感器上未記錄為零。 使問題復雜化的是,這種“偏見”通常會隨着時間的流逝而變化(並隨溫度而變化,例如當電池變熱或手機在手掌中時)。 同樣,要消除這種偏差並不容易(可以像應用高通濾波器一樣容易,但是首選方法是使用增強卡爾曼濾波器 )。

第三個問題是非線性。 最便宜的加速度計遠沒有加速度和測量值之間具有線性關系。 它們通常被設計為在0附近相對線性,並且朝着它們可以測量的加速度范圍的上限和下限變差。 因此,如果您不要太猛烈地移動,這將不是問題。

所有這些問題的結果是,智能手機內部的加速度計根本不夠好,無法產生像手機運動軌跡一樣精確的信息。 要實際產生這條路徑,您需要對信號進行兩次數值積分(一次獲得速度,再一次獲得位置)。 數值積分通常會使上述每個問題變得更糟,並且兩次進行將是災難性的。 當集成信號時,大多數可用來消除噪聲和/或偏置的濾波器都會增加其他問題。 一種或另一種方式是,您正在與某些堅不可摧的自然力量作斗爭,信號處理是一個非常寬容的領域,最重要的是,如果您希望最后獲得除垃圾以外的其他東西,則需要更好的信號作為開始,或如我們所說,垃圾進,垃圾出。

這就是為什么智能手機中的加速度計除了用於檢測手機的握持方向(這是基於一段時間內平均加速度計值的簡單計算),而且用於檢測相當猛烈的手勢(檢測到手機上的大/長尖峰)而很少用於其他用途的原因。值)。 甚至Wii-mote之類的傳感器要好得多,甚至都無法用於重建路徑,因此信號仍然太嘈雜且有偏差。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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