API 功能支持

本文档主要介绍 API 功能支持具体内容。

  • API 调用示例参考 调用示例 ([SimOne 安装目录]\SimOne\SimOneAPI )

API 类型 API 接口 功能
1. 基础服务类
主要提供车辆选择、仿真工作模式设置和热区数据获取的功能。
ServiceAPI 选择车辆: 选择具体的目标车辆进行控制,并订阅其状态更新
设置仿真工作模式: 根据需要选择帧同步(保证实时性和稳定性)或非帧同步(提高运行效率)模式
获取热区数据:
通过主动 API 调用或自动回调函数获取车辆及其周边环境的实时数据
2. 传感器类
为开发者提供了从 SimOne 仿真环境中获取各种传感器数据的能力。
SensorAPI 获取目标级或物理级信息: 包括图像信息、激光雷达点云、毫米波雷达及超声波雷达目标级信息等
获取传感器真值数据: 既能满足感知算法接入测试,也能满足跳过感知,直接从决策算法接入的开环测试需求
环境信息配置与管理 :涉及获取和设置与仿真环境相关信息(如天气、光照和地面条件等),对于创建特定测试场景非常关键。
StreamingAPI 获取物理级传感器流式传输 :实时获取和自动回调图像及点云数据,支持多种格式。
V2XAPI V2X 消息处理 :获取特定车辆 UPER 编码的 V2X 消息及更新通知。
3. 控制通信类
通过控制信号输入驱动被测车辆运行,实现复杂交通场景模拟。
PNCAPI 车辆状态与初始化 :涵盖选择测试车辆、初始化状态信息、设置起始位置和重置车辆状态的操作。
预警信息与控制策略 :包括设置和接收预警信息、控制车辆动作,以及规划控制输出的必要接口,确保测试车辆按照算 法进行动态响应。
4. 高精地图运行时类
为决策算法提供厘米级高精度地图信息,包括路网和交通元素,支持包括路径规划和定位在内的 多种 API 调用。
HDMapAPI 地图与车道分析 :提供高精地图加载及车道详细信息查询,强化定位和路由能力。
环境识别与判断 :集成交通灯、标志、停车位等环境要素的识别,辅助决策及判断。
5. 评价算法类
获取用户自定义评价功能所需要的基本仿真数据以及评价需要的用户规控算法内部相关信号。
EvaluationAPI 存取评价数据 :存取用户自定义的评价功能所需的数据,用于用户自定义的评价算法。

1. 基础服务类

1.1 ServiceAPI

1.1.1 选择车辆并初始化

注意

该操作可以设定是否使用同步帧功能

1、帧同步(保证实时性和稳定性)

2、非帧同步(提高运行效率)

事件 API
初始化 SimOne API SIMONE_API bool InitSimOneAPI(const char* mainVehicleId = "0", bool isFrameSync = false, const char *serverIP = "127.0.0.1", int port = 23789, void(*startCase)()=0, void(*endCase)()=0, int registerNodeId=0);
多车版本-初始化 SimOne API SIMONE_API bool InitSimOneAPIEx(char** mainVehicleIdList, int count, bool isFrameSync = false, const char *serverIP = "127.0.0.1", int port = 23789, void(*startCase)() = 0, void(*endCase)() = 0, int registerNodeId = 0);
初始化 SimOne API 带超时 SIMONE_API bool InitSimOneAPIWithTimeOut(const char* mainVehicleId = "0", bool isFrameSync = false, const char *serverIP = "127.0.0.1", int port = 23789, int timeOutMS = -1, void(*startCase)() = 0, void(*endCase)() = 0, int registerNodeId = 0);
多车版本 - 初始化 SimOne API 带超时 SIMONE_API bool InitSimOneAPIExWithTimeOut(char** mainVehicleIdList, int count, bool isFrameSync = false, const char *serverIP = "127.0.0.1", int port = 23789, int timeOutMS = -1, void(*startCase)() = 0, void(*endCase)() = 0, int registerNodeId = 0);
参数名 解释
mainVehicleId 主机车辆 ID(范围从 0 到 9)
isFrameSync 是否同步帧
serverIP BridgeIO 服务器 IP 地址
port BridgeIO 服务器端口号
startCase 案例开始前调用的回调函数
endCase 案例结束后调用的回调函数
registerNodeId 注册节点 ID(当前未使用
count 主车辆 ID 数量
timeOutMS 超时时间,以毫秒为单位

1.1.2 获取主车状态

事件 API
主动获取主车状态 SIMONE_API bool GetMainVehicleStatus(const char* mainVehicleId, SimOne_Data_MainVehicle_Status *pMainVehicleStatus);
回调方式获取之车状态 SIMONE_API bool SetMainVehicleStatusUpdateCB(void(*cb)(const char* mainVehicleId, SimOne_Data_MainVehicle_Status *pMainVehicleStatus));
参数名 解释
mainVehicleId 主车的 ID
SimOne_Data_MainVehicle_Status 指向主车状态信息的指针

SimOne_Data_MainVehicle_Status 结构体说明:

参数名 解释
mainVehicleId 主车 ID 的队列
mainVehicleStatus 对应的状态

1.1.3 其他函数说明

类别 事件 API
退出 退出 API 节点 SIMONE_API bool TerminateSimOneAPI();
获取案例信息 获取案例详情 SIMONE_API bool GetCaseInfo(SimOne_Data_CaseInfo *pCaseInfo);
获取案例运行状态 SIMONE_API ESimOne_Case_Status GetCaseRunStatus();
获取主车信息列表 SIMONE_API bool GetMainVehicleList(SimOne_Data_MainVehicle_Info *pMainVehicleInfo);
获取高精度地图元数据信息 SIMONE_API bool GetHDMapData(SimOne_Data_Map* hdMap);
获取当前库的版本号 SIMONE_API const char *GetVersion();
案例控制 等待并获取当前帧值 SIMONE_API int Wait();
进行下一帧 SIMONE_API void NextFrame(int frame); //frame 为具体的第几帧
暂停,用于非帧同步调试 SIMONE_API int Pause();
继续,用于非帧同步调试 SIMONE_API int Continue();
自动回调帧数据 仿真场景中每帧的回调函数 SIMONE_API bool SetFrameCB(void(*FrameStart)(int frame), void(*FrameEnd)(int frame));
截取节点信息 节点通信数据发送API SIMONE_API bool SendRouteMessage(int length, void* pBuffer, int msgId, int toNodeId, ESimOne_Client_Type toNodeType);
节点通信数据接收API SIMONE_API bool ReceiveRouteMessageCB(void(*cb)(int fromId, ESimOne_Client_Type fromType, int length, const void* pBuffer, int commandId));
设置日志格式 日志设置接口 SIMONE_API bool SetLogOut(ESimOne_LogLevel_Type level, const char *format, ...);

SimOne_Data_CaseInfo 如下:

参数名 解释
caseName 案例名称
caseId 案例 ID
taskId 任务 ID

SimOne_Data_MainVehicle_Info 结构如下:

参数名 解释
size 车辆数量
id_list 车辆 ID
type_list 车辆类型

SimOne_Data_Map 结构如下:

参数名 解释
openDrive 地图名称
openDriveUrl 地图下载的URL
opendriveMd5 地图文件的MD5值

2. 传感器类

2.1 SensorAPI

新增 获得所有传感器的配置信息(Id/类型/频率/位置和朝向等) GetSensorConfigurations SoGetSensorConfigurations
新增 获取传感器检测到地面喷漆信息(包括车道停止线/地面箭头/人行横道线) GetSensorRoadMarkInfo SoGetSensorRoadMarkInfo
获取传感器检测到地面喷漆信息(包括车道停止线/地面箭头/人行横道线数据回调) SetSensorRoadMarkInfoCB SoApiSetSensorRoadMarkInfoCB

2.1.1 GPS

GPS 获取数据的 API 有:

事件 API
获取主车 GPS 信息 SIMONE_NET_API bool GetGps(int mainVehicleId, SimOne_Data_Gps *pGps)
主车 GPS 更新回调 SIMONE_NET_API bool SetGpsUpdateCB(void(cb)(int mainVehicleId, SimOne_Data_GpspGps))
  • mainVehicleId 为主车 ID; pGps 的数据结构 SimOne_Data_Gps 如下:

数据 解释
float posX; Opendrive 中地图坐标系位置信息 X 坐标(单位 米)
float posY; Opendrive 中地图坐标系位置信息 Y 坐标(单位 米)
float posZ; Opendrive 中地图坐标系位置信息 Z 坐标(单位 米)
float oriX; Opendrive 中地图坐标系旋转位置信息 X 坐标(单位 弧度)
float oriY; Opendrive 中地图坐标系旋转位置信息 Y 坐标(单位 弧度)
float oriZ; Opendrive 中地图坐标系旋转位置信息 Z 坐标(单位 弧度)
float velX; Opendrive 中地图坐标系速度信息 X 坐标(单位 m/s)
float velY; Opendrive 中地图坐标系速度信息 Y 坐标(单位 m/s)
float velZ; Opendrive 中地图坐标系速度信息 Z 坐标(单位 m/s)
float throttle; 主车油门
float brake; 主车刹车
float steering; 主车方向盘
int gear; 主车档位
float accelX; Opendrive 中地图坐标系加速度 X 坐标(单位 m/s^2)
float accelY; Opendrive 中地图坐标系加速度 Y 坐标(单位 m/s^2)
float accelZ; Opendrive 中地图坐标系加速度 Z 坐标(单位 m/s^2)
float angVelX; Opendrive 中地图坐标系速度方向在 X 坐标(单位 弧度)
float angVelY; Opendrive 中地图坐标系速度方向在 Y 坐标(单位 弧度)
float angVelZ; Opendrive 中地图坐标系速度方向在 Z 坐标(单位 弧度)
float wheelSpeedFL; 主车前面左轮的转速(单位 m/s)
float wheelSpeedFR; 主车前面右轮的转速(单位 m/s)
float wheelSpeedRL; 主车后面左轮的转速(单位 m/s)
float wheelSpeedRR; 主车后面面右轮的转速(单位 m/s)
float engineRpm; 发动机转速(单位 r/min)
float odometer; 主车里程表(单位 米)

2.1.2 摄像头以及目标级摄像头

2.1.2.1 物理级摄像头

事件 API
获取图像信息 SIMONE_NET_API bool GetImage(const int mainVehicleId, const int sensorId, SimOne_Data_Image *pImage)
设置图像更新回调 SIMONE_NET_API bool SetImageUpdateCB(void(cb)(int mainVehicleId, int sensorId, SimOne_Data_ImagepImage))
获取流式图像信息 SIMONE_NET_API bool GetStreamingImage(const char ip, unsigned short port, SimOne_Data_ImagepImage)
设置流式图像回调 SIMONE_NET_API bool SetStreamingImageCB(const char* ip, unsigned short port, void(cb)(SimOne_Data_ImagepImage))

mainVehicleId 为主车 ID; sensorId 为摄像头 ID; ip 为接收机器的 ip 地址; port 为分配的端口号; pImage 为每帧图像信息; SimOne_Data_Image 的结构如下:

数据 解释
int width; 图像的宽度
int height; 图像的高度
SimOne_Image_Format format; 图像的格式目前只支持 RGB(每通道 8 位)
int imageDataSize; 图像的大小
Char imageData[SOSM_IMAGE_DATA_SIZE_MAX]; 图像数据存储数组,最大 1920 x 1200 x 3

1 与 2 方式获取物理级摄像头信息时不需要配置 UDP 信息,仅以 3 、4 的方式获取物理级图像信息时,需要在网页端订阅通道上配置 UDP 信息例如:udp://127.0.0.1:13956,截图如下:

2.1.2.2 目标级摄像头

事件 API
获取传感器检测到物体的对应真值 (支持的传感器包括目标级相机/目标级激光雷达/完美传感器)
传感器真值信息更新回调 (支持的传感器包括目标级相机/目标级激光雷达/完美传感器)
获取传感器检测到车道与车道线数据 (仅目标级相机和融合传感器支持)
获取传感器检测到车道与车道线数据 回调
  • 其中 pGroundtruth 为目标信息集合, SimOne_Data_SensorDetections 结构如下:

数据 解释
int objectSize; 目标数量
SimOne_Data_SensorDetections_Entry objects[SOSM_SENSOR_DETECTIONS_OBJECT_SIZE_MAX]; 目标存储集合,最多存储 256 个目标
  • SimOne_Data_SensorDetections_Entry 结构如下:

数据 解释
int id; 目标 ID
SimOne_Obstacle_Type type; 目标类型,与目标物理材质对应类型一致
float posX; 目标在世界坐标系中的 X 坐标(单位 米)
float posY; 目标在世界坐标系中的 Y 坐标(单位 米)
float posZ; 目标在世界坐标系中的 Z 坐标(单位 米)
float oriX; 目标在世界坐标系中的 X 轴方向的旋转坐标(单位 弧度)
float oriY; 目标在世界坐标系中的 Y 轴方向的旋转坐标(单位 弧度)
float oriZ; 目标在世界坐标系中的 Z 轴方向的旋转坐标(单位 弧度)
float length; 目标的长度(单位 米)
float width; 目标的宽度(单位 米)
float height; 目标的高度(单位 米)
float range; 目标相对于传感器的距离(单位 米)
float velX; 目标在 X 轴上的速度(单位 km/h)
float velY; 目标在 Y 轴上的速度(单位 km/h)
float velZ; 目标在 Z 轴上的速度(单位 km/h)
float probability; 目标为当前类型的置信度(0~1 之间)
float relativePosX; 目标相对于传感器的 X 坐标(单位 米)
float relativePosY; 目标相对于传感器的 Y 坐标(单位 米)
float relativePosZ; 目标相对于传感器的 Z 坐标(单位 米)
float relativeRotX; 目标相对于传感器的 X 轴方向的旋转坐标(单位 米)
float relativeRotY; 目标相对于传感器的 Y 轴方向的旋转坐标(单位 米)
float relativeRotZ; 目标相对于传感器的 Z 轴方向的旋转坐标(单位 米)
float relativeVelX; 目标相对于传感器的 X 轴方向的速度坐标(单位 km/h)
float relativeVelY; 目标相对于传感器的 Y 轴方向的速度坐标(单位 km/h)
float relativeVelZ; 目标相对于传感器的 Z 轴方向的速度坐标(单位 km/h)
float bbox2dMinX ; 像素坐标系下目标的 2d 包围盒左上角 X 坐标
float bbox2dMinY ; 像素坐标系下目标的 2d 包围盒左上角 Y 坐标
float bbox2dMaxX ; 像素坐标系下目标的 2d 包围盒右下角 X 坐标
float bbox2dMaxY ; 像素坐标系下目标的 2d 包围盒右下角 Y 坐标
  • 其中 pLaneInfo 为车道信息集合, SimOne_Data_LaneInfo 结构如下:

数据 解释
int id; 车道 ID
ESimOneLaneType laneType; 车道类型
int laneLeftID; 当前车道的左边车道 ID
int laneRightID; 当前车道的右边车道 ID
int lanePredecessorID[SOSM_SENSOR_LANE_OBJECT_SIZE_MAX]; 当前车道前继集合最大 256
int laneSuccessorID[SOSM_SENSOR_LANE_OBJECT_SIZE_MAX]; 当前车道后继集合最大 256
SimOne_Data_LaneLineInfo l_Line; 当前车道左边缘线信息
SimOne_Data_LaneLineInfo c_Line; 当前车道中间线信息
SimOne_Data_LaneLineInfo r_Line; 当前车道右边缘线信息
SimOne_Data_LaneLineInfo ll_Line; 当前车道左左边缘线信息
SimOne_Data_LaneLineInfo rr_Line; 当前车道右右边缘线信息

2.1.3 理想传感器

  • 理想传感器是用来获取目标真值的,只有目标级信息。与理想传感器相关的 API 有:

事件 API
获得仿真场景中的物体真值信息
获得仿真场景中的物体真值信息更新回调
获取传感器检测到物体的对应真值(支持的传感器包括目标级相机/目标级激光雷达/完美传感器)
传感器真值信息更新回调(支持的传感器包括目标级相机/目标级激光雷达/完美传感器)
  • 其中 3 4 上面已经介绍过,1 2 中 SimOne_Data_Obstacle 结构如下:

数据 解释
int obstacleSize; 目标数量
SimOne_Data_Obstacle_Entry obstacle[SOSM_OBSTACLE_SIZE_MAX]; 目标存储数组最多存储 100 个
  • SimOne_Data_Obstacle_Entry 结构如下:

数据 解释
int id; 目标 ID
int viewId; 目标可视化 ID
SimOne_Obstacle_Type type; 目标类型,与目标物理材质对应类型一致
float theta; 全局坐标系方位角,这里用的是 oriZ 的值
float posX; 目标在世界坐标系中的 X 坐标(单位 米)
float posY; 目标在世界坐标系中的 Y 坐标(单位 米)
float posZ; 目标在世界坐标系中的 Z 坐标(单位 米)
float oriX; 目标在世界坐标系中的 X 轴方向的旋转坐标(单位 弧度)
float oriY; 目标在世界坐标系中的 Y 轴方向的旋转坐标(单位 弧度)
float oriZ; 目标在世界坐标系中的 Z 轴方向的旋转坐标(单位 弧度)
float velX; 目标在 X 轴上的速度(单位 km/h)
float velY; 目标在 Y 轴上的速度(单位 km/h)
float velZ; 目标在 Z 轴上的速度(单位 km/h)
float length; 目标的长度(单位 米)
float width; 目标的宽度(单位 米)
float height; 目标的高度(单位 米)

2.1.4 超声波雷达

超声波雷达用来探测目标离传感器的相对距离,以及返回目标的位置信息,相关的 API 如下:

事件 API
获得一个超声波雷达信息 SIMONE_NET_API bool GetUltrasonicRadar(int mainVehicleId, int sensorId, SimOne_Data_UltrasonicRadar *pUltrasonic)
获得所有超声波雷达信息 SIMONE_NET_API bool GetUltrasonicRadars(int mainVehicleId, SimOne_Data_UltrasonicRadars *pUltrasonics)
超声波雷达真值信息更新回调 SIMONE_NET_API bool SetUltrasonicRadarsCB(void(cb)(int mainVehicleId, SimOne_Data_UltrasonicRadarspUltrasonics))

1 获取的是单个超声波雷达的信息,而 2 返回的是所有超波雷达信息的集合;

  • SimOne_Data_UltrasonicRadar 的结构如下:

数据 解释
int id; 超声波 ID
int obstacleNum; 超声雷达检测到目标的数量
SimOne_Data_UltrasonicRadarDetection_Entry obstacledetections[SOSM_OBSTACL_SIZE_MAX]; 检测到目标集合,最多存储 100 个
  • SimOne_Data_UltrasonicRadarDetection_Entry 的结构如下:

数据 解释
float obstacleRanges = 0; 目标力传感器的距离(单位米)
float x = 0; 目标相对于传感器的 x 坐标(单位米)
float y = 0; 目标相对于传感器的 y 坐标(单位米)
  • SimOne_Data_UltrasonicRadars 的结构如下:

数据 解释
int UltrasonicRadarsNum; 超声波雷达数量
SimOne_Data_UltrasonicRadar ultrasonicRadars[SOSM_ULTRASONICRADAR_SIZE_MAX]; 超声波雷达存储集合,最多存储 100 个

2.1.5 毫米波雷达

毫米波雷达用来探测目标距离,速度,角度信息,相关的 API 如下:

事件 API
获得毫米波雷达目标信息 SIMONE_NET_API bool GetRadarDetections(const int mainVehicleId, const int sensorId, SimOne_Data_RadarDetection *pDetections)
毫米波雷达目标信息更新回调 SIMONE_NET_API bool SetRadarDetectionsUpdateCB(void(cb)(int mainVehicleId, int sensorId, SimOne_Data_RadarDetectionpDetections))
  • 输入:mainVehicleId 为主车 ID;sensorId 为毫米波雷达 ID;

  • 输出:SimOne_Data_RadarDetection *pDetections,其结构体如下:

    • struct SimOne_Data_RadarDetection : public SimOne_Data

数据 解释
int detectNum; 目标物个数
SimOne_Data_RadarDetection_Entry detections[SOSM_RADAR_SIZE_MAX]; 目标物集合
  • struct SimOne_Data_RadarDetection_Entry

数据 解释
int id; 目标物 ID
int subId; 目标物子 ID
SimOne_Obstacle_Type type; 目标物类型
float posX; 目标物在雷达坐标系的 X 轴位置(雷达坐标系采用右手坐标:前进方向为 X,正上方向为 Z)
float posY; 目标物在雷达坐标系的 Y 轴位置
float posZ; 目标物在雷达坐标系的 Z 轴位置
float velX; 目标物在雷达坐标系的 X 轴速度
float velY; 目标物在雷达坐标系的 Y 轴速度
float velZ; 目标物在雷达坐标系的 Z 轴速度
float range; 目标物在雷达坐标系的距离
float rangeRate; 目标物在雷达坐标系的径向速度
float azimuth; 目标物在雷达坐标系的水平角度
float vertical; 目标物在雷达坐标系的垂直角度
float snrdb; 目标物回波信号的信噪比
float rcsdb; 目标物 RCS 值
float probability; 目标物置信度

2.1.6 激光雷达以及目标级激光雷达

2.1.6.1 物理级激光雷达

事件 API(貌似删除了?)
1 SIMONE_NET_API bool GetPointCloud(int mainVehicleId, int sensorId, SimOne_Data_Point_Cloud *pPointCloud)
2 SIMONE_NET_API bool SetPointCloudUpdateCB(void(cb)(int mainVehicleId, int sensorId, SimOne_Data_Point_CloudpPointCloud))
3 SIMONE_NET_API bool GetStreamingPointCloud(const char ip, unsigned short port, unsigned short infoPort,SimOne_Data_Point_CloudpPointCloud)
4 SIMONE_NET_API bool SetStreamingPointCloudUpdateCB(const char* ip, unsigned short port,unsigned short infoPort, void(cb)(SimOne_Data_Point_CloudpPointCloud))

mainVehicleId 为主车 ID; sensorId 为激光雷达 ID; ip 为接收机器的 ip 地址; port 为激光雷达数据端口号; infoPort 为用户配置数据端口; pPointCloud 为每帧点云信息, SimOne_Data_Point_Cloud 的结构如下:

1 与 2 方式获取激光雷达信息时不需要配置 UDP 信息,仅以 3、4 的方式获取物理级激光雷达信息时,需要在网页端通道上配置 UDP 信息例如:udp://127.0.0.1:6699,截图如下:

2.1.6.2 目标级激光雷达

事件 API
1 SIMONE_NET_API bool GetSensorDetections(int mainVehicleId, int sensorId, SimOne_Data_SensorDetections *pGroundtruth)
2 SIMONE_NET_API bool SetSensorDetectionsUpdateCB(void(cb)(int mainVehicleId, int sensorId, SimOne_Data_SensorDetectionspGroundtruth))

其中 pGroundtruth SimOne_Data_SensorDetections 结构已经在摄像头与目标级摄像头 API 中已介绍。

2.1.7 目标级融合传感器

事件 API
获取传感器检测到物体的对应真值(支持的传感器包括目标级相机/目标级激光雷达/完美传感器) SIMONE_NET_API bool GetSensorDetections(int mainVehicleId, int sensorId, SimOne_Data_SensorDetections *pGroundtruth)
传感器真值信息更新回调(支持的传感器包括目标级相机/目标级激光雷达/完美传感器) SIMONE_NET_API bool SetSensorDetectionsUpdateCB(void(cb)(int mainVehicleId, int sensorId, SimOne_Data_SensorDetectionspGroundtruth))
获取传感器检测到车道与车道线数据(仅目标级相机和融合传感器支持) SIMONE_NET_API bool GetSensorLaneInfo(int mainVehicleId, int sensorId, SimOne_Data_LaneInfo *pLaneInfo)
获取传感器检测到车道与车道线数据回调 SIMONE_NET_API bool SetSensorLaneInfoCB(void(cb)(int mainVehicleId, int sensorId, SimOne_Data_LaneInfopLaneInfo))

其中 pGroundtruth SimOne_Data_SensorDetections SimOne_Data_LaneInfo 结构已经在摄像头与目标级摄像头 API 中已介绍。

2.2 StreamingAPI

名称 事件 C++ API Python API
物理级传感器流式传输 实时获取图像数据(图像格式包括 RGB/JPEG/Segmentation/H.265 等) GetStreamingImage SoGetStreamingImage
设置实时图像数据更新回调(图像格式包括 RGB/JPEG/Segmentation/H.265 等) SetStreamingImageUpdateCB SoApiSetStreamingImageUpdateCB
实时获取 SimOne_Streaming_Point_Cloud 格式点云数据 GetStreamingPointCloud SoGetStreamingPointCloud
设置点云数据更新回调 SetStreamingPointCloudUpdateCB SoApiSetStreamingPointCloudUpdateCB

2.3 V2XAPI

V2X(车联网)技术关键在于两部分设备: OBU RSU ,它们通过无线通信方式实现车与车以及车与路边设施之间的互联。具体的设备功能和通信方式如下表所示:

序号 组件 设施 描述 通信方式
1 OBU (车载端) 车辆内部安装 作为车辆通信节点 直连 RSU;与其他 OBU 通过 LTE 广播通信
2 RSU (路侧端) 路边设施安装 类似大型 WIFI,支持车辆通信 广播 CSAE2020 标准信息给所有车辆 OBU

在 CSAE2020 标准下, RSU 负责将关键安全和导航信息以广播的方式传输给车载的 OBU ,确保车辆及时获取重要通信。

详细的广播消息类型及其描述如右表所示:

消息类型 覆盖内容
SPAT 信号灯状态信息,例如红绿灯变换
RSI 路侧信息,涉及道路状况例如施工、限速等
RSM 路侧安全信息,包括事故报告、车辆异常等
MAP 地图信息,详细描述路口设计及其信号灯相位信息

2.3.1 V2X API 概览

事件 API
获取主车通过 OBU 接收到的特定 V2X 消息 SIMONE_API bool GetV2XInfo(const char* mainVehicleId, const char* sensorId, int infoType, SimOne_Data_V2XNFS*pDetections)
设置回调函数,以获取所有接收到的 V2X 消息 SIMONE_API bool SetV2XInfoUpdateCB(void(cb)(const char mainVehicleId, const char* sensorId, SimOne_Data_V2XNFS*pDetections))

2.3.2 API 详细说明

2.3.2.1 GetV2XInfo 函数

用于获取指定类型的 V2X 消息。

参数 参数 类型 描述
输入 mainVehicleId const char* 主车 ID。
sensorId const char* OBU 设备 ID。
infoType int 要获取的 V2X 消息类型。
输出 pDetections SimOne_Data_V2XNFS* 返回的 V2X 消息。

2.3.2.2 SetV2XInfoUpdateCB 函数

用于设置 V2X 消息更新的回调,确保消息实时更新且无数据丢失。

参数 参数 类型 描述
输入 cb function 回调函数。
mainVehicleId const char* 主车 ID。
sensorId const char* OBU 设备 ID。
输出 pDetections SimOne_Data_V2XNFS* 返回的 V2X 消息。

2.3.2.3 V2X 消息结构体 SimOne_Data_V2XNFS 说明:

字段名称 类型 描述
infoType int 消息类型,按照 ESimOne_V2X_MessageFrame_PR 枚举定义
V2XMsgFrameSize int 消息的字节大小
MsgFrameData char[SOSM_V2X_MSGFRAME_SIZE_MAX] ASN 编码的十六进制字符形式的应用层消息

注意 :更详细的消息定义可参考《CSAE 2020 合作式智能运输系统 - 车用通信系统应用层及应用数据交互标准》。

3. 控制通信类

3.1 PNCAPI

调用示例可参考 调用示例

4. 高精地图运行时类

4.1 HDMapAPI

高精度地图路网运行时目前提供的 API 包括功能为: 全图查询,定位,路由,交通灯和标志牌,停车位 等。

4.1.1 基本概念

  1. 坐标系统 :对于高精度地图而言,系统提供 Local ENU 和 s-t 两种坐标系统

A. 世界坐标系/站心直角坐标系(Local ENU) 世界坐标系为 x,y,z 右手坐标系

惯例适用于地理参考,即对应站心直角坐标系,x 为正东(East,E),y 为正北(North,N),z 为 Up(U)。

B. 参考线坐标系/轨道系统 s-t 坐标系(Track System s-t coordinate)

路网运行时根据不同参考线基准分别定义了 2 个 s-t 坐标系:

  • 道路参考线 为基准定义 s-t 坐标系

  • 车道虚拟中心线 为基准定义 s-t 坐标系

  1. 车道标识符 :高精度地图中的 laneName 为车道提供了唯一标识,结合道路编号、路段索引和车道编号,实现了精准的车道信息查询和定位。

    • 标识符格式 : $roadId_sectionIndex_laneId

      • $roadId : 道路的唯一编号。

      • _sectionIndex : 道路中特定路段的索引,用于标识道路的不同部分。

      • _laneId : 车道编号,在每个路段中独一无二。

    例如:

    • "1_0_-1" 表示道路编号为 1 的路段索引 0 上的右侧第一条车道( 负号表示右侧 )。

    • "1_0_2" 表示同一路段上左侧的第二条车道( 正号表示左侧 )。

  2. 坐标转换 :LocalENU(x,y,z) 坐标和 [s,t] 坐标相互转换

    1. Road 参考线体系下的 [s,t] 坐标

      • 定义: 道路参考线 为基准线,参考线右侧 t 值为负,左侧 t 值为正

      • 例子: * *P(-51.5,-73.5)对应 Road 1 的[s,t]坐标系的值是(7,-5.25)

    2. Lane 虚拟中心线体系下的 [s,t] 坐标

      • 定义: 车道虚拟中心线 为基准线,基准线右侧 t 为负,左侧 t 为正,主车沿着车道虚拟中心线行驶,那么 t 值永远为 0

      • 例子 :P(-51.5,-73.5),对应 Lane “1_0_-2”的[s,t]坐标系的值是(7,0);对应 Lane “1_0_-1”的[s,t]坐标系的值是(7,-3.5)

  1. 定位障碍物 :使用 Road 参考线体系下的[s,t]坐标,我们可以确定障碍物相对于主车前进方向的横向距离(t)和纵向距离(s)。

    • 定义 :以道路参考线为基准线,参考线右侧 t 值为负,左侧 t 值为正,S 是沿着道路参考线的累加值

    • 例子 :主车相对于道路的 ST 坐标(25,-5.25)

4.1.2 全局查询

4.1.3 定位

4.1.4 路由

5. 评价算法类

5.1 EvaluationAPI

5.1.1 评价 API 功能介绍

Simone 支持用户自定义评价功能,EvaluationAPI 用于获取存储用户自定义的评价功能所需的数据,主要为:

(1)仿真过程数据,例如主车以及障碍物的位姿数据等;

(2)用户规控算法的内部输出信号,例如状态机信号、控制信号等;

5.1.2 评价 API 存储数据的方式

目前存储用户自定义评价所需数据的方式有两种:本地文件存储与数据库存储。

对应的 API 如下:

API 功能 API
用于获取仿真过程数据,并将数据存储到数据库中。 InitEvaluationService
用于获取仿真过程数据,并将数据存储到本地文件。 InitEvaluationServiceWithLocalData
保存评价算法所需的各类信息(JSON 格式)。 SaveEvaluationRecord

5.1.3 评价 API 添加规控算法内部信号

用户自定义评价算法需要的数据除了仿真过程数据,有些可能还需要特定的规控算法内部信号,用户可以通过 API 自行添加评价所需要的数据,例如变道信号、控制信号等。

API 功能 API
添加评价算法所需的各类信息(JSON 格式),信号格式示例:{"category": "signal", "timestamp": 1648363819335, "ACC": "on", "ACCSpeed": 20} AddEvaluationRecord