Vulcan
Aerospace Engineering Utilities Built on Janus
Loading...
Searching...
No Matches
RotationKinematics.hpp
Go to the documentation of this file.
1// Vulcan Rotation Kinematics
2// Angular velocity and rotation rate relationships
3#pragma once
4
8
9#include <janus/math/Quaternion.hpp>
10
11namespace vulcan {
12
13// =============================================================================
14// Quaternion Rate <-> Angular Velocity
15// =============================================================================
16
28template <typename Scalar>
29Vec3<Scalar>
30omega_from_quaternion_rate(const janus::Quaternion<Scalar> &q,
31 const janus::Quaternion<Scalar> &q_dot) {
32 // omega_body = 2 * q* * q_dot
33 auto omega_quat = q.conjugate() * q_dot;
34 Scalar two = Scalar(2);
35
36 Vec3<Scalar> omega;
37 omega(0) = two * omega_quat.x;
38 omega(1) = two * omega_quat.y;
39 omega(2) = two * omega_quat.z;
40 return omega;
41}
42
54template <typename Scalar>
55janus::Quaternion<Scalar>
56quaternion_rate_from_omega(const janus::Quaternion<Scalar> &q,
57 const Vec3<Scalar> &omega_body) {
58 // q_dot = 0.5 * q * (0, omega)
59 janus::Quaternion<Scalar> omega_quat(Scalar(0), omega_body(0),
60 omega_body(1), omega_body(2));
61 Scalar half = Scalar(0.5);
62 auto q_dot = q * omega_quat;
63 return janus::Quaternion<Scalar>(half * q_dot.w, half * q_dot.x,
64 half * q_dot.y, half * q_dot.z);
65}
66
67// =============================================================================
68// DCM Rate <-> Angular Velocity
69// =============================================================================
70
83template <typename Scalar>
84Vec3<Scalar> omega_from_dcm_rate(const Mat3<Scalar> &R,
85 const Mat3<Scalar> &R_dot) {
86 Mat3<Scalar> omega_skew = R.transpose() * R_dot;
87 return unskew(omega_skew);
88}
89
99template <typename Scalar>
100Mat3<Scalar> dcm_rate_from_omega(const Mat3<Scalar> &R,
101 const Vec3<Scalar> &omega_body) {
102 return R * skew(omega_body);
103}
104
105// =============================================================================
106// Rotation Composition
107// =============================================================================
108
119template <typename Scalar>
120janus::Quaternion<Scalar>
121compose_rotations(const janus::Quaternion<Scalar> &q1,
122 const janus::Quaternion<Scalar> &q2) {
123 return q2 * q1;
124}
125
136template <typename Scalar>
137janus::Quaternion<Scalar>
138relative_rotation(const janus::Quaternion<Scalar> &q_from,
139 const janus::Quaternion<Scalar> &q_to) {
140 return q_to * q_from.conjugate();
141}
142
154template <typename Scalar>
155Vec3<Scalar> rotation_error(const janus::Quaternion<Scalar> &q_actual,
156 const janus::Quaternion<Scalar> &q_desired) {
157 // q_error = q_desired * q_actual^(-1)
158 auto q_error = q_desired * q_actual.conjugate();
159 return rotation_vector_from_quaternion(q_error);
160}
161
162} // namespace vulcan
Definition Aerodynamics.hpp:11
Mat3< Scalar > skew(const Vec3< Scalar > &v)
Definition DCMUtils.hpp:32
janus::Quaternion< Scalar > compose_rotations(const janus::Quaternion< Scalar > &q1, const janus::Quaternion< Scalar > &q2)
Definition RotationKinematics.hpp:121
janus::Quaternion< Scalar > relative_rotation(const janus::Quaternion< Scalar > &q_from, const janus::Quaternion< Scalar > &q_to)
Definition RotationKinematics.hpp:138
Vec3< Scalar > omega_from_quaternion_rate(const janus::Quaternion< Scalar > &q, const janus::Quaternion< Scalar > &q_dot)
Definition RotationKinematics.hpp:30
janus::Quaternion< Scalar > quaternion_rate_from_omega(const janus::Quaternion< Scalar > &q, const Vec3< Scalar > &omega_body)
Definition RotationKinematics.hpp:56
Vec3< Scalar > rotation_error(const janus::Quaternion< Scalar > &q_actual, const janus::Quaternion< Scalar > &q_desired)
Definition RotationKinematics.hpp:155
Mat3< Scalar > dcm_rate_from_omega(const Mat3< Scalar > &R, const Vec3< Scalar > &omega_body)
Definition RotationKinematics.hpp:100
Vec3< Scalar > rotation_vector_from_quaternion(const janus::Quaternion< Scalar > &q)
Definition AxisAngle.hpp:143
Vec3< Scalar > omega_from_dcm_rate(const Mat3< Scalar > &R, const Mat3< Scalar > &R_dot)
Definition RotationKinematics.hpp:84
Vec3< Scalar > unskew(const Mat3< Scalar > &S)
Definition DCMUtils.hpp:53