Android 如何使用加速度计计算速度?

Android 如何使用加速度计计算速度?,android,accelerometer,sensors,Android,Accelerometer,Sensors,嗨,我正在尝试使用加速度传感器来计算Android中的加速度和速度。一切正常,但速度总是在增加。我得到了正确的加速度。为了得到实际加速度,我用地球当前的加速度(大约9.8)减去它,这是我的主要活动类别: public class MainActivity extends AppCompatActivity { Handler handler = new Handler(); SensorManager sensorManager; TextView myTextView; double

嗨,我正在尝试使用加速度传感器来计算Android中的加速度和速度。一切正常,但速度总是在增加。我得到了正确的加速度。为了得到实际加速度,我用地球当前的加速度(大约9.8)减去它,这是我的主要活动类别:

    public class MainActivity extends AppCompatActivity {
Handler handler = new Handler();

SensorManager sensorManager;
TextView myTextView;
double intialVelocity = 0.0;
double finalAcceleration = 0.0;
double appliedAcceleration = 0;
double currentAcceleration = 0;
double velocity = 0;
double initialAcceleration = 0;
Date lastUpdate;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myTextView = (TextView)findViewById(R.id.myTextView);
    lastUpdate = new Date(System.currentTimeMillis());

    sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
    Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    sensorManager.registerListener(sensorEventListener,
            accelerometer,
            SensorManager.SENSOR_DELAY_FASTEST);

}

private void updateVelocity() {
    // Calculate how long this acceleration has been applied.
    Date timeNow = new Date(System.currentTimeMillis());
    long timeDelta = timeNow.getTime()-lastUpdate.getTime();
    lastUpdate.setTime(timeNow.getTime());

    // Calculate the change in velocity at the
    // current acceleration since the last update.
    double deltaVelocity = appliedAcceleration * (timeDelta/1000);
    appliedAcceleration = currentAcceleration;
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            //Log.d("init_velocity", String.valueOf(intialVelocity));
            if(initialAcceleration < currentAcceleration){
                if(currentAcceleration > 9.9 || currentAcceleration < 9.4){
                    finalAcceleration = currentAcceleration;
                }else{
                    finalAcceleration = 9.80665;
                }
                double acceleration = finalAcceleration - 9.80665;
                Log.d("acc1", String.valueOf(acceleration));
                velocity = (intialVelocity + (acceleration));
                myTextView.setText(String.valueOf(velocity));
                intialVelocity = velocity;
                initialAcceleration = currentAcceleration;
            }else if(initialAcceleration > currentAcceleration){
                if(currentAcceleration > 9.9 || currentAcceleration < 9.4){
                    finalAcceleration = currentAcceleration;
                }else{
                    finalAcceleration = 9.80665;
                }
                double acceleration = finalAcceleration - 9.80665;
                Log.d("acc2", String.valueOf(acceleration));
                velocity = (intialVelocity - (acceleration));
                myTextView.setText(String.valueOf(velocity));
                intialVelocity = velocity;
                initialAcceleration = currentAcceleration;
            }

        }
    });
}

//private final SensorListener sensorListener = new SensorListener() {
private final SensorEventListener sensorEventListener = new SensorEventListener() {
    double calibration = Double.NaN;



    public void onSensorChanged(SensorEvent event) {
        double x = event.values[0];
        double y = event.values[1];
        double z = event.values[2];

        double a = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2));

        if (calibration == Double.NaN)
            calibration = a;
        else {
            updateVelocity();
            currentAcceleration = (float)a;
        }
    }
    public void onAccuracyChanged(Sensor sensor, int accuracy) { }
};
}
public类MainActivity扩展了AppCompatActivity{
Handler=newhandler();
传感器管理器传感器管理器;
文本视图myTextView;
双内禀赋率=0.0;
双最终加速=0.0;
双应用加速=0;
双电流加速度=0;
双速=0;
双初始加速度=0;
最新更新日期;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myTextView=(TextView)findViewById(R.id.myTextView);
lastUpdate=新日期(System.currentTimeMillis());
sensorManager=(sensorManager)getSystemService(Context.SENSOR\u服务);
传感器加速计=sensorManager.getDefaultSensor(传感器类型\加速计);
sensorManager.registerListener(sensorEventListener,
加速计,
传感器管理器。传感器延迟(最快);
}
私有void updateVelocity(){
//计算施加该加速度的时间。
Date timeNow=新日期(System.currentTimeMillis());
long-timeDelta=timeNow.getTime()-lastUpdate.getTime();
setTime(timeNow.getTime());
//计算速度的变化
//自上次更新以来的当前加速度。
双deltaVelocity=appliedAcceleration*(时间增量/1000);
appliedAcceleration=当前加速度;
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
//Log.d(“初始速度”,String.valueOf(初始速度));
if(初始加速度<当前加速度){
如果(当前加速度>9.9 | |当前加速度<9.4){
最终加速度=当前加速度;
}否则{
最终加速度=9.80665;
}
双加速度=最终加速度-9.80665;
Log.d(“acc1”,String.valueOf(加速度));
速度=(初始速度+(加速度));
myTextView.setText(String.valueOf(velocity));
初始伸长率=速度;
初始加速度=当前加速度;
}否则如果(初始加速度>当前加速度){
如果(当前加速度>9.9 | |当前加速度<9.4){
最终加速度=当前加速度;
}否则{
最终加速度=9.80665;
}
双加速度=最终加速度-9.80665;
Log.d(“acc2”,String.valueOf(加速度));
速度=(初始速度-(加速度));
myTextView.setText(String.valueOf(velocity));
初始伸长率=速度;
初始加速度=当前加速度;
}
}
});
}
//私有最终SensorListener=新的SensorListener(){
私有最终SensorEventListener SensorEventListener=新的SensorEventListener(){
双重校准=双重。NaN;
传感器更改时的公共无效(传感器事件){
双x=事件值[0];
双y=事件值[1];
双z=事件值[2];
double a=Math.sqrt(Math.pow(x,2)+Math.pow(y,2)+Math.pow(z,2));
如果(校准==Double.NaN)
校准=a;
否则{
updateVelocity();
电流加速度=(浮动)a;
}
}
精度已更改(传感器,int精度){}
};
}

有人能帮我吗?

为什么要从汽车的加速度中减去地球的加速度。它们之间除了摩擦之外没有任何关系。例如,在你的代码中,如果你向前加速A秒,然后向后加速A秒,在现实世界中,你没有净速度变化,但是你的代码忽略了方向,A所以你认为S秒有2A的加速度。你最好用gps来测量velocity@ZiyaERKOC:
TYPE\u加速计
包括重力。
TYPE\u线性加速度
抵消重力,在这里是一个更好的选择,因为计算速度(相当于)航位推算从一开始就有意义。@Commonware我已经将加速度计改为线性加速度计,它表示传感器或监听器为空。请帮助。为什么要从汽车的加速度中减去地球加速度。它们之间除了摩擦之外没有任何关系。例如,在你的代码中,如果你向前加速一秒在现实世界中,你没有净速度的变化,但是你的代码忽略了方向,所以你认为在S秒内有2A的加速度。你最好使用gpsvelocity@ZiyaERKOC:
TYPE\u加速计
包括重力。
TYPE\u线性加速度
重力和重力将是一个更好的选择,因为通过(相当于)航位推算来计算速度首先是有意义的。@Commonware我将类型_加速计更改为类型_线性_加速度,它表示传感器或侦听器为空。请帮助。