Датчик акселерометри Android, аномальних цінностей/глюків

Я намагаюся використовувати API датчиків для акселерометрів на тестовому телефоні (Nexus S). Коли телефон, що сидить на лавці, нічого не робить, я отримую дуже дивні читання (зображення додається). Хто-небудь ще бачив подібну поведінку? Глюки у прискореному читанні ? Будь-яка ідея, як з цим боротися?

   package com.example.m6;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Calendar;

import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.PowerManager;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;
//import android.widget.Toast;

public class HelloAndroidActivity extends Activity implements SensorEventListener {
    private SensorManager sensorManager; 
    private TextView tv;
    private float accel[] = {0,0,0};
    private float gyro[] = {0,0,0};


    InetAddress addr; 
    int port         = 1337;
    DatagramSocket s = null;
    String out       = "";
    PowerManager.WakeLock wl;

    /** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {
        try{
            //Lock the screen 
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

            //Set up the output screen
            setContentView(R.layout.main);
            tv = (TextView) findViewById(R.id.textview);
            tv.setBackgroundColor(Color.BLACK);
            tv.setTextColor(Color.GREEN);

            //Set up the telemetry feed 
            addr = InetAddress.getByName("192.168.0.12");
            s = new DatagramSocket();

            //Turning off the power management!!
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "My Tag");
            wl.acquire(); 

            //Set up the sensors
            sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);

            out += "Done\n";
            tv.setText(out);

        } catch (Exception e) {
            out += "\nInit Error:" + e.getMessage() + "\n";
            tv.setText(out);
        }

    }

    private static final float NS2S = 1.0f/1000000000.0f;
    private float timestamp;

    int down = 0; 
    float tstart = 0;
    @Override
    public void onSensorChanged(SensorEvent event) {            

        String type = "";
        float dT = 0;       
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            if (timestamp != 0) {
                accel = event.values;
                dT = (event.timestamp - timestamp);
                tstart += dT;
            }
            timestamp = event.timestamp;
            type = "G";
        }

        if(event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
            if (timestamp != 0) {
                gyro = event.values;
                dT = (event.timestamp - timestamp);
                tstart += dT;
            }
            timestamp = event.timestamp;
            type = "A";
        }

        String out_packet = tstart/1000/1000 + " "+ type + " " + dT + " " + accel[0] + " " + accel[1] + " " + accel[2] + " " + gyro[0] + " " + gyro[1] + " " + gyro[2] + "\n\0";

        try{
            DatagramPacket p = new DatagramPacket(out_packet.getBytes(),out_packet.length(), addr,port);
            s.send(p);
        }
    catch (Exception e) {
            out += "Packet send error: " + e.getMessage() + "\n";
        }

        tv.setText(timestamp + "\n" + out);
    }

    @Override
    protected void onResume() {
        super.onResume();
        out += "on resume\n";
        sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL);
        sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_NORMAL);
        tv.setText(out);
    }

    @Override
    protected void onPause() {
        out += "on pause";
        sensorManager.unregisterListener(this);
        tv.setText(out);
        super.onStop();

    }

    @Override
    protected void onDestroy() {
        out += "on destroy";
        wl.release();
        tv.setText(out);
        super.onDestroy();
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
       //TODO Auto-generated method stub

    }
}
0
Використовуючи Droid 1, я не помітив таких аномалій. Мені завжди доводилося використовувати пороги для того, що я хотів би виявити (послідовності руху), та не намагався виявляти "будь-які" події для руху.
додано Автор Matt H, джерело
Я додав код. Сподіваємося, це буде корисним щодо того, які події я слухаю.
додано Автор MattieG, джерело

2 Відповіді

Код буде непоганим .. спробуйте цей демонстраційний код. Я знаю, що це працює і робить графік.

http://www.5laida.com/docs/android/samples/Sensors.html

Я протестував цей код на декількох пристроях .. Отже, якщо це показує ті самі збої, то це, ймовірно, ваш пристрій.

0
додано
Так, звісно! Це було дурне про мене. Ви редагуєте питання, щоб включити джерело. Я повинен попередити вас, я в основному розробник C/C ++, мій Java досить іржавий. Отже, можливо, що я роблю щось неправильне у коді. Я просто не маю інтуїції на цій мові.
додано Автор MattieG, джерело

Я зрозумів, що відбувається. Мені потрібно було включити цю лінію:

        if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE ){
        return;
    }

Проте, через це я зараз не отримую ніяких значень з гіроскопа. Хм ...

0
додано
Я не дивлячись на джерело для event.accuracy або Sensor_Status_unrelaible .. але does event.accuarcy виводить числові значення .. так що, можливо, ви можете встановити порогове значення. Дивлячись на ваш графік проблема полягає в повній краплях. Ви завжди можете з деякими заявками, якщо виключити внесення змін, якщо зміна є швидкою та різкою. Важко підтримувати всі пристрої, особливо коли відрізняється ОС, а також якість побудови фізичного телефону.
додано Автор DJPlayer, джерело
Вітаю з рішенням. Коли зможете, будь ласка, обов'язково позначте свою відповідь "прийнятою", щоб інші могли навчитися у вас успіху. Ура!
додано Автор Andrew Kozak, джерело
І ось відповідь на це питання: stackoverflow.com/questions/5985514/…
додано Автор MattieG, джерело
android_jobs_ua
android_jobs_ua
120 учасників

Публикуем вакансии и запросы на поиск работы по направлению Android. Здесь всё: full-time, part-time, remote и разовые подработки.

Mobile Dev Jobs UA
Mobile Dev Jobs UA
20 учасників

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin, RN и т.д.