Sen API
Sen Libraries
Loading...
Searching...
No Matches
dead_reckoner_base.h
Go to the documentation of this file.
1// === dead_reckoner_base.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_DETAIL_DEAD_RECKONER_BASE_H
9#define SEN_UTIL_DR_DETAIL_DEAD_RECKONER_BASE_H
10
11#include "dead_reckoner_impl.h"
12
13// sen
15
16namespace sen::util
17{
18
21
25{
26
27public:
28 SEN_NOCOPY_NOMOVE(DeadReckonerBase)
29
30public:
31 explicit DeadReckonerBase(DrConfig config = {});
32 virtual ~DeadReckonerBase() = default;
33
34public:
45 [[nodiscard]] virtual Situation situation(sen::TimeStamp timeStamp);
46
57 [[nodiscard]] virtual GeodeticSituation geodeticSituation(sen::TimeStamp timeStamp);
58
61 void updateSituation(const Situation& value);
62
66
67public: // config
68 [[nodiscard]] const DrConfig& getConfig() const noexcept;
69 void setConfig(const DrConfig& config);
70
71protected:
72 [[nodiscard]] const Situation& getSmoothSituation() const noexcept;
73 void smooth(const Situation& update);
74
75 void invalidateCache();
76
77 [[nodiscard]] bool isSituationCached(sen::TimeStamp timeStamp) const noexcept;
79 [[nodiscard]] const Situation& getCachedSituation() const noexcept;
80
81 [[nodiscard]] bool isGeodeticSituationCached(sen::TimeStamp timeStamp) const noexcept;
83 [[nodiscard]] const GeodeticSituation& getCachedGeodeticSituation() const noexcept;
84
85private:
86 DrConfig config_;
87 Situation lastSituation_;
88 Situation smoothSituation_;
89
90 // cache
91 Situation cachedSituation_;
92 GeodeticSituation cachedGeodeticSituation_;
93};
94
96template <typename T>
98{
99public:
100 SEN_NOCOPY_NOMOVE(DeadReckonerTemplateBase)
101
102public:
103 explicit DeadReckonerTemplateBase(DrConfig config = {});
104 ~DeadReckonerTemplateBase() override = default;
105
106public: // relevant spatial types inferred from RPR
107 using SpatialVariant = std::remove_const_t<std::remove_reference_t<decltype(std::declval<T>().getSpatial())>>;
108 using StaticSpatial = std::variant_alternative_t<0U, SpatialVariant>;
109 using FpsSpatial = std::variant_alternative_t<1U, SpatialVariant>;
110 using RpsSpatial = std::variant_alternative_t<2U, SpatialVariant>;
111 using RvsSpatial = std::variant_alternative_t<3U, SpatialVariant>;
112 using FvsSpatial = std::variant_alternative_t<4U, SpatialVariant>;
113 using RprLocation = decltype(std::declval<RvsSpatial>().worldLocation);
114 using RprOrientation = decltype(std::declval<RvsSpatial>().orientation);
115 using RprVelocity = decltype(std::declval<RvsSpatial>().velocityVector);
116 using RprAcceleration = decltype(std::declval<RvsSpatial>().accelerationVector);
117 using RprAngularVelocity = decltype(std::declval<RvsSpatial>().angularVelocity);
118
119protected:
122 [[nodiscard]] static Situation extrapolate(const SpatialVariant& spatial,
124 sen::TimeStamp lastTimeStamp);
125};
126
128
129//-------------------------------------------------------------------------------------------------------------------
130// Inline implementation
131//-------------------------------------------------------------------------------------------------------------------
132
133template <typename T>
137
138template <typename T>
141 sen::TimeStamp lastTimeStamp)
142{
143 // NOTE: For efficiency, we handle more common cases prior in the switch.
144 switch (static_cast<SpatialAlgorithm>(spatial.index()))
145 {
147 {
148 const auto& value = std::get<4>(spatial);
149 return drFvw({value.isFrozen,
150 lastTimeStamp,
151 impl::fromRprLocation(value.worldLocation),
152 impl::fromRprOrientation(value.orientation),
153 impl::fromRprVelocity(value.velocityVector),
154 {},
155 impl::fromRprAcceleration(value.accelerationVector)},
156 time);
157 }
159 {
160 const auto& value = std::get<3>(spatial);
161 return drRvw({value.isFrozen,
162 lastTimeStamp,
163 impl::fromRprLocation(value.worldLocation),
164 impl::fromRprOrientation(value.orientation),
165 impl::fromRprVelocity(value.velocityVector),
166 impl::fromRprAngularVelocity(value.angularVelocity),
167 impl::fromRprAcceleration(value.accelerationVector)},
168 time);
169 }
171 {
172 const auto& value = std::get<1>(spatial);
173 return drFpw({value.isFrozen,
174 lastTimeStamp,
175 impl::fromRprLocation(value.worldLocation),
176 impl::fromRprOrientation(value.orientation),
177 impl::fromRprVelocity(value.velocityVector)},
178 time);
179 }
181 {
182 const auto& value = std::get<2>(spatial);
183 return drRpw({value.isFrozen,
184 lastTimeStamp,
185 impl::fromRprLocation(value.worldLocation),
186 impl::fromRprOrientation(value.orientation),
187 impl::fromRprVelocity(value.velocityVector),
188 impl::fromRprAngularVelocity(value.angularVelocity)},
189 time);
190 }
192 {
193 const auto& value = std::get<8>(spatial);
194 return drFvb({value.isFrozen,
195 lastTimeStamp,
196 impl::fromRprLocation(value.worldLocation),
197 impl::fromRprOrientation(value.orientation),
198 impl::fromRprVelocity(value.velocityVector),
199 {},
200 impl::fromRprAcceleration(value.accelerationVector)},
201 time);
202 }
204 {
205 const auto& value = std::get<7>(spatial);
206 return drRvb({value.isFrozen,
207 lastTimeStamp,
208 impl::fromRprLocation(value.worldLocation),
209 impl::fromRprOrientation(value.orientation),
210 impl::fromRprVelocity(value.velocityVector),
211 impl::fromRprAngularVelocity(value.angularVelocity),
212 impl::fromRprAcceleration(value.accelerationVector)},
213 time);
214 }
216 {
217 const auto& value = std::get<5>(spatial);
218 return drFpb({value.isFrozen,
219 lastTimeStamp,
220 impl::fromRprLocation(value.worldLocation),
221 impl::fromRprOrientation(value.orientation),
222 impl::fromRprVelocity(value.velocityVector)},
223 time);
224 }
226 {
227 const auto& value = std::get<6>(spatial);
228 return drRpb({value.isFrozen,
229 lastTimeStamp,
230 impl::fromRprLocation(value.worldLocation),
231 impl::fromRprOrientation(value.orientation),
232 impl::fromRprVelocity(value.velocityVector),
233 impl::fromRprAngularVelocity(value.angularVelocity)},
234 time);
235 }
237 {
238 const auto& value = std::get<0>(spatial);
239 return {
240 value.isFrozen, time, impl::fromRprLocation(value.worldLocation), impl::fromRprOrientation(value.orientation)};
241 }
242 default:
244 }
245}
246
248{
249 cachedSituation_ = {};
250 cachedGeodeticSituation_ = {};
251}
252
253inline bool DeadReckonerBase::isSituationCached(sen::TimeStamp timeStamp) const noexcept
254{
255 return timeStamp == cachedSituation_.timeStamp;
256}
257
258inline void DeadReckonerBase::setCachedSituation(const Situation& situation) { cachedSituation_ = situation; }
259
261{
262 return timeStamp == cachedGeodeticSituation_.timeStamp;
263}
264
266{
267 cachedGeodeticSituation_ = situation;
268}
269
270inline const Situation& DeadReckonerBase::getCachedSituation() const noexcept { return cachedSituation_; }
271
273{
274 return cachedGeodeticSituation_;
275}
276
277} // namespace sen::util
278
279#endif // SEN_UTIL_DR_DETAIL_DEAD_RECKONER_BASE_H
A point in time.
Definition timestamp.h:26
const DrConfig & getConfig() const noexcept
virtual Situation situation(sen::TimeStamp timeStamp)
Returns the extrapolated/smoothed situation of the object at the timestamp introduced as argument,...
virtual ~DeadReckonerBase()=default
DeadReckonerBase(DrConfig config={})
virtual GeodeticSituation geodeticSituation(sen::TimeStamp timeStamp)
Returns the extrapolated/smoothed situation of the object at the timestamp introduced as argument,...
const Situation & getCachedSituation() const noexcept
Definition dead_reckoner_base.h:270
void updateSituation(const Situation &value)
Updates the last known real time Situation. A valid timestamp is needed inside the Situation provided...
void updateGeodeticSituation(const GeodeticSituation &value)
Updates the last known real time GeodeticSituation. A valid timestamp is needed inside the GeodeticSi...
void setConfig(const DrConfig &config)
void invalidateCache()
Definition dead_reckoner_base.h:247
const GeodeticSituation & getCachedGeodeticSituation() const noexcept
Definition dead_reckoner_base.h:272
void setCachedGeodeticSituation(const GeodeticSituation &situation)
Definition dead_reckoner_base.h:265
void setCachedSituation(const Situation &situation)
Definition dead_reckoner_base.h:258
bool isSituationCached(sen::TimeStamp timeStamp) const noexcept
Definition dead_reckoner_base.h:253
void smooth(const Situation &update)
const Situation & getSmoothSituation() const noexcept
bool isGeodeticSituationCached(sen::TimeStamp timeStamp) const noexcept
Definition dead_reckoner_base.h:260
std::variant_alternative_t< 2U, SpatialVariant > RpsSpatial
Definition dead_reckoner_base.h:110
DeadReckonerTemplateBase(DrConfig config={})
Definition dead_reckoner_base.h:134
std::variant_alternative_t< 4U, SpatialVariant > FvsSpatial
Definition dead_reckoner_base.h:112
decltype(std::declval< RvsSpatial >().orientation) RprOrientation
Definition dead_reckoner_base.h:114
decltype(std::declval< RvsSpatial >().worldLocation) RprLocation
Definition dead_reckoner_base.h:113
std::variant_alternative_t< 1U, SpatialVariant > FpsSpatial
Definition dead_reckoner_base.h:109
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:139
std::remove_const_t< std::remove_reference_t< decltype(std::declval< T >().getSpatial())> > SpatialVariant
Definition dead_reckoner_base.h:107
decltype(std::declval< RvsSpatial >().accelerationVector) RprAcceleration
Definition dead_reckoner_base.h:116
std::variant_alternative_t< 0U, SpatialVariant > StaticSpatial
Definition dead_reckoner_base.h:108
std::variant_alternative_t< 3U, SpatialVariant > RvsSpatial
Definition dead_reckoner_base.h:111
~DeadReckonerTemplateBase() override=default
decltype(std::declval< RvsSpatial >().angularVelocity) RprAngularVelocity
Definition dead_reckoner_base.h:117
decltype(std::declval< RvsSpatial >().velocityVector) RprVelocity
Definition dead_reckoner_base.h:115
Situation drRvb(const Situation &value, sen::TimeStamp time) noexcept
Returns the extrapolated situation using the RVB algorithm.
Situation drRvw(const Situation &value, sen::TimeStamp time) noexcept
Returns the extrapolated situation using the RVW algorithm.
Acceleration fromRprAcceleration(const T &value)
Translates to Acceleration struct from a RPR Acceleration.
Definition dead_reckoner_impl.h:160
Velocity fromRprVelocity(const T &value)
Translates to a Velocity struct from a RPR Velocity.
Definition dead_reckoner_impl.h:153
Situation drFpb(const Situation &value, sen::TimeStamp time) noexcept
Returns the extrapolated situation using the FPB algorithm. The velocity is expressed in body coordin...
Situation drFvb(const Situation &value, sen::TimeStamp time) noexcept
Returns the extrapolated situation using the FVB algorithm.
Situation drRpb(const Situation &value, sen::TimeStamp time) noexcept
Returns the extrapolated situation using the RPB algorithm. The input situation should be expressed i...
Situation drRpw(const Situation &value, sen::TimeStamp time) noexcept
Returns the extrapolated situation using the RPW algorithm.
AngularVelocity fromRprAngularVelocity(const T &value)
Translates to AngularVelocity struct from a RPR AngularVelocity.
Definition dead_reckoner_impl.h:167
Situation drFvw(const Situation &value, sen::TimeStamp time) noexcept
Returns the extrapolated situation using the FVW algorithm.
Orientation fromRprOrientation(const T &value)
Translates to an Orientation struct from a RPR Orientation.
Definition dead_reckoner_impl.h:146
SpatialAlgorithm
Enumeration of the different Spatial algorithms.
Definition algorithms.h:202
Location fromRprLocation(const T &value)
Translates to a Location struct from a RPR WorldLocation.
Definition dead_reckoner_impl.h:140
Situation drFpw(const Situation &value, sen::TimeStamp time) noexcept
Returns the extrapolated situation using the FPW algorithm.
@ drFPW
Definition algorithms.h:204
@ drRVB
Definition algorithms.h:210
@ drFPB
Definition algorithms.h:208
@ drRVW
Definition algorithms.h:206
@ drFVB
Definition algorithms.h:211
@ drRPW
Definition algorithms.h:205
@ drRPB
Definition algorithms.h:209
@ drStatic
Definition algorithms.h:203
@ drFVW
Definition algorithms.h:207
Length in meters.
Definition algorithms.h:58
GeodeticSituation structure with the following parameters:
Definition algorithms.h:173
Situation structure with the following parameters:
Definition algorithms.h:143
#define SEN_UNREACHABLE()
Definition compiler_macros.h:420
@ time
Definition unit.h:34
Definition iterator_adapters.h:16
Definition assert.h:17
STL namespace.