概述
场景对于车载自组织网络(VANET)的仿真来说至关重要,因为VANET是一种特殊的Ad-Hoc网络,其特殊性主要变现在应用场景上。
传统的Ad-Hoc网络,比如sensor network,其仿真场景通常只是随机分布、随机运动即可;但由于车辆运动的规律性和动态性对网络的各个指标性能有较大的影响,所以在评估一个VANET的算法(路由,MAC,广播)的时候,合适的场景是很有必要的。
当前VANET的协议算法的仿真主要是两个软件:OMNET++,NS2/3,我使用的是前者。在OMNET++中,其本身是没有VANET仿真模块的,为了解决这个问题,[1]开发了开源的Veins仿真框架,Veins包括基本的802.11p/1609.4模块,以及简单的应用层数据生成框架。
Veins的仿真需要用SUMO来生成仿真场景。SUMO其实是一个开源的交通仿真软件,它可以生成逼真的交通轨迹场景,之所以说逼真,是因为其集成了车辆行驶规律、驾驶习惯等重要的内容。SUMO通过Traci拓展包与外部程序(如Veins,NS2等)进行通信,使得SUMO中的车辆轨迹可以输入到其他的外部程序中并加以利用。
一般来说使用SUMO生成场景需要用到以下文件:node文件,edge文件,flow文件以及route文件(这些文件都是XML格式)。下面以高速公路场景为例说明整个过程。
首先定义节点(highway.node.xml)。节点包含坐标、id、节点类型type等属性,这里列出的属性是必须的,其他属性有默认值或者是可选的,具体见[2]。
<nodes>
<node id="node1" x="0" y="100" type="priority" />
<node id="node2" x="5000" y="100" type="priority" />
<node id="node3" x="5001" y="100" type="priority" />
</nodes>
上面的代码中定义了node1-3 3个节点,type为priority。priority的意思是,在后续定义的边edge中,具有高优先级的edge,其车辆通过的优先级也较高。
在以上面已经定义好的节点基础上,我们定义边edge(highway.edge.xml)。
<edges>
<edge id="edge1" from="node1" to="node2" priority="75" numLanes="2" speed="40" />
<edge id="edge2" from="node2" to="node3" priority="75" numLanes="2" speed="40" />
</edges>
同样,边edge也包含很多种属性[2],其中比较重要的属性是from和to,这两个属性表示边两端所连接的点;numLanes定义了该边的车道数目,speed表示该边的最大行驶速度。在定义好edge和node后,使用netconvert命令,将其转换为net文件(highway.net.xml):
netconvert --node-files=highway.node.xml --edge-files=highway.edg.xml --output-file=highway.net.xml
在定义好道路net后,需要定义车流flow(highway.flow.xml):
<pre name="code" class="html"><flows>
<vType
id="vtype0" accel="2.9" decel="7.5" sigma="0.5" length="4.3" minGap="2" maxSpeed="22.22222" color="1,1,0" speedFactor="1.0"
speedDev="0.15" />
<flow id="flow0" type="vtype0" from="edge1" to="edge2"
begin="0" end="500"
period="1"
departLane="best" departSpeed="max" departPos="base"
/>
</flows>
在flow文件中,定义了车辆类型(包含车辆的各种参数,例如加减速度、驾驶习惯参数、长度和间距等);此外还定义了最重要的车流(flow),车流中包含之前定义好的车辆类型、起始位置和终止位置(以边来作为标识,这说明要定义正常的道路,至少要三个node)、车辆产生间隔(s)period以及车辆插入道路的位置(详细的选项见[3])。
接下来,使用duarouter命令将net文件和flow文件转化为route文件:
duarouter -n highway.net.xml -f highway.flow.xml -o highway.rou.xml --randomize-flows --random
转化后的route文件如下:
<pre name="code" class="html"><routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://sumo-sim.org/xsd/routes_file.xsd">
<vType id="vtype0" length="4.30" minGap="2.00" maxSpeed="22.22" speedFactor="1.00" speedDev="0.15" color="yellow">
<carFollowing-Krauss accel="2.90" decel="7.50" sigma="0.50"/>
</vType>
<vehicle id="flow0.0" type="vtype0" depart="0.00" departLane="best" departPos="base" departSpeed="max">
<route edges="edge1 edge2"/>
</vehicle>
<vehicle id="flow0.1" type="vtype0" depart="1.00" departLane="best" departPos="base" departSpeed="max">
<route edges="edge1 edge2"/>
</vehicle>
.........
<vehicle id="flow0.499" type="vtype0" depart="499.00" departLane="best" departPos="base" departSpeed="max">
<route edges="edge1 edge2"/>
</vehicle>
</routes>
从上面生成的代码可以看出,其实我们可以自己手动的写route文件。
在弄好这些文件后,编写sumo配置文件highway.sumo.cfg:
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://sumo.sf.net/xsd/sumoConfiguration.xsd">
<input>
<net-file value="highway.net.xml"/>
<route-files value="highway.rou.xml"/>
</input>
<time>
<begin value="0"/>
<end value="500"/>
<step-length value="0.1"/>
</time>
</configuration>
以上文件弄好后,放入OMNET++&Veins中(详见Veins官网和Veins中的例子),就可以进行最后的仿真了。
事实上,要使得自己的场景更符合实际情况,还有很多东西需要注意:首先是车辆的自身参数要符合实际情况(speed factor et. al);其次是车辆跟随模型;此外还需要在duarouter中使用--randomize-flows --random等参数,使得车辆的到达间隔不是一个固定的值。
此外,在很多论文中,作者都倾向于假设车辆在道路上是服从possion分布的,这一点我还没实现。我现在的想法是:固定的period可以对应一个Vehicle/km,以此作为初步解决方案。如果有朋友碰巧看见拙文,并且知道possion分布如何实现,麻烦告知。
[1] http://veins.car2x.org/
[2] http://sumo.dlr.de/wiki/Networks/Building_Networks_from_own_XML-descriptions
[3] http://sumo.dlr.de/wiki/Definition_of_Vehicles,_Vehicle_Types,_and_Routes
最后
以上就是傻傻鸡翅为你收集整理的OMNET++/Veins VANET仿真:SUMO场景生成的全部内容,希望文章能够帮你解决OMNET++/Veins VANET仿真:SUMO场景生成所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复