bitinf

Members
  • Content count

    3
  • Joined

  • Last visited

Community Reputation

103 Neutral

About bitinf

  • Rank
    Newbie
  1. Thank you so much for the timely reply. I know -q and q represent the same rotation. You say that one quaternion may have many corresponding Euler angles. I also think so. But why common methods only return a single set of angles?   And the same, why the inverse (from angles to quaternion) returns a single quaternion?  Are there some rules in it? Thanks!  
  2.   I'm trying to implement the conversion between quaternion and Euler angles. I've referred to some exsiting methods. But the results have "sign(±)" problems. That is, I first convert a quaternion q to Euler angles (pan,tilt,roll) and then computer the quaternion again from the acquired Euler angles. But the result sometimes is -q, and sometimes it's q. Below is my code. In my code, I use a coodinate system with z pointing up. Pan is rotation with respect to y-axis, tilt x-axis, roll z-axis. I apply roll first, then tilt, and last pan. Could anyone tell me what is wrong? Thanks a lot!   //from quaterion to pan,tilt,roll void q2ptr(quaternion q, double &pan, double &tilt, double &roll) {   double sqw = q.w * q.w;   double sqx = q.x * q.x;   double sqy = q.y * q.y;   double sqz = q.z * q.z;   double n2 = sqx + sqy + sqz + sqw;   double eps = 1.e-7;   double test = q.x * q.y + q.z * q.w;   if (test > (0.5-eps) * n2)      {        // Singularity at north pole        roll = 2 * atan2(q.x, q.w); // Yaw        tilt = M_PI/2; // Pitch pan = 0;       }    else if (test < -(0.5-eps) * n2)    {       // Singularity at south pole       roll = -2*atan2(q.x, q.w); // Yaw       tilt = -M_PI/2; // Pitch pan = 0; // Roll     }     else     {       roll = atan2(2*(q.w*q.y - q.x*q.z), sqx - sqy - sqz + sqw);       pan = atan2(2*(q.w*q.x - q.y*q.z), -sqx + sqy - sqz + sqw);       tilt = asin(2*test/n2);      }  }    //from pan,tilt,roll to quaterion void  ptr2q(double pan, double tilt, double roll, quaternion &q)  {    double c1, c2, c3, s1, s2, s3; c1 = cos(roll/2);    c2 = cos(tilt/2);  c3 = cos(pan/2); s1 = sin(roll/2); s2 = sin(tilt/2); s3 = sin(pan/2);    q.w = c1*c2*c3 - s1*s2*s3;    q.x = s1*s2*c3 + c1*c2*s3;    q.y = s1*c2*c3 + c1*s2*s3;    q.z = c1*s2*c3 - s1*c2*s3;    } rotation quaternion