模块介绍:交通通信耦合仿真模块
一、耦合仿真模块架构体系
1、基础层
如图1,基础层的特点:
(1)定义了通信体必须具备的属性与功能。
(2)设计基础层为抽象类,只能作为接口使用。
(3)通过功能层的子类进行实例化。

图1 基础层的参数与功能
2、功能层
特点:
(1)基于基础层进行通信体的功能划分。
(2)提供了有针对性、更加丰富的属性与功能
图2 功能层的参数与功能
3、应用层
特点:
(1)需要考虑交通相关的功能和属性,如路网拓扑、车辆拓扑、车流密度等。
(2)生成通信路由表和标准覆盖车辆数。

图3 应用层的参数与功能
二、可适配微观交通行为的通信等效模型
相比于传统的通信仿真器,本研究以数据+场景驱动的参数标定,简化通信过程建模。
通信等效模型主要包括:
(1)RSU信息服务区域定义;
(2)连通概率模型;
(3)时延模型。
三、敏捷开发需求的交通-通信耦合仿真工具
1、基于SUMO仿真平台嵌入RSU与OBU对象--实现基础参数配置
(1)在netedit编辑器中添加RSU个体,并生成(RSU.xml)文件。
①功能栏选择Network,进入其中的POI点设置。
图4 NETEDIT编辑器上设置POI示意图
②参数设置。
Ⅰ. 修改poi类型为RSU
Ⅱ. 设置对应的参数包括基础参数id(” RSU_XX”)、pos;
Ⅲ. 可视化相关参数有图标读取路径image、图标宽度width、图标高度height以及可视化图层layer。可视化图层layer默认设置为-1,以防止RSU图标覆盖路网图层。
Ⅳ. 设备参数。需要在Edit parameter中增加“设备参数”。包括发射功率emit_rate、comm_range通信范围、控制周期cont_cycle等。
Ⅴ. 环境参数。需要在Edit parameter中增加“设备参数”。包括路径损失系数arfa和高斯随机变量标准差theta。

图5 NETEDIT编辑器上设置RSU示意图
③保存至附属设施(RSU.xml)文件中。
点击File选择Additionals and Shapes,通过save Additional as自动保存并生成RSU附属设施文件(.xml)。
(2)在(.rou)文件中添加OBUcar车辆类型,更新(rou.xml)文件。
①添加OBUcar车辆类型,添加对应的参数。
Ⅰ. 设备参数。包括发射功率emit_rate、comm_range通信范围等。
Ⅱ. 环境参数。包括路径损失系数arfa和高斯随机变量标准差theta。
②根据场景需求设定车辆类型选择OBUcar。
2、基于Traci接口导入等效通信模型---实现通信功能配置
(1)配置导sumosfg文件中,并使用已封装的RSU类对象实现案例测试。
import RSU_OBU 导入封装好的库
(2)使用功能函数:
①根据需求,选择功能对应的类及函数,例如,获取RSU与装载OBU车辆的通信数据,选择RSU(). comp_data()②获取对应RSU的参数值,完成函数调用(实例化)。见案例
说明:该仿真模块代码的β1.0版本已开放在Code Ocean,链接地址为:https://doi.org/10.24433/CO.8068651.v1.
案例介绍:RSU与OBU的配置及其通信数据输出
一、数据输入与文件配置
1、输入路网及信号控制数据文件
以安徽省宣城市路网(xuancheng.net.xml)及其真实信号控制数据(signal_new.add.xml)为输入文件。
图6 宣称路网SUMO仿真图
2、配置交通出行需求文件
通过netedit模块设置出行需求文件(flows.rou.xml)为输入文件。
3、配置OBU设备
在车辆出行需求文件(.rou.xml)中,配置'OBUcar'类型,设置其基础功能参数
4、配置RSU设备
在NETEDIT编辑器或是RSU.xml(附属设施文档)中,配置RSU对象,设置其基础功能参数
5、形成配置文件(sim.sumocfg)
完成仿真场景配置,仿真场景示意图如下。
图7 场景仿真示意图
二、仿真运行与数据输出
1、仿真启动
通过Traci接口,编写demo.py文件。通过命令traci.start(["sumo-gui", "-c", "sim.sumocfg"], port=7930)启动SUMO交通仿真软件。
2、导入等效通信模型库
在demo.py中导入'RSU_OBU'库,选择对应的类与功能函数。
from RSU_OBU import RSU,OBU
3、RSU的基础参数
可以通过traci.poi.getxxx()相关函数获取RSU的基础参数。例如:
以'RSU_01'为例,
获取RSU的位置数据:RSU_position_01=traci.poi.getPosition('RSU_01')获取RSU的发射功率数据:RSU_emit_rate_01=traci.poi.getParameter('RSU_01','emit_rate')
获取RSU的通信范围数据:RSU_comm_range_01 = traci.poi.getParameter('RSU_01', 'comm_range')获取RSU的路径损耗参数数据:RSU_theta_01 = traci.poi.getParameter('RSU_01', 'theta')
获取RSU的高斯随机变量标准差数据:RSU_arfa_01 = traci.poi.getParameter('RSU_01', 'arfa')
获取RSU的服务容量数据:RSU_capacity_01 = traci.poi.getParameter('RSU_01', 'capacity')
获取RSU的控制周期数据:RSU_cycle_01 = traci.poi.getParameter('RSU_01', 'cont_cycle')
4、OBU的基础参数
可以通过traci.vehicletype.getxxx()和traci.vehicle.getxxx()相关函数获取OBU的基础参数。例如:
以'OBU_01'为例,
获取OBU的位置数据:OBU_position_01 = traci.vehicle.getPosition('flow_2.2')
获取OBU的发射功率数据:OBU_emit_rate_01 = traci.vehicletype.getParameter('OBUcar', 'emit_rate') # getParameter()
获取OBU的通信范围数据:OBU_comm_range_01 = traci.vehicletype.getParameter('OBUcar', 'comm_range')获取OBU的路径损耗参数数据:OBU_theta_01 = traci.vehicletype.getParameter('OBUcar', 'theta')
获取OBU的高斯随机变量标准差数据:OBU_arfa_01 = traci.vehicletype.getParameter('OBUcar', 'arfa')5、输出RSU与任一OBU的通信状态数据
例如:获取连通概率数据:RSU(id='RSU_01', pos=RSU_position_01, emit_rate=int(RSU_emit_rate_01), comm_range=int(RSU_comm_range_01), theta=float(RSU_theta_01), arfa=float(RSU_arfa_01),capacity=int(RSU_capacity_01), cont_cycle=int(RSU_cycle_01)).comp_data(pos_OBU)[1]
获取通信时延数据:RSU(id='RSU_02', pos=RSU_position_02, emit_rate=int(RSU_emit_rate_02), comm_range=int(RSU_comm_range_02), theta=float(RSU_theta_02), arfa=float(RSU_arfa_02),capacity=int(RSU_capacity_02), cont_cycle=int(RSU_cycle_02)).comp_data(pos_OBU)[1]
6、输出多个RSU下OBU通信状态数据
例如:多个RSU覆盖下OBU的通信对象选择及时延数据输出:OBU(id='flow_2.2', pos=traci.vehicle.getPosition('flow_2.2'), emit_rate=int(OBU_emit_rate_01),comm_range=float(OBU_comm_range_01),theta=float(OBU_theta_01), arfa=float(OBU_arfa_01)).comp_data_formul(RSUsp_list)[2]