Safe Haskell | None |
---|---|
Language | Haskell2010 |
- data Euler a = Euler {}
- rotateXyzAboutX :: Floating a => V3 a -> a -> V3 a
- rotateXyzAboutY :: Floating a => V3 a -> a -> V3 a
- rotateXyzAboutZ :: Floating a => V3 a -> a -> V3 a
- euler321OfQuat :: RealFloat a => Quaternion a -> Euler a
- euler321OfDcm :: RealFloat a => M33 a -> Euler a
- quatOfEuler321 :: (Floating a, Ord a) => Euler a -> Quaternion a
- dcmOfQuat :: Num a => Quaternion a -> M33 a
- dcmOfQuatB2A :: (Conjugate a, RealFloat a) => Quaternion a -> M33 a
- dcmOfEuler321 :: (Floating a, Ord a) => Euler a -> M33 a
- quatOfDcm :: RealFloat a => M33 a -> Quaternion a
- quatOfDcmB2A :: (Conjugate a, RealFloat a) => M33 a -> Quaternion a
- rotVecByDcm :: Num a => M33 a -> V3 a -> V3 a
- rotVecByDcmB2A :: Num a => M33 a -> V3 a -> V3 a
- rotVecByQuat :: Num a => Quaternion a -> V3 a -> V3 a
- rotVecByQuatB2A :: Num a => Quaternion a -> V3 a -> V3 a
- rotVecByEuler :: (Floating a, Ord a) => Euler a -> V3 a -> V3 a
- rotVecByEulerB2A :: (Floating a, Ord a) => Euler a -> V3 a -> V3 a
- type M33 a = V3 (V3 a)
- data V3 a :: * -> * = V3 !a !a !a
- data Quaternion a :: * -> * = Quaternion !a !(V3 a)
Documentation
3-2-1 Euler angle rotation sequence
rotateXyzAboutX :: Floating a => V3 a -> a -> V3 a Source
Rotate a vector about the X axis
>>>
trunc $ rotateXyzAboutX (V3 0 1 0) (pi/2)
V3 0.0 0.0 1.0
>>>
trunc $ rotateXyzAboutX (V3 0 0 1) (pi/2)
V3 0.0 (-1.0) 0.0
rotateXyzAboutY :: Floating a => V3 a -> a -> V3 a Source
Rotate a vector about the Y axis
>>>
trunc $ rotateXyzAboutY (V3 0 0 1) (pi/2)
V3 1.0 0.0 0.0
>>>
trunc $ rotateXyzAboutY (V3 1 0 0) (pi/2)
V3 0.0 0.0 (-1.0)
rotateXyzAboutZ :: Floating a => V3 a -> a -> V3 a Source
Rotate a vector about the Z axis
>>>
trunc $ rotateXyzAboutZ (V3 1 0 0) (pi/2)
V3 0.0 1.0 0.0
>>>
trunc $ rotateXyzAboutZ (V3 0 1 0) (pi/2)
V3 (-1.0) 0.0 0.0
euler321OfQuat :: RealFloat a => Quaternion a -> Euler a Source
Convert quaternion to Euler angles
>>>
euler321OfQuat (Quaternion 1.0 (V3 0.0 0.0 0.0))
Euler {eYaw = 0.0, ePitch = -0.0, eRoll = 0.0}
>>>
euler321OfQuat (Quaternion (sqrt(2)/2) (V3 (sqrt(2)/2) 0.0 0.0))
Euler {eYaw = 0.0, ePitch = -0.0, eRoll = 1.5707963267948966}
>>>
euler321OfQuat (Quaternion (sqrt(2)/2) (V3 0.0 (sqrt(2)/2) 0.0))
Euler {eYaw = 0.0, ePitch = 1.5707963267948966, eRoll = 0.0}
>>>
euler321OfQuat (Quaternion (sqrt(2)/2) (V3 0.0 0.0 (sqrt(2)/2)))
Euler {eYaw = 1.5707963267948966, ePitch = -0.0, eRoll = 0.0}
euler321OfDcm :: RealFloat a => M33 a -> Euler a Source
Convert DCM to euler angles
>>>
euler321OfDcm $ V3 (V3 1 0 0) (V3 0 1 0) (V3 0 0 1)
Euler {eYaw = 0.0, ePitch = -0.0, eRoll = 0.0}
>>>
euler321OfDcm $ V3 (V3 0 1 0) (V3 (-1) 0 0) (V3 0 0 1)
Euler {eYaw = 1.5707963267948966, ePitch = -0.0, eRoll = 0.0}
>>>
let s = sqrt(2)/2 in euler321OfDcm $ V3 (V3 s s 0) (V3 (-s) s 0) (V3 0 0 1)
Euler {eYaw = 0.7853981633974483, ePitch = -0.0, eRoll = 0.0}
quatOfEuler321 :: (Floating a, Ord a) => Euler a -> Quaternion a Source
Convert Euler angles to quaternion
>>>
quatOfEuler321 (Euler 0 0 0)
Quaternion 1.0 (V3 0.0 0.0 0.0)
>>>
quatOfEuler321 (Euler (pi/2) 0 0)
Quaternion 0.7071067811865476 (V3 0.0 0.0 0.7071067811865475)
>>>
quatOfEuler321 (Euler 0 (pi/2) 0)
Quaternion 0.7071067811865476 (V3 0.0 0.7071067811865475 0.0)
>>>
quatOfEuler321 (Euler 0 0 (pi/2))
Quaternion 0.7071067811865476 (V3 0.7071067811865475 0.0 0.0)
dcmOfQuat :: Num a => Quaternion a -> M33 a Source
convert a quaternion to a DCM
>>>
dcmOfQuat $ Quaternion 1.0 (V3 0.0 0.0 0.0)
V3 (V3 1.0 0.0 0.0) (V3 0.0 1.0 0.0) (V3 0.0 0.0 1.0)
>>>
let s = sqrt(2)/2 in fmap trunc $ dcmOfQuat $ Quaternion s (V3 0.0 0.0 s)
V3 (V3 0.0 1.0 0.0) (V3 (-1.0) 0.0 0.0) (V3 0.0 0.0 1.0)
>>>
dcmOfQuat $ Quaternion 0.9238795325112867 (V3 0.0 0.0 0.3826834323650898)
V3 (V3 0.7071067811865475 0.7071067811865476 0.0) (V3 (-0.7071067811865476) 0.7071067811865475 0.0) (V3 0.0 0.0 1.0)
dcmOfQuatB2A :: (Conjugate a, RealFloat a) => Quaternion a -> M33 a Source
dcmOfEuler321 :: (Floating a, Ord a) => Euler a -> M33 a Source
Convert DCM to euler angles
>>>
dcmOfEuler321 $ Euler {eYaw = 0.0, ePitch = 0, eRoll = 0}
V3 (V3 1.0 0.0 0.0) (V3 0.0 1.0 0.0) (V3 0.0 0.0 1.0)
>>>
fmap trunc $ dcmOfEuler321 $ Euler {eYaw = pi/2, ePitch = 0, eRoll = 0}
V3 (V3 0.0 1.0 0.0) (V3 (-1.0) 0.0 0.0) (V3 0.0 0.0 1.0)
>>>
dcmOfEuler321 $ Euler {eYaw = pi/4, ePitch = 0, eRoll = 0}
V3 (V3 0.7071067811865475 0.7071067811865476 0.0) (V3 (-0.7071067811865476) 0.7071067811865475 0.0) (V3 0.0 0.0 1.0)
quatOfDcm :: RealFloat a => M33 a -> Quaternion a Source
convert a DCM to a quaternion
>>>
quatOfDcm $ V3 (V3 1 0 0) (V3 0 1 0) (V3 0 0 1)
Quaternion 1.0 (V3 0.0 0.0 0.0)
>>>
quatOfDcm $ V3 (V3 0 1 0) (V3 (-1) 0 0) (V3 0 0 1)
Quaternion 0.7071067811865476 (V3 0.0 0.0 0.7071067811865475)
>>>
let s = sqrt(2)/2 in quatOfDcm $ V3 (V3 s s 0) (V3 (-s) s 0) (V3 0 0 1)
Quaternion 0.9238795325112867 (V3 0.0 0.0 0.3826834323650898)
quatOfDcmB2A :: (Conjugate a, RealFloat a) => M33 a -> Quaternion a Source
rotVecByQuat :: Num a => Quaternion a -> V3 a -> V3 a Source
vec_b = q_a2b * vec_a * q_a2b^(-1) vec_b = R(q_a2b) * vec_a
rotVecByQuatB2A :: Num a => Quaternion a -> V3 a -> V3 a Source
re-exported from linear
data V3 a :: * -> *
A 3-dimensional vector
V3 !a !a !a |
data Quaternion a :: * -> *
Quaternions
Quaternion !a !(V3 a) |