JSim 2026.06.01-p(1)
Loading...
Searching...
No Matches
drag_model.hpp
Go to the documentation of this file.
1// Copyright (c) JSim contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the LGPLv3 license file in the root directory of this project.
4
5#pragma once
6
9
10namespace frcsim {
11
32
40class DragModel {
41 public:
51 DragModel(double drag_coefficient, double reference_area_m2,
52 double air_density_kgpm3 = 1.225,
53 double linear_drag_coefficient_n_per_mps = 0.0)
54 : drag_coefficient_(drag_coefficient),
55 reference_area_m2_(reference_area_m2),
56 air_density_kgpm3_(air_density_kgpm3),
57 linear_drag_coefficient_n_per_mps_(linear_drag_coefficient_n_per_mps) {}
58
66 const Vector3& velocity_mps) const {
67 return Vector3::dragForceDetailed(velocity_mps, drag_coefficient_,
68 reference_area_m2_, air_density_kgpm3_,
69 linear_drag_coefficient_n_per_mps_);
70 }
71
79 const Vector3& velocity_mps = body.linearVelocity();
80 double reference_area_m2 = body.dragReferenceAreaM2(velocity_mps);
81 if (reference_area_m2 <= 0.0) {
82 reference_area_m2 = reference_area_m2_;
83 }
84
85 return Vector3::dragForceDetailed(velocity_mps, drag_coefficient_,
86 reference_area_m2, air_density_kgpm3_,
87 linear_drag_coefficient_n_per_mps_);
88 }
89
95 Vector3 computeForce(const Vector3& velocity_mps) const {
96 auto details = computeForceDetailed(velocity_mps);
97 return Vector3(details.force.x, details.force.y, details.force.z);
98 }
99
105 Vector3 computeForce(const RigidBody& body) const {
106 auto details = computeForceDetailed(body);
107 return Vector3(details.force.x, details.force.y, details.force.z);
108 }
109
118 const RigidBody& body, const Vector3& effective_gravity_mps2) const {
119 DragGravityComparison comparison{};
120 comparison.body_mass_kg = body.massKg();
121
122 const auto details = computeForceDetailed(body);
123 comparison.drag_force =
124 Vector3(details.force.x, details.force.y, details.force.z);
125 comparison.drag_force_magnitude_n = details.drag_force_magnitude_n;
126 comparison.drag_acceleration_mps2 =
127 (comparison.body_mass_kg > 0.0)
128 ? comparison.drag_force_magnitude_n / comparison.body_mass_kg
129 : 0.0;
131 effective_gravity_mps2.norm();
132 comparison.drag_to_gravity_ratio =
133 (comparison.effective_gravity_acceleration_mps2 > 0.0)
134 ? comparison.drag_acceleration_mps2 /
136 : 0.0;
137 comparison.valid = details.valid && comparison.body_mass_kg > 0.0;
138 return comparison;
139 }
140
146 void apply(RigidBody& body) const {
147 if (body.flags().is_kinematic)
148 return;
150 }
151
152 private:
153 double drag_coefficient_{0.47};
154 double reference_area_m2_{0.02};
155 double air_density_kgpm3_{1.225};
156 double linear_drag_coefficient_n_per_mps_{0.0};
157};
158
159} // namespace frcsim
DragModel(double drag_coefficient, double reference_area_m2, double air_density_kgpm3=1.225, double linear_drag_coefficient_n_per_mps=0.0)
Constructs a drag force model.
Definition drag_model.hpp:51
Vector3 computeForce(const RigidBody &body) const
Computes drag force using body geometry.
Definition drag_model.hpp:105
Vector3::DragForceDetails computeForceDetailed(const RigidBody &body) const
Computes detailed drag force using body geometry and motion.
Definition drag_model.hpp:78
Vector3 computeForce(const Vector3 &velocity_mps) const
Computes drag force vector for a world-space velocity.
Definition drag_model.hpp:95
void apply(RigidBody &body) const
Applies computed drag force to a rigid body.
Definition drag_model.hpp:146
DragGravityComparison compareToEffectiveGravity(const RigidBody &body, const Vector3 &effective_gravity_mps2) const
Compares drag force magnitude against an effective gravity vector.
Definition drag_model.hpp:117
Vector3::DragForceDetails computeForceDetailed(const Vector3 &velocity_mps) const
Computes detailed drag force breakdown for a world-space velocity vector.
Definition drag_model.hpp:65
Simulated rigid body with translational/angular dynamics and optional aero metadata.
Definition rigid_body.hpp:44
void applyForce(const Vector3 &force_n)
Adds force at center of mass in newtons.
Definition rigid_body.hpp:431
double dragReferenceAreaM2(const Vector3 &velocity_world) const
Computes effective drag reference area for current geometry and motion direction.
Definition rigid_body.hpp:367
BodyFlags & flags()
Mutable access to runtime body flags.
Definition rigid_body.hpp:244
const Vector3 & linearVelocity() const
Returns world linear velocity in meters per second.
Definition rigid_body.hpp:163
double massKg() const
Returns mass in kilograms.
Definition rigid_body.hpp:106
Definition vector.hpp:13
bool is_kinematic
Definition body_flags.hpp:26
Diagnostic output comparing drag force to gravitational acceleration.
Definition drag_model.hpp:15
double effective_gravity_acceleration_mps2
Magnitude of effective gravity vector in m/s^2.
Definition drag_model.hpp:23
Vector3 drag_force
Computed drag force vector in newtons.
Definition drag_model.hpp:17
double body_mass_kg
Body mass used for acceleration calculations in kg.
Definition drag_model.hpp:27
bool valid
True when the comparison computed without invalid inputs or mass=0.
Definition drag_model.hpp:30
double drag_force_magnitude_n
Magnitude of drag_force in newtons.
Definition drag_model.hpp:19
double drag_to_gravity_ratio
Ratio of drag acceleration to gravity (>1 means drag dominates).
Definition drag_model.hpp:25
double drag_acceleration_mps2
Drag-induced acceleration magnitude in m/s^2.
Definition drag_model.hpp:21
Expanded drag diagnostics for force computation.
Definition vector.hpp:249
3D vector utility used throughout JSim physics.
Definition vector.hpp:22
double norm() const noexcept
Returns Euclidean magnitude.
Definition vector.hpp:114
static DragForceDetails dragForceDetailed(const Vector3 &v, double Cd, double A, double rho=1.225, double linear_drag_coefficient_n_per_mps=0.0) noexcept
Computes drag force details for a body moving through air.
Definition vector.hpp:287