第三方中间件 Simulink¶
注意
文件在【SimOne 安装路径】\SimOneAPI\Matlab
SimOne 提供 Simulink 中间件支持,通过 SimOneModule 模块库将 SimOne 仿真平台与 MATLAB/Simulink 环境连接,实现联合仿真。开发者可在 Simulink 中直接调用 SimOne 传感器数据和主车控制接口,无需手动编写 C++ 桥接代码,适用于控制算法开发与验证场景。
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,即没拉手刹 |
| isManualGear | 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,即没拉手刹 |
| isManualGear | 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 | 图像格式,0 for RGB,现只支持 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 标签并展开,进行如下配置:
(1)选择 Code Generation 本身,
-
将
Target selection -
System target file设置成grt.tlc(Create Visual C/C++ Solution File for Simulink Coder) Language选择C++;- 同时注意一下
Makefile configuration下的Template makefile是RTW.MSVCBuild;
(2)左侧选中 Optimization 标签,右侧选项 Default parameter behavior 设置成 Tunable,方便在 VS 工程中调整 s-function 参数。
(3)左侧选中 Code Generation 下的 Interface 标签,右侧选项 Code Interface 设置成 Nonreusable function 因为打包成一个可执行文件,所以不存在代码复用。
(4)左侧选中 Code Generation 下的 Custom Code 标签,右侧选项 Include directories 中添加头文件所在路径(SimOne 的 Matlab->Simulink 文件夹所在路径和 SDK->include 文件夹所在的路径)
(5)在 Source files 中输入 SimOne s-function 模块对应的源文件(使用到的 S-Function 的名字 _wrapper.cpp 文件)
(6)在 Libraries 中输入 Simulink 文件夹下的静态库文件(HDMapModule.lib、SSD.lib 和 SimOneSMAPI.lib)以及项目依赖的其它库。
(7)左侧选中 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 中编译生成可执行程序¶
(1)调整 Windows SDK 配置
根据需要针对不同的 Windows SDK 版本进行配置调整:
(2)设置仿真参数
在 Visual Studio 的 Simulink 项目中,
- 使用与 Simulink 模型(
.slx)同名的.cpp文件中的rtmSetTFinal函数来指定仿真运行时间。 - 在
slx文件名_data.cpp中设置仿真所需要的参数和控制输入。
(3)处理 S-function 输出
在 sfun_函数名.cpp文件中实现该 S-function 模块,并输出模块结果。
(4)关于可执行文件的运行
为了成功运行打包后的可执行文件,
- 确保在可执行文件所在路径下包括了所有必要的
.dll文件,这些是联合仿真所依赖的动态库。
注意
在 Simulation 的 Model Configuration Parameters -> Code Generation -> Target selection中也可以选择 grt.tlc (Generic Real-Time Target),这样 Matlab 会直接调用编译器在 Simulink Models路径下直接编译生成对应的可执行文件。但是,这种方式不允许修改仿真时间和相应的输入输出参数。
3.2 Linux¶
在 Linux 上编译 Windows 生成的代码
(1)拷贝源文件:
- 将在 Windows 环境下通过 Simulink 生成的代码(包括
.h头文件和.cpp源文件)复制到 Linux 系统上。 - 将这些源文件放到 SimOne 仿真环境的 Matlab 路径下,特别是放入自定义的
grt_rtw文件夹中。
(2)修改 Makefile:
- 使用 SimOne 提供的 Makefile 模板对原有的 Makefile 进行必要的修改,以适配 Linux 系统和编译环境。
(3)在 Linux 进行编译:
- 在含有源代码和修改过的 Makefile 的目录下,运行
make命令来编译代码,生成 Linux 平台的可执行文件。
(4)运行可执行文件:
- 为了在 Linux 系统上运行编译好的可执行文件,需要确保可执行文件目录下包含了所需的
.so动态链接库文件。这些文件提供了联合仿真必需的库和依赖。
注意
上述打包过程需要本地安装 Matlab(Makefile 中的 Matlab 路径需要和安装路径匹配)以及 gcc/g++或者相应的 C/C++编译器






















