我正在使用公式V = Vo + a * t来计算速度,并使用TYPE_LINEAR_ACCELEROMETER。尽管如此,我还是得不到连贯的结果,我不知道为什么。 如果我向右移动设备,轴X不会长大,如果我向左移动,它也不会。上下同意。即使停止也有变化(不是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("");
}
}
}
答案 0 :(得分:0)
要应用公式,您需要恒定加速度,或者您需要知道传感器读数之间的平均加速度。手机中的传感器可以为您提供瞬时加速度,但它不会随时间积分该值,因此该技术不太可能生成准确的速度值。
您所看到的另一个效果 - 当设备静止时更改值 - 可能是真实世界传感器中的正常噪音。它们的行为很少与理论所说的一致,因此信号需要进行调节(平滑,缩放,校准等)。