OMNET++:如何在 INET 4.0 中移动离散 NxN space 中的节点?
OMNET++: How to move node in a discrete NxN space in INET 4.0?
正如问题所暗示的,我想将我的 AdhocHost
移动到离散的 (100m x 100m)
space 中。也就是说,例如假设节点在(0,0)m
,那么它等待一秒钟,然后它"teleports"到(0,1)m
,没有跨越两个位置之间的距离。
我该怎么做?
写一个移动模型。将实际整数坐标存储为状态。创建一个每秒触发的计时器事件,并根据您的规则在该事件上修改坐标。您可以从头开始,也可以以固定移动模块为例。
关于 INET 中的移动模型:https://inet.omnetpp.org/users-guide/chap22.html
下面是我如何使用一个小技巧来完成的。
我的移动模型基于 TractorMobility
.
从 class TractorMobility
扩展后,我添加了另一个 Coord
变量,称为 vLastPosition
(代表虚拟最后位置)。此变量的作用与 TractorMobility
的 lastPosition
变量相同,并存储我的主机的最后位置。然后当涉及到移动主机并因此设置 lastPosition
变量时,我根据 vLastPosition
坐标的整数部分设置它。
因此我的移动模块仍然 "thinks" 主机不断移动,而主机仅在其位置的整数部分发生变化时移动。
我模块的 .ned
文件是:
import inet.mobility.single.TractorMobility;
import inet.mobility.contract.IMobility;
simple OfflinePhaseMobility extends TractorMobility like IMobility
{
parameters:
double hopSize @unit(m) = default(1m);
@class(inet::OfflinePhaseMobility);
}
这是我的自定义机动性的头文件 class (OfflinePhaseMobility.h
):
#ifndef OFFLINEPHASEMOBILITY_H_
#define OFFLINEPHASEMOBILITY_H_
#include "inet/common/INETDefs.h"
#include "inet/mobility/single/TractorMobility.h"
namespace inet{
class OfflinePhaseMobility : public TractorMobility{
protected:
virtual void setTargetPosition() override;
virtual void move() override;
Coord vLastPosition;
};
}//ns inet
#endif /* OFFLINEPHASEMOBILITY_H_ */
这是我的 OfflinePhaseMobility.cc
文件:
#include "OfflinePhaseMobility.h"
namespace inet{
Define_Module(OfflinePhaseMobility);
void OfflinePhaseMobility::setTargetPosition()
{
int sign;
Coord positionDelta = Coord::ZERO;
switch (step % 4) {
case 0:
positionDelta.x = x2 - x1;
break;
case 1:
case 3:
sign = (step / (2 * rowCount)) % 2 ? -1 : 1;
positionDelta.y = (y2 - y1) / rowCount * sign;
break;
case 2:
positionDelta.x = x1 - x2;
break;
}
step++;
targetPosition = vLastPosition + positionDelta;
nextChange = simTime() + positionDelta.length() / speed;
}
void OfflinePhaseMobility::move(){
simtime_t now = simTime();
if (now == nextChange) {
vLastPosition = targetPosition;
EV_INFO << "reached current target position = " << vLastPosition << endl;
setTargetPosition();
EV_INFO << "new target position = " << targetPosition << ", next change = " << nextChange << endl;
lastVelocity = (targetPosition - vLastPosition) / (nextChange - simTime()).dbl();
}
else if (now > lastUpdate) {
ASSERT(nextChange == -1 || now < nextChange);
vLastPosition += lastVelocity * (now - lastUpdate).dbl();
}
double hopSize = par("hopSize");
int numHopsX = vLastPosition.x / hopSize;
int numHopsY = vLastPosition.y / hopSize;
double candidateX = (numHopsX * hopSize);
double deltaX = vLastPosition.x - candidateX;
if(deltaX <= hopSize/2)
lastPosition.x = candidateX;
else
lastPosition.x = candidateX + hopSize;
lastPosition.y = (numHopsY * hopSize);
}
}//ns inet
以及omnetpp.ini
中的移动配置:
*.hostA.mobility.typename = "OfflinePhaseMobility"
*.hostA.mobility.rowCount = 101
*.hostA.mobility.x1 = 0m
*.hostA.mobility.y1 = 0m
*.hostA.mobility.x2 = 100m
*.hostA.mobility.y2 = 100m
*.hostA.mobility.speed = 1mps
*.hostA.mobility.constraintAreaMinX = 0m
*.hostA.mobility.constraintAreaMinY = 0m
*.hostA.mobility.constraintAreaMaxX = 100m
*.hostA.mobility.constraintAreaMaxY = 100m
如您所见,我将速度设置为 1mps。您可能还意识到 hopeSize
参数是我的预定义位置之间的距离。
就那么简单!希望这对遇到同样问题并且不想从头开始编写移动模块的人有所帮助。
正如问题所暗示的,我想将我的 AdhocHost
移动到离散的 (100m x 100m)
space 中。也就是说,例如假设节点在(0,0)m
,那么它等待一秒钟,然后它"teleports"到(0,1)m
,没有跨越两个位置之间的距离。
我该怎么做?
写一个移动模型。将实际整数坐标存储为状态。创建一个每秒触发的计时器事件,并根据您的规则在该事件上修改坐标。您可以从头开始,也可以以固定移动模块为例。
关于 INET 中的移动模型:https://inet.omnetpp.org/users-guide/chap22.html
下面是我如何使用一个小技巧来完成的。
我的移动模型基于 TractorMobility
.
从 class TractorMobility
扩展后,我添加了另一个 Coord
变量,称为 vLastPosition
(代表虚拟最后位置)。此变量的作用与 TractorMobility
的 lastPosition
变量相同,并存储我的主机的最后位置。然后当涉及到移动主机并因此设置 lastPosition
变量时,我根据 vLastPosition
坐标的整数部分设置它。
因此我的移动模块仍然 "thinks" 主机不断移动,而主机仅在其位置的整数部分发生变化时移动。
我模块的 .ned
文件是:
import inet.mobility.single.TractorMobility;
import inet.mobility.contract.IMobility;
simple OfflinePhaseMobility extends TractorMobility like IMobility
{
parameters:
double hopSize @unit(m) = default(1m);
@class(inet::OfflinePhaseMobility);
}
这是我的自定义机动性的头文件 class (OfflinePhaseMobility.h
):
#ifndef OFFLINEPHASEMOBILITY_H_
#define OFFLINEPHASEMOBILITY_H_
#include "inet/common/INETDefs.h"
#include "inet/mobility/single/TractorMobility.h"
namespace inet{
class OfflinePhaseMobility : public TractorMobility{
protected:
virtual void setTargetPosition() override;
virtual void move() override;
Coord vLastPosition;
};
}//ns inet
#endif /* OFFLINEPHASEMOBILITY_H_ */
这是我的 OfflinePhaseMobility.cc
文件:
#include "OfflinePhaseMobility.h"
namespace inet{
Define_Module(OfflinePhaseMobility);
void OfflinePhaseMobility::setTargetPosition()
{
int sign;
Coord positionDelta = Coord::ZERO;
switch (step % 4) {
case 0:
positionDelta.x = x2 - x1;
break;
case 1:
case 3:
sign = (step / (2 * rowCount)) % 2 ? -1 : 1;
positionDelta.y = (y2 - y1) / rowCount * sign;
break;
case 2:
positionDelta.x = x1 - x2;
break;
}
step++;
targetPosition = vLastPosition + positionDelta;
nextChange = simTime() + positionDelta.length() / speed;
}
void OfflinePhaseMobility::move(){
simtime_t now = simTime();
if (now == nextChange) {
vLastPosition = targetPosition;
EV_INFO << "reached current target position = " << vLastPosition << endl;
setTargetPosition();
EV_INFO << "new target position = " << targetPosition << ", next change = " << nextChange << endl;
lastVelocity = (targetPosition - vLastPosition) / (nextChange - simTime()).dbl();
}
else if (now > lastUpdate) {
ASSERT(nextChange == -1 || now < nextChange);
vLastPosition += lastVelocity * (now - lastUpdate).dbl();
}
double hopSize = par("hopSize");
int numHopsX = vLastPosition.x / hopSize;
int numHopsY = vLastPosition.y / hopSize;
double candidateX = (numHopsX * hopSize);
double deltaX = vLastPosition.x - candidateX;
if(deltaX <= hopSize/2)
lastPosition.x = candidateX;
else
lastPosition.x = candidateX + hopSize;
lastPosition.y = (numHopsY * hopSize);
}
}//ns inet
以及omnetpp.ini
中的移动配置:
*.hostA.mobility.typename = "OfflinePhaseMobility"
*.hostA.mobility.rowCount = 101
*.hostA.mobility.x1 = 0m
*.hostA.mobility.y1 = 0m
*.hostA.mobility.x2 = 100m
*.hostA.mobility.y2 = 100m
*.hostA.mobility.speed = 1mps
*.hostA.mobility.constraintAreaMinX = 0m
*.hostA.mobility.constraintAreaMinY = 0m
*.hostA.mobility.constraintAreaMaxX = 100m
*.hostA.mobility.constraintAreaMaxY = 100m
如您所见,我将速度设置为 1mps。您可能还意识到 hopeSize
参数是我的预定义位置之间的距离。
就那么简单!希望这对遇到同样问题并且不想从头开始编写移动模块的人有所帮助。