专注于车载信息安全和预期功能安全技术研究
电话:+86 21 62655001
您的位置: 网站首页 > 学术前沿
2021-04-19 11:17:31

自动驾驶汽车CAN总线数字孪生建模(二)

来源:学术前沿 浏览次数:180 点赞数:0

标注:本文来自本实验室单超的研究成果。


整体思路:仿真模型通过python打开并运行之后,会启动Carla, 使用Carla API 获取汽车的相关数据之后,启动matplotlib绘制线程,将Carla提供的数据输进模型,再从matlab的worksapce通过接口获取输出结果并绘制。


python调用仿真模型

Matlab提供python API供外部调用,本文将需要使用的matlab功能封装成类的形式进行调用。Matlab class用于连接Matlab软件并对模型输入数据获取输出结果,其中connectToMatlab方法通过Matlab命令行启动Simulink运行仿真模型,simulate方法用于把数据输入模型,之后将输出结果以数组形式存入实例变量中。



python控制Carla客户端

python脚本启动的Carla客户端以pygame库作为媒介,实现用户输入和Carla服务端交互的各种功能,再将最新的结果渲染并绘制到pygame的用户界面中。

初始需要先将Carla服务端启动,暴露本地2000端口用于客户端连接。

 


获取到初始化的 pygame.display实例后进入循环渲染阶段,此时键盘的输入作为pygame的事件触发parse_events方法调用

 


 

数据提取

建模部分提到,simulink CAN 仿真模型主要传输的是车速、转向角、档位三种数据报文。所有的数据来源于以下三个实例:

  • 车速:车速V(km/h)计算方式为 V = 3.6 * √(x^2  + y^2  + z^2 ) (其中x、y、z表示前/后、左/右、上/下方向的速度矢量,单位为m/s)。 


  • 档位:档位共分为R、P、D三档,分别代表倒车、停车、直行,档位的判断依据汽车的行驶状态来定,因此档位的数据源需要汽车车速和倒车参数来判定。 

  • 转向角度:转向角可以直接从实例中获取。 


实时数据展示

上文已经解决了模型实时输入实时输出问题,那么当获取到仿真模型的输出结果时,该结果是以数组的形式记录从仿真开始到当前时间的所有结果,所以每次获取到结果后都需要重新依据新的数据样本进行绘制,由于python是Carla和Simulink数据传输的媒介,因此最好的解决方案是基于python的绘图工具实时绘制。本文采用python Matplotlib库以实现该需求。


绘制代码实现

由于绘制的是模型的输出结果,现针对输出的车速数据绘制相应的实时变化曲线,为了做到良好的代码风格,增加代码复用率,本文将一系列绘制相关的方法集中到Draw类里。


 

实时仿真并绘制

本部分将结合前面的实验结果,将所有对接Carla的python模块、对接Matlab/Simulink的python模块、实时绘制相关的python模块都组合起来运行。

车速实时变化

实时模拟时长为60秒,60秒内,汽车的速度变化曲线在图像中持续不断地刷新,直到60秒到为止。

从图中可以看出,经过仿真模型模拟出来的速度数据和原数据基本一致,说明模型的CAN报文解封装过程顺利执行,但是在车速的转折点存在模型的模拟结果比原数据更平滑的问题,很明显是由于原数据输入过于频繁,两个相邻的输入时间间隔小于模型最小采样时间,而采样时间不能进一步缩小,否则会导致该时间段内无正确模拟结果输出。


档位实时变化

时长为60秒,手动控制汽车行驶,共尝试两个档位,P和D、分别代表泊车和直行,对应参数为17和20,泊车后发送单个P档位报文,到车辆开始直行这段时间不发送任何报文,直行后会依据汽车的速度反馈不断发送D档位报文。

从图中可以看出,由于原数据变化的不是非常频繁,模型模拟出来的结果完全匹配了原数据,说明输入频率远小于模型采样频率会使模拟结果贴合预期结果。


转向角度实时变化

时长60秒,手动控制汽车行驶,并控制轮胎左右转向,向左角度为负,向右角度为正,值位于[-100, 100]区间内。

由图可知,转向角变化数据更新十分频繁,仿真模型在处理大量的输入时必然会卡顿并抛弃大量数据,使得模拟结果没有很好地贴合原数据,因此在高频输入的前提下,模型模拟结果无法完全贴合预期。


小结

本文介绍了基于Carla自动驾驶模拟仿真平台构造Simulink CAN仿真模型并结合python API及其绘图工具库matplotlib的一整套实时仿真流程的设计和实现细节,实际模拟了虚拟汽车车速,档位、转向角度三个信息在CAN中的解封装和传递。发现在低频的数据输入场景下,模型能做到贴合实际结果,而在高频输入数据场景下,模型容易运行卡顿并在多个时间点输出无效数据,抛弃这些数据后模拟结果相对于预期结果显得平滑,无法体现预期结果中的峰值。