首页/文章/ 详情

仿真测试入门参考(16):SIL系统的开发步骤

1年前浏览4553

 经常有朋友问如何学习仿真测试,于是想着把自己的一些经验和理解分享出来,希望能有所帮助。不过视野和技术有限,所说不一定对,供大家批评和参考。这是第16篇,SIL系统的开发步骤。

为构建出仿真测试入门参考(15)中提到的软件在环测试系统所示的自动驾驶软件在环测试系统(如下图),可遵循如下步骤:

1.确定被测对象

软件在环测试系统构建的第一步是确定被测对象,这是所有后续工作的输入和基础。具体地,包含画框图、定对象、辨数据三部分内容,下面进行举例说明:

(1)画框图

软件在环测试系统的被测对象是自动驾驶算法软件,但是该软件由多个模块构成,有时要对完整的算法进行测试,有时仅需要测试其中的一部分。仿真测试系统需要模拟被测对象以外的部分,从而使得被测对象能够正常运行。

为了能够实现正确的仿真,首先需要根据实车的实际情况,画出完整自动驾驶系统框图,用以进行后续的分析。

本例中,假设完整的自动驾驶系统如下图所示,由摄像头、激光雷达等传感器探测周围环境信息,并发出图像、点云等原始信号;感知模块从中识别出障碍物、红绿灯等目标信息,发出目标列表;车载定位设备发送本车的位姿、速度、加速度等信息;规划模块根据自车状态和周围环境情况,做出规划决策,发出未来一段时间的目标轨迹;控制模块通过计算并发出对车辆的加速、减速和转向控制,以实现对目标轨迹的跟踪。

(2)定对象

根据项目进展和测试需求,决定对规划控制模块进行测试,即被测对象为规划控制模块。这样一来,仿真系统需要模拟规划控制模块以外的模块,即被测对象为真实模块,其他模块为虚拟模块。

实际操作中并不需要模拟所有被测对象以外的模块,而是模拟与被测对象直接连接的模块的输入和输入即可。即并不是很关心是否有相应的虚拟模块,更关心是否有相应的输入和输出信号。比如,为实现目标列表的模拟,可以在仿真软件中添加能够发布图像信息的摄像头模型和虚拟感知模块,也可以仅添加一个能够发布目标列表的简单传感器即可,实际操作中更倾向于后者,因为这样可以使系统更简单。

(3)辨数据

接下来需要对需要模拟发布接收的信号进行具体分析,确定通信方式和格式定义,弄清楚需要发布和接收的具体内容。

采用与算法模块一致的通信方式和格式定义即可,比如算法模块基于ROS2通信,那么模拟发布和接收信号时也基于ROS2即可。

2.选择仿真软件

根据上一节分析得到需要模拟的内容,选择合适的仿真软件。比如,若需要传感器图像等原始信号的模拟,需要仿真软件具有高保真的渲染能力和合适的传感器模型;若关注车辆的动态响应精度,需要仿真软件具体高精度的车辆模型。

(1)仿真软件的类别

根据来源的不同,可以将仿真软件分为三类:自研软件、基于开源软件二次开发和商用软件,具体对比如下表所示:

表中“+”越多说明该项优势越大。总体而言,自研软件灵活性好、可根据自己的节奏开发需要的各种功能;商用软件功能成熟稳定、一般不能或者只能进行较少的自定义开发。表中对成本、时间、灵活性和可靠性共四个方面进行了对比,具体选用时可实际情况进行评估和平衡。

需要补充说明的是,成本列其实是自研软件和开源软件的人工成本与商用软件的采购成本的对比。商用软件一般需要按照使用数量购买使用许可,在使用数量较多的情况下成本较高,但是如果数量较少的情况,需要进行具体评估,其成本不一定高于自研或者开源软件。

(2)常见仿真软件

现有软件众多,仿真测试入门参考之常用仿真软件(4):调研问卷结果中提到了一些,还有很多优秀软件没有列举。

不同的仿真软件有不同的特性和优势,有时为实现良好的仿真效果,会不只选用某一款软件,而是选用几款软件发挥各自的优势,进行联合仿真。

3.集成开发

集成开发的目的是将仿真测试系统的各个组成部分集成为联合运行的有机整体,包括软件环境集成和算法集成两个方面。

(1)软件环境集成

由于软件环境大多情况下由来源不同的多个模块或软件构成,需要对接各种软件的信号并实现同步运行。

软件环境集成既要实现各仿真模块/软件之间的联合运行,也要实现测试管理模块对仿真软件、软件算法、测试场景的调用和管理。

(2)算法集成

通过开发中间件实现仿真软件和自动驾驶算法的集成,中间件一般在算法运行环境下开发,并通过api与仿真软件交互。下面以算法基于ROS框架的情形为例进行简单说明。如下图所示,规划、控制等算法模块都作为一个节点(ros node),互相通过话题(ros topic)进行通信;仿真软件提供了基于c++的api,与其进行信息交互。

在算法开发环境建立一个中间件节点,该节点从功能上包含算法侧、软件侧和信息转换三个部分,不过这三个部分的代码不一定完全分离。算法侧通过话题的方式、按照算法的消息类型(msg)与算法节点通信,软件侧调用仿真软件提供的api与仿真软件交互,信息转换部分各种信息转换。

中间件使用仿真软件api中的SIMAPI::GetLoc和SIMAPI::GetObs获取本车位置和障碍物信息,经过信息转换后通过本车定位话题/localization和障碍物话题/obstacle发布给算法;算法经过计算后发布控制指令话题/control,中间件接收这一话题,经过信息转换后通过SIMAPI::SetCtrl将控制指令发送给车辆模型,控制其实现状态更新。

中间件开发完成后,可通过开环调试和闭环调试确认其功能:

  • 开环调试

主要目的是对算法侧和软件侧两个部分的功能进行验证。

算法侧的验证:使用话题/control发布控制指令,算法侧接收并打印,查看是否与话题/control上发布的数值一致;算法侧通过话题/localization和/obstacle发布一组本车位置和障碍物信息,查看是否算法能够通过/localization和/obstacle接收且数值一致。

软件侧的验证:在仿真软件中将本车和障碍车设置到两个已知的位置,使用软件侧获取本车位置和障碍车信息并打印,查看是否与仿真软件中设置的一致;在软件侧中设置固定的控制指令(如方向盘转角或加速度),在仿真软件中查看本车是否按照该控制运行。

  • 闭环调试

主要目的是对数据转换部分的功能进行验证,并确认算法能够正常运行。

选取一组有代表性的仿真场景,运行仿真软件和中间件,启动自动驾驶算法,查看算法的相应功能是否按照预期运行。


来源:孙工自动驾驶
二次开发通信自动驾驶控制渲染
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-08-28
最近编辑:1年前
孙工自动驾驶
硕士 专注自动驾驶仿真测试
获赞 19粉丝 27文章 82课程 0
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈