Efficient quaternion angular velocity

假装没事ソ 提交于 2019-12-19 04:49:26

问题


I have an orientation expressed with a quaternion and an angular velocity expressed as either a quaternion or a number (radians per second around the original orientation). I understand how to do this using conversion to axis-angle but that method is rather computationally expensive and is not a realistic option. How would I go about modifying the orientation quaternion given a time interval (in seconds)? I need a solution for both cases (the quaternion and the number). However, converting one case into the other is acceptable and may be preferable depending on the computational complexity of the various algorithms/formulae required for conversions.


回答1:


For update of orientation , you require to multiply current orientation by delta rotation. This is comparable expensive operation with axis angle conversion.

Common way to represent angular velocity is "exponential map"m the 3d vector parallel with rotation axis and magnitude of rotation velocity (radians per second). The conversion to delta rotation quaternion looks like

Quaternion deltaRotation(const Vector3& em, double deltaTime)
{
   Quaternion q;
   Vector3 ha = em * deltaTime *0.5; // vector of half angle
   double l = ha.norm(); // magnitude
   if( l > 0 )
   {
      double ss = sin(l)/l;
      q = Quaternion(cos(l), ha.x()*ss, ha.y()*ss, ha.z()*ss);
   }else{
      q = Quaternion(1.0, ha.x(), ha.y(), ha.z());
   }

   return q;
}

If your deltaTime is small and rotation speed is small , you can use approximation by 1st Taylor series multiplier. But you should normalize result quaternion to avoid numerical instability more often.

Quaternion deltaRotationAppx1(const Vector3& em, double deltaTime)
    {
       Vector3 ha = em * deltaTime *0.5; // vector of half angle
       return Quaternion(1.0, ha.x(), ha.y(), ha.z());
    }


来源:https://stackoverflow.com/questions/24197182/efficient-quaternion-angular-velocity

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!