前言
Omnet++、Sumo、Veins的基本介绍及简单使用,个人学习需要总结版,如有问题可以交流~
目录
Veins
Veins基本介绍
Veins(Vehicle Information and Entertainment System)是一种用于车载移动环境下无线通信仿真的开源框架。它是基于OMNeT++网络仿真平台和SUMO道路交通仿真平台开发的,用于模拟和研究车辆间通信(V2X)和车辆与基础设施之间的通信(V2I),其结构如下图所示。
Veins可以模拟车辆行驶过程中的通信行为,包括车辆间的消息传递、路由选择、信道特性等。它提供了一套丰富的工具和接口,使得用户可以方便地进行车载通信相关研究和开发。Veins也使用了TraCI接口,两个仿真器通过TCP套接字连接,允许道路交通和网络交通的双向耦合模拟。车辆在SUMO中的移动被映射为OMNeT++仿真中节点的移动。
Veins的主要特征
- 可科学仿真多种车辆移动模式;
- 支持IEEE802.11p和IEEE1609.4DSRC/WAVE网络层的详细模型,包括多信道操作、QoS信道接入噪声和干扰效应;
- 支持用于蜂窝网络的模型,如LTE;
- 可以从OpenStreetMap导入整个场景,包括建筑物、速度限制、车道数、交通灯、访问和转弯限制;
- 支持模拟由建筑物或车辆造成的阴影模型。
Veins文件构成
antenna.xml:天线配置,定义了三种不同类型天线的样本数据,分别为:
- monopole:单极天线,位于车顶
- panorama:单极天线,位于全景玻璃车顶
- patch:贴片天线,位于侧镜
config.xml:物理层无线电传播相关参数配置,Decider部分定义了用于 802.11p 通信的决策器模型,指定了物理层监听的中心频率(centerFrequency)。
- SimplePathModel:一个基本的路径损耗模型,包含路径损耗指数(alpha)和载波频率(carrierFrequency)等参数
- SimpleObstacleShadowing:一个简单的障碍物阴影模型,包括载波频率和障碍物类型(如建筑物)的特定衰减值参数
debug:记录仿真运行过程中的调试信息、日志或者其他相关数据。
erlangen.launchd.xml:建立与SUMO的通信。
erlangen.net.xml: SUMO路网文件,可替换为自己的地图。
erlangen.png:从OpenStreetMap导出的地图。
erlangen.poly.xml:用于描述SUMO中polyconvert工具的配置参数,用于将OpenStreetMap的数据转换为SUMO道路网络格式,生成的路网文件中包含所选地区的建筑物的信息。通过SUMO提供的OpenStreetMap的Web接口可生成记录这些建筑物形状、大小和位置信息的配置文件,来作为config.xml内信号衰落模型的输入,若不考虑建筑物对于信号传播的影响则无需此文件,要记得将config.xml内的信号衰落模型的配置删去。
erlangen.rou.xml:车辆的行驶路线和车流的信息。
- vType元素:定义车辆类型,包括加速度、减速度、车辆长度、最小间距和最大速度等属性
- route元素:定义车辆行驶的具体路线,使用边(edges)来指定路径
- flow元素:定义车流,指定了车辆类型、行驶路线、开始时间、时间间隔和车辆数量
erlangen.sumo.cfg: 描述SUMO仿真的参数设置。
- configuration:指定XML的命名空间和模式的位置
- input:输入
- <begin value="0"/>:指定仿真开始时间为0
- <end value="1000"/>:指定仿真结束时间为1000
- <step-length value="0.1"/> :指定仿真的时间步长为0.1,即每个仿真步长的时间间隔为0.1单位
- report:设置是否生成仿真步骤日志的选项为true,表示不生成
- gui_only:设置是否启动GUI界面的选项为true,表示启动SUMO仿真时显示GUI界面
memcheck:用于配置Valgrind工具的memcheck工具,以进行内存错误检查。
omnetpp.ini:OMNeT++运行文件,下文会详细介绍。
RSUExampleScenario.ned:因为Veins是一个基于OMNeT++的框架,.ned文件是OMNeT文件中网络描述模块,相当于C++中的类,下文会详细介绍。这个样例定义一个简单Veins仿真场景,只包含一个(Roadside Unit)RSU节点。通过使用Veins仿真框架,在此场景中模拟车辆通信系统的行为,例如车辆与RSU之间的通信,以及RSU提供的服务等。
run:文件是一个Shell脚本或者批处理脚本,用于启动和运行仿真。它的作用是执行一系列命令或者指令,以便配置和启动仿真环境,然后运行仿真程序。
OMNeT++
OMNeT++文件组成
模块组成
- .ned文件,NED语言拓扑描述,用于描述带有参数、门等的模块结构。NED文件可以使用任何文本编辑器编写,但OMNeT++IDE 为双向图形和文本编辑提供了出色的支持。
- .msg文件,消息定义,允许定义消息类型并向其中添加数据字段。OMNeT++ 会将消息定义转换为成熟的 C++类。
- .h/.cc文件,C++文件,简单的模块源。
其他文件
- .ini:定义网络的仿真环境。
- .elog:仿真过程的时序图,和FPGA过程的时序图类似。
-
.anf:仿真结构保存,包含有.vec矢量文件和.sca标量文件。
另
- src文件夹:存放源代码、.ned、C++
- simulation文件夹:存放项目配置文件、节点网络
OMNeT++运行文件omnetpp.ini详解
--以veins样例中的.ini文件为例
网络仿真环境.ini文件的编辑有两种形式
(1)form
(2)source
[General]
cmdenv-express-mode = true # 使用命令行模式进行快速模拟
cmdenv-autoflush = true # 自动刷新输出
cmdenv-status-frequency = 1s # 每秒输出一次模拟状态
**.cmdenv-log-level = info # 设置命令行日志级别为info
ned-path = . # 指定NED文件路径
image-path = ../../images # 指定图片文件路径
network = RSUExampleScenario # 指定使用的.ned文件,是整个网络,可替换。这里指定网络场景模型为RSUExampleScenario
仿真参数设置
##########################################################
# Simulation parameters #
##########################################################
debug-on-errors = true # 出错时进行调试
print-undisposed = true # 打印未释放的对象
sim-time-limit = 200s # 模拟时间限制为200秒,即本次网络仿真模拟的时间达到200s时自动断开。
**.scalar-recording = true # 记录标量数据
**.vector-recording = true # 记录向量数据
**.debug = false # 关闭调试模式
**.coreDebug = false # 关闭核心调试模式
*.playgroundSizeX = 2500m # 设置场地X轴尺寸为2500米
*.playgroundSizeY = 2500m # 设置场地Y轴尺寸为2500米
*.playgroundSizeZ = 50m # 设置场地Z轴尺寸为50米
注释参数设置
##########################################################
# Annotation parameters #
##########################################################
*.annotations.draw = true # 在仿真过程中将所有的注释绘制出来
障碍物参数设置
##########################################################
# Obstacle parameters #
##########################################################
*.obstacles.debug = false # 关闭障碍物调试
*.obstacles.obstacles = xmldoc("config.xml", "//AnalogueModel[@type='SimpleObstacleShadowing']/obstacles")
# 从XML文件中加载障碍物模型,从名为"config.xml"的XML文件中获取"SimpleObstacleShadowing"类型的模拟模型(AnalogueModel)的"obstacles"属性值,并将其应用于当前正在被配置的对象的障碍物属性。
交通参数配置
TraCIScenarioManager是用于管理和控制TraCI(Traffic Control Interface)仿真场景的模块。TraCI是一种用于仿真城市交通流量的接口,通过它可以从外部程序中控制和获取仿真场景的状态和参数。
##########################################################
# TraCIScenarioManager parameters #
##########################################################
*.manager.updateInterval = 1s # 设置TraCIScenarioManager更新间隔为1秒
*.manager.host = "localhost" # 设置TraCIScenarioManager主机为本地主机
*.manager.port = 9999 # 设置TraCIScenarioManager端口为9999
*.manager.autoShutdown = true # 自动关闭TraCIScenarioManager
*.manager.launchConfig = xmldoc("erlangen.launchd.xml")
# 从XML文件加载启动配置
RSU配置
知识补充
信标(Beacon)是一种由车辆或路侧单元(RSU)发送的特定消息,通常用于在一定范围内广播车辆的身份、位置和其他相关信息。其作用类似于一个标识符,可以被其他车辆或RSU接收,从而提供关于周围车辆的实时信息。信标通常是在特定的时间间隔内周期性地发送,以便其他车辆或RSU能够感知到附近车辆的存在和状态。
信标用户优先级和数据用户优先级是两个不同的参数,它们在Veins中分别用于不同的通信阶段。信标用户优先级主要用于信标传递阶段,而数据用户优先级主要用于数据传输阶段。
- 信标用户优先级(Beacon User Priority)是指在信标传递过程中,用于确定哪个车辆可以发送信标的优先级。具有较高信标用户优先级的车辆更有可能被选中发送信标。
- 数据用户优先级(Data User Priority)是指在数据传输过程中,用于确定哪个车辆可以发送数据的优先级。具有较高数据用户优先级的车辆更有可能被选中发送数据。
- 信标传递阶段:在这个阶段,车辆或RSU通过DSRC技术向周围发送信标,信标包含了车辆的身份、位置等信息。其他车辆或RSU可以接收到这些信标,从而获取周围车辆的信息。信标传递阶段主要用于建立车辆间的通信连接,为后续的数据传输做准备。
- 数据传输阶段:在建立了通信连接之后,车辆或RSU可以通过DSRC技术进行数据传输。数据传输阶段主要用于车辆之间或车辆与RSU之间交换各种信息,例如交通状况、行驶速度、行驶方向等。这个阶段通常需要设置数据用户优先级,以确定哪些车辆可以优先发送数据。
- 消息传递阶段:除了实时的数据传输,车联网中还需要支持一些非实时的消息传递,例如紧急事件通知、交通公告等。消息传递阶段主要用于在较大的范围内广播这些消息,让所有车辆都能够接收到相关信息。
信标用户优先级用于确定哪些车辆可以发送信标,而数据用户优先级用于确定哪些车辆可以发送数据。通过设置不同的优先级,可以控制车辆在通信过程中的行为,从而实现更高效、更安全的通信。
##########################################################
# RSU SETTINGS #
##########################################################
*.rsu[0].mobility.x = 2000 # 第一个RSU的X坐标为2000
*.rsu[0].mobility.y = 2000 # 第一个RSU的Y坐标为2000
*.rsu[0].mobility.z = 3 # 第一个RSU的Z坐标为3
*.rsu[*].applType = "TraCIDemoRSU11p" # 设置RSU应用类型为TraCIDemoRSU11p
*.rsu[*].appl.headerLength = 80 bit # 设置RSU应用头部长度为80比特
*.rsu[*].appl.sendBeacons = false # 关闭RSU发送信标
*.rsu[*].appl.dataOnSch = false # RSU不在时隙上发送数据
*.rsu[*].appl.beaconInterval = 1s # 设置RSU 信标间隔为1秒
*.rsu[*].appl.beaconUserPriority = 7 # 设置RSU 信标用户优先级为7
*.rsu[*].appl.dataUserPriority = 5 # 设置RSU数据用户优先级为5
网卡参数设置
11p specific parameters和NIC-Settings是两个不同的配置参数,nic包含两个子.ned(mac1609_4和phy80211p)
11p specific parameters是与802.11p协议相关的参数,用于配置无线通信的特性。802.11p是一种无线通信标准,专门用于车辆网络(V2X通信),具有较高的传输速率和较低的延迟。这些参数包括调制方式、数据速率、信道带宽等,可以根据具体的应用场景进行调整。
NIC是指网络接口卡,可以通过设置参数来模拟不同类型和配置的NIC、不同的网络环境和通信条件,以支持各种网络协议和仿真场景。。这些参数包括网络接口卡的类型、MAC地址、最大传输单元(MTU)等。
##########################################################
# 11p specific parameters #
##########################################################
*.connectionManager.sendDirect = true # 使用直接发送模式,不通过多跳或路由
*.connectionManager.maxInterfDist = 2600m # 最大干扰距离为2600米
*.connectionManager.drawMaxIntfDist = false # 不绘制最大干扰距离
*.**.nic.mac1609_4.useServiceChannel = false # 不使用服务信道
*.**.nic.mac1609_4.txPower = 20mW # 设置发送功率为20mW
*.**.nic.mac1609_4.bitrate = 6Mbps # 设置数据速率为6Mbps
*.**.nic.phy80211p.sensitivity = -89dBm # 设置灵敏度为-89dBm
*.**.nic.phy80211p.useThermalNoise = true # 使用热噪声
*.**.nic.phy80211p.thermalNoise = -110dBm # 设置热噪声为-110dBm
*.**.nic.phy80211p.decider = xmldoc("config.xml") # 从XML文件加载决策器
*.**.nic.phy80211p.analogueModels = xmldoc("config.xml")
# 从XML文件加载模拟模型
*.**.nic.phy80211p.usePropagationDelay = true # 使用传播延迟
*.**.nic.phy80211p.antenna = xmldoc("antenna.xml", "/root/Antenna[@id='monopole']")
# 从XML文件加载天线模型
WaveAppLayer 移动车辆应用层设置
##########################################################
# WaveAppLayer #
##########################################################
*.node[*].applType = "TraCIDemo11p" # 设置节点应用类型为TraCIDemo11p
*.node[*].appl.headerLength = 80 bit # 设置节点应用头部长度为80比特
*.node[*].appl.sendBeacons = false # 关闭节点发送beacons
*.node[*].appl.dataOnSch = false # 节点不在时隙上发送数据
*.node[*].appl.beaconInterval = 1s # 设置节点beacon间隔为1秒
移动节点Mobility
##########################################################
# Mobility #
##########################################################
*.node[*].veinsmobilityType.debug = true # 打开节点移动模型调试模式
*.node[*].veinsmobility.x = 0 # 设置节点初始X坐标为0
*.node[*].veinsmobility.y = 0 # 设置节点初始Y坐标为0
*.node[*].veins
- .node[].veinsmobility.setHostSpeed::设置或更改主机速度。
- *.node[0].veinsmobility.accidentCount = 1: 发生一次事故的次数,这行代码的意思是将编号为0的节点的veinsmobility对象的accidentCount属性设为1,代表该节点会发生一次事故。
- .node[0].veinsmobility.accidentStart = 73s: 事故开始的时间。
- .node[*0].veinsmobility.accidentDuration = 50s:事故的持续时间。
OMNeT++简单使用
1.创建一个项目,File->New->OMNeT++Project...
2.给项目起名,我i这里就设置为MyFirstProject,点击Next
3.选择空项目,第二个是生成两个文件夹src以及simulations,两个文件夹具体存什么在上文中已经介绍了,这里不多赘述,然后点Finish。
4.左边可以看到创建好的项目目录,如下
5.创建一个简单模块,右键项目文件夹->New->Simple Moudle
6.选择A simple module->Finish
7.创建好以后工作区的界面是这样
如果工作区没有SimpleModule,可以在右侧Types栏中选择第一个(Simple Module--Create a simple module type),然后在左边生成一个简单模块
8.右键这个图标可以修改属性、参数、名称等等
9.点击在工作区左下角的Source,切换到source模式编辑
simple SimpleModule
{
gates:
input in;//添加一个接收门
output out;//添加一个发送门
}
gates:门,实现模块的连接。
10.创建一个整体网络描述文件,用于.ini启动,右击MyFistProject->New->Network Description File(NED)
11.在右侧Types栏中选择第三个,在左侧生成Network
12.在右侧Submodules中选择SimpleModule,再在左侧Network内生成三个SimpleModule
13.修改他们的名字为S1、S2、S3
14.在右侧Plaette中选择Connection对几个SimpleModule进行连接,注意由于SimpleModule中只设置了一个输入门和一个输出门,因此每个SimpleModule只有一个箭头指出一个箭头指入
先后左击不同SimpleModule可以看到输入和输出的SimpleModule名称
15.切换到source模式,可以看到在design中编辑后source会出现相关代码
我们给SimpleModule的connections加入时延{delay=100ms;}以便观察仿真动画
network Network
{
@display("bgb=417,304");
types:
submodules:
S1: SimpleModule {
@display("p=94,81");
}
S2: SimpleModule {
@display("p=268,80");
}
S3: SimpleModule {
@display("p=173,211");
}
connections:
S1.out --> {delay=100ms;} --> S2.in;
S2.out --> {delay=100ms;} --> S3.in;
S3.out --> {delay=100ms;} --> S1.in;//消息传输延迟100ms发送
}
16.在左侧目录中打开simpleModule.cc文件
void SimpleModule::initialize():初始化函数
void SimpleModule::handleMessage(cMessage *msg):消息处理函数,当该模块收到消息后所需要执行的操作
17.对这两个函数进行简单处理
#include "simpleModule.h"
Define_Module(SimpleModule);
void SimpleModule::initialize()
{
// TODO - Generated method body
if (strcmp("S1", getName()) == 0) {
cMessage *msg = new cMessage("spMsg");
send(msg, "out");
}
}
void SimpleModule::handleMessage(cMessage *msg)
{
// TODO - Generated method body
send(msg, "out"); // send out the message
}
在初始化过程中,如果该模块名字为S1,生成消息msg,并通过函数send()将该消息通过发送门out发送出去
一旦从接收门in接收到消息,该模块将消息从发送门out发送出去
18.右击项目New->Initialization File(ini)生成文件omnetpp.ini文件
19.点击Next
20.选择Empty Ini File->Finish
打21.打开omnetpp.ini文件,点击左下角Source,输入网络名network=Network
22.点击Project->Build Project
23.等待操作完成,看到Build Finished开始下一步
24.右击omnetpp.ini->run as->OMNet++ simulation,运行MyFirstProject
25.出现弹框选择OK
选择OK
这个尽量都选No,不然可能会报错
26.出现仿真画面
后续可能会出tictoc1-9练习以及讲解~
SUMO(待修改)
“城市交通仿真”(SUMO)是一个开源、高度便携、微观和连续的交通仿真软件包,旨在处理大型网络。它允许包括行人在内的多式联运仿真,并配有一套用于场景创建的大型工具。它主要由德国航空航天中心运输系统研究所的员工开发。
SUMO是一个微观的,空间上连续,时间上离散的交通仿真软件,采用c++语言开发,其宏观特征包括带变道的多车道道路,基于道路交叉口的靠右侧行驶规则,支持动态路由,可以管理超过10000条街道的网络。其微观特征包括允许碰撞自由的车辆移动模式,支持单车路由。该软件特点是具有快速的OpenGL图形界面,支持多种网络格式输入,缺点是sumo本身不能提供网络仿真器所需要的轨迹文件。
sumo使用方法一(地图替换)
1.进入官网,点击左上角导出,手动选择地图范围。
2.点击导出生成相应的map.osm文件,将移动到存在自己知道的位置可以更改文件名,注意使用英文字母。
3.