39 : magnus_model_(magnus_model) {}
61 double dt)
const noexcept {
67 Vector3 omegaWorld = R * omegaLocal;
69 double vMag = velocityWorld.norm();
70 double wMag = omegaWorld.
norm();
75 Vector3 linearDamping = omegaWorld * m_linearDecay;
78 Vector3 velocityDamping = omegaWorld * (m_velocityCoupling * vMag);
81 Vector3 nonlinearDamping = omegaWorld * (m_nonlinearDecay * wMag);
90 magnus_model_.computeForce(velocityWorld, omegaWorld);
93 Vector3 magnusTorque = m_radiusVector.
cross(magnusForce);
103 omegaWorld = omegaWorld + domega * dt;
106 return Rinv * omegaWorld;
141 double m_linearDecay{0.05};
144 double m_velocityCoupling{0.01};
147 double m_nonlinearDecay{0.02};
154 Vector3 m_radiusVector{0.0, 0.0, 0.05};
Computes a Magnus lift force from linear velocity and spin.
Definition magnus_model.hpp:23
void setVelocityCoupling(double k) noexcept
Sets velocity-coupled damping coefficient.
Definition spin_decay_model.hpp:121
void setLinearDecay(double k) noexcept
Sets linear angular decay coefficient.
Definition spin_decay_model.hpp:115
Vector3 step(const Vector3 &omegaLocal, const Vector3 &velocityWorld, const Quaternion &orientation, double dt) const noexcept
Advances angular velocity forward in time.
Definition spin_decay_model.hpp:58
void setNonlinearDecay(double k) noexcept
Sets nonlinear angular decay coefficient.
Definition spin_decay_model.hpp:127
SpinDecayModel(const MagnusModel &magnus_model=MagnusModel())
Constructs a spin decay model.
Definition spin_decay_model.hpp:38
void setRadiusVector(const Vector3 &r) noexcept
Sets radius (lever arm) used for Magnus torque calculation.
Definition spin_decay_model.hpp:134
Definition spin_decay_model.hpp:10
3x3 matrix type used for rotations and inertia-tensor operations.
Definition matrix.hpp:27
static Matrix3 fromQuaternion(const Quaternion &q) noexcept
Definition matrix.hpp:164
Matrix3 transpose() const noexcept
Definition matrix.hpp:111
Unit-quaternion rotation representation and rotation algebra helpers.
Definition quaternion.hpp:25
3D vector utility used throughout JSim physics.
Definition vector.hpp:22
double norm() const noexcept
Returns Euclidean magnitude.
Definition vector.hpp:114
Vector3 cross(const Vector3 &o) const noexcept
Returns cross product with o.
Definition vector.hpp:172