Sen API
Sen Libraries
Loading...
Searching...
No Matches
detail/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]
29{
30
31public:
32 SEN_NOCOPY_NOMOVE(DeadReckonerBase)
33
34public:
35 explicit DeadReckonerBase(DrConfig config = {});
36 virtual ~DeadReckonerBase() = default;
37
38public:
49 [[nodiscard]] virtual Situation situation(sen::TimeStamp timeStamp);
50
61 [[nodiscard]] virtual GeodeticSituation geodeticSituation(sen::TimeStamp timeStamp);
62
65 void updateSituation(const Situation& value);
66
70
71public: // config
72 [[nodiscard]] const DrConfig& getConfig() const noexcept;
73 void setConfig(const DrConfig& config);
74
75protected:
76 [[nodiscard]] const Situation& getSmoothSituation() const noexcept;
77 void smooth(const Situation& update);
78
81 [[nodiscard]] const Situation& smoothIfEnabled(const Situation& update);
82
83 void invalidateCache();
84
85 [[nodiscard]] bool isSituationCached(sen::TimeStamp timeStamp) const noexcept;
87 [[nodiscard]] const Situation& getCachedSituation() const noexcept;
88
89 [[nodiscard]] bool isGeodeticSituationCached(sen::TimeStamp timeStamp) const noexcept;
91 [[nodiscard]] const GeodeticSituation& getCachedGeodeticSituation() const noexcept;
92
93private:
94 DrConfig config_;
95 Situation lastSituation_;
96 Situation smoothSituation_;
97
98 // cache
99 Situation cachedSituation_;
100 GeodeticSituation cachedGeodeticSituation_;
101};
102// --8<-- [end:dead_reckoner_base]
103
105template <typename T>
107{
108public:
109 SEN_NOCOPY_NOMOVE(DeadReckonerTemplateBase)
110
111public:
112 explicit DeadReckonerTemplateBase(DrConfig config = {});
113 ~DeadReckonerTemplateBase() override = default;
114
115public: // relevant spatial types inferred from RPR
116 using SpatialVariant = std::remove_const_t<std::remove_reference_t<decltype(std::declval<T>().getSpatial())>>;
117 using StaticSpatial = std::variant_alternative_t<0U, SpatialVariant>;
118 using FpsSpatial = std::variant_alternative_t<1U, SpatialVariant>;
119 using RpsSpatial = std::variant_alternative_t<2U, SpatialVariant>;
120 using RvsSpatial = std::variant_alternative_t<3U, SpatialVariant>;
121 using FvsSpatial = std::variant_alternative_t<4U, SpatialVariant>;
122 using RprLocation = decltype(std::declval<RvsSpatial>().worldLocation);
123 using RprOrientation = decltype(std::declval<RvsSpatial>().orientation);
124 using RprVelocity = decltype(std::declval<RvsSpatial>().velocityVector);
125 using RprAcceleration = decltype(std::declval<RvsSpatial>().accelerationVector);
126 using RprAngularVelocity = decltype(std::declval<RvsSpatial>().angularVelocity);
127
128protected:
131 [[nodiscard]] static Situation extrapolate(const SpatialVariant& spatial,
133 sen::TimeStamp lastTimeStamp);
134};
135
137
138//-------------------------------------------------------------------------------------------------------------------
139// Inline implementation
140//-------------------------------------------------------------------------------------------------------------------
141
142template <typename T>
146
147template <typename T>
150 sen::TimeStamp lastTimeStamp)
151{
152 // NOTE: For efficiency, we handle more common cases prior in the switch.
153 switch (static_cast<SpatialAlgorithm>(spatial.index()))
154 {
156 {
157 const auto& value = std::get<4>(spatial);
158 return drFvw({value.isFrozen,
159 lastTimeStamp,
160 impl::fromRprLocation(value.worldLocation),
161 impl::fromRprOrientation(value.orientation),
162 impl::fromRprVelocity(value.velocityVector),
163 {},
164 impl::fromRprAcceleration(value.accelerationVector)},
165 time);
166 }
168 {
169 const auto& value = std::get<3>(spatial);
170 return drRvw({value.isFrozen,
171 lastTimeStamp,
172 impl::fromRprLocation(value.worldLocation),
173 impl::fromRprOrientation(value.orientation),
174 impl::fromRprVelocity(value.velocityVector),
175 impl::fromRprAngularVelocity(value.angularVelocity),
176 impl::fromRprAcceleration(value.accelerationVector)},
177 time);
178 }
180 {
181 const auto& value = std::get<1>(spatial);
182 return drFpw({value.isFrozen,
183 lastTimeStamp,
184 impl::fromRprLocation(value.worldLocation),
185 impl::fromRprOrientation(value.orientation),
186 impl::fromRprVelocity(value.velocityVector)},
187 time);
188 }
190 {
191 const auto& value = std::get<2>(spatial);
192 return drRpw({value.isFrozen,
193 lastTimeStamp,
194 impl::fromRprLocation(value.worldLocation),
195 impl::fromRprOrientation(value.orientation),
196 impl::fromRprVelocity(value.velocityVector),
197 impl::fromRprAngularVelocity(value.angularVelocity)},
198 time);
199 }
201 {
202 const auto& value = std::get<8>(spatial);
203 return drFvb({value.isFrozen,
204 lastTimeStamp,
205 impl::fromRprLocation(value.worldLocation),
206 impl::fromRprOrientation(value.orientation),
207 impl::fromRprVelocity(value.velocityVector),
208 {},
209 impl::fromRprAcceleration(value.accelerationVector)},
210 time);
211 }
213 {
214 const auto& value = std::get<7>(spatial);
215 return drRvb({value.isFrozen,
216 lastTimeStamp,
217 impl::fromRprLocation(value.worldLocation),
218 impl::fromRprOrientation(value.orientation),
219 impl::fromRprVelocity(value.velocityVector),
220 impl::fromRprAngularVelocity(value.angularVelocity),
221 impl::fromRprAcceleration(value.accelerationVector)},
222 time);
223 }
225 {
226 const auto& value = std::get<5>(spatial);
227 return drFpb({value.isFrozen,
228 lastTimeStamp,
229 impl::fromRprLocation(value.worldLocation),
230 impl::fromRprOrientation(value.orientation),
231 impl::fromRprVelocity(value.velocityVector)},
232 time);
233 }
235 {
236 const auto& value = std::get<6>(spatial);
237 return drRpb({value.isFrozen,
238 lastTimeStamp,
239 impl::fromRprLocation(value.worldLocation),
240 impl::fromRprOrientation(value.orientation),
241 impl::fromRprVelocity(value.velocityVector),
242 impl::fromRprAngularVelocity(value.angularVelocity)},
243 time);
244 }
246 {
247 const auto& value = std::get<0>(spatial);
248 return {
249 value.isFrozen, time, impl::fromRprLocation(value.worldLocation), impl::fromRprOrientation(value.orientation)};
250 }
251 default:
253 }
254}
255
257{
258 cachedSituation_ = {};
259 cachedGeodeticSituation_ = {};
260}
261
262inline bool DeadReckonerBase::isSituationCached(sen::TimeStamp timeStamp) const noexcept
263{
264 return timeStamp == cachedSituation_.timeStamp;
265}
266
267inline void DeadReckonerBase::setCachedSituation(const Situation& situation) { cachedSituation_ = situation; }
268
270{
271 return timeStamp == cachedGeodeticSituation_.timeStamp;
272}
273
275{
276 cachedGeodeticSituation_ = situation;
277}
278
279inline const Situation& DeadReckonerBase::getCachedSituation() const noexcept { return cachedSituation_; }
280
282{
283 return cachedGeodeticSituation_;
284}
285
286} // namespace sen::util
287
288#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 detail/dead_reckoner_base.h:279
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)
const Situation & smoothIfEnabled(const Situation &update)
Smooths the update when configured to and returns what to publish. With smoothing off the walk is ski...
void invalidateCache()
Definition detail/dead_reckoner_base.h:256
const GeodeticSituation & getCachedGeodeticSituation() const noexcept
Definition detail/dead_reckoner_base.h:281
void setCachedGeodeticSituation(const GeodeticSituation &situation)
Definition detail/dead_reckoner_base.h:274
void setCachedSituation(const Situation &situation)
Definition detail/dead_reckoner_base.h:267
bool isSituationCached(sen::TimeStamp timeStamp) const noexcept
Definition detail/dead_reckoner_base.h:262
void smooth(const Situation &update)
const Situation & getSmoothSituation() const noexcept
bool isGeodeticSituationCached(sen::TimeStamp timeStamp) const noexcept
Definition detail/dead_reckoner_base.h:269
std::variant_alternative_t< 2U, SpatialVariant > RpsSpatial
Definition detail/dead_reckoner_base.h:119
DeadReckonerTemplateBase(DrConfig config={})
Definition detail/dead_reckoner_base.h:143
std::variant_alternative_t< 4U, SpatialVariant > FvsSpatial
Definition detail/dead_reckoner_base.h:121
decltype(std::declval< RvsSpatial >().orientation) RprOrientation
Definition detail/dead_reckoner_base.h:123
decltype(std::declval< RvsSpatial >().worldLocation) RprLocation
Definition detail/dead_reckoner_base.h:122
std::variant_alternative_t< 1U, SpatialVariant > FpsSpatial
Definition detail/dead_reckoner_base.h:118
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 detail/dead_reckoner_base.h:148
std::remove_const_t< std::remove_reference_t< decltype(std::declval< T >().getSpatial())> > SpatialVariant
Definition detail/dead_reckoner_base.h:116
decltype(std::declval< RvsSpatial >().accelerationVector) RprAcceleration
Definition detail/dead_reckoner_base.h:125
std::variant_alternative_t< 0U, SpatialVariant > StaticSpatial
Definition detail/dead_reckoner_base.h:117
std::variant_alternative_t< 3U, SpatialVariant > RvsSpatial
Definition detail/dead_reckoner_base.h:120
~DeadReckonerTemplateBase() override=default
decltype(std::declval< RvsSpatial >().angularVelocity) RprAngularVelocity
Definition detail/dead_reckoner_base.h:126
decltype(std::declval< RvsSpatial >().velocityVector) RprVelocity
Definition detail/dead_reckoner_base.h:124
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:187
Velocity fromRprVelocity(const T &value)
Translates to a Velocity struct from a RPR Velocity.
Definition dead_reckoner_impl.h:180
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:194
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:173
SpatialAlgorithm
Length in meters.
Definition algorithms.h:58
Location fromRprLocation(const T &value)
Translates to a Location struct from a RPR WorldLocation.
Definition dead_reckoner_impl.h:167
Situation drFpw(const Situation &value, sen::TimeStamp time) noexcept
Returns the extrapolated situation using the FPW algorithm.
@ drFPW
Definition algorithms.h:60
@ drRVB
Definition algorithms.h:66
@ drFPB
Definition algorithms.h:64
@ drRVW
Definition algorithms.h:62
@ drFVB
Definition algorithms.h:67
@ drRPW
Definition algorithms.h:61
@ drRPB
Definition algorithms.h:65
@ drStatic
Definition algorithms.h:59
@ drFVW
Definition algorithms.h:63
Dead Reckoning configuration.
Definition algorithms.h:80
GeodeticSituation structure with the following parameters:
Definition algorithms.h:208
Situation structure with the following parameters:
Definition algorithms.h:176
#define SEN_UNREACHABLE()
Definition compiler_macros.h:420
@ time
Definition unit.h:34
Definition iterator_adapters.h:16
Definition assert.h:17
STL namespace.