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
22// --8<-- [start:dead_reckoner_base]
26{
27
28public:
29 SEN_NOCOPY_NOMOVE(DeadReckonerBase)
30
31public:
32 explicit DeadReckonerBase(DrConfig config = {});
33 virtual ~DeadReckonerBase() = default;
34
35public:
46 [[nodiscard]] virtual Situation situation(sen::TimeStamp timeStamp);
47
58 [[nodiscard]] virtual GeodeticSituation geodeticSituation(sen::TimeStamp timeStamp);
59
62 void updateSituation(const Situation& value);
63
67
68public: // config
69 [[nodiscard]] const DrConfig& getConfig() const noexcept;
70 void setConfig(const DrConfig& config);
71
72protected:
73 [[nodiscard]] const Situation& getSmoothSituation() const noexcept;
74 void smooth(const Situation& update);
75
76 void invalidateCache();
77
78 [[nodiscard]] bool isSituationCached(sen::TimeStamp timeStamp) const noexcept;
80 [[nodiscard]] const Situation& getCachedSituation() const noexcept;
81
82 [[nodiscard]] bool isGeodeticSituationCached(sen::TimeStamp timeStamp) const noexcept;
84 [[nodiscard]] const GeodeticSituation& getCachedGeodeticSituation() const noexcept;
85
86private:
87 DrConfig config_;
88 Situation lastSituation_;
89 Situation smoothSituation_;
90
91 // cache
92 Situation cachedSituation_;
93 GeodeticSituation cachedGeodeticSituation_;
94};
95// --8<-- [end:dead_reckoner_base]
96
98template <typename T>
100{
101public:
102 SEN_NOCOPY_NOMOVE(DeadReckonerTemplateBase)
103
104public:
105 explicit DeadReckonerTemplateBase(DrConfig config = {});
106 ~DeadReckonerTemplateBase() override = default;
107
108public: // relevant spatial types inferred from RPR
109 using SpatialVariant = std::remove_const_t<std::remove_reference_t<decltype(std::declval<T>().getSpatial())>>;
110 using StaticSpatial = std::variant_alternative_t<0U, SpatialVariant>;
111 using FpsSpatial = std::variant_alternative_t<1U, SpatialVariant>;
112 using RpsSpatial = std::variant_alternative_t<2U, SpatialVariant>;
113 using RvsSpatial = std::variant_alternative_t<3U, SpatialVariant>;
114 using FvsSpatial = std::variant_alternative_t<4U, SpatialVariant>;
115 using RprLocation = decltype(std::declval<RvsSpatial>().worldLocation);
116 using RprOrientation = decltype(std::declval<RvsSpatial>().orientation);
117 using RprVelocity = decltype(std::declval<RvsSpatial>().velocityVector);
118 using RprAcceleration = decltype(std::declval<RvsSpatial>().accelerationVector);
119 using RprAngularVelocity = decltype(std::declval<RvsSpatial>().angularVelocity);
120
121protected:
124 [[nodiscard]] static Situation extrapolate(const SpatialVariant& spatial,
126 sen::TimeStamp lastTimeStamp);
127};
128
130
131//-------------------------------------------------------------------------------------------------------------------
132// Inline implementation
133//-------------------------------------------------------------------------------------------------------------------
134
135template <typename T>
139
140template <typename T>
143 sen::TimeStamp lastTimeStamp)
144{
145 // NOTE: For efficiency, we handle more common cases prior in the switch.
146 switch (static_cast<SpatialAlgorithm>(spatial.index()))
147 {
149 {
150 const auto& value = std::get<4>(spatial);
151 return drFvw({value.isFrozen,
152 lastTimeStamp,
153 impl::fromRprLocation(value.worldLocation),
154 impl::fromRprOrientation(value.orientation),
155 impl::fromRprVelocity(value.velocityVector),
156 {},
157 impl::fromRprAcceleration(value.accelerationVector)},
158 time);
159 }
161 {
162 const auto& value = std::get<3>(spatial);
163 return drRvw({value.isFrozen,
164 lastTimeStamp,
165 impl::fromRprLocation(value.worldLocation),
166 impl::fromRprOrientation(value.orientation),
167 impl::fromRprVelocity(value.velocityVector),
168 impl::fromRprAngularVelocity(value.angularVelocity),
169 impl::fromRprAcceleration(value.accelerationVector)},
170 time);
171 }
173 {
174 const auto& value = std::get<1>(spatial);
175 return drFpw({value.isFrozen,
176 lastTimeStamp,
177 impl::fromRprLocation(value.worldLocation),
178 impl::fromRprOrientation(value.orientation),
179 impl::fromRprVelocity(value.velocityVector)},
180 time);
181 }
183 {
184 const auto& value = std::get<2>(spatial);
185 return drRpw({value.isFrozen,
186 lastTimeStamp,
187 impl::fromRprLocation(value.worldLocation),
188 impl::fromRprOrientation(value.orientation),
189 impl::fromRprVelocity(value.velocityVector),
190 impl::fromRprAngularVelocity(value.angularVelocity)},
191 time);
192 }
194 {
195 const auto& value = std::get<8>(spatial);
196 return drFvb({value.isFrozen,
197 lastTimeStamp,
198 impl::fromRprLocation(value.worldLocation),
199 impl::fromRprOrientation(value.orientation),
200 impl::fromRprVelocity(value.velocityVector),
201 {},
202 impl::fromRprAcceleration(value.accelerationVector)},
203 time);
204 }
206 {
207 const auto& value = std::get<7>(spatial);
208 return drRvb({value.isFrozen,
209 lastTimeStamp,
210 impl::fromRprLocation(value.worldLocation),
211 impl::fromRprOrientation(value.orientation),
212 impl::fromRprVelocity(value.velocityVector),
213 impl::fromRprAngularVelocity(value.angularVelocity),
214 impl::fromRprAcceleration(value.accelerationVector)},
215 time);
216 }
218 {
219 const auto& value = std::get<5>(spatial);
220 return drFpb({value.isFrozen,
221 lastTimeStamp,
222 impl::fromRprLocation(value.worldLocation),
223 impl::fromRprOrientation(value.orientation),
224 impl::fromRprVelocity(value.velocityVector)},
225 time);
226 }
228 {
229 const auto& value = std::get<6>(spatial);
230 return drRpb({value.isFrozen,
231 lastTimeStamp,
232 impl::fromRprLocation(value.worldLocation),
233 impl::fromRprOrientation(value.orientation),
234 impl::fromRprVelocity(value.velocityVector),
235 impl::fromRprAngularVelocity(value.angularVelocity)},
236 time);
237 }
239 {
240 const auto& value = std::get<0>(spatial);
241 return {
242 value.isFrozen, time, impl::fromRprLocation(value.worldLocation), impl::fromRprOrientation(value.orientation)};
243 }
244 default:
246 }
247}
248
250{
251 cachedSituation_ = {};
252 cachedGeodeticSituation_ = {};
253}
254
255inline bool DeadReckonerBase::isSituationCached(sen::TimeStamp timeStamp) const noexcept
256{
257 return timeStamp == cachedSituation_.timeStamp;
258}
259
260inline void DeadReckonerBase::setCachedSituation(const Situation& situation) { cachedSituation_ = situation; }
261
263{
264 return timeStamp == cachedGeodeticSituation_.timeStamp;
265}
266
268{
269 cachedGeodeticSituation_ = situation;
270}
271
272inline const Situation& DeadReckonerBase::getCachedSituation() const noexcept { return cachedSituation_; }
273
275{
276 return cachedGeodeticSituation_;
277}
278
279} // namespace sen::util
280
281#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:272
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:249
const GeodeticSituation & getCachedGeodeticSituation() const noexcept
Definition dead_reckoner_base.h:274
void setCachedGeodeticSituation(const GeodeticSituation &situation)
Definition dead_reckoner_base.h:267
void setCachedSituation(const Situation &situation)
Definition dead_reckoner_base.h:260
bool isSituationCached(sen::TimeStamp timeStamp) const noexcept
Definition dead_reckoner_base.h:255
void smooth(const Situation &update)
const Situation & getSmoothSituation() const noexcept
bool isGeodeticSituationCached(sen::TimeStamp timeStamp) const noexcept
Definition dead_reckoner_base.h:262
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
~DeadReckonerTemplateBase() override=default
decltype(std::declval< RvsSpatial >().angularVelocity) RprAngularVelocity
Definition dead_reckoner_base.h:119
decltype(std::declval< RvsSpatial >().velocityVector) RprVelocity
Definition dead_reckoner_base.h:117
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:172
Velocity fromRprVelocity(const T &value)
Translates to a Velocity struct from a RPR Velocity.
Definition dead_reckoner_impl.h:165
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:179
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:158
SpatialAlgorithm
Enumeration of the different Spatial algorithms.
Definition algorithms.h:210
Location fromRprLocation(const T &value)
Translates to a Location struct from a RPR WorldLocation.
Definition dead_reckoner_impl.h:152
Situation drFpw(const Situation &value, sen::TimeStamp time) noexcept
Returns the extrapolated situation using the FPW algorithm.
@ 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
Length in meters.
Definition algorithms.h:61
GeodeticSituation structure with the following parameters:
Definition algorithms.h:180
Situation structure with the following parameters:
Definition algorithms.h:148
#define SEN_UNREACHABLE()
Definition compiler_macros.h:420
@ time
Definition unit.h:34
Definition iterator_adapters.h:16
Definition assert.h:17
STL namespace.