第三方中间件 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 上配置好联合仿真环境,加入 SimOneModuleHDMapMoudle 中的相应模块以及自定义的算法模块并确保能够正确仿真,下图是一个简单例子:

注意

在上述 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 makefileRTW.MSVCBuild

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

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

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

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

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

  1. 左侧选中 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 版本进行配置调整:

  1. 设置仿真参数

在 Visual Studio 的 Simulink 项目中,

  • 使用与 Simulink 模型(.slx)同名的.cpp文件中的rtmSetTFinal函数来指定仿真运行时间。

  • slx文件名_data.cpp中设置仿真所需要的参数和控制输入。

  1. 处理 S-function 输出

sfun_函数名.cpp文件中实现该 S-function 模块,并输出模块结果。

  1. 关于可执行文件的运行 为了成功运行打包后的可执行文件,

  • 确保在可执行文件所在路径下包括了所有必要的.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++编译器