2

ジャイロスコープのスマートフォン出力から Android のヨー、ロール、ピッチを計算する必要があり、次のコードを書きました。

if(event.sensor.getType()==Sensor.TYPE_GYROSCOPE){

        float xgyr=event.values[0];                //rotation around x-axis  [rad/sec]
        float ygyr=event.values[1];                // rotation around y-axis
        float zgyr=event.values[2];               // rotation around z-axis


        // This timestep's delta rotation to be multiplied by the current rotation
         // after computing it from the gyro sample data.

        double EPSILON = 0.0;           //EPSILON value to be defined
         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, teta is the vector length 
             float omegaMagnitude = (float) Math.sqrt(axisX*axisX + axisY*axisY + axisZ*axisZ);

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

こんにちは、ジャイロスコープからの出力を使用してヨーロール、ピッチを計算する必要があり、次のコードを書きました。

             float thetaOverTwo = omegaMagnitude * dT / 2.0f;      //Insert initial value for orientation omegaMagnitude
             float sinThetaOverTwo = (float) Math.sin(thetaOverTwo);
             float cosThetaOverTwo = (float) Math.cos(thetaOverTwo);

             /*rotation vector, a non-normalized three-dimensional vector the direction of which specifies the rotation axis,
             and the length of which is teta,    Combining two consecutive quaternion rotations is therefore just as simple as using the rotation matrix. 
             Remember that two successive rotation matrices, A1 , A2 are combined A3 = A2*A1*/ 

             //Quaternions
             deltaRotationVector[0] = sinThetaOverTwo * axisX;
             deltaRotationVector[1] = sinThetaOverTwo * axisY;
             deltaRotationVector[2] = sinThetaOverTwo * axisZ;
             deltaRotationVector[3] = cosThetaOverTwo;
         }
         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; The initial rotation has to be computedand then at each step updated
         /*Rotation current is a vector with rotation on pitch, roll, yaw (3x1) multiplied by 3x3 rotation matrix i have the new orientation*/

         /*In the "xyz (pitch-roll-yaw) convention," theta is pitch, psi is roll, and phi is yaw. */




         double pitch = Math.atan2(deltaRotationMatrix[6], deltaRotationMatrix[7]);
         double roll = Math.acos(deltaRotationMatrix[8]);
         double yaw = - Math.atan2(deltaRotationMatrix[2], deltaRotationMatrix[5]);

どこに問題があるのか​​ わかりませんが、このコードを使用して取得したヨー、ロール、ピッチの値は間違っています。これは、電話が同じ向きにある場合でも、合計で異なる値を取得したためです。コードの最後の 3 行で、回転行列からそれらを計算します。また、式に書かれているヨー、ピッチロールの値はラジアンですか?

4

1 に答える 1

3

Android での経験は限られていますが、リファレンス マニュアルによると、計算なしでSensorManager.getOrientation (...)からこれらの値を取得できます。これが正しければ、内部で動作するセンサー フュージョン アルゴリズムにより値がより正確になるため、自作の計算の代わりにこれを使用することをお勧めします。

于 2012-10-17T18:04:36.200 に答える