使用Android手机测量汽车旋转

时间:2013-04-05 13:42:18

标签: android sensor

我找到了很多关于如何处理设备旋转,运动方向和位置传感器的线索。 我想创建一个我将在我的车中使用的应用程序,首先我想测量汽车的旋转度。 所以我将手机放到手机壳上,例如当我向车辆左转时,我希望看到手机上的汽车转向度。

是否可以通过磁力计和加速度计?

我发布的代码首先我认为没问题。 (假设我把手机设为“肖像”模式,所以首先不是风景图)

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

问题: - 这款应用在汽车中的准确度如何? (我能做些什么才能更准确?) - 当我将手机置于“风景”模式时,我该怎么办? 来自方向的滚动仍然可以吗?

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

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您将Android设备设置为指南针,则会出现一个始终指向磁北的箭头。因此,通过测量箭头方向的变化,您可以测量汽车的旋转角度。

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

如果Android设备平躺在表面上,那么磁北的方向由SensorManager.getOrientation(...)出来的方位角定义。当它站起来或者它站在它的侧面时,它会有点复杂。但是,我建议首先将设备平放,因为这是最简单的情况,然后你可以进展到更困难的情况。