Merge "improve the gyroscope javadoc"
This commit is contained in:
committed by
Android (Google) Code Review
commit
66bd5e98ec
@@ -154,16 +154,16 @@ public class SensorEvent {
|
|||||||
* All values are in micro-Tesla (uT) and measure the ambient magnetic field
|
* All values are in micro-Tesla (uT) and measure the ambient magnetic field
|
||||||
* in the X, Y and Z axis.
|
* in the X, Y and Z axis.
|
||||||
*
|
*
|
||||||
* <h4>{@link android.hardware.Sensor#TYPE_GYROSCOPE Sensor.TYPE_GYROSCOPE}:</h4>
|
* <h4>{@link android.hardware.Sensor#TYPE_GYROSCOPE Sensor.TYPE_GYROSCOPE}:
|
||||||
* All values are in radians/second and measure the rate of rotation
|
* </h4> All values are in radians/second and measure the rate of rotation
|
||||||
* around the X, Y and Z axis. The coordinate system is the same as is
|
* around the device's local X, Y and Z axis. The coordinate system is the
|
||||||
* used for the acceleration sensor. Rotation is positive in the counter-clockwise
|
* same as is used for the acceleration sensor. Rotation is positive in the
|
||||||
* direction. That is, an observer looking from some positive location on the x, y.
|
* counter-clockwise direction. That is, an observer looking from some
|
||||||
* or z axis at a device positioned on the origin would report positive rotation
|
* positive location on the x, y or z axis at a device positioned on the
|
||||||
* if the device appeared to be rotating counter clockwise. Note that this is the
|
* origin would report positive rotation if the device appeared to be
|
||||||
* standard mathematical definition of positive rotation and does not agree with the
|
* rotating counter clockwise. Note that this is the standard mathematical
|
||||||
* definition of roll given earlier.
|
* definition of positive rotation and does not agree with the definition of
|
||||||
*
|
* roll given earlier.
|
||||||
* <ul>
|
* <ul>
|
||||||
* <p>
|
* <p>
|
||||||
* values[0]: Angular speed around the x-axis
|
* values[0]: Angular speed around the x-axis
|
||||||
@@ -176,28 +176,61 @@ public class SensorEvent {
|
|||||||
* </p>
|
* </p>
|
||||||
* </ul>
|
* </ul>
|
||||||
* <p>
|
* <p>
|
||||||
* Typically the output of the gyroscope is integrated over time to calculate
|
* Typically the output of the gyroscope is integrated over time to
|
||||||
* an angle, for example:
|
* calculate a rotation describing the change of angles over the timestep,
|
||||||
|
* for example:
|
||||||
* </p>
|
* </p>
|
||||||
|
*
|
||||||
* <pre class="prettyprint">
|
* <pre class="prettyprint">
|
||||||
* private static final float NS2S = 1.0f / 1000000000.0f;
|
* private static final float NS2S = 1.0f / 1000000000.0f;
|
||||||
|
* private final float[] deltaRotationVector = new float[4]();
|
||||||
* private float timestamp;
|
* private float timestamp;
|
||||||
* public void onSensorChanged(SensorEvent event)
|
*
|
||||||
* {
|
* public void onSensorChanged(SensorEvent event) {
|
||||||
|
* // This timestep's delta rotation to be multiplied by the current rotation
|
||||||
|
* // after computing it from the gyro sample data.
|
||||||
* if (timestamp != 0) {
|
* if (timestamp != 0) {
|
||||||
* final float dT = (event.timestamp - timestamp) * NS2S;
|
* final float dT = (event.timestamp - timestamp) * NS2S;
|
||||||
* angle[0] += event.values[0] * dT;
|
* // Axis of the rotation sample, not normalized yet.
|
||||||
* angle[1] += event.values[1] * dT;
|
* float axisX = event.values[0];
|
||||||
* angle[2] += event.values[2] * dT;
|
* float axisY = event.values[1];
|
||||||
|
* float axisZ = event.values[2];
|
||||||
|
*
|
||||||
|
* // Calculate the angular speed of the sample
|
||||||
|
* float omegaMagnitude = sqrt(axisX*axisX + axisY*axisY + axisZ*axisZ);
|
||||||
|
*
|
||||||
|
* // Normalize the rotation vector if it's big enough to get the axis
|
||||||
|
* 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
|
||||||
|
* // We will 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 = sin(thetaOverTwo);
|
||||||
|
* float cosThetaOverTwo = cos(thetaOverTwo);
|
||||||
|
* deltaRotationVector[0] = sinThetaOverTwo * axisX;
|
||||||
|
* deltaRotationVector[1] = sinThetaOverTwo * axisY;
|
||||||
|
* deltaRotationVector[2] = sinThetaOverTwo * axisZ;
|
||||||
|
* deltaRotationVector[3] = cosThetaOverTwo;
|
||||||
* }
|
* }
|
||||||
* timestamp = event.timestamp;
|
* timestamp = event.timestamp;
|
||||||
|
* float[] deltaRotationMatrix = new float[9];
|
||||||
|
* SensorManager.getRotationMatrixFromVector(deltaRotationMatrix, deltaRotationVector);
|
||||||
|
* // User code should concatenate the delta rotation we computed with the current rotation
|
||||||
|
* // in order to get the updated rotation.
|
||||||
|
* // rotationCurrent = rotationCurrent * deltaRotationMatrix;
|
||||||
* }
|
* }
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
* <p>
|
||||||
* <p>In practice, the gyroscope noise and offset will introduce some errors which need
|
* In practice, the gyroscope noise and offset will introduce some errors
|
||||||
* to be compensated for. This is usually done using the information from other
|
* which need to be compensated for. This is usually done using the
|
||||||
* sensors, but is beyond the scope of this document.</p>
|
* information from other sensors, but is beyond the scope of this document.
|
||||||
*
|
* </p>
|
||||||
* <h4>{@link android.hardware.Sensor#TYPE_LIGHT Sensor.TYPE_LIGHT}:</h4>
|
* <h4>{@link android.hardware.Sensor#TYPE_LIGHT Sensor.TYPE_LIGHT}:</h4>
|
||||||
* <ul>
|
* <ul>
|
||||||
* <p>
|
* <p>
|
||||||
|
|||||||
Reference in New Issue
Block a user