Can't get Quaternion Time Derivative to work?

Started by
3 comments, last by Super Llama 10 years, 1 month ago

Okay I'm sure this is a stupid question and I'm either completely misusing this formula or I'm missing something obvious, but I can't for the life of me figure out how I'm supposed to apply an angular velocity vector to an orientation quaternion, despite finding the Quaternion Time Derivative formula on multiple websites.

From what I've read, you can take an angular velocity vector like (0, 0, 3.14) for a 180 degree turn around the Z axis each second, then use these values in a non-normalized quaternion with zero w (0 0 3.14 0) -- I'm using xyzw representation for my quaternions -- and then you can multiply it by a delta time and an orientation quaternion and divide it by two, then add it to the orientation quaternion, and that should properly rotate the orientation quaternion according to the velocity. The formula looks like this: Q' = Q + 0.5t(W x Q).

Anyway, when I went to try it with a delta time of one second, it didn't seem to work. I take a unit quaternion with no rotation:

(0 0 0 1)

then multiply it by the angular velocity quaternion (with the original on the right, as per the formula)

(0 0 3.14 0) x (0 0 0 1) = (0 0 3.14 0)

then divide that by two

(0 0 1.57 0)

then add it to the original quaternion

(0 0 1.57 1)

but when I apply this rotation, it's 0, 0, -115 in euler angles, not 0, 0, 180.

So yeah... does anyone know what the problem is? I'd rather avoid having to build a quaternion from axis-angles each frame if I can, since that would require sin and cos which are more costly than just arithmetic, and everyone seems to say this formula works just as well, but I'm not seeing it.

It's a sofa! It's a camel! No! It's Super Llama!
Advertisement
The derivative is a linear approximation, so a formula for the derivative of something only tells you how it changes in infinitesimally small periods of time. In your case, one second is too large of a step for the approximation to work.

Try this instead:

Q' = (cos(t*|W|/2) + sin(t*|W|/2)*W/|W|) * Q

If you plug in Q=(0 0 0 1), W=(0 0 pi 0) and t=1, you get Q'=(0 0 1 0)

OHH right, that makes perfect sense, thank you! I knew I was missing something obvious lol. I guess that means it technically works if you keep re-normalizing the quaternion and the game doesn't go longer than a few fractions of a second before updating the delta, but I guess using trig functions is inevitable if I want to do it right in all situations. I think I'll just construct a new unit quaternion from my angular velocity (since that only takes 5 math function calls) and multiply that onto it, unless there's a more efficient way I don't know about.

It's a sofa! It's a camel! No! It's Super Llama!

Notice that my formula is exact only if the angular velocity is constant for the whole second. In your simulation that will probably not be true, and you'll have to split time into smaller steps. At that point the steps will probably be small enough that your original approximation is perfectly acceptable.

I should have mentioned in my previous post that if you make the approximations cos(epsilon) = 1 and sin(epsilon)=epsilon (which are good for small epsilon), my formula turns into the one you posted.

Oh okay, I was wondering where that came from, that makes sense too. Thanks for the explanations, this is exactly what I needed to know.

It's a sofa! It's a camel! No! It's Super Llama!

This topic is closed to new replies.

Advertisement