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
43
46template <typename T>
49{
50public:
51 SEN_NOCOPY_NOMOVE(SettableDeadReckoner)
52
53public:
54 explicit SettableDeadReckoner(T& object, DrThreshold thresholds = {});
55 ~SettableDeadReckoner() override = default;
56
57public:
70
71public:
73 [[nodiscard]] T& object() noexcept;
74
76 [[nodiscard]] const T& object() const noexcept;
77
78public:
81 void setSpatial(const Situation& situation);
82
86
89 void setFrozen(sen::TimeStamp timeStamp, bool value);
90
91private:
94 SpatialVariant toSpatialVariant(const Situation& situation, const DrThreshold& threshold);
95
96private:
97 T& obj_;
98 sen::TimeStamp lastTimeStamp_;
99 DrThreshold threshold_;
100 const f64 orientationThresholdCos; // constant used to determine if the orientation threshold has been exceeded
101};
102
104
105//-------------------------------------------------------------------------------------------------------------------
106// Inline implementation
107//-------------------------------------------------------------------------------------------------------------------
108
109template <typename T>
111 : obj_ {object}
112 , threshold_ {thresholds}
113 , orientationThresholdCos {cos(static_cast<f64>(threshold_.orientationThreshold) * 0.5)}
114{
115}
116
117template <typename T>
119{
120 return obj_;
121}
122
123template <typename T>
124inline const T& SettableDeadReckoner<T>::object() const noexcept
125{
126 return obj_;
127}
128
129template <typename T>
131{
132 const auto extrapolation = Parent::extrapolate(obj_.getSpatial(), situation.timeStamp, lastTimeStamp_);
133 if (impl::maxDistanceExceeded(situation.worldLocation, extrapolation.worldLocation, threshold_.distanceThreshold) ||
134 impl::maxRotationExceeded(situation.orientation, extrapolation.orientation, orientationThresholdCos))
135 {
136 lastTimeStamp_ = situation.timeStamp;
137 obj_.setNextSpatial(toSpatialVariant(situation, threshold_));
138 }
139}
140
141template <typename T>
143{
144 // translate input geodetic situation to standard reference system
145 const auto ecefPosition = impl::toEcef(situation.worldLocation);
146 const auto ecefOrientation = impl::nedToEcef(situation.orientation, situation.worldLocation);
147 const auto extrapolation = Parent::extrapolate(obj_.getSpatial(), situation.timeStamp, lastTimeStamp_);
148 if (impl::maxDistanceExceeded(ecefPosition, extrapolation.worldLocation, threshold_.distanceThreshold) ||
149 impl::maxRotationExceeded(ecefOrientation, extrapolation.orientation, orientationThresholdCos))
150 {
151 lastTimeStamp_ = situation.timeStamp;
152 obj_.setNextSpatial(toSpatialVariant({situation.isFrozen,
153 situation.timeStamp,
154 ecefPosition,
155 ecefOrientation,
156 impl::nedToEcef(situation.velocityVector, situation.worldLocation),
157 situation.angularVelocity,
158 impl::nedToEcef(situation.accelerationVector, situation.worldLocation)},
159 threshold_));
160 }
161}
162
163template <typename T>
164inline void SettableDeadReckoner<T>::setFrozen(sen::TimeStamp timeStamp, bool value)
165{
166 auto situation = Parent::extrapolate(obj_.getNextSpatial(), timeStamp, lastTimeStamp_);
167 situation.isFrozen = value;
168 lastTimeStamp_ = timeStamp;
169
170 obj_.setNextSpatial(toSpatialVariant(situation, threshold_));
171}
172
173template <typename T>
174inline typename SettableDeadReckoner<T>::SpatialVariant SettableDeadReckoner<T>::toSpatialVariant(
175 const Situation& situation,
176 const DrThreshold& threshold)
177{
178 const auto isMoving = impl::isMoving(situation.velocityVector);
179 const auto isAccelerating = impl::isAccelerating(situation.accelerationVector);
180
181 if (!isMoving && !isAccelerating)
182 {
183 return SpatialVariant {std::in_place_index<static_cast<size_t>(SpatialAlgorithm::drStatic)>,
187 }
188
189 const auto isRotating = impl::isRotating(situation.angularVelocity);
190 const auto isWorld = threshold.referenceSystem == ReferenceSystem::world;
191
192 // slow moving
193 if (isMoving && !isAccelerating)
194 {
195 // not rotating
196 if (!isRotating)
197 {
198 if (isWorld)
199 {
200 return SpatialVariant {std::in_place_index<static_cast<size_t>(SpatialAlgorithm::drFPW)>,
202 situation.isFrozen,
204 impl::toRpr<RprVelocity>(situation.velocityVector)}};
205 }
206 return SpatialVariant {std::in_place_index<static_cast<size_t>(SpatialAlgorithm::drFPB)>,
208 situation.isFrozen,
210 impl::toRpr<RprVelocity>(situation.velocityVector)}};
211 }
212
213 // rotating
214 if (isWorld)
215 {
216 return SpatialVariant {std::in_place_index<static_cast<size_t>(SpatialAlgorithm::drRPW)>,
218 situation.isFrozen,
220 impl::toRpr<RprVelocity>(situation.velocityVector),
222 }
223 return SpatialVariant {std::in_place_index<static_cast<size_t>(SpatialAlgorithm::drRPB)>,
225 situation.isFrozen,
227 impl::toRpr<RprVelocity>(situation.velocityVector),
229 }
230 // fast-moving not rotating
231 if (!isRotating)
232 {
233 if (isWorld)
234 {
235 return SpatialVariant {std::in_place_index<static_cast<size_t>(SpatialAlgorithm::drFVW)>,
237 situation.isFrozen,
239 impl::toRpr<RprVelocity>(situation.velocityVector),
240 impl::toRpr<RprAcceleration>(situation.accelerationVector)}};
241 }
242 return SpatialVariant {std::in_place_index<static_cast<size_t>(SpatialAlgorithm::drFVB)>,
244 situation.isFrozen,
246 impl::toRpr<RprVelocity>(situation.velocityVector),
247 impl::toRpr<RprAcceleration>(situation.accelerationVector)}};
248 }
249
250 // fast-moving rotating
251 if (isWorld)
252 {
253 return SpatialVariant {std::in_place_index<static_cast<size_t>(SpatialAlgorithm::drRVW)>,
255 situation.isFrozen,
257 impl::toRpr<RprVelocity>(situation.velocityVector),
258 impl::toRpr<RprAcceleration>(situation.accelerationVector),
260 }
261 return SpatialVariant {std::in_place_index<static_cast<size_t>(SpatialAlgorithm::drRVB)>,
263 situation.isFrozen,
265 impl::toRpr<RprVelocity>(situation.velocityVector),
266 impl::toRpr<RprAcceleration>(situation.accelerationVector),
268}
269
270} // namespace sen::util
271
272#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: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
decltype(std::declval< RvsSpatial >().angularVelocity) RprAngularVelocity
Definition dead_reckoner_base.h:117
decltype(std::declval< RvsSpatial >().velocityVector) RprVelocity
Definition dead_reckoner_base.h:115
typename Parent::SpatialVariant SpatialVariant
Definition settable_dead_reckoner.h:59
typename Parent::FvsSpatial FvsSpatial
Definition settable_dead_reckoner.h:64
typename Parent::RprVelocity RprVelocity
Definition settable_dead_reckoner.h:67
typename Parent::StaticSpatial StaticSpatial
Definition settable_dead_reckoner.h:60
T & object() noexcept
Returns a mutable reference to the RPR object whose position is extrapolated.
Definition settable_dead_reckoner.h:118
typename Parent::RprAcceleration RprAcceleration
Definition settable_dead_reckoner.h:68
SettableDeadReckoner(T &object, DrThreshold thresholds={})
Definition settable_dead_reckoner.h:110
DeadReckonerTemplateBase< T > Parent
Definition settable_dead_reckoner.h:58
typename Parent::RprAngularVelocity RprAngularVelocity
Definition settable_dead_reckoner.h:69
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:164
typename Parent::FpsSpatial FpsSpatial
Definition settable_dead_reckoner.h:61
~SettableDeadReckoner() override=default
typename Parent::RvsSpatial RvsSpatial
Definition settable_dead_reckoner.h:63
void setSpatial(const Situation &situation)
Updates the spatial property of the object if the update period is exceeded or if the extrapolation e...
Definition settable_dead_reckoner.h:130
typename Parent::RprOrientation RprOrientation
Definition settable_dead_reckoner.h:66
typename Parent::RprLocation RprLocation
Definition settable_dead_reckoner.h:65
typename Parent::RpsSpatial RpsSpatial
Definition settable_dead_reckoner.h:62
ReferenceSystem referenceSystem
Definition settable_dead_reckoner.h:41
Location worldLocation
Position in ECEF.
Definition algorithms.h:151
Velocity velocityVector
Velocity vector with respect to ECEF or body reference system (depending on the reference system of t...
Definition algorithms.h:158
AngleRadians orientationThreshold
Definition settable_dead_reckoner.h:40
Orientation orientation
Orientation of the body reference system (x forward, y right, z down) with respect to ECEF.
Definition algorithms.h:154
Acceleration accelerationVector
Acceleration vector with respect to ECEF or body reference system (depending on the reference system ...
Definition algorithms.h:165
LengthMeters distanceThreshold
Definition settable_dead_reckoner.h:39
bool isFrozen
When true, no extrapolation is performed because the entity is frozen.
Definition algorithms.h:145
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:110
bool isRotating(const AngularVelocity &omega)
Returns true when angular velocity acceleration is not null.
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: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
Threshold configuration structure with the position error threshold (maximum distance between extrapo...
Definition settable_dead_reckoner.h:38
GeodeticSituation structure with the following parameters:
Definition algorithms.h:173
Situation structure with the following parameters:
Definition algorithms.h:143
uint32_t u32
Definition numbers.h:25
float64_t f64
Definition numbers.h:29
Definition iterator_adapters.h:16
Definition assert.h:17