Vulcan
Aerospace Engineering Utilities Built on Janus
Loading...
Searching...
No Matches
RigidBody.hpp
Go to the documentation of this file.
1// Vulcan Rigid Body Dynamics
2// 6DOF equations of motion for trajectory optimization and simulation
3#pragma once
4
7
8#include <janus/math/Linalg.hpp>
9#include <janus/math/Quaternion.hpp>
10
11namespace vulcan::dynamics {
12
13// =============================================================================
14// Translational Dynamics
15// =============================================================================
16
32template <typename Scalar>
33Vec3<Scalar> translational_dynamics(const Vec3<Scalar> &velocity_body,
34 const Vec3<Scalar> &omega_body,
35 const Vec3<Scalar> &force_body,
36 const Scalar &mass) {
37 // v_dot = F/m - ω × v
38 Vec3<Scalar> transport = janus::cross(omega_body, velocity_body);
39 return force_body / mass - transport;
40}
41
42// =============================================================================
43// Rotational Dynamics (Euler's Equations)
44// =============================================================================
45
60template <typename Scalar>
61Vec3<Scalar> rotational_dynamics(const Vec3<Scalar> &omega_body,
62 const Vec3<Scalar> &moment_body,
63 const Mat3<Scalar> &inertia) {
64 // I * ω_dot = M - ω × (I * ω)
65 Vec3<Scalar> H = inertia * omega_body; // Angular momentum
66 Vec3<Scalar> gyroscopic = janus::cross(omega_body, H);
67 Vec3<Scalar> rhs = moment_body - gyroscopic;
68
69 // Solve I * ω_dot = rhs using janus::solve for symbolic compatibility
70 return janus::solve(inertia, rhs);
71}
72
73// =============================================================================
74// Frame Transformations
75// =============================================================================
76
87template <typename Scalar>
88Vec3<Scalar>
89velocity_to_reference_frame(const Vec3<Scalar> &velocity_body,
90 const janus::Quaternion<Scalar> &attitude) {
91 return attitude.rotate(velocity_body);
92}
93
104template <typename Scalar>
105Vec3<Scalar> velocity_to_body_frame(const Vec3<Scalar> &velocity_ref,
106 const janus::Quaternion<Scalar> &attitude) {
107 return attitude.conjugate().rotate(velocity_ref);
108}
109
110// =============================================================================
111// Full 6DOF Derivatives
112// =============================================================================
113
132template <typename Scalar>
133RigidBodyDerivatives<Scalar> compute_6dof_derivatives(
134 const RigidBodyState<Scalar> &state, const Vec3<Scalar> &force_body,
135 const Vec3<Scalar> &moment_body, const MassProperties<Scalar> &mass_props) {
137
138 // Position rate = velocity in reference frame
139 derivs.position_dot =
140 velocity_to_reference_frame(state.velocity_body, state.attitude);
141
142 // Velocity rate = translational dynamics
143 derivs.velocity_dot = translational_dynamics(
144 state.velocity_body, state.omega_body, force_body, mass_props.mass);
145
146 // Attitude rate = quaternion kinematics
147 derivs.attitude_dot =
148 quaternion_rate_from_omega(state.attitude, state.omega_body);
149
150 // Angular velocity rate = rotational dynamics
151 derivs.omega_dot =
152 rotational_dynamics(state.omega_body, moment_body, mass_props.inertia);
153
154 return derivs;
155}
156
157// =============================================================================
158// ECEF Dynamics with Earth Rotation Effects
159// =============================================================================
160
177template <typename Scalar>
178Vec3<Scalar> translational_dynamics_ecef(const Vec3<Scalar> &position,
179 const Vec3<Scalar> &velocity_ecef,
180 const Vec3<Scalar> &force_ecef,
181 const Scalar &mass,
182 const Vec3<Scalar> &omega_earth) {
183 // Coriolis: 2 * (ω_earth × v)
184 Vec3<Scalar> coriolis =
185 Scalar(2) * janus::cross(omega_earth, velocity_ecef);
186
187 // Centrifugal: ω × (ω × r)
188 Vec3<Scalar> centrifugal =
189 janus::cross(omega_earth, janus::cross(omega_earth, position));
190
191 // Total acceleration: F/m - Coriolis - Centrifugal
192 return force_ecef / mass - coriolis - centrifugal;
193}
194
195} // namespace vulcan::dynamics
Definition Guided5Dof.hpp:13
AtmosphericState< Scalar > state(const Scalar &altitude, double scale_height=DEFAULT_SCALE_HEIGHT)
Exponential atmosphere - Complete atmospheric state.
Definition ExponentialAtmosphere.hpp:160
janus::Quaternion< Scalar > quaternion_rate_from_omega(const janus::Quaternion< Scalar > &q, const Vec3< Scalar > &omega_body)
Definition RotationKinematics.hpp:56
Time derivatives of rigid body state.
Definition RigidBodyTypes.hpp:32
Vec3< Scalar > position_dot
Velocity in reference frame [m/s].
Definition RigidBodyTypes.hpp:33
Definition RigidBodyTypes.hpp:24
Definition MassProperties.hpp:65