Skip to main content

Hold

Struct Hold 

Source
pub struct Hold {
    pub sigma: Meters,
}
Expand description

The position hold an unaided filter fuses to keep its tilt. Equation (28″).

Without horizontal aiding nothing observes tilt, so a vehicle that loses GNSS in flight loses its attitude on the schedule ImuNoise sets while the true error may still be small. With no horizontal measurement judged within Timeouts::dead_reckoning_after, which a start that has heard none meets from its first step, no Eskf::fuse_stationary accepted, and the tilt σ past 3°, the filter fuses its own position estimate from the step the hold engaged, every 0.2 s at sigma. Bounding position bounds velocity, so a velocity error can no longer hide a tilt error, and the accelerometer levels the filter. PX4’s fake position (fake_pos_control.cpp:47-82 at c4e4ef98) and ArduPilot’s AID_NONE (AP_NavEKF3_Control.cpp:416-420 at 368dc0c4) do the same.

It assumes the vehicle stays near where the hold engaged. A hover meets that; a sustained acceleration reads as tilt error, and sigma is the trade between the two, which is the mission’s: how far a vehicle flies on without aiding is what it is flying for. A vehicle that keeps moving without GNSS, a car or a fixed-wing, should turn it off: on UrbanNav’s car the hold took the F9P’s position NEES from 1.02 to 32 (decision).

The hold is an assumption, not a sensor: Status stays DeadReckoning, and horizontal position and velocity each stay invalid in Validity, however tight the covariance the hold leaves, until a measurement of that quantity is accepted or adopted. A stationary claim, a fix the gate turns down or a velocity does not validate position; a stationary claim does bound velocity, and so does the second position fix the gate passes, which has checked the velocity that carried the estimate from the first. The first GNSS fix or velocity after it that the gate turns down is adopted at once rather than after Config::recovery’s timeout, since what the gate would be judging it against is the hold. A source whose recovery is off is never adopted. A caller’s reset_position_to or reset_velocity_to ends it for its quantity, until the hold next fuses. On by default, as Coast is; Config::hold = None is the opt-out.

Fields§

§sigma: Meters

The σ of the held position on each horizontal axis.

Trait Implementations§

Source§

impl Clone for Hold

Source§

fn clone(&self) -> Self

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 Hold

Source§

impl Debug for Hold

Source§

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

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

impl Default for Hold

Source§

fn default() -> Self

PX4’s EKF2_NOAID_NOISE (src/modules/ekf2/module.yaml:67-75 at c4e4ef98) and ArduPilot’s EK3_NOAID_M_NSE (AP_NavEKF3.cpp:447-453 at 368dc0c4) both default to 10 m.

Source§

impl PartialEq for Hold

Source§

fn eq(&self, other: &Self) -> 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 Hold

Auto Trait Implementations§

§

impl Freeze for Hold

§

impl RefUnwindSafe for Hold

§

impl Send for Hold

§

impl Sync for Hold

§

impl Unpin for Hold

§

impl UnsafeUnpin for Hold

§

impl UnwindSafe for Hold

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> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Scalar for T
where T: 'static + Clone + PartialEq + Debug,

Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
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.