INET Framework for OMNeT++/OMNEST
inet::SuperpositioningMobility Class Reference

#include <SuperpositioningMobility.h>

Inheritance diagram for inet::SuperpositioningMobility:
inet::MobilityBase inet::IMobility

Public Member Functions

virtual const CoordgetCurrentPosition () override
 Returns the position at the current simulation time. More...
 
virtual const CoordgetCurrentVelocity () override
 Returns the velocity at the current simulation time. More...
 
virtual const CoordgetCurrentAcceleration () override
 Returns the acceleration at the current simulation time. More...
 
virtual const QuaterniongetCurrentAngularPosition () override
 Returns the angular position at the current simulation time. More...
 
virtual const QuaterniongetCurrentAngularVelocity () override
 Returns the angular velocity at the current simulation time. More...
 
virtual const QuaterniongetCurrentAngularAcceleration () override
 Returns the angular acceleration at the current simulation time. More...
 
virtual void receiveSignal (cComponent *source, simsignal_t signal, cObject *object, cObject *details) override
 
- Public Member Functions inherited from inet::MobilityBase
virtual double getMaxSpeed () const override
 Returns the maximum possible speed at any future time. More...
 
virtual const CoordgetConstraintAreaMax () const override
 Returns the maximum position along each axes for. More...
 
virtual const CoordgetConstraintAreaMin () const override
 Returns the minimum position along each axes for. More...
 
- Public Member Functions inherited from inet::IMobility
virtual ~IMobility ()
 

Protected Types

enum  PositionComposition {
  PositionComposition::PC_UNDEFINED = -1, PositionComposition::PC_ZERO, PositionComposition::PC_SUM, PositionComposition::PC_AVERAGE,
  PositionComposition::PC_ELEMENT
}
 
enum  OrientationComposition {
  OrientationComposition::OC_UNDEFINED = -1, OrientationComposition::OC_ZERO, OrientationComposition::OC_SUM, OrientationComposition::OC_AVERAGE,
  OrientationComposition::OC_FACE_FORWARD, OrientationComposition::OC_ELEMENT
}
 

Protected Member Functions

virtual int numInitStages () const override
 Returns the required number of initialize stages. More...
 
virtual void initialize (int stage) override
 Initializes mobility model parameters. More...
 
virtual void handleSelfMessage (cMessage *msg) override
 Called upon arrival of a self messages, subclasses must override. More...
 
virtual void setInitialPosition () override
 Initializes the position from the display string or from module parameters. More...
 
- Protected Member Functions inherited from inet::MobilityBase
 MobilityBase ()
 
virtual int getId () const override
 
virtual void initializePosition ()
 Initializes mobility position. More...
 
virtual void checkPosition ()
 Checks whether the position is valid or not. More...
 
virtual void initializeOrientation ()
 Initializes the orientation from module parameters. More...
 
virtual void refreshDisplay () const override
 Moves the visual representation module's icon to the new position on the screen. More...
 
virtual void updateDisplayStringFromMobilityState () const
 
virtual void handleParameterChange (const char *name) override
 Allows changing parameters from the GUI. More...
 
virtual void handleMessage (cMessage *msg) override
 This modules should only receive self-messages. More...
 
virtual void emitMobilityStateChangedSignal ()
 Emits a signal with the updated mobility state. More...
 
virtual Coord getRandomPosition ()
 Returns a new random position satisfying the constraint area. More...
 
virtual cModule * findSubjectModule ()
 Returns the module that represents the object moved by this mobility module. More...
 
virtual bool isOutside ()
 Returns true if the mobility is outside of the constraint area. More...
 
virtual void reflectIfOutside (Coord &targetPosition, Coord &velocity, rad &angle, rad &elevation, Quaternion &quaternion)
 Utility function to reflect the node if it goes outside the constraint area. More...
 
virtual void wrapIfOutside (Coord &targetPosition)
 Utility function to wrap the node to the opposite edge (torus) if it goes outside the constraint area. More...
 
virtual void placeRandomlyIfOutside (Coord &targetPosition)
 Utility function to place the node randomly if it goes outside the constraint area. More...
 
virtual void raiseErrorIfOutside ()
 Utility function to raise an error if the node gets outside the constraint area. More...
 
virtual void handleIfOutside (BorderPolicy policy, Coord &targetPosition, Coord &velocity)
 Invokes one of reflectIfOutside(), wrapIfOutside() and placeRandomlyIfOutside(), depending on the given border policy. More...
 
virtual void handleIfOutside (BorderPolicy policy, Coord &targetPosition, Coord &velocity, rad &heading)
 
virtual void handleIfOutside (BorderPolicy policy, Coord &targetPosition, Coord &velocity, rad &heading, rad &elevation)
 
virtual void handleIfOutside (BorderPolicy policy, Coord &targetPosition, Coord &velocity, rad &heading, rad &elevation, Quaternion &quaternion)
 

Protected Attributes

Coord lastVelocity
 
Coord lastAcceleration
 
Quaternion lastAngularVelocity
 
Quaternion lastAngularAcceleration
 
PositionComposition positionComposition = PositionComposition::PC_UNDEFINED
 
OrientationComposition orientationComposition = OrientationComposition::OC_UNDEFINED
 
int positionElementIndex = -1
 
int orientationElementIndex = -1
 
std::vector< IMobility * > elements
 
- Protected Attributes inherited from inet::MobilityBase
cModule * subjectModule
 Pointer to visual representation module, to speed up repeated access. More...
 
const CanvasProjectioncanvasProjection
 The 2D projection used on the canvas. More...
 
Coord constraintAreaMin
 3 dimensional position and size of the constraint area (in meters). More...
 
Coord constraintAreaMax
 
Coord lastPosition
 The last position that was reported. More...
 
Quaternion lastOrientation
 The last orientation that was reported. More...
 
StringFormat format
 

Additional Inherited Members

- Public Types inherited from inet::MobilityBase
enum  BorderPolicy { REFLECT, WRAP, PLACERANDOMLY, RAISEERROR }
 Selects how a mobility module should behave if it reaches the edge of the constraint area. More...
 
- Static Public Attributes inherited from inet::IMobility
static simsignal_t mobilityStateChangedSignal = cComponent::registerSignal("mobilityStateChanged")
 A signal used to publish mobility state changes. More...
 

Member Enumeration Documentation

◆ OrientationComposition

Enumerator
OC_UNDEFINED 
OC_ZERO 
OC_SUM 
OC_AVERAGE 
OC_FACE_FORWARD 
OC_ELEMENT 
26  {
27  OC_UNDEFINED = -1,
28  OC_ZERO,
29  OC_SUM,
30  OC_AVERAGE,
31  OC_FACE_FORWARD,
32  OC_ELEMENT,
33  };

◆ PositionComposition

Enumerator
PC_UNDEFINED 
PC_ZERO 
PC_SUM 
PC_AVERAGE 
PC_ELEMENT 
18  {
19  PC_UNDEFINED = -1,
20  PC_ZERO,
21  PC_SUM,
22  PC_AVERAGE,
23  PC_ELEMENT,
24  };

Member Function Documentation

◆ getCurrentAcceleration()

const Coord & inet::SuperpositioningMobility::getCurrentAcceleration ( )
overridevirtual

Returns the acceleration at the current simulation time.

Implements inet::IMobility.

110 {
111  switch (positionComposition) {
114  break;
118  for (auto element : elements)
119  lastAcceleration += element->getCurrentAcceleration();
121  lastAcceleration /= elements.size();
122  break;
124  lastAcceleration = elements[positionElementIndex]->getCurrentAcceleration();
125  break;
126  default:
127  throw cRuntimeError("Unknown orientation composition");
128  }
129  return lastAcceleration;
130 }

◆ getCurrentAngularAcceleration()

const Quaternion & inet::SuperpositioningMobility::getCurrentAngularAcceleration ( )
overridevirtual

Returns the angular acceleration at the current simulation time.

Implements inet::IMobility.

220 {
221  switch (orientationComposition) {
224  break;
227  for (auto element : elements)
228  lastAngularAcceleration *= Quaternion(element->getCurrentAngularAcceleration());
229  break;
232  break;
235  break;
238  break;
239  default:
240  throw cRuntimeError("Unknown orientation composition");
241  }
243 }

◆ getCurrentAngularPosition()

const Quaternion & inet::SuperpositioningMobility::getCurrentAngularPosition ( )
overridevirtual

Returns the angular position at the current simulation time.

Implements inet::IMobility.

133 {
134  switch (orientationComposition) {
137  break;
140  for (auto element : elements)
141  lastOrientation *= Quaternion(element->getCurrentAngularPosition());
142  break;
144  Coord rotatedX;
145  Coord rotatedY;
146  Coord rotatedZ;
147  for (auto element : elements) {
148  Quaternion quaternion(element->getCurrentAngularPosition());
149  rotatedX += quaternion.rotate(Coord::X_AXIS);
150  rotatedY += quaternion.rotate(Coord::Y_AXIS);
151  rotatedZ += quaternion.rotate(Coord::Z_AXIS);
152  }
153  rotatedX.normalize();
154  rotatedY.normalize();
155  rotatedZ.normalize();
156  double matrix[3][3];
157  matrix[0][0] = rotatedX.x;
158  matrix[1][0] = rotatedX.y;
159  matrix[2][0] = rotatedX.z;
160  matrix[0][1] = rotatedY.x;
161  matrix[1][1] = rotatedY.y;
162  matrix[2][1] = rotatedY.z;
163  matrix[0][2] = rotatedZ.x;
164  matrix[1][2] = rotatedZ.y;
165  matrix[2][2] = rotatedZ.z;
166  if (!rotatedX.isUnspecified() && !rotatedY.isUnspecified() && !rotatedZ.isUnspecified())
167  lastOrientation = RotationMatrix(matrix).toQuaternion();
168  break;
169  }
171  // determine orientation based on direction
173  if (lastVelocity != Coord::ZERO) {
174  Coord direction = lastVelocity;
175  direction.normalize();
176  auto alpha = rad(atan2(direction.y, direction.x));
177  auto beta = rad(-asin(direction.z));
178  auto gamma = rad(0.0);
179  lastOrientation = Quaternion(EulerAngles(alpha, beta, gamma));
180  }
181  break;
182  }
184  lastOrientation = elements[orientationElementIndex]->getCurrentAngularPosition();
185  break;
186  }
187  default:
188  throw cRuntimeError("Unknown orientation composition");
189  }
190  return lastOrientation;
191 }

◆ getCurrentAngularVelocity()

const Quaternion & inet::SuperpositioningMobility::getCurrentAngularVelocity ( )
overridevirtual

Returns the angular velocity at the current simulation time.

Implements inet::IMobility.

194 {
195  switch (orientationComposition) {
198  break;
201  for (auto element : elements)
202  lastAngularVelocity *= Quaternion(element->getCurrentAngularVelocity());
203  break;
206  break;
209  break;
212  break;
213  default:
214  throw cRuntimeError("Unknown orientation composition");
215  }
216  return lastAngularVelocity;
217 }

◆ getCurrentPosition()

const Coord & inet::SuperpositioningMobility::getCurrentPosition ( )
overridevirtual

Returns the position at the current simulation time.

Implements inet::IMobility.

64 {
65  switch (positionComposition) {
68  break;
72  for (auto element : elements)
73  lastPosition += element->getCurrentPosition();
75  lastPosition /= elements.size();
76  break;
78  lastPosition = elements[positionElementIndex]->getCurrentPosition();
79  break;
80  default:
81  throw cRuntimeError("Unknown orientation composition");
82  }
83  return lastPosition;
84 }

Referenced by setInitialPosition().

◆ getCurrentVelocity()

const Coord & inet::SuperpositioningMobility::getCurrentVelocity ( )
overridevirtual

Returns the velocity at the current simulation time.

Implements inet::IMobility.

87 {
88  switch (positionComposition) {
91  break;
95  for (auto element : elements)
96  lastVelocity += element->getCurrentVelocity();
98  lastVelocity /= elements.size();
99  break;
101  lastVelocity = elements[positionElementIndex]->getCurrentVelocity();
102  break;
103  default:
104  throw cRuntimeError("Unknown orientation composition");
105  }
106  return lastVelocity;
107 }

Referenced by getCurrentAngularPosition().

◆ handleSelfMessage()

virtual void inet::SuperpositioningMobility::handleSelfMessage ( cMessage *  msg)
inlineoverrideprotectedvirtual

Called upon arrival of a self messages, subclasses must override.

Implements inet::MobilityBase.

50 { throw cRuntimeError("Unknown self message"); }

◆ initialize()

void inet::SuperpositioningMobility::initialize ( int  stage)
overrideprotectedvirtual

Initializes mobility model parameters.

Reimplemented from inet::MobilityBase.

17 {
19  EV_TRACE << "initializing SuperpositioningMobility stage " << stage << endl;
20  if (stage == INITSTAGE_LOCAL) {
21  const char *positionCompositionAsString = par("positionComposition");
22  if (!strcmp(positionCompositionAsString, "zero"))
24  else if (!strcmp(positionCompositionAsString, "sum"))
26  else if (!strcmp(positionCompositionAsString, "average"))
28  else {
30  positionElementIndex = std::stoi(positionCompositionAsString);
31  }
32  const char *orientationCompositionAsString = par("orientationComposition");
33  if (!strcmp(orientationCompositionAsString, "zero"))
35  else if (!strcmp(orientationCompositionAsString, "sum"))
37  else if (!strcmp(orientationCompositionAsString, "average"))
39  else if (!strcmp(orientationCompositionAsString, "faceForward"))
41  else {
43  orientationElementIndex = std::stoi(orientationCompositionAsString);
44  }
45  int numElements = par("numElements");
46  for (int i = 0; i < numElements; i++) {
47  auto element = getSubmodule("element", i);
48  element->subscribe(IMobility::mobilityStateChangedSignal, this);
49  elements.push_back(check_and_cast<IMobility *>(element));
50  }
51  WATCH(lastVelocity);
52  WATCH(lastAcceleration);
53  }
54  else if (stage == INITSTAGE_LAST)
56 }

◆ numInitStages()

virtual int inet::SuperpositioningMobility::numInitStages ( ) const
inlineoverrideprotectedvirtual

Returns the required number of initialize stages.

Reimplemented from inet::MobilityBase.

48 { return NUM_INIT_STAGES; }

◆ receiveSignal()

void inet::SuperpositioningMobility::receiveSignal ( cComponent *  source,
simsignal_t  signal,
cObject *  object,
cObject *  details 
)
overridevirtual
246 {
247  Enter_Method("%s", cComponent::getSignalName(signal));
248 
251 }

◆ setInitialPosition()

void inet::SuperpositioningMobility::setInitialPosition ( )
overrideprotectedvirtual

Initializes the position from the display string or from module parameters.

Reimplemented from inet::MobilityBase.

59 {
61 }

Member Data Documentation

◆ elements

◆ lastAcceleration

Coord inet::SuperpositioningMobility::lastAcceleration
protected

◆ lastAngularAcceleration

Quaternion inet::SuperpositioningMobility::lastAngularAcceleration
protected

◆ lastAngularVelocity

Quaternion inet::SuperpositioningMobility::lastAngularVelocity
protected

◆ lastVelocity

Coord inet::SuperpositioningMobility::lastVelocity
protected

◆ orientationComposition

◆ orientationElementIndex

int inet::SuperpositioningMobility::orientationElementIndex = -1
protected

◆ positionComposition

PositionComposition inet::SuperpositioningMobility::positionComposition = PositionComposition::PC_UNDEFINED
protected

◆ positionElementIndex

int inet::SuperpositioningMobility::positionElementIndex = -1
protected

The documentation for this class was generated from the following files:
inet::SuperpositioningMobility::PositionComposition::PC_SUM
@ PC_SUM
inet::SuperpositioningMobility::lastVelocity
Coord lastVelocity
Definition: SuperpositioningMobility.h:35
inet::INITSTAGE_LAST
INET_API InitStage INITSTAGE_LAST
Operations that no other initializations can depend on, e.g.
inet::MobilityBase::emitMobilityStateChangedSignal
virtual void emitMobilityStateChangedSignal()
Emits a signal with the updated mobility state.
Definition: MobilityBase.cc:246
inet::Quaternion::NIL
static Quaternion NIL
Definition: Quaternion.h:21
inet::MobilityBase::lastPosition
Coord lastPosition
The last position that was reported.
Definition: MobilityBase.h:73
inet::Coord::ZERO
static const Coord ZERO
Definition: Coord.h:27
inet::SuperpositioningMobility::lastAngularVelocity
Quaternion lastAngularVelocity
Definition: SuperpositioningMobility.h:37
inet::MobilityBase::lastOrientation
Quaternion lastOrientation
The last orientation that was reported.
Definition: MobilityBase.h:76
inet::SuperpositioningMobility::orientationElementIndex
int orientationElementIndex
Definition: SuperpositioningMobility.h:44
inet::SuperpositioningMobility::getCurrentVelocity
virtual const Coord & getCurrentVelocity() override
Returns the velocity at the current simulation time.
Definition: SuperpositioningMobility.cc:86
inet::SuperpositioningMobility::getCurrentPosition
virtual const Coord & getCurrentPosition() override
Returns the position at the current simulation time.
Definition: SuperpositioningMobility.cc:63
inet::SuperpositioningMobility::PositionComposition::PC_AVERAGE
@ PC_AVERAGE
inet::SuperpositioningMobility::positionComposition
PositionComposition positionComposition
Definition: SuperpositioningMobility.h:41
inet::SuperpositioningMobility::OrientationComposition::OC_ZERO
@ OC_ZERO
inet::IMobility::mobilityStateChangedSignal
static simsignal_t mobilityStateChangedSignal
A signal used to publish mobility state changes.
Definition: IMobility.h:40
inet::SuperpositioningMobility::elements
std::vector< IMobility * > elements
Definition: SuperpositioningMobility.h:45
inet::SuperpositioningMobility::PositionComposition::PC_ELEMENT
@ PC_ELEMENT
inet::Coord::Z_AXIS
static const Coord Z_AXIS
Definition: Coord.h:31
inet::SuperpositioningMobility::OrientationComposition::OC_FACE_FORWARD
@ OC_FACE_FORWARD
inet::INITSTAGE_LOCAL
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
inet::MobilityBase::initialize
virtual void initialize(int stage) override
Initializes mobility model parameters.
Definition: MobilityBase.cc:87
inet::Quaternion::IDENTITY
static Quaternion IDENTITY
Definition: Quaternion.h:20
inet::Coord::X_AXIS
static const Coord X_AXIS
Definition: Coord.h:29
NUM_INIT_STAGES
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
inet::SuperpositioningMobility::orientationComposition
OrientationComposition orientationComposition
Definition: SuperpositioningMobility.h:42
Enter_Method
#define Enter_Method(...)
Definition: SelfDoc.h:71
inet::SuperpositioningMobility::OrientationComposition::OC_SUM
@ OC_SUM
inet::MobilityBase::initializePosition
virtual void initializePosition()
Initializes mobility position.
Definition: MobilityBase.cc:115
inet::units::constants::alpha
const value< double, units::unit > alpha(7.2973525376e-3)
inet::SuperpositioningMobility::lastAngularAcceleration
Quaternion lastAngularAcceleration
Definition: SuperpositioningMobility.h:38
inet::SuperpositioningMobility::PositionComposition::PC_ZERO
@ PC_ZERO
inet::Coord::normalize
Coord normalize()
Updates the length of this position vector to be 1.
Definition: Coord.h:280
inet::SuperpositioningMobility::OrientationComposition::OC_ELEMENT
@ OC_ELEMENT
inet::SuperpositioningMobility::lastAcceleration
Coord lastAcceleration
Definition: SuperpositioningMobility.h:36
inet::units::values::rad
value< double, units::rad > rad
Definition: Units.h:1245
inet::SuperpositioningMobility::OrientationComposition::OC_AVERAGE
@ OC_AVERAGE
inet::Coord::Y_AXIS
static const Coord Y_AXIS
Definition: Coord.h:30
inet::SuperpositioningMobility::positionElementIndex
int positionElementIndex
Definition: SuperpositioningMobility.h:43