Vulcan
Aerospace Engineering Utilities Built on Janus
Loading...
Searching...
No Matches
PointMass.hpp
Go to the documentation of this file.
1// Vulcan 3-DOF Point Mass Dynamics
2// Pure stateless functions for point mass trajectory computation
3#pragma once
4
6
7#include <janus/janus.hpp>
8
9namespace vulcan::dynamics {
10
11// =============================================================================
12// 3-DOF Point Mass Dynamics (Inertial Frame)
13// =============================================================================
14
24template <typename Scalar>
25Vec3<Scalar> point_mass_acceleration(const Vec3<Scalar> &force,
26 const Scalar &mass) {
27 return force / mass;
28}
29
34template <typename Scalar> Scalar speed(const Vec3<Scalar> &velocity) {
35 return janus::norm(velocity);
36}
37
42template <typename Scalar>
43Vec3<Scalar> velocity_direction(const Vec3<Scalar> &velocity) {
44 Scalar v_mag = janus::norm(velocity);
45 return velocity / (v_mag + Scalar(1e-12)); // Regularized for zero velocity
46}
47
48// =============================================================================
49// 3-DOF Point Mass Dynamics (ECEF Frame)
50// =============================================================================
51
67template <typename Scalar>
68Vec3<Scalar> point_mass_acceleration_ecef(const Vec3<Scalar> &position,
69 const Vec3<Scalar> &velocity,
70 const Vec3<Scalar> &force,
71 const Scalar &mass,
72 const Vec3<Scalar> &omega_earth) {
73 // Force-based acceleration
74 Vec3<Scalar> a_force = force / mass;
75
76 // Coriolis: -2 * ω × v
77 Vec3<Scalar> coriolis = Scalar(-2) * janus::cross(omega_earth, velocity);
78
79 // Centrifugal: -ω × (ω × r)
80 Vec3<Scalar> centrifugal =
81 -janus::cross(omega_earth, janus::cross(omega_earth, position));
82
83 return a_force + coriolis + centrifugal;
84}
85
86// =============================================================================
87// Specific Force Components
88// =============================================================================
89
94template <typename Scalar>
95Vec3<Scalar> specific_force(const Vec3<Scalar> &acceleration) {
96 return acceleration; // They're the same thing
97}
98
104template <typename Scalar>
105Vec3<Scalar> g_load(const Vec3<Scalar> &acceleration,
106 const Scalar &g0 = Scalar(9.80665)) {
107 return acceleration / g0;
108}
109
115template <typename Scalar>
116Scalar g_load_magnitude(const Vec3<Scalar> &acceleration,
117 const Scalar &g0 = Scalar(9.80665)) {
118 return janus::norm(acceleration) / g0;
119}
120
121// =============================================================================
122// Flight Path Angles
123// =============================================================================
124
134template <typename Scalar>
135Scalar flight_path_angle(const Vec3<Scalar> &velocity) {
136 Scalar v_mag = janus::norm(velocity);
137 // Z-down: negative vz is upward, positive gamma
138 return janus::asin(-velocity(2) / (v_mag + Scalar(1e-12)));
139}
140
150template <typename Scalar> Scalar heading_angle(const Vec3<Scalar> &velocity) {
151 return janus::atan2(velocity(1), velocity(0));
152}
153
160template <typename Scalar>
161Vec3<Scalar> velocity_from_angles(const Scalar &speed, const Scalar &gamma,
162 const Scalar &chi) {
163 Scalar cos_gamma = janus::cos(gamma);
164 Scalar sin_gamma = janus::sin(gamma);
165 Scalar cos_chi = janus::cos(chi);
166 Scalar sin_chi = janus::sin(chi);
167
168 return Vec3<Scalar>{
169 speed * cos_gamma * cos_chi, // North (vx)
170 speed * cos_gamma * sin_chi, // East (vy)
171 -speed * sin_gamma // Down (vz), negative for positive gamma
172 };
173}
174
175// =============================================================================
176// Energy & Orbital Quantities
177// =============================================================================
178
183template <typename Scalar>
184Scalar specific_kinetic_energy(const Vec3<Scalar> &velocity) {
185 return Scalar(0.5) * janus::dot(velocity, velocity);
186}
187
193template <typename Scalar>
194Scalar specific_potential_energy(const Vec3<Scalar> &position,
195 const Scalar &mu) {
196 return -mu / janus::norm(position);
197}
198
205template <typename Scalar>
206Scalar specific_energy(const Vec3<Scalar> &position,
207 const Vec3<Scalar> &velocity, const Scalar &mu) {
208 return specific_kinetic_energy(velocity) +
209 specific_potential_energy(position, mu);
210}
211
212} // namespace vulcan::dynamics
Definition Guided5Dof.hpp:13
Scalar speed(const Vec3< Scalar > &velocity)
Definition PointMass.hpp:34
Vec3< Scalar > point_mass_acceleration(const Vec3< Scalar > &force, const Scalar &mass)
Definition PointMass.hpp:25
Vec3< Scalar > g_load(const Vec3< Scalar > &acceleration, const Scalar &g0=Scalar(9.80665))
Definition PointMass.hpp:105
Vec3< Scalar > point_mass_acceleration_ecef(const Vec3< Scalar > &position, const Vec3< Scalar > &velocity, const Vec3< Scalar > &force, const Scalar &mass, const Vec3< Scalar > &omega_earth)
Definition PointMass.hpp:68
Vec3< Scalar > specific_force(const Vec3< Scalar > &acceleration)
Definition PointMass.hpp:95
Scalar specific_potential_energy(const Vec3< Scalar > &position, const Scalar &mu)
Definition PointMass.hpp:194
Vec3< Scalar > velocity_direction(const Vec3< Scalar > &velocity)
Definition PointMass.hpp:43
Scalar g_load_magnitude(const Vec3< Scalar > &acceleration, const Scalar &g0=Scalar(9.80665))
Definition PointMass.hpp:116
Vec3< Scalar > velocity_from_angles(const Scalar &speed, const Scalar &gamma, const Scalar &chi)
Definition PointMass.hpp:161
Scalar specific_kinetic_energy(const Vec3< Scalar > &velocity)
Definition PointMass.hpp:184
Scalar flight_path_angle(const Vec3< Scalar > &velocity)
Definition PointMass.hpp:135
Scalar heading_angle(const Vec3< Scalar > &velocity)
Definition PointMass.hpp:150
Scalar specific_energy(const Vec3< Scalar > &position, const Vec3< Scalar > &velocity, const Scalar &mu)
Definition PointMass.hpp:206
Definition MassProperties.hpp:12