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: MetersThe σ of the held position on each horizontal axis.
Trait Implementations§
impl Copy for Hold
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> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> Scalar for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.