外接第三方交通流(Vissim)
支持直接对接Vissim交通流工具,或者通过DST API对接第三方交通流。
1. 交通流用例-如何使用Vissim¶
Step 1 安装 Vissim 软件¶
安装 Vissim 软件 10 版(注意不要安装其他的版本,目前只有这个版本可以用于 SimOne 的仿真)。
Step 2 安装 CodeMeter7.10a 并配置¶
(1)打开 CodeMeter,点击右下角 WebAdmin 。
(2)在弹出网页中点击上面一行中的 Configration 菜单,将 Server Search List 中清空(点击 垃圾桶 图标),点击 Apply 确定。
Step 3 在 SimOne 中配置使用 Vissim¶
(1)目前公开版本中支持 Vissim 的地图只有 三车道路口,如要使用 Vissim 仿真,请在构建用例时选择该地图。
(2)选择案例类型为 交通流案例,并在 交通流属性配置 里选择 Vissim,并根据需要配置所需的对手车类型及其比例
(3)运行仿真用例。
2. 交通流用例-如何使用DST_API控制¶
DST(Dynamic Simulation Translator) API用于接入第三方生成的交通流;DST API 和第三方交通流数据的通信通过 socket 通信完成;且每帧第三方交通流数据会以 JSON 方式发给 DST(参考 附录 DST 一帧数据的 JSON 格式样例)。
一般使用情况下,为保证数据传输效率,建议将发送数据的进程与 SimOne 放于同一机器。在此前提下,socket 通信的 IP 地址是 127.0.0.1,端口是 21568。
DST
动态仿真转换器 / Dynamic Simulation Translator
DST代表"Dynamic Simulation Translator",即动态仿真转换器。Dynamic Simulation Translator是一种软件工具,用于将不同仿真环境之间的模型和数据进行转换和集成。它允许在不同的仿真平台之间共享和传递模型、数据和结果,以便进行跨平台的仿真和分析。DST的主要目的是提高仿真的灵活性和可重用性,减少重复开发的工作量,并促进不同仿真工具之间的互操作性。
基本工作流程¶
Step 1 创建第三方交通流用例¶
创建交通流用例,点击左侧 资源列表 的交通流,并在弹出的右侧 交通流属性配置 中选择 api 交通流,根据需要勾选 家用 商用 工程用 类型,并保存。
Step 2 获取地图及主车信息进行交通流建模¶
调用 API 获取该用例的地图和主车信息(相关 API 调用请参考 开发者手册),在第三方交通流工具中进行交通流建模,生成交通流数据。
Step 3 调用DST API编写发送脚本¶
根据第三方交通流向DST发送数据的要求,编写发送脚本,并将脚本拷贝到 SimOne 的同一环境下(python脚本样例参考 附录 DST API Sample 代码)。脚本内容主要包括:
(1)创建 socket,绑定 IP 地址和端口以建立连接。
(2)获取交通参与者数据并通过 socket 发送给 DST。参考下面的例子,交通参与者的数据信息包括:
| 数据类型 | 字段说明 |
|---|---|
| 通用数据 | (1)TimeStamp:交通参与者当前所在帧的时间戳,单位是秒,为必须项; (2)ObjectId:交通参与者的用户自定义 id,具有唯一性,为必须项; (3)ObjectType:交通参与者的具体类别,可取值 Vehicle、Pedestrian、Bike 或 TrafficLight,为必须项; (4)Position:交通参与者坐标,X、Y、Z 单位是米,其中 X、Y 为必须项,Z 为可选项; |
| 车辆行人自行车专属数据 | (1)Speed:交通参与者的速度,单位是米/秒,为可选项; (2)PIS:交通参与者的航向度,单位是弧度,为可选项; (3)AssetId:具体交通参与者的类型 id,用于加载 SimOne 内部模型,取值要参考 SimOne 内部的 agents.json 并结合 ObjectType,为可选项,默认为 agents.json 中随机 Vehicle 的 id。 |
| 交通灯专属数据 | Attributes 字段:其中包含 OpenDriveLightId、Signal 及 CountDown 三个子字段 (1)OpenDriveLightId:opendrive 中对应交通灯的 id,为必须项; (2)Signal: 此交通灯的颜色,取值“R”、”Y”或”G”,表示红、黄或绿,为必须项; (3)CountDown:此交通灯的持续秒数,为必须项。 |
(3)建议用恒定频率发送数据,推荐 10HZ。
Step 4 运行测试用例¶
运行 SimOne 中建立的交通流用例,等启动完成后(比如 UE 界面加载完成),运行 Step 3中的脚本,运行结果如下,可见主车前方的对手车在按照发送的数据实时缓慢移动。
附录 DST API Sample 代码¶
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
import json
import time
if __name__ == '__main__':
dstSocket = socket.socket()
dstSocket.connect(("127.0.0.1", 21568))
print("start data process node...\n")
print("connect dst ip: 127.0.0.1 port:21568")
index = 0
tick = 0
pulse = 0.1
while True:
start = time.time()
dataPackage = {}
dataPackage['Data'] = []
asset = {}
asset['TimeStamp'] = str(tick)
objects = []
position = {}
position['X'] = float(-46 + 0.25 * index)
position['Y'] = -3.44
actor = {}
actor["ObjectId"] = '23562'
actor['AssetId'] = "1000006"
actor['ObjectType'] = 'Vehicle'
actor['Position'] = position
objects.append(actor)
asset['Objects'] = objects
dataPackage['Data'].append(asset)
try:
sendData = json.dumps(dataPackage).encode('utf-8')
dstSocket.send(sendData)
except:
print('dst Socket is closed!!')
index = index + 1
end = time.time()
if pulse > (end - start):
time.sleep(pulse - (end - start))
tick = tick + pulse
附录 DST 一帧数据的 JSON 格式样例¶
FrameData = {
"Data": [
{
"TimeStamp": "51.0",
"Objects": [
{
# 只写必须字段的例子
"ObjectId":"23562",
"ObjectType": "Vehicle",
"Position": {
"X": 575,
"Y": 268
}
},
{
# 字段写全的例子
"ObjectId": "23562",
"ObjectType": "Vehicle",
"Position": {
"X": 575,
"Y": 268,
"Z": 0
},
"Speed": "30",
"PIS": 1,
"AssetId": "1000049"
},
{
"ObjectId": "73088",
"ObjectType": "Vehicle",
"Position": {
"X": 575,
"Y": 280
}
},
{
"ObjectId": "73088",
"ObjectType": "Vehicle",
"Position": {
"X": 575,
"Y": 280
}
},
{
# 交通灯的例子,使id为9的交通灯设为红灯,并使之持续10秒
"ObjectId": "74000",
"ObjectType": "TrafficLight",
"Attributes": {
"OpenDriveLightId": 9,
"Signal": "R",
"CountDown": 10
}
"Position": {
"X": 600,
"Y": 300
}
}
]
}
]
}





