Skip to main content

SolRef

Struct SolRef 

Source
pub struct SolRef {
    pub timeconst: f64,
    pub dampratio: f64,
}
Expand description

MuJoCo-style solref: the reference response of a violated constraint.

The pair (timeconst, dampratio) describes the mass-normalized damped spring the solver pretends the constraint is, rather than a raw stiffness/damping pair. Parameterizing by a time constant is what makes the behaviour independent of the contacting bodies’ masses: a 20 ms recovery is 20 ms whether the box weighs a gram or a tonne.

Fields§

§timeconst: f64

Time constant of the constraint’s reference response, in seconds.

MuJoCo’s default is 0.02, and its guidance — that it should be at least twice the timestep — applies here for the same reason: the discrete correction below reduces to a per-step gain of dt / (2*timeconst*dampratio^2 + dt), which saturates at 1 (a full, popping correction in one step) as timeconst -> 0.

§dampratio: f64

Damping ratio. 1 is critically damped, which is what a contact wants: penetration decays without overshooting into a bounce.

Implementations§

Source§

impl SolRef

Source

pub fn error_reduction(&self, dt: f64) -> f64

Fraction of the current penetration to remove in a step of dt.

Derived from the reference spring rather than picked: a critically damped spring with time constant tau and damping ratio zeta has mass-normalized k = 1/(tau^2 zeta^2) and b = 2/(tau zeta^2). One implicit step of that spring removes

  dt*k / (b + dt*k)  =  dt / (2*tau*zeta^2 + dt)

of the violation. Taking the implicit (rather than the explicit dt^2 k) gain is what keeps the correction bounded by 1 for every dt, so a large step can never over-correct and launch the body.

Trait Implementations§

Source§

impl Clone for SolRef

Source§

fn clone(&self) -> SolRef

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for SolRef

Source§

impl Debug for SolRef

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for SolRef

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl PartialEq for SolRef

Source§

fn eq(&self, other: &SolRef) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for SolRef

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.