跳转至

外接第三方交通流(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
                        }
                    }
                ]
            }
        ]
    }