动态创建模块的可视化

问题描述

我正在 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,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);
}

解决方法

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

创建相应对象的代码是here

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