Skip to main content

Crate astrodyn_dynamics

Crate astrodyn_dynamics 

Source
Expand description

Rigid-body dynamics: state, mass properties, forces, and integration.

This crate is the JEOD-faithful port of the dynamics half of models/dynamics/. It owns the per-vehicle state types (TranslationalState, RotationalState, SixDofState), the rigid- body mass model (MassProperties, MassBody, MassPoint, MassTree, point_mass_inertia), the force-collection pipeline (collect_forces, ForceContributions, TotalForce, GravityAcceleration, compute_translational_acceleration, compute_translational_derivatives, compute_frame_derivatives, compute_t_inertial_struct), and a battery of integrators (rk4_translational_step, rk4_sixdof_step, adaptive RKF4(5) in rkf45, multistep abm4/Adams–Bashforth–Moulton, and gauss_jackson).

Initial-condition machinery in body_init mirrors JEOD’s BodyAction subclasses: init_from_orbital_elements, init_from_mean_anomaly, init_from_time_periapsis, init_from_lvlh, init_from_ned, and compute_ned_rotation. Frame propagation lives in propagation: propagate_body_frames, propagate_forward, propagate_reverse. Holonomic constraints (HolonomicConstraint, PendulumConstraint, BaumgarteSolver, apply_constraint) port the constraint-stabilization layer used by tethers and articulated structures. Declaratively driven kinematic joints — single-axis frame-rotation drivers used by articulated sub-trees that consume a prescribed angular trajectory rather than integrating one — live in kinematic_joint (JointKinematicsSpec, evaluate_joint_kinematics). Root-to-leaf state propagation through kinematic-child chains lives in kinematic_propagation (compute_kinematic_child_state, compute_kinematic_child_state_typed, derive_kinematic_child_from_states, KinematicChildInputs, KinematicChildOutputs).

JEOD source: models/dynamics/dyn_body/, models/dynamics/mass/, models/dynamics/body_action/, and models/utils/integration/. Pure Rust, zero Bevy dependency — orchestration lives in astrodyn and ECS wiring lives in the astrodyn_bevy root crate.

§Example

Compute the parallel-axis (Steiner) inertia contribution of a 10 kg point mass offset 2 m along +X from the reference point. The resulting matrix has 0 on the (0,0) diagonal (no inertia about the axis through the offset) and mass * r^2 = 40 on the perpendicular diagonal entries:

use astrodyn_dynamics::point_mass_inertia;
use glam::DVec3;

let i = point_mass_inertia(10.0, DVec3::new(2.0, 0.0, 0.0));
assert!(i.x_axis.x.abs() < 1e-12);
assert!((i.y_axis.y - 40.0).abs() < 1e-12);
assert!((i.z_axis.z - 40.0).abs() < 1e-12);

Re-exports§

pub use abm4::abm4_translational_step;
pub use abm4::Abm4State;
pub use attach::combine_states_at_attach;
pub use attach::AttachCombineInputs;
pub use attach::AttachCombineOutputs;
pub use body_init::compute_ned_rotation;
pub use body_init::init_from_lvlh;
pub use body_init::init_from_mean_anomaly;
pub use body_init::init_from_ned;
pub use body_init::init_from_orbital_elements;
pub use body_init::init_from_time_periapsis;
pub use constraints::apply_constraint;
pub use constraints::BaumgarteSolver;
pub use constraints::HolonomicConstraint;
pub use constraints::PendulumConstraint;
pub use forces::collect_forces;
pub use forces::compute_frame_derivatives;
pub use forces::compute_t_inertial_struct;
pub use forces::compute_translational_acceleration;
pub use forces::compute_translational_derivatives;
pub use forces::DynamicsConfig;
pub use forces::ForceContributions;
pub use forces::FrameDerivatives;
pub use forces::GravityAcceleration;
pub use forces::TotalForce;
pub use frame_attach::derive_frame_attached_state;
pub use frame_attach::FrameAttachInputs;
pub use gauss_jackson::config::GaussJacksonConfig;
pub use gauss_jackson::GaussJacksonState;
pub use gauss_jackson::IntegratorResult;
pub use integration::rk4_sixdof_step;
pub use integration::rk4_translational_step;
pub use integration::IntegratorType;
pub use kinematic_joint::evaluate as evaluate_joint_kinematics;
pub use kinematic_joint::evaluate_closure as evaluate_closure_kinematics;
pub use kinematic_joint::evaluate_model as evaluate_joint_kinematics_model;
pub use kinematic_joint::evaluate_multi_dof as evaluate_multi_dof_kinematics;
pub use kinematic_joint::evaluate_sinusoidal as evaluate_sinusoidal_kinematics;
pub use kinematic_joint::ClosureJointKinematicsSpec;
pub use kinematic_joint::JointKinematicsModel;
pub use kinematic_joint::JointKinematicsSpec;
pub use kinematic_joint::MultiDofJointKinematicsSpec;
pub use kinematic_joint::SingleDofKinematics;
pub use kinematic_joint::SinusoidalJointKinematicsSpec;
pub use kinematic_joint::MAX_MULTI_DOF_AXES;
pub use kinematic_propagation::compute_kinematic_child_state;
pub use kinematic_propagation::compute_kinematic_child_state_dquat;
pub use kinematic_propagation::compute_kinematic_child_state_typed;
pub use kinematic_propagation::derive_kinematic_child_from_states;
pub use kinematic_propagation::KinematicChildInputs;
pub use kinematic_propagation::KinematicChildOutputs;
pub use mass::MassProperties;
pub use mass::MassPropertiesTyped;
pub use mass::INERTIA_CONSISTENCY_TOL;
pub use mass_body::point_mass_inertia;
pub use mass_body::MassBody;
pub use mass_body::MassBodyId;
pub use mass_body::MassPoint;
pub use mass_body::MassPointState;
pub use mass_body::MassTree;
pub use mass_storage::compute_node_composite;
pub use mass_storage::finalize_child_in_parent_frame;
pub use mass_storage::recompute_composites_via_storage;
pub use mass_storage::MassNodeOutputs;
pub use mass_storage::MassNodeView;
pub use mass_storage::MassStorage;
pub use propagation::propagate_body_frames;
pub use propagation::propagate_forward;
pub use propagation::propagate_reverse;
pub use rkf45::rkf45_adaptive_sixdof_step;
pub use rkf45::rkf45_adaptive_translational_step;
pub use rkf45::rkf45_sixdof_step;
pub use rkf45::rkf45_translational_step;
pub use rkf45::AdaptiveConfig;
pub use rkf45::AdaptiveResult;
pub use rotational::compute_left_quat_deriv;
pub use rotational::compute_rotational_acceleration;
pub use rotational::normalize_integ;
pub use rotational::RotationalState;
pub use rotational::RotationalStateTyped;
pub use rotational::SixDofState;
pub use rotational::SixDofStateTyped;
pub use state::TranslationalState;
pub use subtree::DetachedSubtreeState;
pub use wrench::shift_wrench_to_parent;
pub use wrench::shift_wrench_to_parent_typed;
pub use wrench::Wrench;

Modules§

abm4
Adams-Bashforth-Moulton 4th-order (ABM4) integrator for second-order ODEs.
attach
Mass-tree attach: combine two free bodies’ kinematic states into a single rigid body via JEOD’s “magical” merge algorithm.
body_init
Body initialization functions for translational state.
constraints
Holonomic constraint dynamics with Baumgarte stabilization.
forces
Per-body force / torque accumulators consumed by the integrator.
frame_attach
Frame-attached body integration kernel.
gauss_jackson
Gauss-Jackson (Störmer-Cowell) integrator for second-order ODEs.
integration
Integration-method dispatch and the per-method translational / rotational step kernels.
kinematic_joint
Declaratively driven kinematic joints.
kinematic_propagation
Kinematic state derivation for a passive rigid attachment.
mass
MassProperties and the typed sibling MassPropertiesTyped — mass, inertia tensor, and CoM offset for a rigid body.
mass_body
Arena-based mass tree: a faithful port of JEOD’s MassBody hierarchy.
mass_storage
Storage-agnostic mass-tree composition.
propagation
State propagation: compute derived frame states from an integrated frame state and mass offsets.
rkf45
Runge-Kutta-Fehlberg 4(5) integrator.
rotational
Rotational state: attitude quaternion, angular velocity, and the integration kernels that propagate them under applied torque.
state
TranslationalState — position and velocity in the integration frame.
subtree
Composite-body kinematic state of a free-flying mass-tree subtree.
wrench
Composite-rigid-body wrench shift: parallel-axis transfer of a child’s (force, torque) pair to its parent’s structural frame.