Sen API
Sen Libraries
Loading...
Searching...
No Matches
settable_dead_reckoner.h
Go to the documentation of this file.
1// === settable_dead_reckoner.h ========================================================================================
2// Sen Infrastructure
3// Released under the Apache License v2.0 (SPDX-License-Identifier Apache-2.0).
4// See the LICENSE.txt file for more information.
5// © Airbus SAS, Airbus Helicopters, and Airbus Defence and Space SAU/GmbH/SAS.
6// =====================================================================================================================
7
8#ifndef SEN_UTIL_DR_SETTABLE_DEAD_RECKONER_H
9#define SEN_UTIL_DR_SETTABLE_DEAD_RECKONER_H
10
11#include "dead_reckoner.h"
14
15// std
16#include <cmath>
17
18namespace sen::util
19{
20
23
24//--------------------------------------------------------------------------------------------------------------
25// Types
26//--------------------------------------------------------------------------------------------------------------
27
29enum class ReferenceSystem : u32
30{
33};
34
35// --8<-- [start:dr_threshold]
44// --8<-- [end:dr_threshold]
45
48template <typename T>
51{
52public:
53 SEN_NOCOPY_NOMOVE(SettableDeadReckoner)
54
55public:
56 explicit SettableDeadReckoner(T& object, DrThreshold thresholds = {});
57 ~SettableDeadReckoner() override = default;
58
59public:
72
73public:
75 [[nodiscard]] T& object() noexcept;
76
78 [[nodiscard]] const T& object() const noexcept;
79
80public:
83 bool setSpatial(const Situation& situation);
84
88
91 void setFrozen(sen::TimeStamp timeStamp, bool value);
92
93private:
96 SpatialVariant toSpatialVariant(const Situation& situation, const DrThreshold& threshold);
97
98private:
99 T& obj_;
100 sen::TimeStamp lastTimeStamp_;
101 DrThreshold threshold_;
102 const f64 orientationThresholdCos; // constant used to determine if the orientation threshold has been exceeded
103};
104
106
107//-------------------------------------------------------------------------------------------------------------------
108// Inline implementation
109//-------------------------------------------------------------------------------------------------------------------
110
111template <typename T>
113 : obj_ {object}
114 , threshold_ {thresholds}
115 , orientationThresholdCos {cos(static_cast<f64>(threshold_.orientationThreshold) * 0.5)}
116{
117}
118
119template <typename T>
121{
122 return obj_;
123}
124
125template <typename T>
126inline const T& SettableDeadReckoner<T>::object() const noexcept
127{
128 return obj_;
129}
130
131template <typename T>
133{
134 const auto extrapolation = Parent::extrapolate(obj_.getSpatial(), situation.timeStamp, lastTimeStamp_);
135 if (impl::maxDistanceExceeded(situation.worldLocation, extrapolation.worldLocation, threshold_.distanceThreshold) ||
136 impl::maxRotationExceeded(situation.orientation, extrapolation.orientation, orientationThresholdCos))
137 {
138 lastTimeStamp_ = situation.timeStamp;
139 obj_.setNextSpatial(toSpatialVariant(situation, threshold_));
140 return true;
141 }
142
143 return false;
144}
145
146template <typename T>
148{
149 // translate input geodetic situation to standard reference system
150 const auto ecefPosition = impl::toEcef(situation.worldLocation);
151 const auto ecefOrientation = impl::nedToEcef(situation.orientation, situation.worldLocation);
152 const auto extrapolation = Parent::extrapolate(obj_.getSpatial(), situation.timeStamp, lastTimeStamp_);
153 if (impl::maxDistanceExceeded(ecefPosition, extrapolation.worldLocation, threshold_.distanceThreshold) ||
154 impl::maxRotationExceeded(ecefOrientation, extrapolation.orientation, orientationThresholdCos))
155 {
156 lastTimeStamp_ = situation.timeStamp;
157 obj_.setNextSpatial(toSpatialVariant(impl::toSituation(situation, ecefPosition, ecefOrientation), threshold_));
158 return true;
159 }
160
161 return false;
162}
163
164template <typename T>
165inline void SettableDeadReckoner<T>::setFrozen(sen::TimeStamp timeStamp, bool value)
166{
167 auto situation = Parent::extrapolate(obj_.getNextSpatial(), timeStamp, lastTimeStamp_);
168 situation.isFrozen = value;
169 lastTimeStamp_ = timeStamp;
170
171 obj_.setNextSpatial(toSpatialVariant(situation, threshold_));
172}
173
174template <typename T>
175inline typename SettableDeadReckoner<T>::SpatialVariant SettableDeadReckoner<T>::toSpatialVariant(
176 const Situation& situation,
177 const DrThreshold& threshold)
178{
179 const auto isMoving = impl::isMoving(situation.velocityVector);
180 const auto isAccelerating = impl::isAccelerating(situation.accelerationVector);
181
182 if (!isMoving && !isAccelerating)
183 {
184 return SpatialVariant {std::in_place_index<static_cast<size_t>(SpatialAlgorithm::drStatic)>,
188 }
189
190 const auto isRotating = impl::isRotating(situation.angularVelocity);
191 const auto isWorld = threshold.referenceSystem == ReferenceSystem::world;
192
193 // slow moving
194 if (isMoving && !isAccelerating)
195 {
196 // not rotating
197 if (!isRotating)
198 {
199 if (isWorld)
200 {
201 return SpatialVariant {std::in_place_index<static_cast<size_t>(SpatialAlgorithm::drFPW)>,
203 situation.isFrozen,
205 impl::toRpr<RprVelocity>(situation.velocityVector)}};
206 }
207 return SpatialVariant {std::in_place_index<static_cast<size_t>(SpatialAlgorithm::drFPB)>,
209 situation.isFrozen,
211 impl::toRpr<RprVelocity>(situation.velocityVector)}};
212 }
213
214 // rotating
215 if (isWorld)
216 {
217 return SpatialVariant {std::in_place_index<static_cast<size_t>(SpatialAlgorithm::drRPW)>,
219 situation.isFrozen,
221 impl::toRpr<RprVelocity>(situation.velocityVector),
223 }
224 return SpatialVariant {std::in_place_index<static_cast<size_t>(SpatialAlgorithm::drRPB)>,
226 situation.isFrozen,
228 impl::toRpr<RprVelocity>(situation.velocityVector),
230 }
231 // fast-moving not rotating
232 if (!isRotating)
233 {
234 if (isWorld)
235 {
236 return SpatialVariant {std::in_place_index<static_cast<size_t>(SpatialAlgorithm::drFVW)>,
238 situation.isFrozen,
240 impl::toRpr<RprVelocity>(situation.velocityVector),
241 impl::toRpr<RprAcceleration>(situation.accelerationVector)}};
242 }
243 return SpatialVariant {std::in_place_index<static_cast<size_t>(SpatialAlgorithm::drFVB)>,
245 situation.isFrozen,
247 impl::toRpr<RprVelocity>(situation.velocityVector),
248 impl::toRpr<RprAcceleration>(situation.accelerationVector)}};
249 }
250
251 // fast-moving rotating
252 if (isWorld)
253 {
254 return SpatialVariant {std::in_place_index<static_cast<size_t>(SpatialAlgorithm::drRVW)>,
256 situation.isFrozen,
258 impl::toRpr<RprVelocity>(situation.velocityVector),
259 impl::toRpr<RprAcceleration>(situation.accelerationVector),
261 }
262 return SpatialVariant {std::in_place_index<static_cast<size_t>(SpatialAlgorithm::drRVB)>,
264 situation.isFrozen,
266 impl::toRpr<RprVelocity>(situation.velocityVector),
267 impl::toRpr<RprAcceleration>(situation.accelerationVector),
269}
270
271} // namespace sen::util
272
273#endif // SEN_UTIL_DR_SETTABLE_DEAD_RECKONER_H
A point in time.
Definition timestamp.h:26
virtual Situation situation(sen::TimeStamp timeStamp)
Returns the extrapolated/smoothed situation of the object at the timestamp introduced as argument,...
std::variant_alternative_t< 2U, SpatialVariant > RpsSpatial
Definition dead_reckoner_base.h:112
DeadReckonerTemplateBase(DrConfig config={})
Definition dead_reckoner_base.h:136
std::variant_alternative_t< 4U, SpatialVariant > FvsSpatial
Definition dead_reckoner_base.h:114
decltype(std::declval< RvsSpatial >().orientation) RprOrientation
Definition dead_reckoner_base.h:116
decltype(std::declval< RvsSpatial >().worldLocation) RprLocation
Definition dead_reckoner_base.h:115
std::variant_alternative_t< 1U, SpatialVariant > FpsSpatial
Definition dead_reckoner_base.h:111
static Situation extrapolate(const SpatialVariant &spatial, sen::TimeStamp time, sen::TimeStamp lastTimeStamp)
Returns the extrapolated situation of the RPR Entity given its Spatial field and two timestamps that ...
Definition dead_reckoner_base.h:141
std::remove_const_t< std::remove_reference_t< decltype(std::declval< T >().getSpatial())> > SpatialVariant
Definition dead_reckoner_base.h:109
decltype(std::declval< RvsSpatial >().accelerationVector) RprAcceleration
Definition dead_reckoner_base.h:118
std::variant_alternative_t< 0U, SpatialVariant > StaticSpatial
Definition dead_reckoner_base.h:110
std::variant_alternative_t< 3U, SpatialVariant > RvsSpatial
Definition dead_reckoner_base.h:113
decltype(std::declval< RvsSpatial >().angularVelocity) RprAngularVelocity
Definition dead_reckoner_base.h:119
decltype(std::declval< RvsSpatial >().velocityVector) RprVelocity
Definition dead_reckoner_base.h:117
typename Parent::SpatialVariant SpatialVariant
Definition settable_dead_reckoner.h:61
bool setSpatial(const Situation &situation)
Updates the spatial property of the object when the extrapolation error exceeds the threshold....
Definition settable_dead_reckoner.h:132
typename Parent::FvsSpatial FvsSpatial
Definition settable_dead_reckoner.h:66
typename Parent::RprVelocity RprVelocity
Definition settable_dead_reckoner.h:69
typename Parent::StaticSpatial StaticSpatial
Definition settable_dead_reckoner.h:62
T & object() noexcept
Returns a mutable reference to the RPR object whose position is extrapolated.
Definition settable_dead_reckoner.h:120
typename Parent::RprAcceleration RprAcceleration
Definition settable_dead_reckoner.h:70
SettableDeadReckoner(T &object, DrThreshold thresholds={})
Definition settable_dead_reckoner.h:112
DeadReckonerTemplateBase< T > Parent
Definition settable_dead_reckoner.h:60
typename Parent::RprAngularVelocity RprAngularVelocity
Definition settable_dead_reckoner.h:71
void setFrozen(sen::TimeStamp timeStamp, bool value)
Directly sets the frozen state of the object's spatial to true/false. The timestamp is needed to cohe...
Definition settable_dead_reckoner.h:165
typename Parent::FpsSpatial FpsSpatial
Definition settable_dead_reckoner.h:63
~SettableDeadReckoner() override=default
typename Parent::RvsSpatial RvsSpatial
Definition settable_dead_reckoner.h:65
typename Parent::RprOrientation RprOrientation
Definition settable_dead_reckoner.h:68
typename Parent::RprLocation RprLocation
Definition settable_dead_reckoner.h:67
typename Parent::RpsSpatial RpsSpatial
Definition settable_dead_reckoner.h:64
ReferenceSystem referenceSystem
Definition settable_dead_reckoner.h:42
Location worldLocation
Position in ECEF.
Definition algorithms.h:156
Velocity velocityVector
Velocity vector with respect to ECEF or body reference system (depending on the reference system of t...
Definition algorithms.h:163
AngleRadians orientationThreshold
Definition settable_dead_reckoner.h:41
Orientation orientation
Orientation of the body reference system (x forward, y right, z down) with respect to ECEF.
Definition algorithms.h:159
Acceleration accelerationVector
Acceleration vector with respect to ECEF or body reference system (depending on the reference system ...
Definition algorithms.h:170
LengthMeters distanceThreshold
Definition settable_dead_reckoner.h:40
bool isFrozen
When true, no extrapolation is performed because the entity is frozen.
Definition algorithms.h:150
Location toEcef(const GeodeticWorldLocation &latLonAlt) noexcept
Translates from Geodetic (LatLonAlt) to ECEF WorldLocation coordinates.
bool maxRotationExceeded(const Orientation &newOrientation, const Orientation &extrapolatedOrientation, f64 threshold)
Returns true when the rotation threshold has been exceeded.
Orientation nedToEcef(const Orientation &value, const GeodeticWorldLocation &latLonAlt) noexcept
Translates the Orientation in euler angles from NED to ECEF using quaternions.
T toRpr(const Location &value)
Translates a Location struct to a RPR WorldLocation given as template argument.
Definition dead_reckoner_impl.h:122
bool isRotating(const AngularVelocity &omega)
Returns true when angular velocity acceleration is not null.
Situation toSituation(const GeodeticSituation &value) noexcept
Converts a situation from geodetic to ECEF.
bool isMoving(const Velocity &velocity)
Returns true when entity velocity is not null.
bool maxDistanceExceeded(const Location &newPosition, const Location &extrapolatedPosition, f64 threshold)
Returns true when the distance threshold has been exceeded.
bool isAccelerating(const Acceleration &acceleration)
Returns true when entity acceleration is not null.
ReferenceSystem
Enumeration of the reference system: world-centered or body-centered.
Definition settable_dead_reckoner.h:30
@ world
Definition settable_dead_reckoner.h:31
@ body
Definition settable_dead_reckoner.h:32
@ drFPW
Definition algorithms.h:212
@ drRVB
Definition algorithms.h:218
@ drFPB
Definition algorithms.h:216
@ drRVW
Definition algorithms.h:214
@ drFVB
Definition algorithms.h:219
@ drRPW
Definition algorithms.h:213
@ drRPB
Definition algorithms.h:217
@ drStatic
Definition algorithms.h:211
@ drFVW
Definition algorithms.h:215
How far the extrapolation may drift from the data before the Spatial is written: a distance per axis,...
Definition settable_dead_reckoner.h:39
GeodeticSituation structure with the following parameters:
Definition algorithms.h:180
Situation structure with the following parameters:
Definition algorithms.h:148
uint32_t u32
Definition numbers.h:25
float64_t f64
Definition numbers.h:29
Definition iterator_adapters.h:16
Definition assert.h:17