Vulcan
Aerospace Engineering Utilities Built on Janus
Loading...
Searching...
No Matches
vulcan::dynamics Namespace Reference

Classes

struct  RigidBodyState
struct  RigidBodyDerivatives
 Time derivatives of rigid body state. More...
struct  MassProperties

Functions

template<typename Scalar>
Vec3< Scalar > position_dot (const Vec3< Scalar > &velocity)
template<typename Scalar>
Scalar attitude_response_accel (const Scalar &angle, const Scalar &angle_dot, const Scalar &angle_cmd, const Scalar &omega_n, const Scalar &zeta)
template<typename Scalar>
Vec3< Scalar > thrust_direction_btt (const Scalar &gamma, const Scalar &chi)
template<typename Scalar>
Vec3< Scalar > lift_direction_btt (const Scalar &gamma, const Scalar &chi, const Scalar &phi)
template<typename Scalar>
Vec3< Scalar > thrust_direction_stt (const Scalar &theta, const Scalar &psi)
template<typename Scalar>
Vec3< Scalar > side_force_direction_stt (const Scalar &theta, const Scalar &psi)
template<typename Scalar>
Vec3< Scalar > normal_force_direction_stt (const Scalar &theta, const Scalar &psi)
template<typename Scalar>
Vec3< Scalar > velocity_dot_btt (const Scalar &thrust, const Scalar &drag, const Scalar &lift, const Scalar &mass, const Scalar &gravity, const Scalar &gamma, const Scalar &chi, const Scalar &phi)
template<typename Scalar>
Vec3< Scalar > velocity_dot_stt (const Scalar &thrust, const Scalar &drag, const Scalar &normal_force, const Scalar &side_force, const Scalar &mass, const Scalar &gravity, const Scalar &theta, const Scalar &psi)
template<typename Scalar>
Scalar gamma_dot (const Scalar &lift, const Scalar &weight, const Scalar &mass, const Scalar &velocity, const Scalar &gamma, const Scalar &phi)
template<typename Scalar>
Scalar chi_dot_btt (const Scalar &lift, const Scalar &mass, const Scalar &velocity, const Scalar &gamma, const Scalar &phi)
template<typename Scalar>
Scalar load_factor_from_lift (const Scalar &lift, const Scalar &weight)
template<typename Scalar>
Scalar bank_for_turn_rate (const Scalar &velocity, const Scalar &chi_dot, const Scalar &gravity)
template<typename Scalar>
Vec2< Scalar > planar_acceleration (const Scalar &force_x, const Scalar &force_y, const Scalar &mass)
template<typename Scalar>
Vec2< Scalar > planar_acceleration (const Vec2< Scalar > &force, const Scalar &mass)
template<typename Scalar>
Vec2< Scalar > planar_acceleration_gravity (const Scalar &force_x, const Scalar &force_y, const Scalar &mass, const Scalar &gravity)
template<typename Scalar>
Vec3< Scalar > point_mass_acceleration (const Vec3< Scalar > &force, const Scalar &mass)
template<typename Scalar>
Scalar speed (const Vec3< Scalar > &velocity)
template<typename Scalar>
Vec3< Scalar > velocity_direction (const Vec3< Scalar > &velocity)
template<typename Scalar>
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)
template<typename Scalar>
Vec3< Scalar > specific_force (const Vec3< Scalar > &acceleration)
template<typename Scalar>
Vec3< Scalar > g_load (const Vec3< Scalar > &acceleration, const Scalar &g0=Scalar(9.80665))
template<typename Scalar>
Scalar g_load_magnitude (const Vec3< Scalar > &acceleration, const Scalar &g0=Scalar(9.80665))
template<typename Scalar>
Scalar flight_path_angle (const Vec3< Scalar > &velocity)
template<typename Scalar>
Scalar heading_angle (const Vec3< Scalar > &velocity)
template<typename Scalar>
Vec3< Scalar > velocity_from_angles (const Scalar &speed, const Scalar &gamma, const Scalar &chi)
template<typename Scalar>
Scalar specific_kinetic_energy (const Vec3< Scalar > &velocity)
template<typename Scalar>
Scalar specific_potential_energy (const Vec3< Scalar > &position, const Scalar &mu)
template<typename Scalar>
Scalar specific_energy (const Vec3< Scalar > &position, const Vec3< Scalar > &velocity, const Scalar &mu)
template<typename Scalar>
Vec3< Scalar > rail_direction_ned (const Scalar &azimuth, const Scalar &elevation)
template<typename Scalar>
MassProperties< Scalar > aggregate_mass_properties (const std::vector< MassProperties< Scalar > > &components)
template<typename Scalar>
MassProperties< Scalar > transform_mass_properties (const MassProperties< Scalar > &props, const Mat3< Scalar > &rotation, const Vec3< Scalar > &translation)

Function Documentation

◆ aggregate_mass_properties()

template<typename Scalar>
MassProperties< Scalar > vulcan::mass::aggregate_mass_properties ( const std::vector< MassProperties< Scalar > > & components)

Aggregate a collection of mass properties

Computes combined CG and inertia tensor about combined CG. Equivalent to sum() in Python.

Parameters
componentsVector of component mass properties
Returns
Combined mass properties

◆ attitude_response_accel()

template<typename Scalar>
Scalar vulcan::dynamics::attitude_response_accel ( const Scalar & angle,
const Scalar & angle_dot,
const Scalar & angle_cmd,
const Scalar & omega_n,
const Scalar & zeta )

Compute attitude angle acceleration via 2nd-order transfer function

Implements: α̈ = ω²(α_cmd - α) - 2ζωα̇

This models the vehicle's attitude response to commands (e.g., from autopilot). The ω_n and ζ parameters characterize the closed-loop response.

Template Parameters
ScalarScalar type (double or casadi::MX)
Parameters
angleCurrent angle [rad]
angle_dotCurrent angle rate [rad/s]
angle_cmdCommanded angle [rad]
omega_nNatural frequency of response [rad/s]
zetaDamping ratio of response
Returns
Angular acceleration [rad/s²]

◆ bank_for_turn_rate()

template<typename Scalar>
Scalar vulcan::dynamics::bank_for_turn_rate ( const Scalar & velocity,
const Scalar & chi_dot,
const Scalar & gravity )

Compute required bank angle for coordinated turn

For a given turn rate and velocity, the required bank angle is: tan(φ) = V·χ̇ / g

Parameters
velocitySpeed [m/s]
chi_dotDesired heading rate [rad/s]
gravityGravitational acceleration [m/s²]
Returns
Required bank angle [rad]

◆ chi_dot_btt()

template<typename Scalar>
Scalar vulcan::dynamics::chi_dot_btt ( const Scalar & lift,
const Scalar & mass,
const Scalar & velocity,
const Scalar & gamma,
const Scalar & phi )

Compute heading rate from lateral acceleration (bank-to-turn)

χ̇ = (L·sin(φ)) / (m·V·cos(γ))

Parameters
liftLift magnitude [N]
massVehicle mass [kg]
velocitySpeed [m/s]
gammaFlight path angle [rad]
phiBank angle [rad]
Returns
Heading rate [rad/s]

◆ flight_path_angle()

template<typename Scalar>
Scalar vulcan::dynamics::flight_path_angle ( const Vec3< Scalar > & velocity)

Compute flight path angle (gamma) from velocity

Flight path angle is the angle between the velocity vector and the local horizontal plane, positive upward.

$$\gamma = \arcsin(-v_z / |v|)$$ (for Z-down convention)

Parameters
velocityVelocity vector [m/s] (Z-down)
Returns
Flight path angle [rad]

◆ g_load()

template<typename Scalar>
Vec3< Scalar > vulcan::dynamics::g_load ( const Vec3< Scalar > & acceleration,
const Scalar & g0 = Scalar(9.80665) )

Compute g-load from acceleration

Parameters
accelerationAcceleration vector [m/s²]
g0Standard gravity [m/s²] (default 9.80665)
Returns
Load factor [g's]

◆ g_load_magnitude()

template<typename Scalar>
Scalar vulcan::dynamics::g_load_magnitude ( const Vec3< Scalar > & acceleration,
const Scalar & g0 = Scalar(9.80665) )

Compute total g-load magnitude

Parameters
accelerationAcceleration vector [m/s²]
g0Standard gravity [m/s²]
Returns
Total load factor magnitude [g's]

◆ gamma_dot()

template<typename Scalar>
Scalar vulcan::dynamics::gamma_dot ( const Scalar & lift,
const Scalar & weight,
const Scalar & mass,
const Scalar & velocity,
const Scalar & gamma,
const Scalar & phi )

Compute flight path angle rate from vertical acceleration

γ̇ = (L·cos(φ) - W·cos(γ)) / (m·V)

For pseudo-5DOF, given the normal load factor, compute gamma_dot.

Parameters
liftLift magnitude [N]
weightWeight (m*g) [N]
massVehicle mass [kg]
velocitySpeed [m/s]
gammaCurrent flight path angle [rad]
phiBank angle [rad]
Returns
Flight path angle rate [rad/s]

◆ heading_angle()

template<typename Scalar>
Scalar vulcan::dynamics::heading_angle ( const Vec3< Scalar > & velocity)

Compute heading angle (chi) from velocity

Heading angle is the angle from North to the horizontal projection of velocity, measured clockwise (for NED convention).

$$\chi = \arctan2(v_y, v_x)$$

Parameters
velocityVelocity vector [m/s] (in NED frame)
Returns
Heading angle [rad]

◆ lift_direction_btt()

template<typename Scalar>
Vec3< Scalar > vulcan::dynamics::lift_direction_btt ( const Scalar & gamma,
const Scalar & chi,
const Scalar & phi )

Compute lift direction for bank-to-turn vehicle

Lift acts perpendicular to velocity, in the plane defined by bank angle. For zero bank, lift is "up" (opposite gravity). For non-zero bank, lift tilts toward the turn.

Parameters
gammaFlight path angle [rad]
chiHeading angle [rad]
phiBank angle [rad] (positive = right wing down)
Returns
Lift unit direction in NED frame

◆ load_factor_from_lift()

template<typename Scalar>
Scalar vulcan::dynamics::load_factor_from_lift ( const Scalar & lift,
const Scalar & weight )

Compute load factor from lift

n = L / W

Parameters
liftLift magnitude [N]
weightWeight [N]
Returns
Load factor [g's]

◆ normal_force_direction_stt()

template<typename Scalar>
Vec3< Scalar > vulcan::dynamics::normal_force_direction_stt ( const Scalar & theta,
const Scalar & psi )

Compute normal force direction for skid-to-turn vehicle

Normal force acts perpendicular to body X in the vertical body plane. This is the lift-like force generated by angle of attack (alpha).

Parameters
thetaPitch angle [rad]
psiYaw angle [rad]
Returns
Normal force unit direction in NED frame (body -Z direction)

◆ planar_acceleration() [1/2]

template<typename Scalar>
Vec2< Scalar > vulcan::dynamics::planar_acceleration ( const Scalar & force_x,
const Scalar & force_y,
const Scalar & mass )

Compute 2-DOF planar point mass acceleration

Simple Newton's second law in 2D: $$\ddot{x} = F_x/m, \quad \ddot{y} = F_y/m$$

Template Parameters
ScalarScalar type (double or casadi::MX)
Parameters
force_xX-direction force [N]
force_yY-direction force [N]
massPoint mass [kg]
Returns
Acceleration vector [ax, ay] [m/s²]

◆ planar_acceleration() [2/2]

template<typename Scalar>
Vec2< Scalar > vulcan::dynamics::planar_acceleration ( const Vec2< Scalar > & force,
const Scalar & mass )

Compute 2-DOF planar acceleration from force vector

Template Parameters
ScalarScalar type (double or casadi::MX)
Parameters
forceForce vector [Fx, Fy] [N]
massPoint mass [kg]
Returns
Acceleration vector [ax, ay] [m/s²]

◆ planar_acceleration_gravity()

template<typename Scalar>
Vec2< Scalar > vulcan::dynamics::planar_acceleration_gravity ( const Scalar & force_x,
const Scalar & force_y,
const Scalar & mass,
const Scalar & gravity )

Compute 2-DOF planar acceleration with gravity (Y-down convention)

Parameters
force_xX-direction force [N] (not including gravity)
force_yY-direction force [N] (not including gravity)
massPoint mass [kg]
gravityGravitational acceleration [m/s²] (positive down)
Returns
Acceleration vector [ax, ay] [m/s²]

◆ point_mass_acceleration()

template<typename Scalar>
Vec3< Scalar > vulcan::dynamics::point_mass_acceleration ( const Vec3< Scalar > & force,
const Scalar & mass )

Compute 3-DOF point mass acceleration in inertial frame

Simple Newton's second law in 3D: $$\ddot{\mathbf{r}} = \mathbf{F}/m$$

Template Parameters
ScalarScalar type (double or casadi::MX)
Parameters
forceForce vector in inertial frame [N]
massPoint mass [kg]
Returns
Acceleration vector [m/s²]

◆ point_mass_acceleration_ecef()

template<typename Scalar>
Vec3< Scalar > vulcan::dynamics::point_mass_acceleration_ecef ( const Vec3< Scalar > & position,
const Vec3< Scalar > & velocity,
const Vec3< Scalar > & force,
const Scalar & mass,
const Vec3< Scalar > & omega_earth )

Compute 3-DOF point mass acceleration in ECEF frame

Includes Coriolis and centrifugal terms for rotating reference frame: $$\ddot{\mathbf{r}} = \mathbf{F}/m - 2\boldsymbol{\omega}_e \times \mathbf{v} - \boldsymbol{\omega}_e \times (\boldsymbol{\omega}_e \times \mathbf{r})$$

Template Parameters
ScalarScalar type (double or casadi::MX)
Parameters
positionPosition in ECEF [m]
velocityVelocity in ECEF [m/s]
forceForce vector in ECEF [N]
massPoint mass [kg]
omega_earthEarth rotation vector [rad/s] (typically {0, 0, 7.2921159e-5})
Returns
Acceleration vector in ECEF [m/s²]

◆ position_dot()

template<typename Scalar>
Vec3< Scalar > vulcan::dynamics::position_dot ( const Vec3< Scalar > & velocity)

Compute position derivative (trivial kinematic relationship)

For pseudo-5DOF in NED frame: ṙ = v

Parameters
velocityVelocity vector in NED [m/s]
Returns
Position derivative in NED [m/s]

◆ rail_direction_ned()

template<typename Scalar>
Vec3< Scalar > vulcan::dynamics::rail_direction_ned ( const Scalar & azimuth,
const Scalar & elevation )

Compute rail direction unit vector from elevation and azimuth

Parameters
azimuthRail azimuth from North [rad]
elevationRail elevation from horizontal [rad]
Returns
Unit direction vector in NED frame

◆ side_force_direction_stt()

template<typename Scalar>
Vec3< Scalar > vulcan::dynamics::side_force_direction_stt ( const Scalar & theta,
const Scalar & psi )

Compute side force direction for skid-to-turn vehicle

Side force acts perpendicular to body X-axis in the horizontal body plane. This is the force generated by sideslip (beta).

Parameters
thetaPitch angle [rad]
psiYaw angle [rad]
Returns
Side force unit direction in NED frame (body Y direction)

◆ specific_energy()

template<typename Scalar>
Scalar vulcan::dynamics::specific_energy ( const Vec3< Scalar > & position,
const Vec3< Scalar > & velocity,
const Scalar & mu )

Compute total specific mechanical energy

Parameters
positionPosition vector [m]
velocityVelocity vector [m/s]
muGravitational parameter [m³/s²]
Returns
Specific mechanical energy [J/kg]

◆ specific_force()

template<typename Scalar>
Vec3< Scalar > vulcan::dynamics::specific_force ( const Vec3< Scalar > & acceleration)

Compute specific force from acceleration (a = F/m)

Parameters
accelerationAcceleration vector [m/s²]
Returns
Specific force [m/s²] = [N/kg]

◆ specific_kinetic_energy()

template<typename Scalar>
Scalar vulcan::dynamics::specific_kinetic_energy ( const Vec3< Scalar > & velocity)

Compute specific kinetic energy

Parameters
velocityVelocity vector [m/s]
Returns
Specific kinetic energy [J/kg] = [m²/s²]

◆ specific_potential_energy()

template<typename Scalar>
Scalar vulcan::dynamics::specific_potential_energy ( const Vec3< Scalar > & position,
const Scalar & mu )

Compute specific potential energy (gravitation)

Parameters
positionPosition vector from center of attracting body [m]
muGravitational parameter [m³/s²]
Returns
Specific potential energy [J/kg] (negative for bound orbits)

◆ speed()

template<typename Scalar>
Scalar vulcan::dynamics::speed ( const Vec3< Scalar > & velocity)

Compute velocity magnitude

Parameters
velocityVelocity vector [m/s]
Returns
Speed [m/s]

◆ thrust_direction_btt()

template<typename Scalar>
Vec3< Scalar > vulcan::dynamics::thrust_direction_btt ( const Scalar & gamma,
const Scalar & chi )

Compute thrust direction for bank-to-turn vehicle

Bank-to-turn: Vehicle banks (rolls) to turn. Thrust is along body X-axis. Lift acts perpendicular to velocity, rotated by bank angle.

Parameters
gammaFlight path angle [rad] (positive = climbing)
chiHeading angle [rad] (from North)
Returns
Thrust unit direction in NED frame

◆ thrust_direction_stt()

template<typename Scalar>
Vec3< Scalar > vulcan::dynamics::thrust_direction_stt ( const Scalar & theta,
const Scalar & psi )

Compute thrust direction for skid-to-turn vehicle

Skid-to-turn: Vehicle yaws to turn (like a missile with cruciform fins). Thrust is along body X-axis, defined by pitch (theta) and yaw (psi).

Parameters
thetaPitch angle [rad] (positive = nose up)
psiYaw angle [rad] (positive = nose right)
Returns
Thrust unit direction in NED frame

◆ transform_mass_properties()

template<typename Scalar>
MassProperties< Scalar > vulcan::mass::transform_mass_properties ( const MassProperties< Scalar > & props,
const Mat3< Scalar > & rotation,
const Vec3< Scalar > & translation )

Transform mass properties to a new coordinate frame

Parameters
propsOriginal mass properties
rotationRotation matrix from old frame to new frame
translationTranslation from old origin to new origin (in old frame)
Returns
Mass properties expressed in new frame

◆ velocity_direction()

template<typename Scalar>
Vec3< Scalar > vulcan::dynamics::velocity_direction ( const Vec3< Scalar > & velocity)

Compute unit velocity direction

Parameters
velocityVelocity vector [m/s]
Returns
Unit velocity direction (normalized)

◆ velocity_dot_btt()

template<typename Scalar>
Vec3< Scalar > vulcan::dynamics::velocity_dot_btt ( const Scalar & thrust,
const Scalar & drag,
const Scalar & lift,
const Scalar & mass,
const Scalar & gravity,
const Scalar & gamma,
const Scalar & chi,
const Scalar & phi )

Compute velocity derivative for bank-to-turn vehicle

Parameters
thrustThrust magnitude [N]
dragDrag magnitude [N]
liftLift magnitude [N]
massVehicle mass [kg]
gravityGravitational acceleration [m/s²]
gammaFlight path angle [rad]
chiHeading angle [rad]
phiBank angle [rad]
Returns
Velocity derivative in NED [m/s²]

◆ velocity_dot_stt()

template<typename Scalar>
Vec3< Scalar > vulcan::dynamics::velocity_dot_stt ( const Scalar & thrust,
const Scalar & drag,
const Scalar & normal_force,
const Scalar & side_force,
const Scalar & mass,
const Scalar & gravity,
const Scalar & theta,
const Scalar & psi )

Compute velocity derivative for skid-to-turn vehicle

Parameters
thrustThrust magnitude [N]
dragDrag magnitude [N]
normal_forceNormal force magnitude [N] (from alpha)
side_forceSide force magnitude [N] (from beta)
massVehicle mass [kg]
gravityGravitational acceleration [m/s²]
thetaPitch angle [rad]
psiYaw angle [rad]
Returns
Velocity derivative in NED [m/s²]

◆ velocity_from_angles()

template<typename Scalar>
Vec3< Scalar > vulcan::dynamics::velocity_from_angles ( const Scalar & speed,
const Scalar & gamma,
const Scalar & chi )

Compute velocity from speed and flight path angles

Parameters
speedSpeed magnitude [m/s]
gammaFlight path angle [rad]
chiHeading angle from North [rad]
Returns
Velocity vector in NED [m/s]