【问题标题】:Visualization of dynamically created modules动态创建模块的可视化
【发布时间】:2021-04-13 10:56:53
【问题描述】:

我正在 OMNeT 中构建动态多代理模拟,为此我必须在运行时创建新模块。模块创建工作正常,但是在运行时创建的模块没有出现在 3D 可视化中。

module "node" is created sucessfully

有谁知道如何使模块出现在可视化中?我必须更新可视化模块吗?

omnet.ini:

[General]
network = AgentNetwork

*.visualizer.osgVisualizer.typename = "IntegratedOsgVisualizer"
*.visualizer.*.mobilityVisualizer.animationSpeed = 1
*.visualizer.osgVisualizer.sceneVisualizer.typename = "SceneOsgEarthVisualizer"
*.visualizer.osgVisualizer.sceneVisualizer.mapFile = "hamburg.earth"

AgentSpawner:

void AgentSpawner::initialize()
{
    cMessage *timer = new cMessage("timer");
    scheduleAt(1.0, timer);
}

void AgentSpawner::handleMessage(cMessage *msg)
{
        cModuleType *moduleType = cModuleType::get("simulations.Agent");
        cModule *module = moduleType->create("node", getParentModule());

        // set up parameters and gate sizes before we set up its submodules
        module->par("osgModel") = "3d/glider.osgb.(20).scale.0,0,180.rot";
        module->getDisplayString().parse("p=200,100;i=misc/aircraft");
        module->finalizeParameters();

        // create internals, and schedule it
        module->buildInside();
        module->callInitialize();
        module->scheduleStart(simTime()+5.0);
}

【问题讨论】:

    标签: c++ omnet++ inet


    【解决方案1】:

    OSG 可视化信息与实际仿真模型模块对象完全分开维护(这是因为可视化在仿真中必须始终是可选的,因此请确保您的仿真在完全关闭 OSG 的情况下构建良好)。这意味着在初始化时间中构建了与现有网络节点完全不同的数据结构。由于这仅在初始化期间完成一次,因此动态创建的模块将不会具有它们的可视化对应数据结构。

    创建相应对象的代码是here

    解决方案是在AgentSpawner 代码中查找NetworkNodeOsgVisualizer 模块,然后创建并添加相应的数据结构(NetworkNodeOsgVisualization 对象)。所需的方法(创建和添加)是there,但遗憾的是它们是受保护的,因此您需要修改 INET 代码并使它们public 能够打电话给他们。

    【讨论】:

    • 附注:如果您以这种方式成功创建了动态可视化,并且需要进行更改,请务必在 INET 存储库中提交问题,以便将方法移至公开。
    • 感谢您的回答。我发现的另一种解决方案是将NetworkNodeOsgVisualizer 模块添加到我要动态创建的模块中。
    猜你喜欢
    • 2011-02-25
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多