我有一个由多个模块组成的网络,其中一个模块使用StationaryMobility
作为移动模块。最小的例子:
network World {
submodules:
station1: station {
@display("p=800,800;is=vl");
}
}
与
import inet.mobility.static.StationaryMobility;
module station {
submodules:
mobility: StationaryMobility
{ }
}
station
是一个外国模块,我可能不会对其进行更改。
我现在想通过omnetpp.ini
中的更改来更改此模块的位置,以便我可以轻松地从运行中移动station1
。
我尝试对其进行参数化,如https://omnetpp.org/doc/omnetpp/manual/#sec:graphics:displaystring-parameter-substitution:
所示network World {
parameters:
posX = 800;
posY = 800;
submodules:
station1: station {
@display("p=$posX,$posY;is=vl");
}
}
所以我可以在omnetpp.ini中执行此操作:
*.posX = 1600
*.posY = 2400
但是StationaryMobility
不喜欢它:
<!> Error in module (inet::StationaryMobility) scenario.station1.mobility (id=28) during network initialization: Mobility position is not a finite number after initialize (x=-nan,y=-nan,z=-nan).
不幸的是,我既没有找到生成的显示字符串,也没有找到直接操纵StationaryMobility
的方法。
如何在station1
?
omnetpp.ini
的位置
答案 0 :(得分:2)
我认为你在这里混合了两件事。
displayString
可用于修改NED编辑器和GUI中模块的位置,但这不一定是INET使用的移动模型(如StationaryMobility
)的位置。
首先查看StationaryMobility.ned
,找出该模块的参数,以便以后编辑omnetpp.ini
。
最重要的参数是:
double initialX
double initialY
double initialZ
bool initFromDisplayString
最后一个(initFromDisplayString
)根据displayString
(特别是p
中的@display("p=x,y;")
参数)启用位置参数的初始设置。
如果要替换显示字符串参数,则需要将X和Y位置定义为双参数,就像its done in the manual一样。但是你忘了定义参数类型double
,所以OMNeT不知道1600是什么(在这个例子中)。
在posX
文件中设置posY
/ omnetpp.ini
变量也可能需要双星号,具体取决于您的NED结构:asterisk vs double asterisks
回到实际的StationaryMobility
模型。
您可以直接在displayString
文件中设置初始位置,而不是使用omnetpp.ini
,就像这样:
**.constraintAreaMinX = 0m
**.constraintAreaMinY = 0m
**.constraintAreaMinZ = 0m
**.constraintAreaMaxX = 100m # example value
**.constraintAreaMaxY = 100m # example value
**.constraintAreaMaxZ = 0m
**.mobility.initFromDisplayString = false # ignore displayString positions
station1.mobility.initialX = 50m
station1.mobility.initialY = 50m
根据您的网络结构和模块层次结构,您需要调整station1.mobility.initialX
的路径,或者您可以通过星号运算符来简化它。
然后在omnetpp.ini
中可以使用依赖于运行的位置设置,不同运行的迭代等等。