2013-04-05 4 views
0

기기의 회전, 동작 및 위치 센서의 방향을 처리하는 방법에 대한 많은 스레드가 있습니다. 나는 내 차에서 사용할 응용 프로그램을 만들고 싶습니다. 먼저 차의 회전 각도를 측정하고 싶습니다. 그래서 저는 전화를 휴대 전화 케이스에 넣었습니다. 예를 들어 차로 왼쪽으로 돌아 가면 차의 회전 각도를 전화로보고 싶습니다.Android 휴대 전화로 자동차 회전 측정

자기 및 가속도계로 가능합니까?

나는 처음에는 괜찮다고 생각하는 코드를 게시합니다.

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); 
} 

질문 (의 내가 처음에 대해 너무 풍경 내 전화 "Portait입니다"모드를하지 개최 가정 해 봅시다) : 을 - 얼마나 정확 것이다 자동차에서이 응용 프로그램? (정확하게하려면 어떻게해야합니까?) - "가로 모드"로 휴대 전화를 들고있을 때 어떻게해야합니까? 오리엔테이션의 롤이 여전히 괜찮습니까?

너무 많은 작업이 있으므로 처음 시도하는 점에 유의하십시오. 하지만 먼저 내가 어떻게 그걸 얻을 수 있는지보고 싶습니다

고마워요!

답변

0

Android 기기가 나침반처럼 설정된 경우, 항상 자기 북쪽을 가리키는 화살표가 있습니다. 따라서 화살표 방향의 변화를 측정하여 자동차의 회전을 측정 할 수 있습니다.

대신 Sensor.TYPE_ACCELEROMETER 및 Sensor.TYPE_MAGNETIC_FIELD의, 당신의 안드로이드 장치의 방향의 더 나은 표시를 얻을 Sensor.TYPE_GRAVITY 및 Sensor.TYPE_MAGNETIC_FIELD를 사용합니다. Sensor.TYPE_GRAVITY가 장치의 움직임으로 인한 영향을 필터링하려고하기 때문에이 방법이 더 좋습니다.

Android 기기가 표면에 평평하게 놓여있는 경우 자기 북쪽 방향은 SensorManager.getOrientation(...)에서 나온 방위각으로 정의됩니다. 서 있거나 서있을 때 좀 더 복잡합니다. 그러나, 나는 가장 쉬운 경우이기 때문에 처음에는 평평하게 누워있는 장치로 시작하는 것이 좋습니다. 그러면 더 어려운 경우로 진행할 수 있습니다.

+0

중력/자기장이 더 나은 콤보 인 것처럼 보이므로 시도해 보겠습니다. 이 콤보는 매우 느린 속도 측정에도 사용할 수 있습니까? (3-5km/h) – user1552747

+0

속도 측정과 관련이 없다고 생각합니다. – Stochastically

+0

고마워요. 제 질문에 대한 대답은 괜찮습니다. (이제는 내 응용이 훨씬 좋습니다!). 시간이 있다면 조언을 해주십시오. 느린 속도 측정에 적합한 센서는 무엇입니까? 감사! – user1552747

관련 문제