2012-10-17 136 views
1

我必须计算在Android的偏航,侧倾,俯仰从gyroscope's智能手机输出和I写了这个代码:如何从旋转矩阵计算偏航,俯仰摇摆?

如果(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]); 

我不知道问题出在哪里,但我得到的偏航,滚动,俯仰值使用此代码是错误的,因为我获得了不同的总价值即使手机处于相同的方向。我从最后三行代码中的旋转矩阵计算它们。并且公式中写入的偏航,俯仰滚动的值以弧度表示?

+0

凯的答案并不多,这是正确的选择。不过,我希望你知道[偏航,俯仰和滚动是邪恶](http://stackoverflow.com/a/5578867/341970)和[不适合插值](http://stackoverflow.com/a/5580491/341970 )。 – Ali

回答

2

我在Android上的经验有限,但根据参考手册,您可以从SensorManager.getOrientation (...)中获取这些值,而无需进行任何计算。如果这是正确的,我建议使用这个来代替任何自制的计算,因为由于传感器融合算法在引擎盖下工作,值应该更精确。

+0

惊人的多少次这个问题出现。您的运动感知评论文章/博客文章有任何进展吗? – Ali

+0

@Ali耻辱我,至今还没有开始,因为我目前对我的比赛工作太多了。但时间会过去 - 希望如此;-) – Kay

+0

请让我知道你什么时候有! – Ali

相关问题