我真的希望有人能帮助我: 我正在开发一个显示手机角度的Android应用程序
我正在使用此代码:
protected void onCreate(Bundle savedInstanceState)
{
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
}
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mAccelerometer,100000);
mSensorManager.registerListener(this, mMagnetometer, 100000);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
}
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
mGravity = lowPass(event.values.clone(), mGravity);
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
mGeomagnetic = lowPass(event.values.clone(), mGeomagnetic);
if (mGravity != null && mGeomagnetic != null) {
boolean success = SensorManager.getRotationMatrix(Ra, Ia, mGravity, mGeomagnetic);
if (success) {
SensorManager.getOrientation(Ra, orientation);
float tempxGy = (orientation[0]);// az
float tempyGy = (orientation[1]);// pitch
float tempzGy = (orientation[2]); //roll
}
我进一步处理我在这里得到的值,但这不是问题。
当手机在桌面上平放时,数值看起来像是:
roll -0,018
投球0,024
偏航2,51对我来说看起来很好(如果我将值转换为euler角度也是如此)
现在想象一下,我从桌子上取下手机 - 手机的底部(micro usb端口所在的位置)留在桌子上,我用相机抬起一边
音高的值变得越来越负 - 直到音高达到-1.53(欧拉-90),一旦达到该值,值再次增加,如果电话在显示器的桌子上面对桌子,球场再次回到0。 问题是,我必须在两个值之间进行区分(例如-1和-1
我该怎么做?卷不是问题,因为卷最大180度而不是90度问题。
我真的希望你能帮助我!
答案 0 :(得分:0)
所以
if(mGravity[2]<0) orientation[1] = (float) (Math.PI + orientation[1]);
足以获得我需要它们的值 - 但现在我有一个新问题 - 我想重新映射坐标系,所以当手机在桌面上时,我得到0度(euler)如果手机正站在micro usb端口上,则为+90
我试过
SensorManager.remapCoordinateSystem(Ra, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, Ri);
但是现在交换了滚动和音高 - 只要显示器朝上,我只需要获得正的音高值,如果显示器朝下则需要负值?
重新映射是错误的想法,我可以通过做其他事情来更简单吗?