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
相关产品推荐
相关产品推荐

