|
INET Framework for OMNeT++/OMNEST
|
Abstract base class for mobility modules.
More...
#include <MobilityBase.h>
|
| | MobilityBase () |
| |
| virtual int | getId () const override |
| |
| 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 | initializePosition () |
| | Initializes mobility position. More...
|
| |
| virtual void | setInitialPosition () |
| | Initializes the position from the display string or from module parameters. 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 | handleSelfMessage (cMessage *msg)=0 |
| | Called upon arrival of a self messages, subclasses must override. 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) |
| |
Abstract base class for mobility modules.
Mobility modules inheriting from this base class may be stationary or may change their mobility state over simulation time. This base class only provides a few utility methods to handle some common tasks among mobility modules.
Subclasses must redefine handleSelfMessage() to update the mobility state and schedule the next update. Subclasses must also redefine initialize() to read their specific parameters and schedule the first update.
This base class also provides random initial placement as a default mechanism. After initialization the module updates the display and emits a signal to subscribers providing the mobility state. Receivers of this signal can query the mobility state through the IMobility interface.
◆ BorderPolicy
Selects how a mobility module should behave if it reaches the edge of the constraint area.
- See also
- handleIfOutside()
| Enumerator |
|---|
| REFLECT | reflect off the wall
|
| WRAP | reappear at the opposite edge (torus)
|
| PLACERANDOMLY | placed at a randomly chosen position within the constraint area
|
| RAISEERROR | stop the simulation with error
|
◆ MobilityBase()
| inet::MobilityBase::MobilityBase |
( |
| ) |
|
|
protected |
◆ checkPosition()
| void inet::MobilityBase::checkPosition |
( |
| ) |
|
|
protectedvirtual |
Checks whether the position is valid or not.
170 throw cRuntimeError(
"Mobility position (x=%g,y=%g,z=%g) is outside the constraint area (%g,%g,%g - %g,%g,%g)",
Referenced by initializePosition().
◆ emitMobilityStateChangedSignal()
| void inet::MobilityBase::emitMobilityStateChangedSignal |
( |
| ) |
|
|
protectedvirtual |
◆ findSubjectModule()
| virtual cModule* inet::MobilityBase::findSubjectModule |
( |
| ) |
|
|
inlineprotectedvirtual |
Returns the module that represents the object moved by this mobility module.
Reimplemented in inet::MoBanCoordinator.
123 {
return findModuleFromPar<cModule>(par(
"subjectModule"),
this); }
Referenced by initialize().
◆ getConstraintAreaMax()
| virtual const Coord& inet::MobilityBase::getConstraintAreaMax |
( |
| ) |
const |
|
inlineoverridevirtual |
◆ getConstraintAreaMin()
| virtual const Coord& inet::MobilityBase::getConstraintAreaMin |
( |
| ) |
const |
|
inlineoverridevirtual |
◆ getId()
| virtual int inet::MobilityBase::getId |
( |
| ) |
const |
|
inlineoverrideprotectedvirtual |
◆ getMaxSpeed()
| virtual double inet::MobilityBase::getMaxSpeed |
( |
| ) |
const |
|
inlineoverridevirtual |
Returns the maximum possible speed at any future time.
Implements inet::IMobility.
Reimplemented in inet::MoBanCoordinator, inet::MoBanLocal, inet::Ns2MotionMobility, inet::TurtleMobility, inet::AnsimMobility, inet::MassMobility, inet::BonnMotionMobility, inet::VehicleMobility, inet::CircleMobility, inet::GaussMarkovMobility, inet::RectangleMobility, inet::TractorMobility, inet::ChiangMobility, inet::RandomWaypointMobility, inet::LinearMobility, and inet::StationaryMobilityBase.
◆ getRandomPosition()
| Coord inet::MobilityBase::getRandomPosition |
( |
| ) |
|
|
protectedvirtual |
◆ handleIfOutside() [1/4]
◆ handleIfOutside() [2/4]
◆ handleIfOutside() [3/4]
◆ handleIfOutside() [4/4]
390 throw cRuntimeError(
"Invalid outside policy=%d in module '%s'", policy, getFullPath().c_str());
◆ handleMessage()
| void inet::MobilityBase::handleMessage |
( |
cMessage * |
msg | ) |
|
|
overrideprotectedvirtual |
This modules should only receive self-messages.
240 if (message->isSelfMessage())
243 throw cRuntimeError(
"Mobility modules can only receive self messages");
◆ handleParameterChange()
| void inet::MobilityBase::handleParameterChange |
( |
const char * |
name | ) |
|
|
overrideprotectedvirtual |
Allows changing parameters from the GUI.
Reimplemented in inet::FacingMobility.
232 if (name !=
nullptr) {
233 if (!strcmp(name,
"displayStringTextFormat"))
◆ handleSelfMessage()
| virtual void inet::MobilityBase::handleSelfMessage |
( |
cMessage * |
msg | ) |
|
|
protectedpure virtual |
◆ initialize()
| void inet::MobilityBase::initialize |
( |
int |
stage | ) |
|
|
overrideprotectedvirtual |
Initializes mobility model parameters.
Reimplemented in inet::MoBanCoordinator, inet::MoBanLocal, inet::TractorMobility, inet::Ns2MotionMobility, inet::MovingMobilityBase, inet::SuperpositioningMobility, inet::RotatingMobilityBase, inet::MassMobility, inet::TurtleMobility, inet::VehicleMobility, inet::CircleMobility, inet::RectangleMobility, inet::GaussMarkovMobility, inet::AnsimMobility, inet::BonnMotionMobility, inet::RandomWaypointMobility, inet::StaticLinearMobility, inet::ChiangMobility, inet::LinearMobility, inet::AttachedMobility, inet::StationaryMobility, and inet::FacingMobility.
89 cSimpleModule::initialize(stage);
90 EV_TRACE <<
"initializing MobilityBase stage " << stage << endl;
Referenced by inet::FacingMobility::initialize(), inet::StationaryMobility::initialize(), inet::AttachedMobility::initialize(), inet::StaticLinearMobility::initialize(), inet::RotatingMobilityBase::initialize(), inet::SuperpositioningMobility::initialize(), and inet::MovingMobilityBase::initialize().
◆ initializeOrientation()
| void inet::MobilityBase::initializeOrientation |
( |
| ) |
|
|
protectedvirtual |
◆ initializePosition()
| void inet::MobilityBase::initializePosition |
( |
| ) |
|
|
protectedvirtual |
◆ isOutside()
| bool inet::MobilityBase::isOutside |
( |
| ) |
|
|
protectedvirtual |
◆ numInitStages()
| virtual int inet::MobilityBase::numInitStages |
( |
| ) |
const |
|
inlineoverrideprotectedvirtual |
Returns the required number of initialize stages.
Reimplemented in inet::MoBanCoordinator, inet::MoBanLocal, inet::Ns2MotionMobility, inet::SuperpositioningMobility, inet::MassMobility, inet::TurtleMobility, inet::CircleMobility, inet::GaussMarkovMobility, inet::TractorMobility, inet::AnsimMobility, inet::BonnMotionMobility, inet::RandomWaypointMobility, inet::RectangleMobility, inet::StaticLinearMobility, inet::ChiangMobility, inet::LinearMobility, inet::AttachedMobility, and inet::FacingMobility.
◆ placeRandomlyIfOutside()
| void inet::MobilityBase::placeRandomlyIfOutside |
( |
Coord & |
targetPosition | ) |
|
|
protectedvirtual |
Utility function to place the node randomly if it goes outside the constraint area.
Decision is made on lastPosition, but targetPosition will also be updated. (Pass a dummy you don't have it).
Referenced by handleIfOutside().
◆ raiseErrorIfOutside()
| void inet::MobilityBase::raiseErrorIfOutside |
( |
| ) |
|
|
protectedvirtual |
Utility function to raise an error if the node gets outside the constraint area.
346 throw cRuntimeError(
"Mobility moved outside the area %g,%g,%g - %g,%g,%g (x=%g,y=%g,z=%g)",
Referenced by handleIfOutside(), inet::RandomWaypointMobility::move(), inet::BonnMotionMobility::move(), inet::AnsimMobility::move(), and inet::Ns2MotionMobility::move().
◆ reflectIfOutside()
| void inet::MobilityBase::reflectIfOutside |
( |
Coord & |
targetPosition, |
|
|
Coord & |
velocity, |
|
|
rad & |
angle, |
|
|
rad & |
elevation, |
|
|
Quaternion & |
quaternion |
|
) |
| |
|
protectedvirtual |
Utility function to reflect the node if it goes outside the constraint area.
Decision is made on pos, but the variables passed as args will also be updated. (Pass dummies you don't have some of them).
285 heading =
deg(90) + (heading -
deg(90)) *
sign;
288 std::swap(quaternion.v.x, quaternion.v.y);
289 quaternion.v.x *= -1;
290 quaternion.v.y *= -1;
296 heading = heading *
sign;
298 quaternion.v.x *= -1;
299 quaternion.v.z *= -1;
305 elevation = elevation *
sign;
307 quaternion.v.x *= -1;
308 quaternion.v.y *= -1;
Referenced by handleIfOutside().
◆ refreshDisplay()
| void inet::MobilityBase::refreshDisplay |
( |
| ) |
const |
|
overrideprotectedvirtual |
◆ setInitialPosition()
| void inet::MobilityBase::setInitialPosition |
( |
| ) |
|
|
protectedvirtual |
Initializes the position from the display string or from module parameters.
Reimplemented in inet::MoBanCoordinator, inet::MoBanLocal, inet::Ns2MotionMobility, inet::SuperpositioningMobility, inet::TurtleMobility, inet::CircleMobility, inet::VehicleMobility, inet::RectangleMobility, inet::TractorMobility, inet::AnsimMobility, inet::BonnMotionMobility, inet::StaticLinearMobility, inet::StaticConcentricMobility, and inet::StaticGridMobility.
125 auto coordinateSystem = findModuleFromPar<IGeographicCoordinateSystem>(par(
"coordinateSystemModule"),
this);
126 if (
subjectModule !=
nullptr && hasPar(
"initFromDisplayString") && par(
"initFromDisplayString")) {
127 const char *
s =
subjectModule->getDisplayString().getTagArg(
"p", 2);
129 throw cRuntimeError(
"The coordinates of '%s' are invalid. Please remove automatic arrangement"
130 " (3rd argument of 'p' tag) from '@display' attribute.",
subjectModule->getFullPath().c_str());
136 EV_DEBUG <<
"position initialized from displayString and initialZ parameter: " <<
lastPosition << endl;
140 EV_DEBUG <<
"position initialized by random values: " <<
lastPosition << endl;
144 else if (coordinateSystem ==
nullptr && hasPar(
"initialX") && hasPar(
"initialY") && hasPar(
"initialZ")) {
148 EV_DEBUG <<
"position initialized from initialX/Y/Z parameters: " <<
lastPosition << endl;
150 else if (coordinateSystem !=
nullptr && hasPar(
"initialLatitude") && hasPar(
"initialLongitude") && hasPar(
"initialAltitude")) {
151 auto initialLatitude =
deg(par(
"initialLatitude"));
152 auto initialLongitude =
deg(par(
"initialLongitude"));
153 auto initialAltitude =
m(par(
"initialAltitude"));
154 lastPosition = coordinateSystem->computeSceneCoordinate(GeoCoord(initialLatitude, initialLongitude, initialAltitude));
155 EV_DEBUG <<
"position initialized from initialLatitude/Longitude/Altitude parameters: " <<
lastPosition << endl;
159 EV_DEBUG <<
"position initialized by random values: " <<
lastPosition << endl;
161 if (par(
"updateDisplayString"))
Referenced by initializePosition(), inet::RectangleMobility::setInitialPosition(), and inet::TurtleMobility::setInitialPosition().
◆ updateDisplayStringFromMobilityState()
| void inet::MobilityBase::updateDisplayStringFromMobilityState |
( |
| ) |
const |
|
protectedvirtual |
202 EV_TRACE <<
"current position = " << position << endl;
205 snprintf(buf,
sizeof(buf),
"%lf", subjectModulePosition.x);
206 buf[
sizeof(buf) - 1] = 0;
208 displayString.setTagArg(
"p", 0, buf);
209 snprintf(buf,
sizeof(buf),
"%lf", subjectModulePosition.y);
210 buf[
sizeof(buf) - 1] = 0;
211 displayString.setTagArg(
"p", 1, buf);
220 angularPosition.getSwingAndTwist(vector, swing, twist);
222 twist.getRotationAxisAndAngle(axis, angle);
225 snprintf(buf,
sizeof(buf),
"%lf", angle);
226 displayString.setTagArg(
"a", 0, buf);
Referenced by refreshDisplay(), and setInitialPosition().
◆ wrapIfOutside()
| void inet::MobilityBase::wrapIfOutside |
( |
Coord & |
targetPosition | ) |
|
|
protectedvirtual |
Utility function to wrap the node to the opposite edge (torus) if it goes outside the constraint area.
Decision is made on pos, but targetPosition will also be updated. (Pass a dummy you don't have it).
Referenced by handleIfOutside().
◆ canvasProjection
◆ constraintAreaMax
| Coord inet::MobilityBase::constraintAreaMax |
|
protected |
Referenced by checkPosition(), getRandomPosition(), inet::TurtleMobility::getValue(), inet::RectangleMobility::initialize(), initialize(), isOutside(), inet::RectangleMobility::move(), inet::GaussMarkovMobility::preventBorderHugging(), raiseErrorIfOutside(), reflectIfOutside(), inet::StaticLinearMobility::setInitialPosition(), and wrapIfOutside().
◆ constraintAreaMin
| Coord inet::MobilityBase::constraintAreaMin |
|
protected |
3 dimensional position and size of the constraint area (in meters).
Referenced by checkPosition(), getRandomPosition(), inet::TurtleMobility::getValue(), inet::RectangleMobility::initialize(), initialize(), isOutside(), inet::RectangleMobility::move(), inet::GaussMarkovMobility::preventBorderHugging(), raiseErrorIfOutside(), reflectIfOutside(), inet::StaticGridMobility::setInitialPosition(), inet::StaticConcentricMobility::setInitialPosition(), and wrapIfOutside().
◆ format
◆ lastOrientation
◆ lastPosition
| Coord inet::MobilityBase::lastPosition |
|
protected |
The last position that was reported.
Referenced by checkPosition(), inet::TurtleMobility::executeStatement(), inet::StaticLinearMobility::finish(), inet::AttachedMobility::getCurrentPosition(), inet::SuperpositioningMobility::getCurrentPosition(), inet::MovingMobilityBase::getCurrentPosition(), initialize(), inet::MoBanCoordinator::initialize(), inet::LineSegmentsMobilityBase::initializePosition(), isOutside(), inet::LineSegmentsMobilityBase::move(), inet::LinearMobility::move(), inet::GaussMarkovMobility::move(), inet::RectangleMobility::move(), inet::CircleMobility::move(), inet::MassMobility::move(), placeRandomlyIfOutside(), inet::GaussMarkovMobility::preventBorderHugging(), raiseErrorIfOutside(), inet::MoBanCoordinator::readConfigurationFile(), reflectIfOutside(), inet::MoBanLocal::refreshDisplay(), inet::TurtleMobility::resumeScript(), inet::MoBanCoordinator::selectDestination(), inet::MoBanCoordinator::selectPosture(), inet::StaticConcentricMobility::setInitialPosition(), inet::StaticGridMobility::setInitialPosition(), inet::BonnMotionMobility::setInitialPosition(), inet::StaticLinearMobility::setInitialPosition(), inet::AnsimMobility::setInitialPosition(), inet::TractorMobility::setInitialPosition(), inet::TurtleMobility::setInitialPosition(), inet::SuperpositioningMobility::setInitialPosition(), inet::Ns2MotionMobility::setInitialPosition(), inet::MoBanLocal::setInitialPosition(), setInitialPosition(), inet::MoBanLocal::setMoBANParameters(), inet::RandomWaypointMobility::setTargetPosition(), inet::ChiangMobility::setTargetPosition(), inet::AnsimMobility::setTargetPosition(), inet::BonnMotionMobility::setTargetPosition(), inet::TractorMobility::setTargetPosition(), inet::GaussMarkovMobility::setTargetPosition(), inet::MassMobility::setTargetPosition(), inet::Ns2MotionMobility::setTargetPosition(), inet::MoBanLocal::setTargetPosition(), inet::MoBanCoordinator::setTargetPosition(), inet::StationaryMobility::updateMobilityStateFromDisplayString(), and wrapIfOutside().
◆ subjectModule
| cModule* inet::MobilityBase::subjectModule |
|
protected |
The documentation for this class was generated from the following files:
virtual void emitMobilityStateChangedSignal()
Emits a signal with the updated mobility state.
Definition: MobilityBase.cc:246
@ REFLECT
reflect off the wall
Definition: MobilityBase.h:56
@ WRAP
reappear at the opposite edge (torus)
Definition: MobilityBase.h:57
static Quaternion NIL
Definition: Quaternion.h:21
Coord lastPosition
The last position that was reported.
Definition: MobilityBase.h:73
fscale< rad, rad2degScale > deg
Definition: Units.h:1158
static const Coord ZERO
Definition: Coord.h:27
virtual void checkPosition()
Checks whether the position is valid or not.
Definition: MobilityBase.cc:165
virtual bool isOutside()
Returns true if the mobility is outside of the constraint area.
Definition: MobilityBase.cc:260
static CanvasProjection * getCanvasProjection(const cCanvas *canvas)
Definition: CanvasProjection.cc:53
Quaternion lastOrientation
The last orientation that was reported.
Definition: MobilityBase.h:76
virtual cModule * findSubjectModule()
Returns the module that represents the object moved by this mobility module.
Definition: MobilityBase.h:123
@ PLACERANDOMLY
placed at a randomly chosen position within the constraint area
Definition: MobilityBase.h:58
virtual void wrapIfOutside(Coord &targetPosition)
Utility function to wrap the node to the opposite edge (torus) if it goes outside the constraint area...
Definition: MobilityBase.cc:318
virtual void updateDisplayStringFromMobilityState() const
Definition: MobilityBase.cc:197
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.
Definition: MobilityBase.cc:278
double x
Definition: Coord.h:36
INET_ALWAYS_INLINE void swap(IntrusivePtr< T > &lhs, IntrusivePtr< T > &ptr) noexcept
Definition: IntrusivePtr.h:194
Coord computeCanvasPointInverse(const cFigure::Point &point, double depth) const
Definition: CanvasProjection.cc:47
const CanvasProjection * canvasProjection
The 2D projection used on the canvas.
Definition: MobilityBase.h:67
value< double, units::s > s
Definition: Units.h:1235
virtual void handleIfOutside(BorderPolicy policy, Coord &targetPosition, Coord &velocity)
Invokes one of reflectIfOutside(), wrapIfOutside() and placeRandomlyIfOutside(), depending on the giv...
Definition: MobilityBase.cc:353
Coord constraintAreaMax
Definition: MobilityBase.h:70
static simsignal_t mobilityStateChangedSignal
A signal used to publish mobility state changes.
Definition: IMobility.h:40
INET_API InitStage INITSTAGE_SINGLE_MOBILITY
Initialization of single mobility modules: calculating the initial position and orientation.
double z
Definition: Coord.h:38
cFigure::Point computeCanvasPoint(const Coord &point) const
Definition: CanvasProjection.cc:34
#define NaN
Definition: INETMath.h:91
INET_API InitStage INITSTAGE_LOCAL
Initialization of local state that don't use or affect other modules includes:
int sign(double v)
Returns 1 if the parameter is greater than zero, -1 if less than zero, 0 otherwise.
Definition: INETMath.h:138
static Quaternion IDENTITY
Definition: Quaternion.h:20
virtual void raiseErrorIfOutside()
Utility function to raise an error if the node gets outside the constraint area.
Definition: MobilityBase.cc:343
#define NUM_INIT_STAGES
Definition: InitStageRegistry.h:73
MobilityBase()
Definition: MobilityBase.cc:39
StringFormat format
Definition: MobilityBase.h:78
virtual const Quaternion & getCurrentAngularPosition()=0
Returns the angular position at the current simulation time.
virtual void initializeOrientation()
Initializes the orientation from module parameters.
Definition: MobilityBase.cc:176
virtual void setInitialPosition()
Initializes the position from the display string or from module parameters.
Definition: MobilityBase.cc:122
virtual void initializePosition()
Initializes mobility position.
Definition: MobilityBase.cc:115
cModule * subjectModule
Pointer to visual representation module, to speed up repeated access.
Definition: MobilityBase.h:64
const value< double, units::unit > alpha(7.2973525376e-3)
virtual void placeRandomlyIfOutside(Coord &targetPosition)
Utility function to place the node randomly if it goes outside the constraint area.
Definition: MobilityBase.cc:334
virtual void handleSelfMessage(cMessage *msg)=0
Called upon arrival of a self messages, subclasses must override.
Coord constraintAreaMin
3 dimensional position and size of the constraint area (in meters).
Definition: MobilityBase.h:70
virtual const Coord & getCurrentPosition()=0
Returns the position at the current simulation time.
Coord normalize()
Updates the length of this position vector to be 1.
Definition: Coord.h:280
value< double, units::m > m
Definition: Units.h:1233
value< double, units::rad > rad
Definition: Units.h:1245
double rad2deg(double rad)
Convert a radian value to degree.
Definition: INETMath.h:188
double y
Definition: Coord.h:37
@ RAISEERROR
stop the simulation with error
Definition: MobilityBase.h:59
virtual Coord getRandomPosition()
Returns a new random position satisfying the constraint area.
Definition: MobilityBase.cc:251