首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Speed设备未应用

Speed设备未应用
EN

Stack Overflow用户
提问于 2013-09-24 05:44:39
回答 1查看 55关注 0票数 0

我正在寻找计算android设备速度的方法。我发现了一些东西,但即使我不能解决它。

我应用公式V= Vo + a*t来计算速度,并使用TYPE_LINEAR_ACCELEROMETER。尽管如此,我还是没有得到一致的结果,我不知道为什么。如果我将设备向右移动,X轴不会长大,如果我向左移动,它也不会长大。向上和向下的Idem。即使它停止了,也会有一些变化(不是g!!,而是其他的)。

这是我的代码注释。如果有人能帮上忙,我会很感激。

代码语言:javascript
复制
public class MainActivity extends Activity implements SensorEventListener, OnClickListener {

    TextView txtGravity,txtMax;
    Button btnStart;

    private long previousMarkTime;
    private Vector currentSpeed;

    private Boolean measure;

    private SensorManager mSensorManager;
    private Sensor mSensor;


    @SuppressLint("InlinedApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        measure = false;

        txtGravity = (TextView)findViewById(R.id.textView1);
        txtMax = (TextView)findViewById(R.id.textView2);

        btnStart = (Button)findViewById(R.id.button1);
        btnStart.setOnClickListener(this);

        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_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.main, menu);
        return true;
    }

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

    }

    @Override
    public void onSensorChanged(SensorEvent a) {
        if(previousMarkTime==0){
                        // I get the first time
            previousMarkTime = System.currentTimeMillis(); 
            return;
        }

        long current_time= System.currentTimeMillis();

        // Here I calculate the diference between now and the previous time
        long t = current_time- previousMarkTime;

        // I create a vector to store the acceleration
        Vector aceleracionPorT = new Vector(a.values[0], a.values[1], a.values[2]);
        double t_f = (float)t;

        // This is   a*t
        aceleracionPorT.doMultiplyScalar(t_f/1000);

        // and this is    Vo + a*t
        currentSpeed.sum(aceleracionPorT);


        previousMarkTime = t_actual;

        // I show the results
        txtGravity.setText(currentSpeed.toString("0.000") + "\n"+
                           aceleracionPorT.toString("0.000"));

    }
    @Override
      protected void onResume() {
        super.onResume();
      }

      @Override
      protected void onPause() {
        super.onPause();
        measure = false;
        mSensorManager.unregisterListener(this);
      }

    @Override
    public void onClick(View id) {
        if(id==btnStart){
            measure = !measure;
            if(measure) {
                mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_FASTEST);
                currentSpeed = new Vector(0,0,0);
                previousMarkTime = 0;
            }
            else txtGravity.setText("");
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2013-09-24 06:09:51

要应用该公式,您需要一个恒定的加速度,或者您需要知道传感器读数之间的一段时间内的平均加速度。手机中的传感器会为您提供瞬时加速度,但它不会随着时间的推移对该值进行积分,因此此技术不太可能生成准确的速度值。

你看到的另一个影响--当设备静止时改变数值--很可能是真实世界传感器中的正常噪声。它们很少会完全按照理论上说的方式运行,因此信号需要进行调节(平滑、缩放、校准等)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18969439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档