前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Veins车联网】Veins入门知识-01

【Veins车联网】Veins入门知识-01

作者头像
程序员洲洲
发布2024-06-07 13:56:18
760
发布2024-06-07 13:56:18
举报
文章被收录于专栏:项目文章

一、Veins介绍

我们先来了解一下Veins是什么。

Veins是一个开源的车联网模拟仿真框架,它为车联网络集成了一系列仿真模型。这些模型在与车辆交通状况模拟器(SUMO)交互时运行在事件网络模拟器(OMNeT++)之上。Veins构建了一个模型框架,使得面向特定仿真模型的代码编程可以更加容易。该框架意味着Veins是面向特定仿真模型的代码编程,使用者所写的代码只是利用仿真来评估具体应用场景的表现。

Veins是一款用于车载移动环境下无线通信仿真的开源框架,其对于车载无线网的底层结构,如物理层、MAC层等基于802.11p协议已基本开发完善,因此在此基础上进行二次开发,如改进MAC层协议或者路由协议等研究都是非常便携的。甚至如果是进行应用层上的研究,如车联网环境下的车辆自动驾驶、编队行驶、路径规划、信号灯区域协调等则更加方便,因为底层的结构可以直接使用,不必再浪费时间精力在这些并不是需要主要研究但却又对仿真结果影响重大的部分。

Veins包含了大量的仿真模型以适应更广泛的车辆网络,这些模型可以用来构建一个广泛的、丰富内容仿真的车辆网络。

一句话概括来说,就是开源软件 SUMO 实现道路交通环境的模拟,具体包括仿真的路网环境、车辆运行等信息;OMNeT++实现通信网络的模拟和仿真;Veins 在 SUMO 和 OMNeT++的基础上构建了车联网的通信仿真框架。

二、Veins下载

官网下载链接:http://veins.car2x.org/download/

推荐下载这个,不用再额外配omnet++和sumo的环境了。这个就是整体的能够跑的环境。

三、Veins项目各文件拆解

  • antenna.xml文件:对车辆天线做配置,一半来说不用管。
  • config.xml文件:配置物理层无线电传播的相关参数,如示例中将信号路径衰落的模型配置为“SmiplePathlossModel”,障碍物引起的信号衰落模型设置为“SimpleObstacleShadowing”,一般使用默认的即可
  • erlangen.launchd.xml:建立与SUMO的通信,通常不能更改。
  • erlangen.net.xml: SUMO路网文件,跑自己的仿真时需要替换。
  • erlangen.poly.xml:如果SUMO路网文件是由地图转化而来的,如从OpenStreetMap导入的,则路网文件中还将包含所选地区的建筑物的信息,通过SUMO提供的OpenStreetMap Web接口便可生成记录这些建筑物形状、大小和位置信息的配置文件,作为config.xml内信号衰落模型的输入;如果不考虑建筑物对于信号传播的影响则无需此文件,当然config.xml内的信号衰落模型的配置也要删去;
  • erlangen.rou.xml:交通流文件,如何生成也需要查阅SUMO官网文档。 链接地址如下:http://www.sumo.dlr.de/userdoc/Installing.html
  • erlangen.sumo.cfg: SUMO运行文件,是对运行时长等运行参数进行配置。
  • omnetpp.ini: OMNeT++运行文件,十分重要,如果了解过OMNeT++的朋友应该懂他的地位,打个比方:类似汽车的引擎。
  • RSUExampleScnario.ned: OMNeT++类似于积木,一个工程项目是由多个ned文件互相嵌套组合而成的。veins作为一个基于OMNeT++的框架,其便是由层次分明的ned文件组合而成的,如果学过面向对象编程的话可能会容易理解一些,这些ned文件就类似一个个类。
  • 需要注意的是,OMNeT++中的ned文件只是定义了组件的结构,比如定义一辆车,ned只是描述了它包含几个对外通信的接口,这些接口的参数之类的,具体这些接口能够实现的相关功能还需要与ned文件同名的C++文件进行定义,比如用这些接口选择与谁进行通信,怎么进行通信,速率多少等等。
  • 这里的RSUExampleScnario.ned定义了OMNeT++中最大的结构——网络(network)(这里为什么说是最大呢?因为之前我们提过了ned是可以定义各种组件的,也可以定义整体的网络network),可以看到在omnetpp.ini中的[General]部分对于本次仿真所运行的网络(整个网络整体)定义为RSUExampleScenari。

四、omnet++.ini配置文件代码讲解

大概的代码如下所示,接下来我们将按照功能来区分讲解。

仿真基本参数

  • network:最核心的参数,也就是指定使用了哪个ned文件。需要替换成自己的network级别的ned文件。
  • sim-time-limit = 600s :意思是本次网络仿真模拟的时间到600s时就会断开。

基本参数的代码如下图所示。

注释参数

在OMNET++中,注释是一种用于在仿真结果中添加额外信息的机制。注释可以包含文本、图形、表格等形式的附加信息,以帮助理解仿真结果。

在上述代码中,*.annotations.draw = true指示OMNET++在仿真过程中将所有的注释绘制出来。通过将该值设置为true,注释将在仿真结果中以图形形式呈现,以提供更直观的视觉效果。这对于分析和理解仿真结果非常有用,因为它可以帮助用户更好地理解网络行为和性能。

障碍物参数

在OMNET++中,这段代码的意思是,从名为"config.xml"的XML文件中获取"SimpleObstacleShadowing"类型的模拟模型(AnalogueModel)的"obstacles"属性值,并将其应用于当前对象(即当前正在被配置的对象)的障碍物(obstacles)属性。

具体来说,xmldoc(“config.xml”, “//AnalogueModel[@type=‘SimpleObstacleShadowing’]/obstacles”)这行代码是在读取名为"config.xml"的XML文件,并使用XPath表达式"//AnalogueModel[@type=‘SimpleObstacleShadowing’]/obstacles"来选择符合条件的元素。这意味着它选择的是所有类型为"SimpleObstacleShadowing"的模拟模型(AnalogueModel)中的"obstacles"属性。

然后,*.obstacles.obstacles = xmldoc(“config.xml”, “//AnalogueModel[@type=‘SimpleObstacleShadowing’]/obstacles”)这行代码将获取到的值赋给当前对象的"obstacles"属性。这使得当前对象的障碍物配置与"SimpleObstacleShadowing"类型的模拟模型中的障碍物配置保持一致。

通过这样的配置,用户可以方便地根据指定的模拟模型配置对象的属性,从而实现灵活的网络模拟。

交通参数配置

TraCIScenarioManager是用于管理和控制TraCI(Traffic Control Interface)仿真场景的模块。TraCI是一种用于仿真城市交通流量的接口,通过它可以从外部程序中控制和获取仿真场景的状态和参数。

以下是每行代码的解释:

  • *.manager.updateInterval = 1s:这行代码将TraCIScenarioManager的更新间隔设置为1秒。这意味着TraCIScenarioManager将每秒更新一次仿真场景的状态。
  • *.manager.host = “localhost”:这行代码将TraCIScenarioManager的主机地址设置为本地主机(“localhost”)。这意味着TraCIScenarioManager将只在本地计算机上运行仿真场景。
  • *.manager.port = 9999:这行代码将TraCIScenarioManager的端口号设置为9999。这意味着TraCIScenarioManager将使用9999端口与外部程序进行通信。
  • *.manager.autoShutdown = true:这行代码将TraCIScenarioManager的自动关闭参数设置为true。这意味着当仿真结束后,TraCIScenarioManager将自动关闭仿真场景。
  • *.manager.launchConfig = xmldoc(“erlangen.launchd.xml”):这行代码将TraCIScenarioManager的启动配置设置为名为"erlangen.launchd.xml"的XML文件。这个XML文件通常包含有关仿真场景的各种配置信息,例如车辆、道路网络等。 通过这些参数的配置,可以控制TraCIScenarioManager的行为和仿真场景的运行方式。

RSU配置

对RSUExampleScnario.ned中的路侧单元ned中的参数做出设置。其中最重要的就是applType,它指定了RSU的应用层,也就是RSU会做什么。其实RSU也是一个ned文件,比network级低,它是由另外几个更低级的ned组成的,包括作为应用层的ned(appl),作为MAC层的ned(nic),作为移动驱动的ned(mobility)。

applType指定的就是应用层的ned,而应用层ned的功能又由其同名且在同一个文件夹的C++文件定义,这样RSU的功能也就确定了,做应用层研究的要改变的就是这个应用层的ned与对应的C++文件。

至于后面那些参数都是对于应用层ned中的一些参数做出设置,如.rsu[*].appl.beaconUserPriority = 7就是令所有RSU应用层的信标优先级为7。

首先在车联网的Veins框架中,RSU代表路侧单元(Road Side Unit)。路侧单元是一种设备,安装在路侧,用于在V2X通信中与车载单元(On Board Unit, OBU)进行通信。

知道了RSU的意思,我们就可以开始入手这个RSU SETTINGS代码了。

*.rsu[0].mobility.x = 5500:这行代码将第一个"rsu"模块的移动性属性(mobility)的x坐标设置为5500。这可能表示该模块在二维空间中的水平位置。

*.rsu[0].mobility.y = 7000:这行代码将第一个"rsu"模块的移动性属性的y坐标设置为7000。这可能表示该模块在二维空间中的垂直位置。

*.rsu[0].mobility.z = 3:这行代码将第一个"rsu"模块的移动性属性的z坐标设置为3。这可能表示该模块在三维空间中的某一维度(比如高度)的位置。

*.rsu[1].mobility.x = 6500:这行代码将第二个"rsu"模块的移动性属性的x坐标设置为6500。

*.rsu[1].mobility.y = 5850:这行代码将第二个"rsu"模块的移动性属性的y坐标设置为5850。

*.rsu[1].mobility.z = 3:这行代码将第二个"rsu"模块的移动性属性的z坐标设置为3。

接下来的几行代码是针对所有"rsu"模块的应用类型(applType)和一些应用级别的参数进行设置。

.rsu[].applType = “IoVSDemo”:这行代码将所有"rsu"模块的应用类型设置为"IoVSDemo"。

.rsu[].appl.headerLength = 80 bit:这行代码将所有"rsu"模块的应用级别的header长度设置为80 bit。

.rsu[].appl.sendBeacons = false:这行代码将所有"rsu"模块的应用级别的发送信标(beacon)参数设置为false,表示不发送信标。

.rsu[].appl.dataOnSch = false:这行代码将所有"rsu"模块的应用级别的数据在调度(dataOnSch)参数设置为false,表示不在调度上发送数据。

.rsu[].appl.beaconInterval = 1s:这行代码将所有"rsu"模块的应用级别的信标间隔(beaconInterval)设置为1秒。

.rsu[].appl.beaconUserPriority = 7:这行代码将所有"rsu"模块的应用级别的信标用户优先级(beaconUserPriority)设置为7。

.rsu[].appl.dataUserPriority = 5:这行代码将所有"rsu"模块的应用级别的数据用户优先级(dataUserPriority)设置为5。

.rsu[].nic.phy80211p.antennaOffsetZ = 0 m:这行代码将所有"rsu"模块的网络接口卡(nic)的物理层(phy80211p)的天线偏移(antennaOffsetZ)设置为0米。

在Veins车联网平台中,信标用户优先级(Beacon User Priority)和数据用户优先级(Data User Priority)是两个相关的概念,它们用于确定车辆在通信过程中的优先级。

  • 信标用户优先级是指在信标传递过程中,用于确定哪个车辆可以发送信标的优先级。具有较高信标用户优先级的车辆更有可能被选中发送信标。
  • 数据用户优先级是指在数据传输过程中,用于确定哪个车辆可以发送数据的优先级。具有较高数据用户优先级的车辆更有可能被选中发送数据。
  • 信标用户优先级和数据用户优先级是两个不同的参数,它们在Veins中分别用于不同的通信阶段。信标用户优先级主要用于信标传递阶段,而数据用户优先级主要用于数据传输阶段。

在车联网中,信标(Beacon)是一种信息公告,它是由车辆或路侧单元(RSU)发送的特定消息。信标通常用于在一定范围内广播车辆的身份、位置和其他相关信息。信标的作用类似于一个标识符,它可以被其他车辆或RSU接收,从而提供关于周围车辆的实时信息。

信标通常是在特定的时间间隔内周期性地发送,以便其他车辆或RSU能够感知到附近车辆的存在和状态。在Veins车联网模拟框架中,信标被用于模拟车辆间的通信过程,以支持各种交通管理和安全应用。

车联网通信阶段

信标传递阶段:在这个阶段,车辆或RSU通过DSRC技术向周围发送信标,信标包含了车辆的身份、位置等信息。其他车辆或RSU可以接收到这些信标,从而获取周围车辆的信息。信标传递阶段主要用于建立车辆间的通信连接,为后续的数据传输做准备。

数据传输阶段:在建立了通信连接之后,车辆或RSU可以通过DSRC技术进行数据传输。数据传输阶段主要用于车辆之间或车辆与RSU之间交换各种信息,例如交通状况、行驶速度、行驶方向等。这个阶段通常需要设置数据用户优先级,以确定哪些车辆可以优先发送数据。

消息传递阶段:除了实时的数据传输,车联网中还需要支持一些非实时的消息传递,例如紧急事件通知、交通公告等。消息传递阶段主要用于在较大的范围内广播这些消息,让所有车辆都能够接收到相关信息。

信标用户优先级和数据用户优先级是分别用于信标传递阶段和数据传输阶段的两个不同的参数。信标用户优先级用于确定哪些车辆可以发送信标,而数据用户优先级用于确定哪些车辆可以发送数据。通过设置不同的优先级,可以控制车辆在通信过程中的行为,从而实现更高效、更安全的通信。

网卡参数设置

11p specific parameters和NIC-Settings是两个不同的配置参数。

nic包含两个子ned(mac1609_4和phy80211p)。

11p specific parameters是与802.11p协议相关的参数,用于配置无线通信的特性。802.11p是一种无线通信标准,专门用于车辆网络(V2X通信),具有较高的传输速率和较低的延迟。这些参数包括调制方式、数据速率、信道带宽等,可以根据具体的应用场景进行调整。

NIC-Settings是指网络接口卡(NIC)的设置。在OMNeT++中,可以通过设置NIC参数来模拟不同类型和配置的网络接口卡。这些参数包括网络接口卡的类型、MAC地址、最大传输单元(MTU)等。通过配置NIC参数,可以模拟不同的网络环境和通信条件,以支持各种网络协议和仿真场景。

网卡

这里先介绍一下网卡的相关概念。

网卡,又称网络适配器或网卡适配器,是计算机中用于连接网络的硬件设备。它负责将计算机产生或接收的数据转换为适合在网络上传输的格式,并且能够通过物理介质(如以太网、无线电波等)与其他计算机或网络设备进行通信。

网卡主要分为有线网卡和无线网卡两种类型。有线网卡通常采用以太网协议,使用网线连接计算机与网络设备(如路由器、交换机等),传输以太网帧,实现数据的传输和通信。无线网卡则是用于无线网络连接的设备,通过无线信号与路由器等网络设备进行通信。

网卡工作在OSI模型中的第二层——数据链路层。

数据链路层是OSI模型中第二层,它负责将网络层传来的数据进行分帧,然后将分帧后的数据发送到物理层,以便在物理层上进行传输。网卡就是在数据链路层上工作的,它接收从物理层传来的数据,然后将数据进行解析和处理,最后将处理后的数据发送到网络层。

网卡的具体功能如下:

  • 数据转换:网卡将计算机内部的数据格式转换为网络上通用的数据格式,同时将接收到的网络数据转换为计算机可以处理的数据格式。
  • 物理连接:网卡提供物理连接接口,如RJ-45接口(用于以太网连接)或USB接口(用于USB总线连接),使得计算机可以与网络设备进行物理连接。
  • 通信协议处理:网卡支持各种网络通信协议,如IP、TCP、UDP等,能够根据协议规则进行数据包的封装、解封装和传输。
  • 错误检测和处理:网卡能够在数据传输过程中检测并处理错误,例如校验和、重传控制等,以确保数据的正确传输。
  • 电源管理:网卡具备电源管理功能,可以在计算机处于低功耗模式时关闭网卡,以节省能源。
  • 速度匹配:由于计算机的网卡与网络设备的传输速率可能不同,因此网卡需要具备速度匹配的功能,以确保数据的顺畅传输。

那么我们查看一下网卡NIC的相关代码:

  • “.connectionManager.sendDirect”: “这个设置表明是否启用直接发送模式。如果设置为true,则数据包将直接发送到目标节点,而不是通过多跳或路由。”
  • “.connectionManager.maxInterfDist”: “这个设置定义了节点之间可以相互通信的最大距离,这里设置为300米。”,
  • “.connectionManager.drawMaxIntfDist”: “此设置控制是否在仿真图中绘制最大接口距离。如果设置为false,该距离将不会在仿真图中显示。”,
  • “…nic.mac1609_4.useServiceChannel”: “这个设置决定是否使用服务频道,这里设置为false,意味着不使用。”,
  • “*…nic.mac1609_4.txPower”: “定义了发送信号的功率,这里设置为20mW。”,
  • “.**.nic.mac1609_4.bitrate”: “定义了数据的传输速率,这里设置为6Mbps。”,
  • “…nic.phy80211p.minPowerLevel”: “定义了最小的无线信号功率水平,这里设置为-110dBm。”,
  • “*…nic.phy80211p.useNoiseFloor”: “这个设置决定是否使用噪声底噪,这里设置为true,表示使用。”,
  • “.**.nic.phy80211p.noiseFloor”: “定义了底噪水平,这里设置为-98dBm。”,
  • “…nic.phy80211p.decider”: “定义了用于决策过程的XML文档,这里设置为’config.xml’。”,
  • “*…nic.phy80211p.analogueModels”: “定义了模拟模型的XML文档,这里设置为’config.xml’。”,
  • “.**.nic.phy80211p.usePropagationDelay”: “这个设置决定是否使用传播延迟,这里设置为true,表示使用。”,
  • “.**.nic.phy80211p.antenna”: “定义了天线的XML文档,这里设置为’antenna.xml’,并选择了具有id为’monopole’的天线。”,
  • “.node[].nic.phy80211p.antennaOffsetY”: “定义了天线的Y轴偏移量,这里设置为0米。”,
  • “.node[].nic.phy80211p.antennaOffsetZ”: “定义了天线的Z轴偏移量,这里设置为1.895米。”

可以看到这里有相关的ned文件。

WaveAppLayer 移动车辆应用层设置

移动节点Mobility

“.node[].veinsmobility.x = 0”: “这行代码将所有节点的veinsmobility对象的x坐标设为0。”, “.node[].veinsmobility.y = 0”: “这行代码将所有节点的veinsmobility对象的y坐标设为0。”, “.node[].veinsmobility.z = 0”: “这行代码将所有节点的veinsmobility对象的z坐标设为0。”, “.node[].veinsmobility.setHostSpeed = false”: “这行代码将所有节点的veinsmobility对象的setHostSpeed属性设为false,意味着不会设置或更改主机速度。”, “*.node[0].veinsmobility.accidentCount = 1”: “这行代码将编号为0的节点的veinsmobility对象的accidentCount属性设为1,这可能代表该节点会发生一次事故。”, “.node[0].veinsmobility.accidentStart = 73s”: “这行代码将编号为0的节点的veinsmobility对象的accidentStart属性设为73秒,这可能代表事故开始的时间。”, “.node[*0].veinsmobility.accidentDuration = 50s”: “这行代码将编号为0的节点的veinsmobility对象的accidentDuration属性设为50秒,这可能代表事故的持续时间。”

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Veins介绍
  • 二、Veins下载
    • 三、Veins项目各文件拆解
    • 四、omnet++.ini配置文件代码讲解
      • 仿真基本参数
        • 注释参数
          • 障碍物参数
            • 交通参数配置
              • RSU配置
                • 车联网通信阶段
                  • 网卡参数设置
                    • 网卡
                  • WaveAppLayer 移动车辆应用层设置
                    • 移动节点Mobility
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档