第三方中间件 Simulink¶
1. SimOneModule 介绍¶
1.1 时间同步模块¶

连接 SimOne 与 Simulink,SimOneAPI 接口初始化,联合仿真时必需的模块。
输入
无
参数
| 参数 | 类型 | 备注 |
|---|---|---|
| IP | int* | 四位长的数组,每一位对应 SimOne 所在的 IP 地址的一节 |
| FrameSync | int | 0 或 1,是否启用帧同步,0 表示不启用,1 表示启用 |
输出
无
1.2 主车模块¶

基于 SimOne 动力学的控制方式,输入油门刹车方向盘等信号,输出车辆位置姿态等信息。
输入
| 参数 | 类型 | 备注 |
|---|---|---|
| throttleMode | enum | 油门输入模式,0 百分比,1 发动机扭矩,2 速度,3 加速度,4 发动机转速,5 轮胎扭矩。2、3 模式下忽略刹车输入 |
| throttleIn | float | 油门输入,不同模式下输入范围不一致,仅提供单位作为参考,0[0 1],1Nm,2m/s,3m/s^2 ,4rpm,5Nm |
| brakeMode | enum | 刹车输入模式,0 百分比,1 主缸压力,2 踏板力,3 轮缸压力,4 轮胎扭矩 |
| brakeIn | float | 刹车输入,不同模式下输入范围不一致,仅提供单位作为参考,0[0 1],1MPa,2N,3MPa,4Nm |
| steeringMode | enum | 方向盘输入模式,0 百分比,1 角度,2 力矩,3 角速度,4 轮胎角度,5 轮胎角速度 |
| steeringIn | float | 方向盘输入,负值左转,正值右转,不同模式下输入范围不一致,仅提供单位作为参考,0[-1 1],1deg,2Nm,3deg/s,4deg,5deg/s |
| handbrake | bool | 手刹,默认 false,即没拉手刹 |
| isMaunualGear | bool | 是否手动档,默认 false,即自动档 |
| gearIn | int | 档位模式输入,0 空挡,1 前进档,2 倒挡 |
| throttle_input_data | float* | 油门输入模式 5 模式下的输入数据,此时会忽略 throttleIn 中的数据 |
| brake_input_data | float* | 刹车输入模式 3、4 模式下的输入数据,此时会忽略 brakeIn 中的数据 |
| steering_input_data | float* | 方向盘输入模式 4、5 模式下的输入数据,此时会忽略 steeringIn 中的数据 |
参数
| 参数 | 类型 | 备注 |
|---|---|---|
| DataSize | int | throttle_input_data、brake_input_data、steering_input_data 的数据长度,默认为 0 |
输出
| 参数 | 类型 | 备注 |
|---|---|---|
| posXYZ | float | 主车位置 XYZ,单位 m |
| oriXYZ | float | 主车旋转 XYZ,单位 rad |
| velXYZ | float | 主车速度 XYZ,单位 m/s |
| throttleOut | float | 油门输出,百分比模式,[0 1] |
| brakeOut | float | 刹车输出,百分比模式,[0 1] |
| steeringOut | float | 方向盘输出,百分比模式,[-1 1] |
| gearOut | int | 档位输出,-2 驻车档,-1 倒车档,0 空档,1、2 等参照真实车辆档位 |
| accelXYZ | float | 主车加速度 XYZ,单位 m/s^2 |
| angvelXYZ | float | 主车角速度 XYZ,单位 rad/s |
| wheelSpeed | float* | 主车轮速,依次为 FL 前左,FR 前右,RL 后左,RR 后右,单位 m/s |
| engineRpm | float | 发动机转速,单位 rpm |
| odometer | float | 里程计,单位 m |
1.3 主车模块(位置控制)¶

无视 SimOne 动力学的控制方式,直接输入车辆的位置姿态,输出车辆位置姿态等信息。
输入
| 参数 | 类型 | 备注 |
|---|---|---|
| posIn | float | 主车位置 XYZ,单位 m |
| oriIn | float | 主车旋转 XYZ,单位 rad |
| autoZ | bool | 根据场景自动设置车辆高度,默认 false |
输出
输出等同于主车模块
1.4 驾驶员模块¶

输入
无
参数
无
输出
| 参数 | 类型 | 备注 |
|---|---|---|
| throttle | float | 油门输出,[0 1] |
| brake | float | 刹车输出,[0 1] |
| steeringMode | enum | 方向盘模式,0 百分比,1 角度,2 力矩,3 角速度,4 轮胎角度,5 轮胎角速度 |
| steering | float | 方向盘输出,负值左转,正值右转,[-1 1] |
| handbrake | bool | 手刹,默认 false,即没拉手刹 |
| isMaunualGear | bool | 是否手动档,默认 false,即自动档 |
| gear | int | 档位输出,-2 驻车档,-1 倒车档,0 空档,1、2 等参照真实车辆档位 |
1.5 障碍物模块(GroundTruth,不需配置传感器)¶
注意:目前障碍物检测距离为 100m

获取障碍物的真实信息,采用读取内部数据的方式获取障碍物。
输入
无
参数
| 参数 | 备注 |
|---|---|
| ObstacleNum | 最多检测障碍物个数 |
| ObstacleId | 障碍物检测 ID,从 1 开始 |
输出
| 参数 | 类型 | 备注 |
|---|---|---|
| id | int | 障碍物在 SimOne 中的 ID,从 11 开始 |
| type | enum | 参见下面障碍物种类说明 |
| theta | float | 障碍物绕 Z 轴旋转角度,单位 rad |
| posXYZ | float | 障碍物位置 XYZ,单位 m |
| velXYZ | float | 障碍物速度 XYZ,单位 m/s |
| length | float | 障碍物 BoundingBox 长度,单位 m |
| width | float | 障碍物 BoundingBox 宽度,单位 m |
| height | float | 障碍物 BoundingBox 高度,单位 m |
| accelXYZ | float | 障碍物加速度 XYZ,单位 m/s^2 |
障碍物种类说明
enum SimOne_Obstacle_Type {
ESimOne_Obstacle_Type_Unknown = 0,
ESimOne_Obstacle_Type_Pedestrian = 4,
ESimOne_Obstacle_Type_Pole = 5,
ESimOne_Obstacle_Type_Car = 6,
ESimOne_Obstacle_Type_Static = 7,
ESimOne_Obstacle_Type_Bicycle = 8,
ESimOne_Obstacle_Type_Fence = 9,
ESimOne_Obstacle_Type_RoadMark = 12,
ESimOne_Obstacle_Type_TrafficSign = 13,
ESimOne_Obstacle_Type_TrafficLight = 15,
ESimOne_Obstacle_Type_Rider = 17,
ESimOne_Obstacle_Type_Truck = 18,
ESimOne_Obstacle_Type_Bus = 19,
ESimOne_Obstacle_Type_SpecialVehicle = 20,
ESimOne_Obstacle_Type_Motorcycle = 21,
ESimOne_Obstacle_Type_Dynamic = 22,
ESimOne_Obstacle_Type_GuardRail = 23,
ESimOne_Obstacle_Type_SpeedLimitSign = 26,
ESimOne_Obstacle_Type_BicycleStatic = 27,
ESimOne_Obstacle_Type_RoadObstacle = 29
};
1.6 摄像头模块(配置摄像头传感器)¶

对应 SimOne 的物理级摄像头,可以获取到摄像头中的数据。
输入
无
参数
| 参数 | 类型 | 备注 |
|---|---|---|
| IP | int* | 4 位数组对应 4 节 IP 地址,与 SimOne 页面传感器设置匹配 |
| Port | int | 端口号,与 SimOne 页面传感器设置匹配 |
| CameraId | int | 摄像头 ID,SimOne 页面赋予传感器的 ID,已内置 ID 的英文部分 |
| HorizontalResolution | int | 摄像头图像水平分辨率,与 SimOne 页面传感器设置匹配 |
| VerticalResolution | int | 摄像头图像垂直分辨率,与 SimOne 页面传感器设置匹配 |
输出
| 参数 | 类型 | 备注 |
|---|---|---|
| format | int | 图像格式,0forRGB,现只支持 RGB |
| width | int | 图像宽度,SimOne 传感器设置,1920max |
| length | int | 图像长度,SimOne 传感器设置,1080max |
| R、G、B | uint8 | 图像数据,VideoViewer 可以查看摄像头图像数据 |
1.7 激光雷达模块(配置激光雷达传感器)¶

对应 SimOne 的物理级激光雷达,可以获取到点云数据。
输入
无
参数
| 参数 | 类型 | 备注 |
|---|---|---|
| IP | int* | 4 位数组对应 4 节 IP 地址,与 SimOne 页面传感器设置匹配 |
| Port | int* | 2 位数组对应 2 节端口号,与 SimOne 页面传感器设置匹配 |
| LidarId | int | 激光雷达 ID,SimOne 页面赋予传感器的 ID,已内置 ID 的英文部分 |
| PointCloudDataSize | int | 点云数据大小,与 SimOne 网页传感器设置匹配 |
输出
| 参数 | 类型 | 备注 |
|---|---|---|
| width | int | 点云图像宽度,SimOne 传感器配置 |
| length | int | 点云图像长度,SimOne 传感器配置 |
| pointStep | int | 单个点云所占字节,SimOne 传感器配置 |
| pointCloudData | uint8* | 点云数据数组,3686400max |
1.8 毫米波雷达模块(配置毫米波雷达传感器)¶

对应 SimOne 的目标级毫米波雷达,可以获取到探测范围内的障碍物信息,输出毫米波雷达索引对应的障碍物信息。
输入
无
参数
| 参数 | 备注 |
|---|---|
| RadarId | 毫米波雷达 ID |
| RadarDetectNum | 毫米波雷达目标检测数量上限 |
| RadarDetectionsId | 毫米波雷达检测目标索引,从 1 开始 |
输出
| 参数 | 类型 | 备注 |
|---|---|---|
| id | int | 目标在 SimOne 中的 ID |
| subId | int | 目标 SubID |
| type | int | 参见障碍物模块种类说明 |
| posXYZ | float | 目标位置 XYZ,单位 m |
| velXYZ | float | 目标速度 XYZ,单位 m/s |
| range | float | 目标距离,单位 m |
| rangeRate | float | 目标相对速度,单位 m/s |
| azimuth | float | 目标方位角,单位 rad |
| vertical | float | 目标高度角,单位 rad |
| snrdb | float | 信噪比,单位 db |
| rcsdb | float | 目标散射截面,单位 db |
| probability | float | 目标检测概率 |
1.9 超声波雷达模块(配置超声波雷达传感器)¶

对应 SimOne 的目标级毫米波雷达,可以获取到探测范围内所有的障碍物信息,输出所有障碍物的信息。
输入
无
参数
| 参数 | 类型 | 备注 |
|---|---|---|
| UltrasonicRadarId | int | 超声波雷达 ID |
| UltrasonicDetectNum | int | 超声波雷达目标检测数量上限 |
输出
| 参数 | 类型 | 备注 |
|---|---|---|
| obstacleRanges | float* | 目标相对距离,单位 m |
1.10 V2X 模块(配置 OBU 传感器)¶

对应 SimOne 的目标级 OBU 传感器,可以获取并输出 V2X 信息。
输入
无
参数
| 参数 | 类型 | 备注 |
|---|---|---|
| SensorId | int | OBU 传感器 ID |
| InfoType | enum | V2X 信息类型,1BSM,2MAP,3RSM,4SPAT,5RSI |
| MaxDataSize | int | V2X 消息字节上限 |
输出
| 参数 | 类型 | 备注 |
|---|---|---|
| V2XMsgFrameSize | int | V2X 消息实际字节数 |
| MsgFrameData | int* | V2X 消息的 ASCII 码 |
1.11 传感器配置信息模块¶

获取全部传感器信息,输出传感器索引对应的传感器信息。
输入
无
参数
| 参数 | 类型 | 备注 |
|---|---|---|
| SensorNum | int | 传感器数量上限 |
| SensorConfigld | int | 传感器索引,从 1 开始 |
输出
| 参数 | 类型 | 备注 |
|---|---|---|
| index | int | 传感器总 ID |
| mainVehicle | int | 装配此传感器的主车 ID |
| sensorld | int | 传感器 ID,数字部分的 ASCII 码 |
| sensorType | int8* | 传感器种类,英文部分的 ASCII 码 |
| posXYZ | float | 传感器位置 XYZ,单位 m |
| oriXYZ | float | 传感器旋转 XYZ,单位 rad |
| hz | int | 传感器频率 |
1.12 传感器检测模块¶

获取指定传感器的检测信息,输出传感器检测目标索引对应的障碍物信息。
输入
无
参数
| 参数 | 类型 | 备注 |
|---|---|---|
| Sensorld | int | 传感器 ID |
| SensorDetectNum | int | 传感器检测数量上限 |
| SensorDetectionsld | int | 传感器检测目标索引,从 1 开始 |
输出
| 参数 | 类型 | 备注 |
|---|---|---|
| id | int | 目标在 SimOne 中的 ID,从 1 开始 |
| type | int | 参见障碍物模块种类说明 |
| posXYZ | float | 目标位置 XYZ,单位 m |
| oriXYZ | float | 目标旋转 XYZ,单位 rad |
| length | float | 目标 BoundingBox 长度,单位 m |
| width | float | 目标 BoundingBox 宽度,单位 m |
| height | float | 目标 BoundingBox 高度,单位 m |
| range | float | 目标相对距离,单位 m |
| velXYZ | float | 目标速度 XYZ,单位 m/s |
| probability | float | 目标检测概率 |
| relativePosXYZ | float | 目标相对位置 XYZ,单位 m |
| relativeVelXYZ | float | 目标相对速度 XYZ,单位 m/s |
2. HDMapModule 介绍¶
HDMapModule 各个模块,可满足联合仿真对于高精地图信息的需求。

关于各个模块功能,双击模块即可详见模块介绍:

3. Simulink 联合仿真代码生成¶
在现有 SimOne 与 Simulink 联合仿真的基础上,用户可以将 Simulink 联合仿真模型生成代码并编译成可执行文件,在本地或者云端运行。(注:此流程需要源码,如 有需求请咨询 SimOne 客服或销售人员)
3.1 Windows¶
注:下述打包过程需要本地安装 Visual Studio 或者相应的 C/C++编译器
在 Windows 的 Matlab 上配置好联合仿真环境,加入 SimOneModule 和 HDMapMoudle 中的相应模块以及自定义的算法模块并确保能够正确仿真,下图是一个简单例子:

注意
在上述 Simulink Models 文件的所属路径下需要包含相应模块的 mex 文件以及 src 文件,含有参数的 S-function 还需要包含 Matlabtlc 文件。
从 Simulation 菜单打开 Model Configuration Parameters 界面
3.1.1 配置参数¶
在 Configuration 窗口,在左侧列表中选择 Code Generation 标签并展开,进行如下配置:
选择
Code Generation本身,将
Target selectionSystem target file设置成grt.tlc(Create Visual C/C++ Solution File for Simulink Coder)Language选择C++;
同时注意一下
Makefile configuration下的Template makefile是RTW.MSVCBuild;

左侧选中
Optimization标签,右侧选项Default parameter behavior设置成Tunable,方便在 VS 工程中调整 s-function 参数。

左侧选中
Code Generation下的Interface标签,右侧选项Code Interface设置成Nonreusable function因为打包成一个可执行文件,所以不存在代码复用。

左侧选中
Code Generation下的Custom Code标签,右侧选项Include directories中添加头文件所在路径(SimOne 的 Matlab->Simulink 文件夹所在路径和SDK->include 文件夹所在的路径)

在
Source files中输入SimOne s-function模块对应的源文件(使用到的S-Function的名字_wrapper.cpp文件)

在
Libraries中输入 Simulink 文件夹下的静态库文件(HDMapModule.lib、SSD.lib和SimOneSMAPI.lib)以及项目依赖的其它库。

左侧选中
Solver标签,右侧选项Solver Selection->Type选择Fixed-step,选项Fixed-step size推荐设置为 0.01。

3.1.2 生成 Visual Studio 工程¶
完成上述 Simulink Coder 配置后,通过点击菜单 Code -> C/C++ Code 选择 Build Model 或使用快捷键 Ctrl+B 来生成代码。
Simulink 将自动生成对应的 Visual Studio 工程,并存储在路径
Simulink Models/grt_rtw下。如果代码生成成功,生成的 Visual Studio 工程将自动打开。
3.1.3 在 Visual Studio 中编译生成可执行程序¶
调整 Windows SDK 配置
根据需要针对不同的 Windows SDK 版本进行配置调整:

设置仿真参数
在 Visual Studio 的 Simulink 项目中,
使用与 Simulink 模型(
.slx)同名的.cpp文件中的rtmSetTFinal函数来指定仿真运行时间。在
slx文件名_data.cpp中设置仿真所需要的参数和控制输入。
处理 S-function 输出
在sfun_函数名.cpp文件中实现该 S-function 模块,并输出模块结果。
关于可执行文件的运行 为了成功运行打包后的可执行文件,
确保在可执行文件所在路径下包括了所有必要的
.dll文件,这些是联合仿真所依赖的动态库。
注意
在 Simulation 的Model Configuration Parameters -> Code Generation -> Target selection中也可以选择grt.tlc (Generic Real-Time Target),这样 Matlab 会直接调用编译器在Simulink Models路径下直接编译生成对应的可执行文件。但是,这种方式不允许修改仿真时间和相应的输入输出参数。
3.2 Linux¶
在 Linux 上编译 Windows 生成的代码
拷贝源文件:
将在 Windows 环境下通过 Simulink 生成的代码(包括
.h头文件和.cpp源文件)复制到 Linux 系统上。将这些源文件放到 SimOne 仿真环境的 Matlab 路径下,特别是放入自定义的
grt_rtw文件夹中。
修改 Makefile:
使用 SimOne 提供的 Makefile 模板对原有的 Makefile 进行必要的修改,以适配 Linux 系统和编译环境。
在 Linux 进行编译:
在含有源代码和修改过的 Makefile 的目录下,运行
make命令来编译代码,生成 Linux 平台的可执行文件。
运行可执行文件:
为了在 Linux 系统上运行编译好的可执行文件,需要确保可执行文件目录下包含了所需的
.so动态链接库文件。这些文件提供了联合仿真必需的库和依赖。
注意
上述打包过程需要**本地安装 Matlab(Makefile 中的 Matlab 路径需要和安装路径匹配)以及 gcc/g++**或者相应的 C/C++编译器