2013-04-05 51 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); 
} 

问题: - 如何准确将这个应用在汽车? (我能做些什么才能更准确?) - 当我将手机放在“横向”模式下时应该怎么做? 从方位角度还是可以的?

请注意,这是第一次尝试,所以有很多事情要做! 但首先我想看看如何实现,

谢谢!

回答

0

如果您的Android设备像指南针一样设置,那么会出现一个指向磁性北极的箭头。所以通过测量箭头方向的变化,可以测量汽车的旋转。

要更好地指示Android设备的方向,请使用 Sensor.TYPE_GRAVITY和Sensor.TYPE_MAGNETIC_FIELD,而不是Sensor.TYPE_ACCELEROMETER和Sensor.TYPE_MAGNETIC_FIELD。这样做会更好,因为Sensor.TYPE_GRAVITY会尝试过滤掉由于设备移动而产生的效果。

如果Android设备平放在一个表面上,则磁北方向由来自SensorManager.getOrientation(...)的方位角定义。当它站起来或者站在它的旁边时,它会更复杂一些。不过,我建议首先将设备放平,因为这是最简单的情况,然后您可以进入更困难的情况。

+0

所以看起来像重力/磁场是一个更好的组合,我会试试看。这个组合可以用于非常慢的速度测量吗? (3-5公里/小时) – user1552747 2013-04-06 11:32:50

+0

我认为这与测量速度无关 – Stochastically 2013-04-06 12:28:52

+0

谢谢,我认为对于我的问题,您的回答是OK(现在我的应用程序更好!)。如果你有时间请告诉我,什么传感器适合低速测量?谢谢! – user1552747 2013-04-06 13:38:38