0

デバイスの回転、モーションおよび位置センサーを使用した向きを処理する方法について、多くのスレッドを見つけました。車で使用するアプリを作成したいと思います。まず、車の回転角度を測定したいと思います。だから私は自分の電話を電話ケースに入れて、例えば車で左折するとき、電話で車の回転角度を見たいと思っています。

磁気と加速度計で可能ですか?

最初に大丈夫だと思うコードを投稿します。(最初は横向きではなく、携帯電話の「縦向き」モードを持っているとしましょう)

private static SensorManager sensorService;

//magnetic
private Sensor mSensor;

//accelerometer
private Sensor gSensor;

private float[] mValuesMagnet      = new float[3];
private float[] mValuesAccel       = new float[3];
private float[] mValuesOrientation = new float[3];

private float[] mRotationMatrix    = new float[9];



@Override
public void onCreate(Bundle savedInstanceState) {
nf.setMaximumFractionDigits(2);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sensorService = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
this.mSensor = sensorService.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
this.gSensor = sensorService.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

sensorService.registerListener(this, gSensor, SensorManager.SENSOR_DELAY_NORMAL);
sensorService.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_NORMAL);
}

@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
}

@Override
public void onSensorChanged(SensorEvent event) {
switch (event.sensor.getType()) {           
case Sensor.TYPE_ACCELEROMETER: 
System.arraycopy(event.values, 0, mValuesAccel, 0, 3); 
break; 

case Sensor.TYPE_MAGNETIC_FIELD: 
System.arraycopy(event.values, 0, mValuesMagnet, 0, 3); 
break; 
}

SensorManager.getRotationMatrix(mRotationMatrix, null, mValuesAccel, mValuesMagnet);
SensorManager.getOrientation(mRotationMatrix, mValuesOrientation); 

//        double azimuth = Math.toDegrees(mValuesOrientation[0]);    //azimuth,     rotation around the Z axis.
//        double pitch   = Math.toDegrees(mValuesOrientation[1]);    // pitch, rotation around the X axis.
double roll    = Math.toDegrees(mValuesOrientation[2]);    //roll, rotation around the Y axis.

//normalize
//        azimuth = azimuth>0?azimuth:azimuth+360;
roll = roll>0?roll:roll+360;


String txt = "roll= "+Math.round(roll);
((EditText)findViewById(R.id.szog)).setText(txt);
}

質問: - このアプリは車内でどれくらい正確ですか? (より正確にするにはどうすればよいですか?) オリエンテーションからのロールはまだ大丈夫ですか?

これは非常に最初の試みであるため、やるべきことがたくさんあることに注意してください。しかし、最初にどうすればそれを達成できるかを見たい

ありがとう!

4

1 に答える 1

0

Android デバイスをコンパスのように設定すると、常に磁北を指す矢印が表示されます。その矢印の方向の変化を測定することで、車の回転を測定できます。

Android デバイスの向きをより正確に示すには、Sensor.TYPE_ACCELEROMETER と Sensor.TYPE_MAGNETIC_FIELD の代わりに、Sensor.TYPE_GRAVITY と Sensor.TYPE_MAGNETIC_FIELD を使用します。これは、Sensor.TYPE_GRAVITY がデバイスの動きによる影響を除外しようとするため、より優れています。

Android デバイスが表面に平らに置かれている場合、磁北の方向は から出てくる方位角によって定義されSensorManager.getOrientation(...)ます。立っているときや横になっているときは、もう少し複雑です。ただし、最初はデバイスを平らに置いた状態から始めることをお勧めします。これが最も簡単なケースであり、その後、より困難なケースに進むことができます.

于 2013-04-05T16:55:02.327 に答える