【问题标题】:How to change module position through its display string from omnetpp.ini?如何通过 omnetpp.ini 中的显示字符串更改模块位置?
【发布时间】:2017-07-05 11:20:14
【问题描述】:

我有一个由多个模块组成的网络,其中一个使用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的方法。

如何在omnetpp.ini 中更改station1 的位置?

【问题讨论】:

    标签: omnet++


    【解决方案1】:

    我认为你在这里混合了两件事。 displayString 可用于修改模块在 NED 编辑器和 GUI 中的位置,但这不一定是 INET 的移动模型(如 StationaryMobility)使用的位置。

    先查看StationaryMobility.ned,了解模块有哪些参数,以便稍后编辑它们,例如omnetpp.ini

    最重要的参数是:

    • double initialX
    • double initialY
    • double initialZ
    • bool initFromDisplayString

    最后一个 (initFromDisplayString) 启用基于displayString(特别是@display("p=x,y;") 中的p 参数)的位置参数的初始设置。

    如果要替换显示字符串参数,则需要将 X 和 Y 位置定义为双参数,就像 its done in the manual 一样。但是你忘了定义参数类型double,所以OMNeT不知道1600是什么(在这个例子中)。

    omnetpp.ini 文件中设置posX/posY 变量也可能需要双星号,具体取决于您的NED 结构:asterisk vs double asterisks

    回到实际的StationaryMobility 模型。 您可以直接在omnetpp.ini 文件中设置初始位置,而不是使用displayString,就像这样:

    **.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 then 中可以进行与运行相关的位置设置、不同运行的迭代等操作。

    【讨论】:

    • 非常感谢!我不敢相信我错过了这些选项。现在一定是看代码太久了。我认为不需要打扰禁区。由于您的提示,我可以查到,如果没有以其他方式初始化,约束是无限的,这适合我。
    猜你喜欢
    • 2014-10-07
    • 1970-01-01
    • 2021-04-07
    • 2017-07-13
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2017-02-17
    • 2019-02-26
    相关资源
    最近更新 更多