标注:本文来自本实验室单超的研究成果。
数字孪生用于虚拟描述真实存在的一个或多个特定实体的数字复制品,也就是说建立的数字孪生模型是物理实体的实时数据表达,因此本文拟建立的CAN 数字孪生模型需要做到虚拟CAN 总线和实体CAN 总线的实时的状态同步,并且要有一定的数据表达能力,实时同步和数据展示是本文探索的重点。
由于Simulink 和Carla 都有python 接口可以调用,本文采用python 编程语言作为数据流通的媒介以实现Carla 和Simulink 的实时数据交互。本文直接使用python 的matplotlib 库作为绘制工具,绘制源数据即模型的模拟结果从matlab 的workspace 中获取。
Simulink CAN 仿真模型设计
查看Simulink 的CAN 通信模块的配置参数。CAN Pack 模块提供的功能为把原始数据封装成CAN 报文并发送到总线网络中,相当于ECU 报文封装的功能,因此使用该模块的前提是确定封装数据的数据结构,也就是说需要确定CAN 应用层协议的选择。
本文选择honda_civic_sedan_16_diesel_2019_can_generated.dbc,该文件对应的是东风本田civic sedan 2019 款的汽车CAN 总线所有非拓展帧的报文格式。本文先针对汽车速度相关报文进行分析。表示汽车速度对应的报文格式如图所示,报文ID 为777,字段的构造均以小端的方式。
汽车速度对应报文数据段结构
转向信息对应报文数据段结构
档位相关报文数据段结构
-
CAR_SPEED 字段以第7 bit 作为起始点,长为16 bit,数据范围在0~65535 之间,注释提供的单位为国际车速单位kph,对应千米每小时。由于COUNTER 和CHECKSUM字段存在部分重合,且CHECKSUM 和COUNTER 不属于数据段应表示的部分,经考虑,在构造数据结构时删除CHECKSUM 和COUNTER,在CAN Pack 模块中构造的信号结构如图所示。
-
STEERING_SENSORS 报文中,STEER_SENSOR_STATUS_x 字段被STEER_ANGLE_RAGE字段覆盖,在模型中重现数据结构时删除上述5 个字段,只保留GEAR_SHIFTER 和GEAR 字段。
-
GEARBOX 报文中,COUNTER 和CHECKSUM 不属于数据段内容,经考虑,在模型中重现数据结构时删除COUNTER 和CHECKSUM。
报文数据结构在模型中重现的步骤是类似的,本文先按流程构建CAR_SPEED 报文,并提供详细的配置说明,之后再提供STEERING_SENSOR 和GEARBOX 构造结果,最后展示整个模型。
参数配置完成后的CAN Pack 模块生成了6 个字段输入端口,1 个CAN 报文输出端口,为6 个配置输入端口配置常量模块作为输入,CAN Pack 模块将依据一定的采样频率构造报文。后续环节将使用python 调用matlab 结构更改常量的值作为输入数据的方式。
CAN Transmit 模块用于将CAN Pack 模块的报文输出输入到CAN 总线内,配置为默认设置即可。
CAN Transmit 模块配置
CAN Transmit 模块
对于Virtual Channel 还有额外的配置模块,用于控制总线传输速度,同样保持默认配置即可。
CAN Channel Configuration 模块配置
CAN Receive 模块用于从指定的虚拟CAN 隧道接收报文,可选择过滤标准数据帧和扩展数据帧,这里保持默认配置,接收所有报文,采样时间设置为0.1 秒,每0.1 秒触发目标调用函数,并输出CAN 报文。
CAN Receive 模块配置
最终创建的CAN Receive 模块如图所示,没有输出端口,输出为一个函数触发端口,一个报文输出端口,这两个端口和Simulink Function-Call Subsystem 模块对接。
之后进入Function-Call System 内部,加入CAN Unpack 模块,该模块会解析指定ID 的标准数据帧数据结构,拆分并输出,内部配置和CAN Pack 模块流程相同,先确定CAN 报文数据结构,再添加字段。
创建后的模块位于Function-Call System 模块中,会有对应的6 个输出,将这6 个输出接入Function-Call System 的输出。
创建Real-Time Sync 模块,使得整个模型在模拟实时模拟。
STEERING_SENSORS 和GEARBOX 的数据结构配置也同样按照上述流程进行。
值得说明的是——
honda_civic_sedan_16_diesel_2019_can_generated.dbc 内部含有51 个不同CAN 报文数据结构定义,所以对如此数量的CAN 报文类型一个一个去实现对应的CAN Pack 模块和CAN Unpack 模块重复工作量较大,本文在这里只针对典型的汽车数据,如车速,转向角,档位相关的数据作为输入,模拟这三类报文在仿真CAN 总线上的传输。