Sen API
Sen Libraries
Loading...
Searching...
No Matches
dead_reckoner.h
Go to the documentation of this file.
1// === 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_DEAD_RECKONER_H
9#define SEN_UTIL_DR_DEAD_RECKONER_H
10
13
14// sen
16
17// std
18#include <algorithm>
19
20namespace sen::util
21{
22
25
29// --8<-- [start:dead_reckoner]
30template <typename T>
32{
33public:
34 SEN_NOCOPY_NOMOVE(DeadReckoner)
35
36public: // RPR types from DeadReckonerTemplateBase
49
50public: // type aliases
53
54public:
57 explicit DeadReckoner(const T& object, DrConfig config = {});
58 ~DeadReckoner() override = default;
59
60public: // overrides DeadReckonerBase
61 [[nodiscard]] Situation situation(sen::TimeStamp timeStamp) override;
62 [[nodiscard]] GeodeticSituation geodeticSituation(sen::TimeStamp timeStamp) override;
63
64public:
66 [[nodiscard]] T& getObject() noexcept;
67
68public: // situation translation helpers
70 [[nodiscard]] static Situation toSituation(const SpatialVariant& spatial, sen::TimeStamp timeStamp = {});
71
73 [[nodiscard]] static GeodeticSituation toGeodeticSituation(const SpatialVariant& spatial,
74 sen::TimeStamp timeStamp = {});
75
76private:
79 [[nodiscard]] SituationProcessor getSituationProcessor(bool bodyReferenced);
80
83 [[nodiscard]] GeodeticSituationProcessor getGeodeticSituationProcessor(bool bodyReferenced);
84
86 void updateSpatial(sen::TimeStamp time);
87
88private:
89 const T& object_;
90 SituationProcessor processSituation_;
91 GeodeticSituationProcessor processGeodeticSituation_;
92 sen::TimeStamp lastTimeStamp_;
93 SpatialVariant lastSpatial_;
94};
95// --8<-- [end:dead_reckoner]
96
98
99//-------------------------------------------------------------------------------------------------------------------
100// Utils
101//-------------------------------------------------------------------------------------------------------------------
102
104[[nodiscard]] inline GeodeticSituation toGeodeticSituation(const Situation& value)
105{
106 return impl::toGeodeticSituation(value);
107}
108
110[[nodiscard]] inline Situation toSituation(const GeodeticSituation& value) { return impl::toSituation(value); }
111
112//-------------------------------------------------------------------------------------------------------------------
113// Inline implementation
114//-------------------------------------------------------------------------------------------------------------------
115
116template <typename T>
117inline DeadReckoner<T>::DeadReckoner(const T& object, DrConfig config)
118 : DeadReckonerTemplateBase<T>(config), object_ {object}
119{
120 const auto& objSpatial = object_.getSpatial();
121 // true if the DR algorithm used is body-centered
122 auto isBody =
123 std::find(bodyAlgorithms.begin(), bodyAlgorithms.end(), static_cast<SpatialAlgorithm>(objSpatial.index())) !=
124 bodyAlgorithms.end();
125
126 // initialize situation and geodetic situation processors
127 processSituation_ = getSituationProcessor(isBody);
128 processGeodeticSituation_ = getGeodeticSituationProcessor(isBody);
130}
131
132template <typename T>
134{
135 if (!this->isSituationCached(timeStamp))
136 {
137 this->setCachedSituation(processSituation_(timeStamp));
138 }
139 return this->getCachedSituation();
140}
141
142template <typename T>
144{
145 if (!this->isGeodeticSituationCached(timeStamp))
146 {
147 this->setCachedGeodeticSituation(processGeodeticSituation_(timeStamp));
148 }
149 return this->getCachedGeodeticSituation();
150}
151
152template <typename T>
153inline T& DeadReckoner<T>::getObject() noexcept
154{
155 return const_cast<T&>(object_); // NOLINT
156}
157
158template <typename T>
160{
161 return std::visit(sen::Overloaded {[&timeStamp](const StaticSpatial& value)
162 {
163 return Situation {value.isFrozen,
164 timeStamp,
165 impl::fromRprLocation(value.worldLocation),
166 impl::fromRprOrientation(value.orientation)};
167 },
168 [&timeStamp](const FpsSpatial& value)
169 {
170 return Situation {value.isFrozen,
171 timeStamp,
172 impl::fromRprLocation(value.worldLocation),
173 impl::fromRprOrientation(value.orientation),
174 impl::fromRprVelocity(value.velocityVector)};
175 },
176 [&timeStamp](const RpsSpatial& value)
177 {
178 return Situation {value.isFrozen,
179 timeStamp,
180 impl::fromRprLocation(value.worldLocation),
181 impl::fromRprOrientation(value.orientation),
182 impl::fromRprVelocity(value.velocityVector),
183 impl::fromRprAngularVelocity(value.angularVelocity)};
184 },
185 [&timeStamp](const RvsSpatial& value)
186 {
187 return Situation {value.isFrozen,
188 timeStamp,
189 impl::fromRprLocation(value.worldLocation),
190 impl::fromRprOrientation(value.orientation),
191 impl::fromRprVelocity(value.velocityVector),
192 impl::fromRprAngularVelocity(value.angularVelocity),
193 impl::fromRprAcceleration(value.accelerationVector)};
194 },
195 [&timeStamp](const FvsSpatial& value)
196 {
197 return Situation {value.isFrozen,
198 timeStamp,
199 impl::fromRprLocation(value.worldLocation),
200 impl::fromRprOrientation(value.orientation),
201 impl::fromRprVelocity(value.velocityVector),
202 {},
203 impl::fromRprAcceleration(value.accelerationVector)};
204 }},
205 spatial);
206}
207
208template <typename T>
210{
211 const auto situation = toSituation(spatial, timeStamp);
212 const auto geoLocation = impl::toLla(situation.worldLocation);
213 const auto nedOrientation = impl::ecefToNed(situation.orientation, geoLocation);
214
215 // body centered algorithms
216 if (std::find(bodyAlgorithms.begin(), bodyAlgorithms.end(), static_cast<SpatialAlgorithm>(spatial.index())) !=
217 bodyAlgorithms.end())
218 {
219 return {situation.isFrozen,
220 situation.timeStamp,
221 geoLocation,
222 nedOrientation,
223 impl::bodyToNed(situation.velocityVector, nedOrientation),
224 situation.angularVelocity,
225 impl::bodyToNed(situation.accelerationVector, nedOrientation),
226 situation.angularAcceleration};
227 }
228
229 // world-centered algorithms
230 return {situation.isFrozen,
231 situation.timeStamp,
232 geoLocation,
233 nedOrientation,
234 impl::ecefToNed(situation.velocityVector, geoLocation),
235 situation.angularVelocity,
236 impl::ecefToNed(situation.accelerationVector, geoLocation),
237 situation.angularAcceleration};
238}
239
240template <typename T>
241typename DeadReckoner<T>::SituationProcessor DeadReckoner<T>::getSituationProcessor(bool bodyReferenced)
242{
243 if (bodyReferenced)
244 {
245 return [this](sen::TimeStamp time)
246 {
247 updateSpatial(time);
248 return Parent::extrapolate(lastSpatial_, time, lastTimeStamp_);
249 };
250 }
251
252 return [this](sen::TimeStamp time)
253 {
254 updateSpatial(time);
255 const auto update = Parent::extrapolate(lastSpatial_, time, lastTimeStamp_);
258 };
259}
260
261template <typename T>
262typename DeadReckoner<T>::GeodeticSituationProcessor DeadReckoner<T>::getGeodeticSituationProcessor(bool bodyReferenced)
263{
264 if (bodyReferenced)
265 {
266 return [this](sen::TimeStamp time)
267 {
268 const auto situation = processSituation_(time);
269 const auto geoLocation = impl::toLla(situation.worldLocation);
270 const auto nedOrientation = impl::ecefToNed(situation.orientation, geoLocation);
271 return GeodeticSituation {situation.isFrozen,
272 situation.timeStamp,
273 geoLocation,
274 nedOrientation,
275 impl::bodyToNed(situation.velocityVector, nedOrientation),
276 situation.angularVelocity,
277 impl::bodyToNed(situation.accelerationVector, nedOrientation),
278 situation.angularAcceleration};
279 };
280 }
281
282 return [this](sen::TimeStamp time) { return impl::toGeodeticSituation(processSituation_(time)); };
283}
284
285template <typename T>
286void DeadReckoner<T>::updateSpatial(sen::TimeStamp time)
287{
288 if (const auto& newSpatial = object_.getSpatial(); newSpatial != lastSpatial_)
289 {
290 lastSpatial_ = newSpatial;
291 lastTimeStamp_ = time;
292 this->invalidateCache();
293 }
294}
295
296} // namespace sen::util
297
298#endif // SEN_UTIL_DR_DEAD_RECKONER_H
A point in time.
Definition timestamp.h:26
const DrConfig & getConfig() const noexcept
const Situation & getCachedSituation() const noexcept
Definition dead_reckoner_base.h:272
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
DeadReckonerTemplateBase< T > Parent
Definition dead_reckoner.h:37
typename Parent::RprOrientation RprOrientation
Definition dead_reckoner.h:45
typename Parent::StaticSpatial StaticSpatial
Definition dead_reckoner.h:39
T & getObject() noexcept
Provides direct mutable access to the internal object managed by this instance of the DeadReckoner.
Definition dead_reckoner.h:153
Situation situation(sen::TimeStamp timeStamp) override
Returns the extrapolated/smoothed situation of the object at the timestamp introduced as argument,...
Definition dead_reckoner.h:133
std::function< Situation(sen::TimeStamp)> SituationProcessor
Definition dead_reckoner.h:51
typename Parent::RprAngularVelocity RprAngularVelocity
Definition dead_reckoner.h:48
typename Parent::FpsSpatial FpsSpatial
Definition dead_reckoner.h:40
static Situation toSituation(const SpatialVariant &spatial, sen::TimeStamp timeStamp={})
Translates a SpatialVariant to a Situation struct.
Definition dead_reckoner.h:159
~DeadReckoner() override=default
DeadReckoner(const T &object, DrConfig config={})
Constructor for the DeadReckoner where an object inheriting from rpr::BaseEntity is inputted as a ref...
Definition dead_reckoner.h:117
typename Parent::SpatialVariant SpatialVariant
Definition dead_reckoner.h:38
typename Parent::RpsSpatial RpsSpatial
Definition dead_reckoner.h:41
static GeodeticSituation toGeodeticSituation(const SpatialVariant &spatial, sen::TimeStamp timeStamp={})
Translates a SpatialVariant to a GeodeticSituation struct.
Definition dead_reckoner.h:209
typename Parent::RprVelocity RprVelocity
Definition dead_reckoner.h:46
typename Parent::RprAcceleration RprAcceleration
Definition dead_reckoner.h:47
typename Parent::FvsSpatial FvsSpatial
Definition dead_reckoner.h:43
GeodeticSituation geodeticSituation(sen::TimeStamp timeStamp) override
Returns the extrapolated/smoothed situation of the object at the timestamp introduced as argument,...
Definition dead_reckoner.h:143
std::function< GeodeticSituation(sen::TimeStamp)> GeodeticSituationProcessor
Definition dead_reckoner.h:52
typename Parent::RvsSpatial RvsSpatial
Definition dead_reckoner.h:42
typename Parent::RprLocation RprLocation
Definition dead_reckoner.h:44
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
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
bool smoothing
If true, the position and orientation of the input data is smoothed removing noise.
Definition algorithms.h:63
Orientation ecefToNed(const Orientation &value, const GeodeticWorldLocation &latLonAlt) noexcept
Translates the Orientation in euler angles from ECEF to NED using quaternions.
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
GeodeticWorldLocation toLla(const Location &worldLocation) noexcept
Translates from ECEF Location to Geodetic (LatLonAlt) Location.
Situation toSituation(const GeodeticSituation &value) noexcept
Converts a situation from geodetic to ECEF.
GeodeticSituation toGeodeticSituation(const Situation &value) noexcept
Converts a situation from ECEF to geodetic, building the position rotation once for all three quantit...
AngularVelocity fromRprAngularVelocity(const T &value)
Translates to AngularVelocity struct from a RPR AngularVelocity.
Definition dead_reckoner_impl.h:179
Velocity bodyToNed(const Velocity &value, const Orientation &orientationNed) noexcept
Translates Velocity vectors expressed in body coordinates to NED coordinates.
constexpr std::array< SpatialAlgorithm, 4U > bodyAlgorithms
Definition algorithms.h:222
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
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
@ time
Definition unit.h:34
Definition iterator_adapters.h:16
Situation toSituation(const GeodeticSituation &value)
Transforms a GeodeticSituation to a Situation.
Definition dead_reckoner.h:110
GeodeticSituation toGeodeticSituation(const Situation &value)
Transform a Situation to a GeodeticSituation.
Definition dead_reckoner.h:104
Definition assert.h:17
Helper type for std::variant lambda visitors.
Definition class_helpers.h:170