pub struct Solver<EPH: EphemerisSource, ORB: OrbitSource, EB: EnvironmentalBias, SB: SpacebornBias, TIM: AbsoluteTime> {
pub cfg: Config,
/* private fields */
}Expand description
Solver to resolve PVTSolutions.
§Generics:
- EPH: EphemerisSource custom data source. Curreuntly unused: limited to [ORB] only!
- ORB: OrbitSource, custom Orbit data source.
- EB: EnvironmentalBias implementation using either intenral or custom external model.
- SB: SpacebornBias external information provider.
- TIM: AbsoluteTime source for correct absolute time management.
Fields§
§cfg: ConfigSolver Configuration
Implementations§
Source§impl<EPH: EphemerisSource, ORB: OrbitSource, EB: EnvironmentalBias, SB: SpacebornBias, TIM: AbsoluteTime> Solver<EPH, ORB, EB, SB, TIM>
impl<EPH: EphemerisSource, ORB: OrbitSource, EB: EnvironmentalBias, SB: SpacebornBias, TIM: AbsoluteTime> Solver<EPH, ORB, EB, SB, TIM>
Sourcepub fn new(
almanac: Almanac,
earth_cef: Frame,
cfg: Config,
eph_source: Rc<EPH>,
orbit_source: Rc<ORB>,
spaceborn_biases: Rc<SB>,
environmental_biases: Rc<EB>,
absolute_time: TIM,
state_ecef_m: Option<(f64, f64, f64)>,
) -> Self
pub fn new( almanac: Almanac, earth_cef: Frame, cfg: Config, eph_source: Rc<EPH>, orbit_source: Rc<ORB>, spaceborn_biases: Rc<SB>, environmental_biases: Rc<EB>, absolute_time: TIM, state_ecef_m: Option<(f64, f64, f64)>, ) -> Self
Creates a new Solver for either direct or differential navigation, with possible apriori knowledge.
§Input
- almanac: provided valid Almanac
- earth_cef: Frame that must be an ECEF
- cfg: solver Configuration
- eph_source: custom EphemerisSource, unavailable right now, tie to null.
- orbit_source: custom OrbitSource implementation, wrapped in a Rc<RefCell<>> which allows the solver and the orbital provider to live in the same thread.
- absolute_time: external AbsoluteTime implementation.
- bias: [Bias] model implementation
- state_ecef_m: provide initial state as ECEF 3D coordinates, otherwise we will have to figure them.
Sourcepub fn new_survey(
almanac: Almanac,
earth_cef: Frame,
cfg: Config,
eph_source: Rc<EPH>,
orbit_source: Rc<ORB>,
spaceborn_biases: Rc<SB>,
environmental_biases: Rc<EB>,
absolute_time: TIM,
) -> Self
pub fn new_survey( almanac: Almanac, earth_cef: Frame, cfg: Config, eph_source: Rc<EPH>, orbit_source: Rc<ORB>, spaceborn_biases: Rc<SB>, environmental_biases: Rc<EB>, absolute_time: TIM, ) -> Self
Sourcepub fn ppp(
&mut self,
epoch: Epoch,
params: UserParameters,
candidates: &[Candidate],
) -> Result<PVTSolution, Error>
pub fn ppp( &mut self, epoch: Epoch, params: UserParameters, candidates: &[Candidate], ) -> Result<PVTSolution, Error>
PVTSolution solving attempt using PPP technique (no reference). Unlike RTK resolution attempt, PPP solving will resolve both the position and the local clock state, but it is a less accurate and much more complex process.
§Input
- epoch: Epoch of measurement
- params: UserParameters
- candidates: proposed Candidates (= measurements)
- rtk_base: possible RTKBase we will connect to
§Output
- success: PVTSolution
- failure: Error
Sourcepub fn rtk<RTK: RTKBase>(
&mut self,
epoch: Epoch,
params: UserParameters,
candidates: &[Candidate],
rtk_base: &RTK,
) -> Result<PVTSolution, Error>
pub fn rtk<RTK: RTKBase>( &mut self, epoch: Epoch, params: UserParameters, candidates: &[Candidate], rtk_base: &RTK, ) -> Result<PVTSolution, Error>
PVTSolution solving attempt using RTK technique and a single remote reference site that implements RTKBase. You may catch RTK solving issues (for example, network loss) and retry using Self::ppp, because this object is compatible with both. For this function to converge, the remote site and rover proposals must agree in their content (enough matches) and signals must fulfill the navigation [Method] being used.
NB: unlike PPP solving, RTK solving will only resolve the spatial state, the clock state can only remain undetermined. If you are interested by both, you will either have to restrict to [Self::ppp_run], or do a PPP (time only) run after the RTK run.
§Input
- epoch: Epoch of measurement from the rover reported by the rover. The remote site must match the sampling instant closely, reducing the time-difference (RTK aging).
- profile: rover [UserProfile]
- candidates: rover measurements, wrapped as Candidates.
- rtk_base: remote reference site that implements RTKBasereference.
§Output
Auto Trait Implementations§
impl<EPH, ORB, EB, SB, TIM> !Freeze for Solver<EPH, ORB, EB, SB, TIM>
impl<EPH, ORB, EB, SB, TIM> RefUnwindSafe for Solver<EPH, ORB, EB, SB, TIM>where
TIM: RefUnwindSafe,
ORB: RefUnwindSafe,
EPH: RefUnwindSafe,
EB: RefUnwindSafe,
SB: RefUnwindSafe,
impl<EPH, ORB, EB, SB, TIM> !Send for Solver<EPH, ORB, EB, SB, TIM>
impl<EPH, ORB, EB, SB, TIM> !Sync for Solver<EPH, ORB, EB, SB, TIM>
impl<EPH, ORB, EB, SB, TIM> Unpin for Solver<EPH, ORB, EB, SB, TIM>where
TIM: Unpin,
impl<EPH, ORB, EB, SB, TIM> UnwindSafe for Solver<EPH, ORB, EB, SB, TIM>where
TIM: UnwindSafe,
ORB: RefUnwindSafe,
EPH: RefUnwindSafe,
EB: RefUnwindSafe,
SB: RefUnwindSafe,
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> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§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.