Java Code Examples for android.hardware.SensorManager#getRotationMatrixFromVector()

The following examples show how to use android.hardware.SensorManager#getRotationMatrixFromVector() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: OrientationManager.java    From SpeedHud with Apache License 2.0 8 votes vote down vote up
@Override
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
        // Get the current heading from the sensor, then notify the listeners of the
        // change.
        SensorManager.getRotationMatrixFromVector(mRotationMatrix, event.values);
        SensorManager.remapCoordinateSystem(mRotationMatrix, SensorManager.AXIS_X,
                SensorManager.AXIS_Z, mRotationMatrix);
        SensorManager.getOrientation(mRotationMatrix, mOrientation);

        // Store the pitch (used to display a message indicating that the user's head
        // angle is too steep to produce reliable results.
        mPitch = (float) Math.toDegrees(mOrientation[1]);

        // Convert the heading (which is relative to magnetic north) to one that is
        // relative to true north, using the user's current location to compute this.
        float magneticHeading = (float) Math.toDegrees(mOrientation[0]);
        mHeading = MathUtils.mod(computeTrueNorth(magneticHeading), 360.0f)
                - ARM_DISPLACEMENT_DEGREES;

        notifyOrientationChanged();
    }
}
 
Example 2
Source File: LocationProvider.java    From open-location-code with Apache License 2.0 6 votes vote down vote up
@Override
public void onSensorChanged(SensorEvent event) {
    float rotationMatrix[] = new float[16];
    SensorManager.getRotationMatrixFromVector(rotationMatrix, event.values);
    float[] orientationValues = new float[3];
    readDisplayRotation();
    SensorManager.remapCoordinateSystem(rotationMatrix, mAxisX, mAxisY, rotationMatrix);
    SensorManager.getOrientation(rotationMatrix, orientationValues);
    double azimuth = Math.toDegrees(orientationValues[0]);
    // Azimuth values are now -180-180 (N=0), but once added to the location object
    // they become 0-360 (N=0).
    @SuppressLint("UseValueOf") Float newBearing = new Float(azimuth);
    if (mBearing == null || Math.abs(mBearing - newBearing) > MIN_BEARING_DIFF) {
        mBearing = newBearing;
        if (mCurrentBestLocation != null) {
            mCurrentBestLocation.setBearing(mBearing);
        }
        mLocationCallback.handleNewBearing(mBearing);
    }
}
 
Example 3
Source File: DeviceSensors.java    From 365browser with Apache License 2.0 6 votes vote down vote up
public void convertRotationVectorToAngles(float[] rotationVector, double[] angles) {
    if (rotationVector.length > 4) {
        // On some Samsung devices SensorManager.getRotationMatrixFromVector
        // appears to throw an exception if rotation vector has length > 4.
        // For the purposes of this class the first 4 values of the
        // rotation vector are sufficient (see crbug.com/335298 for details).
        System.arraycopy(rotationVector, 0, mTruncatedRotationVector, 0, 4);
        SensorManager.getRotationMatrixFromVector(
                mDeviceRotationMatrix, mTruncatedRotationVector);
    } else {
        SensorManager.getRotationMatrixFromVector(mDeviceRotationMatrix, rotationVector);
    }
    computeDeviceOrientationFromRotationMatrix(mDeviceRotationMatrix, angles);
    for (int i = 0; i < 3; i++) {
        angles[i] = Math.toDegrees(angles[i]);
    }
}
 
Example 4
Source File: StreamActivity.java    From Pocket-Plays-for-Twitch with GNU General Public License v3.0 6 votes vote down vote up
protected void update(float[] vectors) {
	int worldAxisX = SensorManager.AXIS_X;
	int worldAxisZ = SensorManager.AXIS_Z;

	float[] rotationMatrix = new float[9];
	float[] adjustedRotationMatrix = new float[9];
	float[] orientation = new float[3];

	SensorManager.getRotationMatrixFromVector(rotationMatrix, vectors);
	SensorManager.remapCoordinateSystem(rotationMatrix, worldAxisX, worldAxisZ, adjustedRotationMatrix);
	SensorManager.getOrientation(adjustedRotationMatrix, orientation);

	float roll = orientation[2] * FROM_RADS_TO_DEGS;

	if (roll > -45 && roll < 45) {
		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
		Log.d(LOG_TAG, "Requesting undefined");
	}
	Log.d(LOG_TAG, "Roll: " + roll);
}
 
Example 5
Source File: Utils.java    From Myna with Apache License 2.0 6 votes vote down vote up
public static void calculateWorldAcce(SensorData sd){
    float[] Rotate = new float[16];
    float[] I = new float[16];
    float[] currOrientation = new float[3];
    if((int)(sd.game_rotation_vector[0]) == 0
            && (int)(sd.game_rotation_vector[1]) == 0
            && (int)(sd.game_rotation_vector[2]) == 0){
        SensorManager.getRotationMatrix(Rotate, I, sd.accelerate, sd.magnetic);
    }else{
        SensorManager.getRotationMatrixFromVector(Rotate, sd.game_rotation_vector);
    }
    SensorManager.getOrientation(Rotate, currOrientation);
    System.arraycopy(currOrientation, 0, sd.orientation, 0, 3);

    float[] relativeAcc = new float[4];
    float[] earthAcc = new float[4];
    float[] inv = new float[16];
    System.arraycopy(sd.accelerate, 0, relativeAcc, 0, 3);
    relativeAcc[3] = 0;
    android.opengl.Matrix.invertM(inv, 0, Rotate, 0);
    android.opengl.Matrix.multiplyMV(earthAcc, 0, inv, 0, relativeAcc, 0);
    System.arraycopy(earthAcc, 0, sd.world_accelerometer, 0, 3);
}
 
Example 6
Source File: ReactNativeHeadingModule.java    From react-native-heading with MIT License 6 votes vote down vote up
@Override
public void onSensorChanged(SensorEvent event) {
    if( event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR ){
        // calculate th rotation matrix
        SensorManager.getRotationMatrixFromVector(rMat, event.values);
        // get the azimuth value (orientation[0]) in degree

        newAzimuth = (int) ((((( Math.toDegrees( SensorManager.getOrientation( rMat, orientation )[0] ) + 360 ) % 360) -
                      ( Math.toDegrees( SensorManager.getOrientation( rMat, orientation )[2] ))) +360) % 360);

        //dont react to changes smaller than the filter value
        if (Math.abs(mAzimuth - newAzimuth) < mFilter) {
            return;
        }

        getReactApplicationContext()
                .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit("headingUpdated", (int) newAzimuth);

        mAzimuth = newAzimuth;
    }
}
 
Example 7
Source File: CompassView.java    From android with Apache License 2.0 6 votes vote down vote up
@Override
public void onSensorChanged(SensorEvent e) {
    loadSensorData(e);

    if (mUseRotation) {
        SensorManager.getRotationMatrixFromVector(mRotation, mRotationVector);
    } else if (mUseAccelerometer && mUseMagnetic) {
        SensorManager.getRotationMatrix(mRotation, null, mGravity, mGeomagnetic);
    }

    configureDeviceAngle();
    SensorManager.getOrientation(mRotationMapped, mOrientation);

    float bearing = (float) Math.toDegrees(mOrientation[0]);
    if (bearing < 0) bearing += 360;

    mDirection = mAzimuth - bearing;
    mDirection = (mDirection < 0) ? mDirection + 360 : mDirection;
}
 
Example 8
Source File: TurnGameActivity.java    From cloud-cup-android with Apache License 2.0 5 votes vote down vote up
@Override
public void onSensorChanged(SensorEvent event) {
    SensorManager.getRotationMatrixFromVector(mRotationMatrix , event.values);
    SensorManager.getOrientation(mRotationMatrix, mOrientation);

    float zAngle = mOrientation[0];

    //Log.d(LOG_TAG, "Turn z: " + zAngle);

    if(originalAngle == 0) {
        originalAngle = zAngle;
    }

    if( !halfTurn && Math.abs(zAngle - backtoRange(originalAngle + Math.PI)) < ANGLE_SENSIBILITY ) {
        halfTurn = true;
        demiTurns++;
        sendTurnValues();
    }

    if( halfTurn && Math.abs(zAngle - originalAngle) < ANGLE_SENSIBILITY) {
        halfTurn = false;
        demiTurns++;
        ((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).vibrate(100);
        sendTurnValues();
    }

}
 
Example 9
Source File: SensorFusionEngine.java    From BleSensorTag with MIT License 5 votes vote down vote up
public void onGyroDataUpdate(float[] gyro) {
    // initialisation of the gyroscope based rotation matrix
    if (!isGyroInitialized) {
        float[] initMatrix = getRotationMatrixFromOrientation(accMagOrientation);
        gyroMatrix = matrixMultiplication(gyroMatrix, initMatrix);
        isGyroInitialized = true;
    }

    // copy the new gyro values into the gyro array
    // convert the raw gyro data into a rotation vector
    float[] deltaVector = new float[4];
    final long currentTimestamp = System.nanoTime();
    if(timestamp != 0) {
        final float dT = (currentTimestamp - timestamp) * NS2S;
        System.arraycopy(gyro, 0, this.gyro, 0, 3);
        getRotationVectorFromGyro(this.gyro, deltaVector, dT / 2.0f);
    }

    // measurement done, save current time for next interval
    timestamp = currentTimestamp;

    // convert rotation vector into rotation matrix
    float[] deltaMatrix = new float[9];
    SensorManager.getRotationMatrixFromVector(deltaMatrix, deltaVector);

    // apply the new rotation interval on the gyroscope based rotation matrix
    gyroMatrix = matrixMultiplication(gyroMatrix, deltaMatrix);

    // get the gyroscope based orientation from the rotation matrix
    SensorManager.getOrientation(gyroMatrix, gyroOrientation);
}
 
Example 10
Source File: CompassActivity.java    From Wrox-ProfessionalAndroid-4E with Apache License 2.0 5 votes vote down vote up
private float[] calculateOrientation(float[] values) {
  float[] rotationMatrix = new float[9];
  float[] remappedMatrix = new float[9];
  float[] orientation = new float[3];

  // Determine the rotation matrix
  SensorManager.getRotationMatrixFromVector(rotationMatrix, values);

  // Remap the coordinates based on the natural device orientation.
  int x_axis = SensorManager.AXIS_X;
  int y_axis = SensorManager.AXIS_Y;
  switch (mScreenRotation) {
    case (Surface.ROTATION_90):
      x_axis = SensorManager.AXIS_Y;
      y_axis = SensorManager.AXIS_MINUS_X;
      break;
    case (Surface.ROTATION_180):
      y_axis = SensorManager.AXIS_MINUS_Y;
      break;
    case (Surface.ROTATION_270):
      x_axis = SensorManager.AXIS_MINUS_Y;
      y_axis = SensorManager.AXIS_X;
      break;
    default: break;
  }

  SensorManager.remapCoordinateSystem(rotationMatrix,
    x_axis, y_axis,
    remappedMatrix);

  // Obtain the current, corrected orientation.
  SensorManager.getOrientation(remappedMatrix, orientation);

  // Convert from Radians to Degrees.
  values[0] = (float) Math.toDegrees(orientation[0]);
  values[1] = (float) Math.toDegrees(orientation[1]);
  values[2] = (float) Math.toDegrees(orientation[2]);
  return values;
}
 
Example 11
Source File: MainActivity.java    From Wrox-ProfessionalAndroid-4E with Apache License 2.0 5 votes vote down vote up
private void listing16_9() {
  final SensorEventListener mySensorEventListener = new SensorEventListener() {
    // Listing 16-10: Calculating the device orientation using the rotation vector
    public void onSensorChanged(SensorEvent sensorEvent) {
      float[] rotationMatrix = new float[9];
      float[] orientation = new float[3];

      // Convert the result Vector to a Rotation Matrix.
      SensorManager.getRotationMatrixFromVector(rotationMatrix,
        sensorEvent.values);

      // Extract the orientation from the Rotation Matrix.
      SensorManager.getOrientation(rotationMatrix, orientation);
      Log.d(TAG, "Yaw: " + orientation[0]); // Yaw
      Log.d(TAG, "Pitch: " + orientation[1]); // Pitch
      Log.d(TAG, "Roll: " + orientation[2]); // Roll
    }

    public void onAccuracyChanged(Sensor sensor, int accuracy) { }
  };

  // Listing 16-9: Monitoring an accelerometer sensor
  SensorManager sm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
  int sensorType = Sensor.TYPE_ACCELEROMETER;
  sm.registerListener(mySensorEventListener,
    sm.getDefaultSensor(sensorType),
    SensorManager.SENSOR_DELAY_NORMAL);
}
 
Example 12
Source File: OrientationView.java    From PanoramaGL with Apache License 2.0 5 votes vote down vote up
@Override
public void onSensorChanged(SensorEvent event) {
  SensorManager.getRotationMatrixFromVector(phoneInWorldSpaceMatrix, event.values);
  if (startFromSensorTransformation == null) {
    // Android's hardware uses radians, but OpenGL uses degrees. Android uses
    // [yaw, pitch, roll] for the order of elements in the orientation array.
    float[] orientationRadians =
        SensorManager.getOrientation(phoneInWorldSpaceMatrix, new float[3]);
    startFromSensorTransformation = new float[3];
    for (int i = 0; i < 3; ++i) {
      startFromSensorTransformation[i] = (float) Math.toDegrees(orientationRadians[i]);
    }
  }
}
 
Example 13
Source File: RotationVectorDemo.java    From codeexamples-android with Eclipse Public License 1.0 5 votes vote down vote up
public void onSensorChanged(SensorEvent event) {
    // we received a sensor event. it is a good practice to check
    // that we received the proper event
    if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) {
        // convert the rotation-vector to a 4x4 matrix. the matrix
        // is interpreted by Open GL as the inverse of the
        // rotation-vector, which is what we want.
        SensorManager.getRotationMatrixFromVector(
                mRotationMatrix , event.values);
    }
}
 
Example 14
Source File: Orientation.java    From Android-Orientation-Sensor with MIT License 5 votes vote down vote up
public void gyroFunction(SensorEvent event) {

        if (accMagOrientation == null)
            return;


        if(initState) {
            float[] initMatrix = new float[9];
            initMatrix = getRotationMatrixFromOrientation(accMagOrientation);
            float[] test = new float[3];
            SensorManager.getOrientation(initMatrix, test);
            gyroMatrix = Matrix3x3.multiplication(gyroMatrix, initMatrix);
            initState = false;
        }

        // copy the new gyro values into the gyro array
        // convert the raw gyro data into a rotation vector
        float[] deltaVector = new float[4];
        if(timestamp != 0) {
            final float dT = (event.timestamp - timestamp) * NS2S;
            System.arraycopy(event.values, 0, gyro, 0, 3);
            getRotationVectorFromGyro(gyro, deltaVector, dT / 2.0f);
        }

        timestamp = event.timestamp;


        float[] deltaMatrix = new float[9];
        SensorManager.getRotationMatrixFromVector(deltaMatrix, deltaVector);

        gyroMatrix = Matrix3x3.multiplication(gyroMatrix, deltaMatrix);

        SensorManager.getOrientation(gyroMatrix, gyroOrientation);
    }
 
Example 15
Source File: CalibratedGyroscopeProvider.java    From tilt-game-android with MIT License 4 votes vote down vote up
@Override
public void onSensorChanged(SensorEvent event) {

    // we received a sensor event. it is a good practice to check
    // that we received the proper event
    if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {

        // This timestep's delta rotation to be multiplied by the current rotation
        // after computing it from the gyro sample data.
        if (timestamp != 0) {
            final float dT = (event.timestamp - timestamp) * NS2S;
            // Axis of the rotation sample, not normalized yet.
            float axisX = event.values[0];
            float axisY = event.values[1];
            float axisZ = event.values[2];

            // Calculate the angular speed of the sample
            gyroscopeRotationVelocity = Math.sqrt(axisX * axisX + axisY * axisY + axisZ * axisZ);

            // Normalize the rotation vector if it's big enough to get the axis
            if (gyroscopeRotationVelocity > EPSILON) {
                axisX /= gyroscopeRotationVelocity;
                axisY /= gyroscopeRotationVelocity;
                axisZ /= gyroscopeRotationVelocity;
            }

            // Integrate around this axis with the angular speed by the timestep
            // in order to get a delta rotation from this sample over the timestep
            // We will convert this axis-angle representation of the delta rotation
            // into a quaternion before turning it into the rotation matrix.
            double thetaOverTwo = gyroscopeRotationVelocity * dT / 2.0f;
            double sinThetaOverTwo = Math.sin(thetaOverTwo);
            double cosThetaOverTwo = Math.cos(thetaOverTwo);
            deltaQuaternion.setX((float) (sinThetaOverTwo * axisX));
            deltaQuaternion.setY((float) (sinThetaOverTwo * axisY));
            deltaQuaternion.setZ((float) (sinThetaOverTwo * axisZ));
            deltaQuaternion.setW(-(float) cosThetaOverTwo);

            // Matrix rendering in CubeRenderer does not seem to have this problem.
            synchronized (syncToken) {
                // Move current gyro orientation if gyroscope should be used
                deltaQuaternion.multiplyByQuat(currentOrientationQuaternion, currentOrientationQuaternion);
            }

            Quaternion correctedQuat = currentOrientationQuaternion.clone();
            // We inverted w in the deltaQuaternion, because currentOrientationQuaternion required it.
            // Before converting it back to matrix representation, we need to revert this process
            correctedQuat.w(-correctedQuat.w());

            synchronized (syncToken) {
                // Set the rotation matrix as well to have both representations
                SensorManager.getRotationMatrixFromVector(currentOrientationRotationMatrix.matrix,
                        correctedQuat.ToArray());
            }
        }
        timestamp = event.timestamp;
    }
}
 
Example 16
Source File: SensorUtils.java    From Pano360 with MIT License 4 votes vote down vote up
public static void getOrientation(SensorEvent event,float[] output){
    //sensorRotationVectorToMatrix(event,oTmp);
    SensorManager.getRotationMatrixFromVector(oTmp, event.values);
    SensorManager.getOrientation(oTmp,output);
}
 
Example 17
Source File: GyroscopeListener.java    From ShaderEditor with MIT License 4 votes vote down vote up
@Override
public void onSensorChanged(SensorEvent event) {
	if (last > 0) {
		final float dT = (event.timestamp - last) * NS2S;

		// axis of the rotation sample, not normalized yet
		float axisX = event.values[0];
		float axisY = event.values[1];
		float axisZ = event.values[2];

		// calculate the angular speed of the sample
		float omegaMagnitude = (float) Math.sqrt(
				axisX * axisX + axisY * axisY + axisZ * axisZ);

		// normalize the rotation vector
		if (omegaMagnitude > EPSILON) {
			axisX /= omegaMagnitude;
			axisY /= omegaMagnitude;
			axisZ /= omegaMagnitude;
		}

		// integrate around this axis with the angular speed by the
		// timestep in order to get a delta rotation from this sample
		// over the timestep; then convert this axis-angle representation
		// of the delta rotation into a quaternion before turning it
		// into the rotation matrix
		float thetaOverTwo = omegaMagnitude * dT / 2.0f;
		float sinThetaOverTwo = (float) Math.sin(thetaOverTwo);
		float cosThetaOverTwo = (float) Math.cos(thetaOverTwo);
		deltaRotationVector[0] = sinThetaOverTwo * axisX;
		deltaRotationVector[1] = sinThetaOverTwo * axisY;
		deltaRotationVector[2] = sinThetaOverTwo * axisZ;
		deltaRotationVector[3] = cosThetaOverTwo;

		SensorManager.getRotationMatrixFromVector(
				deltaRotationMatrix,
				deltaRotationVector);

		float r0 = rotation[0];
		float r1 = rotation[1];
		float r2 = rotation[2];
		rotation[0] = r0 * deltaRotationMatrix[0] +
				r1 * deltaRotationMatrix[1] +
				r2 * deltaRotationMatrix[2];
		rotation[1] = r0 * deltaRotationMatrix[3] +
				r1 * deltaRotationMatrix[4] +
				r2 * deltaRotationMatrix[5];
		rotation[2] = r0 * deltaRotationMatrix[6] +
				r1 * deltaRotationMatrix[7] +
				r2 * deltaRotationMatrix[8];
	}

	last = event.timestamp;
}
 
Example 18
Source File: SensorInterpreter.java    From VideoOS-Android-SDK with GNU General Public License v3.0 4 votes vote down vote up
void setTargetVector(float[] values) {
    SensorManager.getRotationMatrixFromVector(mTargetMatrix, values);
    mTargeted = true;
}
 
Example 19
Source File: SensorInterpreter.java    From VideoOS-Android-SDK with GNU General Public License v3.0 4 votes vote down vote up
@SuppressWarnings("SuspiciousNameCombination")
public float[] interpretSensorEvent(@NonNull Context context, @Nullable SensorEvent event) {
    if (event == null) {
        return null;
    }

    float[] rotationVector = getRotationVectorFromSensorEvent(event);

    if (!mTargeted) {
        setTargetVector(rotationVector);
        return null;
    }

    SensorManager.getRotationMatrixFromVector(mRotationMatrix, rotationVector);

     int rotation = ((WindowManager) context
            .getSystemService(Context.WINDOW_SERVICE))
            .getDefaultDisplay()
            .getRotation();

    if (rotation == Surface.ROTATION_0) {
        SensorManager.getAngleChange(mTiltVector, mRotationMatrix, mTargetMatrix);
    } else {
        switch (rotation) {
            case Surface.ROTATION_90:
                SensorManager.remapCoordinateSystem(mRotationMatrix, AXIS_Y, AXIS_MINUS_X, mOrientedRotationMatrix);
                break;

            case Surface.ROTATION_180:
                SensorManager.remapCoordinateSystem(mRotationMatrix, AXIS_MINUS_X, AXIS_MINUS_Y, mOrientedRotationMatrix);
                break;

            case Surface.ROTATION_270:
                SensorManager.remapCoordinateSystem(mRotationMatrix, AXIS_MINUS_Y, AXIS_X, mOrientedRotationMatrix);
                break;
        }

        SensorManager.getAngleChange(mTiltVector, mOrientedRotationMatrix, mTargetMatrix);
    }

    for (int i = 0; i < mTiltVector.length; i++) {
        mTiltVector[i] /= Math.PI;

        mTiltVector[i] *= mTiltSensitivity;

        if (mTiltVector[i] > 1) {
            mTiltVector[i] = 1f;
        } else if (mTiltVector[i] < -1) {
            mTiltVector[i] = -1f;
        }
    }

    return mTiltVector;
}
 
Example 20
Source File: SensorInterpreter.java    From motion with Apache License 2.0 2 votes vote down vote up
/**
 * Sets the target direction used for angle deltas to determine tilt.
 *
 * @param values a rotation vector (presumably from a ROTATION_VECTOR sensor)
 */
protected void setTargetVector(float[] values) {
    SensorManager.getRotationMatrixFromVector(mTargetMatrix, values);
    mTargeted = true;
}