Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert a Unit Vector to a Quaternion

So I'm very new to quaternions, but I understand the basics of how to manipulate stuff with them. What I'm currently trying to do is compare a known quaternion to two absolute points in space. I'm hoping what I can do is simply convert the points into a second quaternion, giving me an easy way to compare the two.

What I've done so far is to turn the two points into a unit vector. From there I was hoping I could directly plug in the i j k into the imaginary portion of the quaternion with a scalar of zero. From there I could multiply one quaternion by the other's conjugate, resulting in a third quaternion. This third quaternion could be converted into an axis angle, giving me the degree by which the original two quaternions differ by.

Is this thought process correct? So it should just be [ 0 i j k ]. I may need to normalize the quaternion afterwards, but I'm not sure about that.

I have a bad feeling that it's not a direct mapping from a vector to a quaternion. I tried looking at converting the unit vector to an axis angle, but I'm not sure this would work, since I don't know what angle to give as an input.

like image 466
Hmm Avatar asked Jan 08 '11 21:01

Hmm


People also ask

How do you convert a vector to a quaternion?

First we convert the 3D vector into a quaternion, to do this we set the imaginary pars of the quaternion to the x,y and z values of the vector, the real part of the quaternion is set to zero. This quaternion is therefore not normalised like the quaternion representing the rotation.

How do you convert rotation to quaternion?

Description. quaternion = angle2quat( rotationAng1 , rotationAng2 , rotationAng3 ) calculates the quaternion for three rotation angles. Aerospace Toolbox uses quaternions that are defined using the scalar-first convention. The rotation used in this function is a passive transformation between two coordinate systems.

How do you find the unit quaternion?

The unit quaternion can now be written in terms of the angle θ and the unit vector u = q/q: q = cos θ + usinθ.

How to get the direction of a quaternion vector?

(it's like writing "1/2" vs writing "0.5"). you can get a DIRECTIONAL VECTOR pointing in the "direction" of a quaternion by rotating a forward vector like this: Vector3 worldDirection = rotation * Vector3.forward; Syriph, atomicjoe, ig_jcapote and 3 others like this.

What is a unit quaternion in physics?

A unit quaternion is one that has a norm of 1. 9.) A unit three-vector x = {x 1, x 2, x 3 } with x . x = 1 is expressible as a unit vector quaternion X = { 0, x }, |X| = 1. 10.) The spherical rotation of a quaternion vector X by an angle θ about a unit vector axis n is Q⊗X⊗Q * , where Q is the quaternion {cos (θ/2), sin (θ/2) n }.

How many quaternion inverts are there?

1 quaternion inverts vector 24 Quaternion and normalization 17 Converting a direction vector to a quaternion rotation 2 Quaternion instant numeric drift 4 Maintaining rotation during Quaternion normalization

How many components of a quaternion rotation around an axis?

Component of a quaternion rotation around an axis 1 quaternion inverts vector 24 Quaternion and normalization 17 Converting a direction vector to a quaternion rotation 2 Quaternion instant numeric drift


1 Answers

Notation

Quaternions are defined in a four-space with bases {1, i, j, k}. Hamilton famously carved the fundamental relationship into the stone of the Brougham Bridge in Dublin:

i2 = j2 = k2 = i j k = -1.

There are many equivalent quaternion parameterizations, but here I'll use a {scalar, vector} form.

1.) A = {a0, a} and B = {b0, b}, where A and B are quaternions, a0 and b0 are scalars, and a and b are three-vectors.

2.) X = { 0, x } is a vector quaternion.

3.) The (non-commutative) quaternion product derives directly from the properties of i, j and k above, A⊗B = {a0 b0 - a.b, a0 b + b0 a + a x b}

4.) The quaternion conjugate is A* = {a0, - a}

5.) The conjugate of a quaternion product is the product of the conjugates in reverse order.
(A⊗B)* = B*⊗A*

6.) The conjugate of a vector quaternion is its negative. X* = {0, -x } = -X

7.) The quaternion norm is |A| = √(A⊗A*) = √( a0² + a.a )

8.) A unit quaternion is one that has a norm of 1.

9.) A unit three-vector x = {x1, x2, x3} with x . x = 1 is expressible as a unit vector quaternion X = { 0, x }, |X| = 1.

10.) The spherical rotation of a quaternion vector X by an angle θ about a unit vector axis n is Q⊗X⊗Q*, where Q is the quaternion {cos(θ/2), sin(θ/2) n }. Note that |Q| = 1.

Notice the form of the quaternion vector product. Given vector quaternions X1 = { 0, x1 ) and X2 = { 0, x2 }, the quaternion product is X2⊗X1* = { x1.x2, x1 × x2 }. The quaternion reunites the dot product as the scalar part and cross product as the vector part, divorced over a hundred years ago. Neither of these products is invertible, but the quaternion is in the way described below.

Inversion

Find the spherical transform quaternion Q12 to rotate vector X1 to align with vector X2.

From above

X2 = Q12⊗X1⊗Q12*

Multiplying both sides by X1*,

X2⊗X1* = Q12⊗X1⊗(Q12*⊗X1*)

Remember that the rotation axis n derives from the cross product x1×x2, so n . x1 = 0. and Q*⊗X* = (X⊗Q)* = X*⊗Q, leaving

X2⊗X1* = Q12⊗X1⊗X1*⊗Q12 = Q12⊗Q12

So the quaternion transform can be solved directly as

Q12 = √(X2⊗X1*)

You're on your own for the quaternion square root. There are lots of ways to do it, and the best will depend on your application, considering speed and stability.

--hth,
Fred Klingener

like image 197
Fred Klingener Avatar answered Sep 16 '22 18:09

Fred Klingener