Android 用线加速度传感器计算距离

Android 用线加速度传感器计算距离,android,accelerometer,Android,Accelerometer,我正在开发室内导航应用程序,但我无法解释这些值。以下是我的代码片段: public class MainActivity extends Activity implements SensorEventListener { private SensorManager sensorManager; TextView xCoor; // declare X axis object TextView yCoor; // declare Y axis object TextView zCoor; //

我正在开发室内导航应用程序,但我无法解释这些值。以下是我的代码片段:

public class MainActivity extends Activity implements SensorEventListener {

private SensorManager sensorManager;

TextView xCoor; // declare X axis object
TextView yCoor; // declare Y axis object
TextView zCoor; // declare Z axis object
Button button;

float[] linear_acceleration = new float[3];
float[] gravity = new float[3];
float[] distanceInMeter = new float[3];
float[] speed = new float[3];
long timeStamp;
float dT;

private boolean firstTimeOfMeasurement = false;

@Override
public void onCreate(Bundle savedInstanceState){

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    xCoor=(TextView)findViewById(R.id.xcoor); 
    yCoor=(TextView)findViewById(R.id.ycoor); 
    zCoor=(TextView)findViewById(R.id.zcoor); 
    button=(Button)findViewById(R.id.button1);

    sensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);

    button.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            sensorManager.registerListener(MainActivity.this,
                    sensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),
                    SensorManager.SENSOR_DELAY_FASTEST);

            firstTimeOfMeasurement = false;
        }
    });
}

public void onSensorChanged(SensorEvent event){

    // check sensor type
    if(event.sensor.getType()==Sensor.TYPE_LINEAR_ACCELERATION){

        if(!firstTimeOfMeasurement ){
            firstTimeOfMeasurement = true;
            timeStamp = event.timestamp;

            speed[0] = speed[1] = speed[2] = 0;
            distanceInMeter[0] = distanceInMeter[1] = distanceInMeter[2] = 0;

        }
        else{
            dT= (event.timestamp - timeStamp) / 1000000000.0f;
            timeStamp = event.timestamp;

            calculateDistance(event.values, dT);

            xCoor.setText("X: " + Float.toString(distanceInMeter[0]));
            yCoor.setText("Y: " + Float.toString(distanceInMeter[1]));
            zCoor.setText("Z: " + Float.toString(distanceInMeter[2]));

            Log.d("","X: " + Float.toString(distanceInMeter[0]) +  " Y: " + Float.toString(distanceInMeter[1]) + " Z : " + Float.toString(distanceInMeter[2]));
        }
    }
}

public void calculateDistance (float[] acceleration, float deltaTime) {
    for (int i = 0; i < acceleration.length; i++) {
        speed[i] = acceleration[i] * deltaTime;
        distanceInMeter[i] += speed[i] * deltaTime + acceleration[i] * deltaTime * deltaTime / 2;
    }
}
公共类MainActivity扩展活动实现SensorEventListener{
私人传感器管理器传感器管理器;
TextView xCoor;//声明X轴对象
TextView yCoor;//声明Y轴对象
TextView zCoor;//声明Z轴对象
按钮;
浮动[]线性加速度=新浮动[3];
浮动[]重力=新浮动[3];
浮动[]距离计=新浮动[3];
浮动[]速度=新浮动[3];
长时间戳;
浮动dT;
私有布尔值firstTimeOfMeasurement=false;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
xCoor=(TextView)findViewById(R.id.xCoor);
yCoor=(TextView)findViewById(R.id.yCoor);
zCoor=(TextView)findViewById(R.id.zCoor);
按钮=(按钮)findViewById(R.id.button1);
sensorManager=(sensorManager)getSystemService(传感器服务);
setOnClickListener(新的OnClickListener(){
公共void onClick(视图v){
sensorManager.registerListener(MainActivity.this,
sensorManager.getDefaultSensor(传感器类型为线性加速度),
传感器管理器。传感器延迟(最快);
第一次测量=假;
}
});
}
传感器更改时的公共无效(传感器事件){
//检查传感器类型
if(event.sensor.getType()==sensor.TYPE\u线性加速度){
如果(!第一次测量){
第一次测量=真;
timeStamp=event.timeStamp;
速度[0]=速度[1]=速度[2]=0;
距离米[0]=距离米[1]=距离米[2]=0;
}
否则{
dT=(event.timestamp-timestamp)/100000000.0f;
timeStamp=event.timeStamp;
计算距离(事件值,dT);
xCoor.setText(“X:+Float.toString(distanceInMeter[0]));
yCoor.setText(“Y:+Float.toString(distanceInMeter[1]));
zCoor.setText(“Z:+Float.toString(distanceInMeter[2]));
Log.d(“,”X:“+Float.toString(distanceInMeter[0])+”Y:“+Float.toString(distanceInMeter[1])+”Z:“+Float.toString(distanceInMeter[2]);
}
}
}
公共无效计算状态(浮点[]加速度,浮点增量){
对于(int i=0;i
…这里是圆木(设备在X方向移动约0.5米):

X:2.516964E-5 Y:2.3743667E-5 Z:-5.294226E-5 X:4.897119E-5 Y:2.4477049E-5 Z:-1.0725691E-4 X:6.026584E-5 Y:4.4123855E-5 Z:-1.4899505E-4 X:3.9997853E-5 Y:-1.7013517E-6 Z:-1.8953103E-4 X:4.6437595E-5 Y:-5.077744E-6 Z:-2.621123E-4 X:5.7528538E-5 Y:5.1304473E-6 Z:-2.8128378E-4 X:4.4061002E-5 Y:5.7082625E-6 Z:-3.4537681E-4 X:3.2294975E-5Y:-1.6293983E-5Z:-4.103487E-4 X:5.84785E-5 Y:-1.4691614E-6 Z:-4.9171754E-4 X:6.55654E-5Y:-2.2436536E-5Z:-5.5965903E-4 X:4.2109532E-5 Y:-5.2801708E-5 Z:-6.242801E-4 X:3.8397735E-5Y:-8.7437686E-5Z:-6.771843E-4 X:-2.4613353E-5 Y:-1.6809099E-4 Z:-7.590898E-4 X:-4.7245518E-5 Y:-2.0863091E-4 Z:-8.195847E-4 X:-6.6750574E-5 Y:-2.5927206E-4 Z:-8.85209E-4 X:-6.952324E-5 Y:-2.9220866E-4 Z:-9.949753E-4 X:-8.74085E-5 Y:-3.4179245E-4 Z:-0.0010735805 X:-1.0780102E-4 Y:-3.5630423E-4 Z:-0.0011248525 X:-1.19364566E-4 Y:-3.3947633E-4 Z:-0.001229486 X:-1.549891E-4 Y:-3.7859E-4 Z:-0.0013151368 X:-1.5717075E-4 Y:-3.702779E-4 Z:-0.0013620423 X:-2.5051413E-6 Y:-1.9888686E-4 Z:-0.0013941963 X:1.4368152E-4 Y:-3.9539344E-5 Z:-0.0014529589 X:2.6982307E-4 Y:2.944292E-5 Z:-0.0015093404 X:4.395193E-4 Y:7.50221E-5 Z:-0.0015618263 X:6.21904E-4 Y:7.436979E-5 Z:-0.0015917926 X:7.617797E-4 Y:-5.3465046E-6 Z:-0.0016443293 X:8.4774144E-4 Y:-1.39272E-4 Z:-0.0016940705 X:9.120384E-4 Y:-2.1821483E-4 Z:-0.0017769502 X:0.0010219973 Y:-2.7528123E-4 Z:-0.0018363354 X:0.0011270456 Y:-3.19711E-4 Z:-0.0019322607 X:0.0012737722 Y:-3.4506532E-4 Z:-0.0019969852 X:0.001502906 Y:-3.835355E-4 Z:-0.0020537905 X:0.0017388286 Y:-4.398609E-4 Z:-0.0021189034 X:0.0019086768 Y:-4.70718E-4 Z:-0.0021404363 X:0.0021076156 Y:-5.0305086E-4 Z:-0.002185045 X:0.0022671057 Y:-5.1701383E-4 Z:-0.0022573534 X:0.0024057168 Y:-5.4342125E-4 Z:-0.002310839 X:0.002512934 Y:-5.4679764E-4 Z:-0.0023926103 X:0.002557347 Y:-5.900372E-4 Z:-0.0024241738 X:0.0026625344 Y:-6.842513E-4 Z:-0.0024786198 X:0.0027399021 Y:-7.289082E-4 Z:-0.0025227368 X:0.0028299019 Y:-7.829082E-4 Z:-0.0025947813 X:0.00292222 Y:-8.3661743E-4 Z:-0.0026276957 X:0.0030301774 Y:-8.8301615E-4 Z:-0.002701314 X:0.0030617723 Y:-9.42785E-4 Z:-0.0027936357 X:0.0030394243 Y:-9.79083E-4 Z:-0.00285914 X:0.0030165722 Y:-9.802011E-4 Z:-0.0029144369 X:0.0029567073 Y:-9.6269825E-4 Z:-0.002974965 X:0.00297403 Y:-9.315846E-4 Z:-0.0030192512 X:0.0030169394 Y:-9.6226286E-4 Z:-0.0030642622 X:0.0031092423 Y:-0.0010050826 Z:-0.003118441 X:0.0031988935 Y:-0.0011072198 Z:-0.003198576 X:0.0033174676 Y:-0.0012394118 Z:-0.0032808 X:0.0034213979 Y:-0.0013103384 Z:-0.0033766583 X:0.00344505Y:-0.0013735284 Z:-0.0034781513 X:0.0034835928 Y:-0.0014324035 Z:-0.0035485225 X:0.0034975903 Y:-0.0014486146 Z:-0.0036555608 X:0.0034793443 Y:-0.0014780854 Z:-0.0037472823 X:0.0034312923 Y:-0.0015043139 Z:-0.0037952673 X:0.0034234857 Y:-0.001599117 Z:-0.0038744798 X:0.003435113 Y:-0.0016648113 Z:-0.003960097

这些传感器不够精确

在上面的回答中,我给出了你的行动