You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OMNET++4.6中AVENS(FANET)场景指标获取及UAV节点显示问题

AVENS(FANET)场景指标获取与UAV位置显示问题

问题描述

运行AVENS(FANET)场景时,无法获取以下网络性能指标:

  • Throughput:返回标量值为0,且无法获取向量数据;
  • Jitters:结果中未出现该指标;
  • E2E Delay:结果中未出现该指标。

已在ini文件开启向量记录功能,NED文件添加了@statistic配置项,使用版本:

  • OMNeT++版本:4.6
  • INET版本:3.2.4

另外,UAV节点全部堆叠在一起,如何设置让它们显示在不同位置?

附NED文件和ini文件内容:

NED文件内容

//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.
// 
// You should have received a copy of the GNU Lesser General Public License
// along with this program.  If not, see http://www.gnu.org/licenses/.
// 

package avens;

import inet.common.lifecycle.LifecycleController;
import inet.networklayer.configurator.ipv4.IPv4NetworkConfigurator;
import inet.node.inet.AdhocHost;
import inet.physicallayer.ieee80211.packetlevel.Ieee80211ScalarRadioMedium;
import inet.networklayer.ipv4.RoutingTableRecorder;

network FANET
{
    parameters:
        int numHosts = default(2);
        @display("bgb=600,600");
        @statistic[eed](title="end-to-end delay of received packets"; unit=s);
        @statistic[jitter](title="jitter of received packets");
        //@statistic[throughput](source="sumPerDuration(packetBits(messageSent))"; record=last?; unit=bps);
        @statistic[throughput](title="throughput"; unit=bps; record=histogram,vector);


    submodules:

        lifecycleController: LifecycleController {
            @display("p=410,483");
        }
        radioMedium: Ieee80211ScalarRadioMedium {
            @display("p=410,426");
        }
        routingTableRecorder: RoutingTableRecorder {
            parameters:
                @display("p=514,360");
        }
        configurator: IPv4NetworkConfigurator {
            config = xml("<config><interface hosts='*' address='192.168.0.x' netmask='255.255.255.0'/></config>");
            @display("p=529,483");
        }

        uav[numHosts]: Aircraft {
            @display("i=device/drone;is=n;p=398,92");
        }

        gcs: AdhocHost {
            @display("i=device/antennatower_vl;r=,,#707070;p=227,148");
        }

        handler: FileHandler {
            @display("p=529,427");
        }

}

ini文件内容

[General]
#debug-on-errors = true

sim-time-limit = 100000s        #simulation time
output-scalar-file-append = false
cmdenv-express-mode = true      #express run of simulation
network = FANET     #simulate the network 
num-rngs = 2        #random number generator

FANET.numHosts = 10     #no of hosts/uavs in FANET
FANET.handler.filename = "D:\\UAV\\positions\\pluginInterface.xml"      #XML file for filehandler module
FANET.handler.hostVariableName = "uav"                                  #name of host
FANET.handler.numHostVariableName = "numHosts"                          #no of hosts

tkenv-plugin-path = ../../../Etc/plugins    #path for addtional plug-ins for OMNET
#tkenv-default-run=1

description = "Simulacao AVENS"

**.vector-recording = true
**.constraintAreaMinX = 0m
**.constraintAreaMinY = 0m
**.constraintAreaMinZ = 0m
**.constraintAreaMaxX = 2500m
**.constraintAreaMaxY = 2500m
**.constraintAreaMaxZ = 2500m

**.channelNumber = 0

**.mobility.updateInterval = 2s

**.numPingApps = 1
**.pingApp[*].destAddr = "uav[0]"
**.pingApp[*].sendInterval = 10s
**.pingApp[*].sleepDuration = 10s

#**.uav[0].numUdpApps = 0
#
#**.uav[0].udpApp[*].typename = "UDPVideoStreamSvr"
#**.uav[0].udpApp[*].videoSize = 10MiB
#**.uav[0].udpApp[*].localPort = 3088
#**.uav[0].udpApp[*].sendInterval = 10ms
#**.uav[0].udpApp[*].packetLen = 1000B

**.uav[*].numUdpApps = 0

**.uav[*].udpApp[*].typename = "UDPVideoStreamSvr"
**.uav[*].udpApp[*].videoSize = 10MiB
**.uav[*].udpApp[*].localPort = 3088
**.uav[*].udpApp[*].sendInterval = 10ms
**.uav[*].udpApp[*].packetLen = 1000B
**.uav[*].udpApp[*].packetName = "UDPData"

**.gcs.numUdpApps = 0
**.gcs.udpApp[*].typename = "UDPVideoStreamCli"
**.gcs.udpApp[*].serverAddress = "uav[*](ipv4)"
**.gcs.udpApp[*].localPort = 9999
**.gcs.udpApp[*].serverPort = 3088
**.gcs.udpApp[*].startTime = 0

**.routingFile = ""
**.ip.procDelay = 10us

# ARP configuration
**.arp.retryTimeout = 1s
**.arp.retryCount = 3
**.arp.cacheTimeout = 100s

#*.obstacleControl.obstacles = xmldoc("obstacles.xml")      # obstacles XML
#*.obstacleControl.debug = true     # obstacles XML
#**.annotations.draw = true 

##############################################################################
# Parameters for MAC layer #
##############################################################################

# nic settings
**.wlan*.bitrate = 2Mbps

**.mac.address = "auto"
**.mac.maxQueueSize = 14
**.mac.rtsThresholdBytes = 3000B
**.wlan[*].mac.retryLimit = 7
**.wlan[*].mac.cwMinData = 7

**.radioMedium.backgroundNoise.power = -110dBm
**.radioMedium.mediumVisualizer.displayCommunication = true

include uavconf.ini
 ##########################################################
                  #       Parameters for the Host                          #
                  ##########################################################
                  ############# Phy parameters #############################
                  **.phy.usePropagationDelay = false
                  **.phy.useThermalNoise = true
                  **.phy.analogueModels = xmldoc("config.xml")
                  **.phy.maxTXPower = 100mW
                  **.phy.sensitivity = -104dBm
                  ############# Phy parameters #############################


##############################################################################
# Parameters for the Energy Model (units: mAh and mA) #
##############################################################################
**.hasStatus = true

**.energyStorageType = "SimpleEnergyStorage"
**.energyConsumerType = "StateBasedEnergyConsumer"
**.energyStorage.nominalCapacity = 0.05J
**.energyStorage.nodeShutdownCapacity = 0J
**.energyStorage.nodeStartCapacity = 0.5 * this.nominalCapacity
**.energyStorage.initialCapacity = uniform(0J, this.nominalCapacity)
**.energyGeneratorType = "AlternatingEnergyGenerator"
**.energyGenerator.energySinkModule = "^.energyStorage"
**.energyGenerator.powerGeneration = 100mW
**.energyGenerator.sleepInterval = exponential(10s)
**.energyGenerator.generationInterval = exponential(10s)

#**.rxSetupTime = 0.00108s

##############################################################################
# Mobility #
##############################################################################

**.gcs.mobilityType = "StationaryMobility"

##############################################################################
#       Output vectors                                                       #
##############################################################################
output-vector-file = ${resultdir}/${configname}-${runnumber}.vec
output-scalar-file = ${resultdir}/${configname}-${runnumber}.sca

**.End-to-end delay.vector-recording = true
**.Mean end-to-end delay.vector-recording = true
**.throughput.vector-recording = true
**.scalar-recording = true
**.result-recording-modes = default
**.jitter.vector-recording = true

                  ##########################################################
                  #       Parameters for the ConnectionManager             #
                  ##########################################################
                  **.connectionManager.carrierFrequency = 2.4e9Hz  # - Hz
                  # max transmission power - mW
                  **.connectionManager.pMax = 100mW
                  # signal attenuation threshold - dBm
                  **.connectionManager.sat = -104dBm
                  # path loss coefficient alpha
                  **.connectionManager.alpha = 2.5
                  **.connectionManager.sendDirect = false


#visualizer

**.radio.displayCommunicationRange = true
*.visualizer.mediumVisualizer.displaySignals = true
*.visualizer.physicalLinkVisualizer.displayLinks = true
*.visualizer.physicalLinkVisualizer.packetFilter = "UDPData*"
*.visualizer.mobilityVisualizer.displayVelocities = true
*.visualizer.mobilityVisualizer.displayMovementTrails = true

解决方案

1. 修复Throughput指标为0的问题

你当前NED里的throughput统计没指定正确数据源,导致采集不到有效数据。直接修改NED中的统计项:

@statistic[throughput](title="throughput"; unit=bps; record=histogram,vector; source="sumPerDuration(packetBits(receivedPk))"; module="**.gcs.udpApp[*]");
  • 要是想统计UAV发送端的吞吐量,就把receivedPk换成sentPk,模块路径改成**.uav[*].udpApp[*]。
  • 同时在ini文件里补充配置,确保GCS的UDP客户端开启统计:
**.gcs.udpApp[*].throughput.vector-recording = true
**.gcs.udpApp[*].throughput.scalar-recording = true

2. 让Jitters指标显示出来

INET 3.2.4中计算抖动需要用packetJitter统计源,修改NED中的jitter统计项:

@statistic[jitter](title="jitter of received packets"; unit=s; record=vector,scalar; source="packetJitter(receivedPk)"; module="**.gcs.udpApp[*]");
  • 这个统计会计算连续两个接收数据包的时间差与平均间隔的偏差,得到抖动值。然后在ini文件里补加:
**.gcs.udpApp[*].jitter.vector-recording = true
**.gcs.udpApp[*].jitter.scalar-recording = true

3. 修复E2E Delay指标缺失问题

原来的NED里eed统计项没指定数据源和模块,根本采集不到延迟数据,改成下面这样:

@statistic[eed](title="end-to-end delay of received packets"; unit=s; record=vector,scalar; source="packetAge(receivedPk)"; module="**.gcs.udpApp[*]");
  • packetAge就是数据包从发送到接收的时间差,正好对应端到端延迟。同时在ini文件里添加:
**.gcs.udpApp[*].eed.vector-recording = true
**.gcs.udpApp[*].eed.scalar-recording = true

4. 让UAV节点不堆叠,分散显示

有三种方法可选,挑适合你的:

方法一:随机生成初始位置

在ini文件里给UAV配置随机位置生成器,直接加这段:

**.uav[*].mobilityType = "RandomPositionMobility"
**.uav[*].mobility.z = uniform(100m, 200m)  # 给不同UAV设置不同高度,彻底避免堆叠
  • 要是需要UAV移动,就把RandomPositionMobility换成RandomWaypointMobility,再补充速度参数即可。

方法二:加载预定义位置文件

检查你配置的pluginInterface.xml,确保每个UAV都有唯一的坐标,示例格式:

<hosts>
    <host id="0" x="100m" y="200m" z="150m"/>
    <host id="1" x="300m" y="400m" z="160m"/>
    <!-- 剩下的UAV依次填写不同坐标 -->
</hosts>
  • 保证FileHandler能正确读取该文件,且ID与UAV的数组索引对应。

方法三:NED中动态分配位置

修改UAV的@display属性,用索引变量自动计算位置:

uav[numHosts]: Aircraft {
    @display("i=device/drone;is=n;p=100+${index}*50, 100+${index}*50");
}
  • 每个UAV的坐标会跟着索引递增,不会堆在一起。

内容的提问来源于stack exchange,提问作者nisar007

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 19:22:33