我正在寻找计算android设备速度的方法。我发现了一些东西,但即使我不能解决它。
我应用公式V= Vo + a*t来计算速度,并使用TYPE_LINEAR_ACCELEROMETER。尽管如此,我还是没有得到一致的结果,我不知道为什么。如果我将设备向右移动,X轴不会长大,如果我向左移动,它也不会长大。向上和向下的Idem。即使它停止了,也会有一些变化(不是g!!,而是其他的)。
这是我的代码注释。如果有人能帮上忙,我会很感激。
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("");
}
}
}发布于 2013-09-24 06:09:51
要应用该公式,您需要一个恒定的加速度,或者您需要知道传感器读数之间的一段时间内的平均加速度。手机中的传感器会为您提供瞬时加速度,但它不会随着时间的推移对该值进行积分,因此此技术不太可能生成准确的速度值。
你看到的另一个影响--当设备静止时改变数值--很可能是真实世界传感器中的正常噪声。它们很少会完全按照理论上说的方式运行,因此信号需要进行调节(平滑、缩放、校准等)。
https://stackoverflow.com/questions/18969439
复制相似问题