面向SDV的在环测试深度解析——仿真中间件SIL KIT应用篇

1.引言

在汽车行业向软件定义汽车(SDV)转型的过程中,传统硬件在环(HIL)测试方案因难以适应新的技术架构与需求,其局限性日益凸显。传统HIL对硬件依赖性强,扩展性差,更换ECU或传感器需额外硬件支持,成本高且周期长、难以协调多供应商的异构模型,通信协议之间转换复杂、对实时场景支持有限(如μs级响应),且难以保证分布式系统的全局时间同步。而以上这些问题痛点通过软件在环(SIL),依托仿真中间件都可以迎刃而解。所谓“在环”指的是将待测软硬件置于一个模拟的闭环系统中进行测试和验证,好像被“圈”在一个由输入、处理和输出构成的环路中,不断地与模拟环境进行交互,以验证各种情况下的功能和性能是否正确和稳定。而软件在环,就是这基础上将待测试的嵌入式软件从硬件环境中抽象出来,在完全虚拟环境中进行运行和测试。

2.仿真中间件SIL KIT的应用生态

SIL仿真中间件通过虚拟化、标准化通信和分布式架构,可有效解决传统HIL在扩展性、复杂性和成本方面的局限性。尤其在新型电子架构和自动驾驶开发中,逐渐成为不可替代的测试验证手段。借助仿真中间件SIL KIT可以实现以下功能:

  1. 通过SIL KIT可创建虚拟ECU节点,无需物理硬件即可模拟各类控制器功能
  2. 支持虚拟 CAN、LIN 和以太网
  3. 提供标准化通信层,如SOME/IP,兼容多种工具链
  4. 提供全局仿真时钟(精度可达±100μs),支持确定性调度
  5. SILKIT可优化大数据传输(如激光雷达点云)

SIL KIT的设计目标之一是实现轻松连接不同的工具,并在算法开发的初期阶段进行功能验证。SIL KIT提供抽象通信服务、虚拟车辆网络、虚拟时间同步和生命周期管理服务。可与虚拟以太网和 CAN 网络、Linux 虚拟输入 / 输出设备、功能模型接口(FMI)标准实现互操作,并支持流行的系统仿真器 QEMU。目前越来越多的第三方软件工具支持SIL KIT。这种灵活性与高性能相结合,使 SIL Kit 成为软件定义汽车(SDV)架构下 SIL 测试的完美基础。

图 1 SIL KIT生态图

​​​​​​​2.1 FMU导入器

SIL KIT可以通过FMI标准接口将FMU作为仿真的一个节点进行访问,通过YAML配置文件进行FMU和SIL KIT仿真之间的数据和时间同步设置。SIL KIT提供了Synchronized时间同步模式,使得FMU通过SIL KIT的虚拟时间同步与其他SIL KIT参与者同步。可确保在处理下一个仿真步骤之前,FMU接收到来自虚拟时间中先前时间点的所有数据,并立即执行 FMU 的仿真步骤。       

图 2 SIL KIT与FMU集成

多个FMU之间数据的mapping可以通过配置VariableMapping来快速实现在序列化数据之前将数据进行交换和共享以及类型转化。  

图 3 多个FMU之间的数据mapping

​​​​​​​​​​​​​​2.2 SIL KIT 网络模拟器

SIL KIT 网络模拟器可在网络层面实现通信行为模拟。它支持 CAN、CAN FD、CAN XL、LIN、FlexRay 和以太网,并将特定总线行为集成到 SIL Kit 仿真环境中。

  1. 可模拟带宽和网络延迟等基本参数
  2. 可确保准确模拟特定总线行为,如 CAN 网络中的仲裁或 FlexRay 集群中的调度
  3. 由网络模拟器赋能的 SIL Kit 仿真能够进行更精细的分析,并使仿真结果更具实际意义
  4. 能在早期阶段评估网络设计,包含在过载条件下

      

图 4 网络模拟阶段图

​​​​​​​​​​​​​​2.3 SIL KIT 监测器

SIL KIT检测器是用来收集、存储并展示来自SIL KIT系统的信息。它是SIL KIT库的多功能扩展,包含数据库后端和轻量级 Web 客户端。通过其Web界面,用户可以评估已结束的仿真,并监控正在运行的仿真的实时视图,有助于对仿真进行详细分析,提供全面的统计数据,并帮助识别配置错误和系统异常行为。

图 5监测器界面

3.仿真中间件SILKIT示例

综上所述SIL KIT很适合用于自动驾驶算法测试,接下来我们将以自动驾驶ACC功能为例,了解SIL KIT是如何将基于VTD的毫米波雷达数据以CANFD的形式、摄像头数据以以太网的形式与ACC算法相连接形成闭环,并触发ACC功能的。

 

图 6 ACC Demo数据流

3.1 CAN FD的模拟

SIL KIT经过二次开发支持导入并解析DBC文件,可根据信号长度、初始值、Offset、Factor、Layout等构建CAN或CAN FD报文,以原始数据形式发出或对接收到的Message进行解析。如图 7为原始DBC文件及图 8解析后的DBC文件。

图7 原始DBC文件

图 8 解析后的DBC文件

基于SIL KIT源码编写CanWriter、CanReader程序,其中CanWriter建立新线程用于读取RDB_OBJECT_STATE_t信息,通过vehicle_state_canfd_vehicle_state_pack函数将传感器数据打包成Message,随后通过SendFrame函数发布信息到SilKit-Can总线上。

启动CanWriter、CanReader程序后,在CANoe端激活SIL KIT,并在CAN节点中添加对应DBC文件,在CanWriter、CanReader程序、CANoe Trace中可以观测到SIL KIT总线上发布的Message,如图 9、图 10所示。

图 9 CanWriter、CanReader终端

图 10 CANoe Trace CAN报文

3.2 以太网的模拟

在VTD中配置传感器,同时基于SIL KIT源码编写 EthernetWriter、EthernetReader程序,在EthernetWriter中,利用SerializeSensorObjectMsg函数将传感器数据序列化至payload,同时利用SendFrame函数将payload中的传感器数据发布至SilKit-Ethernet总线上。对源码进行编译前确认CMakeLists.txt中确认已包含所需头文件的路径或源文件,如RDBHandler.cc、RDBHandler.hh等。

启动程序后,在EthernetWriter、EthernetReader程序、CANoe Trace窗口可监控到以太网数据,如图 11、图 12、图 13所示。

图 11 EthernetWriter终端

图 12 EthernetReader终端

图 13 CANoe Trace Ethernet报文

3.3 算法搭建

ACC DEMO算法采用Simulink搭建,生成为C++代码后导入SIL KIT,算法作为一个SIL KIT总线节点接入来获取SIL KIT总线上发布的传感器数据作为函数输入,根据当前车速、前车速度与前车的距离等车辆状态信息,算出本车的加速度,图 14为算法节点数据流。

图 14 算法节点数据流

算法计算出的车辆控制信号通过指针推入到初始化过得RDBHandler消息中指定的内存块,通过TCP发送到TaskControl,并在parseRDBMessageEntry中调用本函数,来不断覆盖VTD 的DRIVER_CTRL信息实现对VTD中本车的控制。

​​​​​​​​​​​​​​3.4 集成与闭环效果

SIL KIT使用 YAML 配置文件来定义仿真环境和参与者的参数,图 15YAML配置文件里定义了仿真环境的注册地址和启用了日志追踪。

图15  YAML配置文件

在 SIL KIT的仿真场景中,往往存在多个参与者。sil-kit-registry则作为集中式的协调中心,负责管理和协调这些参与者之间的通信与交互。记录了所有参与者的信息,像参与者的名称、连接的网络端点等。当一个新的参与者启动并尝试加入仿真环境时,需向sil-kit-registry进行注册。sil-kit-registry接收这个注册请求,并将该参与者的信息添加到注册表中。同时会把其他已注册参与者的信息提供给新加入的参与者,这样新参与者就能知道在仿真环境中还有哪些其他参与者,并与它们建立通信,图 16为sil-kit-registry注册列表图。

图 16  sil-kit-registry终端

完成注册后,运行源码编译后的可执行文件,进而可实现不同抽象层次的通信,并执行ACC算法,场景中添加ACC算法后的Ego车可根据前车的速度和相对距离等实时调整本车速度,达到跟车效果,如图 17所示。

图 17 仿真结果

4.总结

软件定义汽车(SDV)正引领汽车行业的变革,其强调软件在汽车功能实现与创新中的核心地位。在SDV的复杂开发与测试流程里,软件在环(SIL)仿真技术至关重要,软件在环测试无需实际的硬件设备,只需在计算机上运行软件和模拟模型,可大大减少硬件采购、维护和更新的成本。而仿真中间件SIL KIT在软件在环中更是扮演着不可或缺的角色,它为SDV生态系统中的各类组件与工具搭建起互联互通的桥梁,有力推动着汽车软件开发的高效迭代与创新。SIL KIT为自动驾驶算法的开发与测试提供了丰富的资源与环境。开发人员能借助SIL KIT连接自动驾驶算法仿真模块与高精度地图仿真、车辆动力学仿真、传感器仿真等多个模块。验证算法在复杂场景下的准确性与可靠性,加速算法迭代优化。下一期内容将介绍虚拟ECU的开发,深入探讨基于Vector的vVIRTUALtarget的vECU生成,以及在SIL中的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/906351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows使用anaconda安装pytorch cuda版本

Windows安装PytorchCUDA环境_使用conda安装pytorch cuda10.2版本-CSDN博客

Axure中使用动态面板实现图标拖动交换位置

要在Axure中实现图标拖动交换位置的功能,可以通过动态面板结合交互事件来实现。 实现步骤 准备图标元素 将每个图标转换为动态面板(方便拖动和交互)。 设置拖动交互 选中图标动态面板 → 添加“拖动时”交互 → 选择“移动”当前动态面板&am…

从零开始的嵌入式学习day24

标准IO 头文件需求&#xff1a; #include <stdio.h>1.fopen和fclose (1)fopen fopen的函数功能是打开一个文件。 首先看看fopen的函数声明&#xff1a; FILE *fopen(const char *path, const char *mode);第一个参数path是文件地址&#xff0c;传入的是不可变的字符…

抓包分析工具与流量监控软件

目录 一、抓包分析工具&#xff1a;定位问题的“放大镜” 1.1 工作原理简述 1.2 主流工具盘点 1.3 抓包的实战应用 二、流量监控软件&#xff1a;网络全景的“雷达系统” 2.1 功能特征 2.2 常用工具概览 2.3 实战应用场景 五、结语&#xff1a;深入可见&#xff0c;安…

DRIVEGPT4: 通过大语言模型实现可解释的端到端自动驾驶

《DriveGPT4: Interpretable End-to-End Autonomous Driving via Large Language Model》 2024年10月发表&#xff0c;来自香港大学、浙江大学、华为和悉尼大学。 多模态大型语言模型&#xff08;MLLM&#xff09;已成为研究界关注的一个突出领域&#xff0c;因为它们擅长处理…

Vue3 Form 表单限制输入小写字母、数字和下划线

方案一&#xff1a;Element Plus 表单验证 <template><el-form :model"form" :rules"rules" ref"formRef" label-width"120px"><el-form-item label"用户名" prop"username"><el-input v-m…

23、电网数据管理与智能分析 - 负载预测模拟 - /能源管理组件/grid-data-smart-analysis

76个工业组件库示例汇总 电网数据管理与智能分析组件 1. 组件概述 本组件旨在模拟一个城市配电网的运行状态&#xff0c;重点关注数据管理、可视化以及基于模拟数据的智能分析&#xff0c;特别是负载预测功能。用户可以通过界面交互式地探索电网拓扑、查看节点状态、控制时间…

单片机复用功能重映射Remap功能

目录 一、查看“DS5319 stm32f10x中等密度mcu数据手册&#xff08;英文&#xff09;”手册 二、查看“RM0008 STM32F10xxx参考手册&#xff08;中文&#xff09;”手册 三、重映射&#xff08;Remap&#xff09;功能程序编写 自己学习过程中容易遗忘的知识点&#xff0c;记录…

链表面试题9之环形链表进阶

那么上一题我们已经知道了双指针的变法以及拓展的用法&#xff0c;那么这里我们直接难度升级。 想回去复习的这里放个链接&#xff1a;链表的面试题8之环形链表-CSDN博客 题目链接&#xff1a;142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 我们来看这道题目主要…

游戏引擎学习第299天:改进排序键 第二部分

回顾并为当天内容做准备 我们会现场编写完整的游戏代码。回顾上周发现自己对游戏中正确的排序规则并没有清晰的理解。主要原因是我们更擅长三维游戏开发&#xff0c;缺乏二维游戏和二维游戏技术的经验&#xff0c;对于二维精灵排序、模拟三维效果的最佳方案等没有太多技巧和经…

Redis从入门到实战 - 高级篇(中)

一、多级缓存 1. 传统缓存的问题 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未命中则查询数据库&#xff0c;存在下面的问题&#xff1a; 请求要经过Tomcat处理&#xff0c;Tomcat的性能成为整个系统的瓶颈Redis缓存失效时&#xff0c;会…

Python训练营打卡 Day31

文件的规范拆分和写法 今日的示例代码包含2个部分 notebook文件夹内的ipynb文件&#xff0c;介绍下今天的思路项目文件夹中其他部分&#xff1a;拆分后的信贷项目&#xff0c;学习下如何拆分的&#xff0c;未来你看到的很多大项目都是类似的拆分方法 知识点回顾&#xff1a;文件…

2025年护网行动蓝队防御全解析:构建智能动态防御体系

2025年&#xff0c;随着网络攻击手段的智能化、混合化升级&#xff0c;护网行动中的蓝队防御已从传统的被动防护转向“动态感知、智能研判、主动反制”的立体化模式。如何在攻防不对称的对抗中实现“看得见、防得住、溯得清”&#xff1f;本文将结合前沿技术与实战经验&#xf…

React Contxt详解

React Contxt详解 React 的 Context API 是用于跨组件层级传递数据的解决方案&#xff0c;尤其适合解决「prop drilling」&#xff08;多层组件手动传递 props&#xff09;的问题。以下是关于 Context 的详细解析&#xff1a; 文章目录 React Contxt详解一、Context 核心概念二…

使用 lock4j-redis-template-spring-boot-starter 实现 Redis 分布式锁

在分布式系统中&#xff0c;多个服务实例可能同时访问和修改共享资源&#xff0c;从而导致数据不一致的问题。为了解决这个问题&#xff0c;分布式锁成为了关键技术之一。本文将介绍如何使用 lock4j-redis-template-spring-boot-starter 来实现 Redis 分布式锁&#xff0c;从而…

Vue响应式系统演进与实现解析

一、Vue 2 响应式实现详解 1. 核心代码实现 // 依赖收集器&#xff08;观察者模式&#xff09; class Dep {constructor() {this.subscribers new Set();}depend() {if (activeEffect) {this.subscribers.add(activeEffect);}}notify() {this.subscribers.forEach(effect &g…

Mujoco 学习系列(一)安装与部署

这个系列文章用来记录 Google DeepMind 发布的 Mujoco 仿真平台的使用过程&#xff0c;Mujoco 是具身智能领域中非常知名的仿真平台&#xff0c;以简单易用的API和精准的物理引擎而著称&#xff08;PS&#xff1a;原来Google能写好API文档啊&#xff09;&#xff0c;也是我平时…

Ai学习之openai api

一、什么是openai api 大家对特斯拉的马斯克应该是不陌生的&#xff0c;openai 就是马斯克投资的一家研究人工智能的公司&#xff0c;它就致力于推动人工智能技术的发展&#xff0c;目标是确保人工智能对人类有益&#xff0c;并实现安全且通用的人工智能。 此后&#xff0c;O…

leetcode 合并区间 java

用 ArrayList<int[]> merged new ArrayList<>();来定义数组的list将数组进行排序 Arrays.sort(intervals,(a,b) -> Integer.compare(a[0],b[0]));如果前面的末尾>后面的初始&#xff0c;那么新的currentInterval的末尾这两个数组末尾的最大值&#xff0c;即…

std::vector<>.emplace_back

emplace_back() 详解&#xff1a;C 就地构造的效率革命 emplace_back() 是 C11 引入的容器成员函数&#xff0c;用于在容器尾部就地构造&#xff08;而非拷贝或移动&#xff09;元素。这一特性显著提升了复杂对象的插入效率&#xff0c;尤其适用于构造代价较高的类型。 一、核…