详解自动驾驶安全软件开发流程

article/2025/6/8 8:27:15

1 引言

自动驾驶汽车开发越来越重视性能、质量和性价比,自动驾驶口碑成为新技术应用取得市场成功的关键,而口碑的建立依赖于相关软件开发流程、周期、时间和质量。一家汽车企业只有拥有或者其软件开发供应商具有成熟的软件开发团队、软件开发流程、可复用的软件流程资源库,才能在日益激烈的自动驾驶产业竞争中获得一席之地。

目前,国际上应用于汽车行业的软件开发成熟度评估标准主要有能力成熟度模型集成(Capability Ma⁃turity Model Integration,CMMI)和汽车软件过程改进及能力评定模型框架(Automotive Software Process Im⁃provement and Capacity Determination,ASPICE)。CMMI拥有全球公认的软件、产品和系统开发优良实践过程改进模型,能够帮助组织提升绩效,具有普适性,而ASPICE标准基于软件过程评估国际标准ISO15504,主要针对汽车行业软件开发过程框架,是现今汽车企业主要依据的过程评估标准。与典型传统软件开发过程,例如线性瀑布模型相比,以V开发模式为导向的ASPICE软件过程域,从客户需求、系统架构、软件需求、软件架构、软件详细设计、单元构建到测试验证之间都存在一致性与双向追溯性关系,从最初的系统需求分析开始,测试人员就参与进行对应验证标准的设计,将设计和测试在项目开始初期就关联起来,在整个软件开发生命周期都有着重要的指导意义。

传统软件开发重视业务过程和文档,若软件开发人员完全按照设计文档进行程序开发,经过很长的开发周期后提交软件程序,会导致早期错误可能要等到开发过程后期才能发现,风险与修正成本不可控制。敏捷软件开发模式强调沟通,通过各子项目的集成和运行,构建成上层软件项目,软件开发成员拥有充分的自主权,可自行寻找最佳工作方式完成工作,不必拘泥于设计文档。开发过程循环迭代,开发人员针对前期需求,尽可能早地提交一个完整可独立运行的源程序,供测试验证,发现问题后提出需求变更请求,开发人员再次按照新需求开发并提交源程序,如此循环直至软件从整体构架至各个细节完全符合需求,从而实现完美的人机结合。

敏捷方法主包括:Scrum方法,自适应软件开发(Adaptive Software Development,ASD),水晶方法,以及最重要的极限编程(eXtreme Programming,XP)。Scrum偏重于过程,XP则偏重于实践,实际开发中,两者经常结合一起应用。

由于汽车自动驾驶软件的复杂性与专业性,一味遵循敏捷开发,专注市场变化和客户反馈,会对整个软件的架构、开发、测试造成很大的波动。控制不好,会使得项目失控,造成严重的质量问题,比如Bug多,架构不合理,易用性差,性能不佳等。除此之外,汽车软件项目开发周期很长,很难保证开发的人员不更换,而没有规范体系文档就会造成在交接的过程中出现很大的困难。因此,采取有效方法保证过程质量,对于提高产品质量具有十分重要的意义。

为满足自动驾驶车辆的安全性需求,根据ISO PAS 21448标准,智能驾驶系统本身传感器/控制器/执行器的设计不足、性能局限在遇到一定的场景触发条件(如环境干扰或人员误用)时,将可能导致整车级失效危害,进而威胁人身安全。究其根本,应在软件开发阶段充分降低预期功能安全SOTIF危害事件的潜在风险、提高软件安全性能、明确安全边界。因此,本文在结合传统与敏捷开发流程基础上,融入SOTIF对部件软件层级的安全需求与测试验证,合理控制软件已知/未知风险,开发自动驾驶软件流程,促进自动驾驶车辆系统安全提升和顺利发布。

2 汽车安全软件开发流程定义

设计智能驾驶软件产品开发流程如图1所示。主要由8个阶段构成,即包括软件需求分析、软件架构设计、软件敏捷设计、软件详细设计和单元构建、软件单元验证、软件敏捷集成、软件集成和集成测试及软件合格性测试。增加软件敏捷设计与集成活动,以应对实际软件开发项目中开发周期短,软件需求预开发架构的问题。

图1 汽车自动驾驶安全软件开发流程

第1阶段(Step-01),软件需求分析:

主要工作内容:根据项目目标与计划,承接系统需求,SOTIF危害分析与项目内各专业确认软件需求,进行需求评审。

第2阶段(Step-02),软件架构设计:

主要工作内容:识别软件需求,形成软件架构设计说明,并进行软件架构设计评审。

第3阶段(Step-03),软件敏捷设计:

主要工作内容:识别软件敏捷设计需求,形成软件敏捷设计说明与计划,并进行软件敏捷设计评审。

第4阶段(Step-04),软件详细设计和单元构建:

主要工作内容:结合敏捷设计需求,根据软件需求和软件架构定义软件详细设计,包括任务设置、调度机制、优先级、时序、函数接口关系、数据定义、算法策略说明,根据软件详细设计进行软件单元构建工作,并进行软件详细设计和单元构建评审。

第5阶段(Step-05),软件单元验证:

主要工作内容:完成静态检查,编写软件单元测试需求文档、测试用例,自动或手动进行单元测试工作,并进行软件单元测试评审。

第6阶段(Step-06),软件敏捷集成:

主要工作内容:完成软件敏捷集成计划,形成软件敏捷集成说明,并进行软件敏捷集成评审。

第7阶段(Step-07),软件集成和集成测试:

主要工作内容:按照集成计划,完成软件单元集成,编写软件集成测试需求文档,自动或手动进行集成测试工作,并进行软件集成和集成测试评审。

第8阶段(Step-08),软件合格性测试:

主要工作内容:根据软件需求进行软件合格性测试,并进行软件合格性测试评审。

体现SOTIF分析与开发过程,具体开发活动如图2所示。

图2 汽车自动驾驶安全软件开发过程

3 汽车安全软件开发流程特点

3.1 双向追溯性

本软件开发过程体系具有ASPICE双向追溯[的特点:

(1)纵向/横向双向追溯性

从上到下的追溯,便于确认是否所有需求都执行;从左到右的追溯,便于确认是否所有需求都被测试;从下到上的追溯,便于发现哪些需求被错误的执行或曲解;从右到左的追溯,通过测试的过程发现问题或者缺陷来源于哪个需求。

(2)需求变更定位

在出现新的需求或者需求变更时,通过快速追溯便于V模型从上到下、从左到右准确的定位,发现从设计到测试整个工程开发中不同阶段需求变更具体位置。

(3)评估评审

通过需求的纵向和横向的追溯就可以知道该项目是否严格按照ASPICE标准流程执行开发过程。

3.2 敏捷开发与集成

将敏捷开发过程融入软件开发端与软件测试端,软件敏捷集成与软件敏捷设计过程同样具有双向追溯性,并强调以下关键实践:

(1)以人为核心

敏捷开发注重人员与沟通,只有软件开发人员与业务人员达到事件的敏捷处理,整个软件开发过程才能实现敏捷化。

(2)迭代—增量开发

整个软件的开发过程通过迭代式开发分成若干阶段,开发人员根据优先级或风险高低选择需求,对程序进行增量的设计和开发。每次迭代完成对应一个经过测试的最终产品,开发团队通过它获得更多反馈,再继续完善软件产品。

(3)测试驱动开发

基本思想就是在明确要开发某个功能和在开发功能代码之前,先编写测试用例,思考如何进行功能测试,然后编写相关的代码满足这些测试用例,循环进行功能添加。直到完成全部功能开发。

(4)持续集成

持续集成的主要思路是为了增加集成测试效率,将软件开发过程后期的软件集成分摊到软件的全过程灵活进行。

3.3 软件层SOTIF开发

在软件设计与测试阶段,同步进行SOTIF开发活动,对软件开发起到安全约束的作用,对应以下5项活动:

(1)识别和评估SOTIF潜在功能不足和触发条件

通过规范与设计文档的支撑,进一步确认软件设计不足及性能限制、人员误用等及其触发条件。利用FTA故障树分析得出导致软件层面上SOTIF相关整车级危害触发条件,包含感知模块、算法决策模块、执行模块及人员的合理可预见的误用。确认触发条件对SOTIF的可接受性,评审评估严重度(S)、可控性(C)以及触发条件的概率是否满足制定的可接受标准。

(2)功能修改以减少SOTIF相关风险

通过已分析得到的软件层级的设计不足及性能限制之处,制定针对SOTIF相关危害的改善措施,包含功能目标的更改、软件设计限制、改进和降级。将改善措施更新进入规范与设计文档。如果仍不能充分降低安全风险,需要定义接受准则并考虑相应的法规、该功能在目标市场的情况、人员暴露在风险下的可接受性。

(3)定义验证和确认策略

SOTIF的验证和确认过程主要是对未知的不安全场景和已知的不安全场景进行探测和转化的过程,针对软件系统提出验证与确认的要求。制定针对已识别SOTIF相关危害的验证策略,及针对残余风险的确认策略,编写集成测试规范,并说明所选验证和确认方法的基本原理。

(4)验证已知危害场景

针对已识别的SOTIF相关危害场景,基于所选的验证方法,对软件算法进行模拟仿真验证或硬件在环(HiL)验证,并进行集成测试,最终出具危害场景的验证报告。

(5)验证未知危害场景

为评估未知危害场景下的潜在风险,应设计测试用例进行风险测试,识别系统设计可能触发危险的运行情况,减少未知危险区域,以验证目标是否满足安全接受准则为评判依据。

4 应用实践 

随着我国汽车企业智能驾驶产品逐步的自主化,由于缺乏经验,软件团队在实际项目开发中曾暴露出多项问题与流程漏洞,以往车型项目中存在过系统方案选型不合理,缺乏有效评审评估,导致系统方案选型与主流方案存在偏差,导致开发后期无法闭环控制,产生空间车位泊车精度不足等系列问题,项目后期难以解决。特别是由于软件开发系统功能需求规范不完善,在软件开发过程中反复修改需求,导致软件开发效率不高的问题。通过该流程的制定与实施,健全整个软件项目开发测试团队的软件开发流程体系,开展软件开发过程管控,完善软件质量管理和微流程规范化工作,制定软件开发规范和要求文档模板40个,严控评审把关,有效保证软件开发各个环节的规范化与标准化,质量问题明显减少,效率明显提升。

通过该流程实施解决AEB自动刹车辅助系统潜在危害的过程举例如下:

(1)潜在的交通状况:

在交通拥堵的路上行驶(如郊区道路)。

(2)潜在危害:

非预期的紧急制动可能致使与后面的车相撞。

驾驶员对危害不可控。后车驾驶员对危害的控制取决于两车之间的距离。

(3)触发事件:

特殊道路条件(如:井盖,管道,饮料罐)可能会生成雷达回波,有可能被理解为潜在障碍物。

不必要的紧急制动引发的后侧碰撞需要降低严重度,此SOTIF相关风险不可接受。为降低后碰的严重度,功能改进方向为对限制制动介入的时长或强度。

(4)改善后的功能描述:

该功能使用雷达传感器扫描前方障碍物的距离。若检测到即将到来的碰撞,则AEB将会触发。限制制动介入以减少或防止不需要的紧急制动带来的碰撞。

5 结束语

本文结合ASPICE过程模型与敏捷开发的各自优势,考虑了SOTIF安全需求,减少了危害事件,提出了一种融入软件敏捷开发环节的软件开发流程,兼顾了传统汽车软件开发控制、流程、文档和评审的方法,与敏捷开发的灵活主动、快速迭代的特性,以及安全约束。新制定的面向自动驾驶安全软件开发流程是在传统汽车软件开发过程基础上的一种改进和优化,合理平衡软件开发活动,实际项目实施效果证明了新开发的软件流程的有效性,对后续汽车自动驾驶安全软件的开发具有指导意义。

本文作者吕颖


http://chatgpt.dhexx.cn/article/vyRL45Gq.shtml

相关文章

软件开发流程:需求评审流程

1 常规需求 图1 常规需求评审流程 2 非常规需求 图2 非常规需求评审流程 3 紧急需求 图3 紧急需求评审流程

软件开发流程知识概括

软件开发流程知识概括 软件开发流程简述开发流程详解软件开发流程涉及的图软件开发总结 软件开发流程简述 研发流程简述: 研发流程详解: 需求提出: ①这个环节主要是产品爸爸给我们提需求,每个需求都是他们从用户&#xff0c…

软件开发的一般流程是什么?

软件开发流程分为: 需求确认——概要设计——详细设计——编码——单元测试——集成测试——系统测试——维护 软件开发是一项包括需求捕捉、需求分析、设计、实现和测试的系统工程。软件一般是用某种程序设计语言来实现的。通常采用软件开发工具可以进行开发。软件分为系统软…

python----列表操作

1. append(添加,添加的类型不变) a [1, 2] b [3, 4] c a.append(b) print(a--->, a) print(b--->, b) print(c--->, c)2. extend(末尾添加,会合并成一个列表) a [1, 2] b [3, 4] c a.extend(b) print(a--->, a) print(b--->, b) …

python——列表基础操作

1.列表的格式 列表的相关操作: 2.添加append()列表里面包含列表: extend和append的区别:append的最终列表中添加的是一个元素,extend的最终列表中显示的是追加的多个元素 第二种方式extend(): 指定对应索引新增数据insert: &am…

在python中、列表中的元素可以是_Python列表操作集合

对于python列表里元素的操作主要分为以下几个方面: 1、向列表里面加元素; 向python列表里面添加元素主要有三种方法: (1)append() append()对于列表的操作主要实现的是在特定的列表最后添加…

python使用下标可以修改列表的元素值吗_Python列表操作最全面总结

1.列表添加元素 列表中可以使用append、insert、extend方法实现元素的添加。 append会把新元素添加到列表末尾 A = ["a", "b", "c"] A.append("d") print(A) 输出 [a, b, c, d] insert(index, object) 在指定位置index前插入元素objec…

Python列表操作常用函数、方法大全

目录 简介列表基本方法访问列表元素(即索引)index方法enumerate()函数 在列表中添加元素append方法insert方法 修改列表元素删除列表元素del语句pop()函数remove方法 列表排序sort方法sorted()函数reverse方法 列表长度 len()函数列表转换 列表高阶操作数…

Python列表操作方法详解

这篇文章主要介绍了Python列表操作方法详解,需要的朋友可以参考下. 本节内容 0、列表常用功能汇总1、定义列表2、访问列表中的元素3、切片4、追加5、插入6、修改7、拷贝8、删除9、扩展10、统计11、翻转12、排序13、获取下标值14、清空列表列表是Python最常用的数据类型之一,通…

python的列表的操作

1.列表的创建与删除 介绍: 1)变量只能存储一个元素,但是列表能存储无限多元素。这样程序就可以很方便的对这些元素操作 2)列表相当于其他语言的数组 列表示意图: 代码例子: 列表创建方式: 列…

Python中列表的基本操作

目录 1、定义列表2、访问列表3、增删改操作4、合并列表5、列表切片6、遍历列表7、列表转换 列表通常用来存储多个数据,每一个数据之间用逗号隔开,列表中的数据被称为元素,列表的左右两边带有中括号。 1、定义列表 定义列表时初始元素可以为…

python列表操作大全

列表相关操作 #1. 添加元素append 、 extend 、insert # li2 [1, b, c, d] # li2.append([2, 3, 4]) # append整体添加在原来列表后面 [1, b, c, d, [2, 3, 4]] # li2.extend([2, 3, 4]) # extend 分散添加, 将另外一个类型中的元素逐一添加 [1, b, c, d, 2,…

Python中列表及其操作

文章目录 前言一、列表简介二、访问列表元素三、修改、添加和删除列表元素1.修改列表元素2.在列表中添加元素3.从列表中删除元素 四、对列表元素排序五、确定列表长度六、遍历列表七、创建数值列表1.函数range()的使用2.创建数字列表3.列表解析4.处理数字列表的函数应用 八、切…

python列表的基础操作

python列表的操作 列表是python最为基础的数据结构,极为重要。 这话怎么理解呢? 是最常用的,想不到其他的,就用列表是其他数据结构的基础,可以继承列表然后定义属于自己的数据类型是numpy,pandas等数据包的基石&…

python教程:12种列表常用操作方法

都是基础知识,长久不用就会忘,温故知新,又来学习学习。相信很多人在编程的或者对一些程序处理的思维会用到,比如面试 (有写的不对的地方也请大家指正~ 一、列表定义 列表是一个有序且可更改的集合。在Pyth…

python教程 列表list操作

python的列表 一、常用操作1、创建列表2、索引操作 二、列表的增删改查1、增加 一、常用操作 1、创建列表 list1 [] #创建一个空列表 list2 [1, 2, 3, 4, 5, -1] #创建一个数字型列表 list3 [“a”, “q”, “w”, “s”, “d”, “f”, “e”] #创建一个字符型列表 li…

Python列表操作详解

目录 前言: 1、列表的创建与删除 1.1 创建有两种方式 1.2 列表特点: 2、列表的查询操作 2.1 给元素查索引 2.2 给索引查元素 2.3 获取列表中多个元素 2.4 使用循环遍历列表 3、列表元素的增,删,改 3.1 增添元素&…

Python中列表的常用操作

1、列表的格式:变量A的类型为列表 namesList [xiaoWang,xiaoZhang,xiaoHua] 比C语言的数组强大的地方在于列表中的元素可以是不同类型的 比如:testList [1, a] 2、打印出列表的数据 一、列表的循环遍历 1、for循环遍历 2、while循环遍历 二、列表的添…

找出数组中其中最大的数及其下标

1、在一个有8个整数(18,25,7,36,13,2,89,63)的数组中找出其中最大的数及其下标。 代码如下: public static void main(String[] args) {int[] a new int[]{18,25,7,36,13,2,89,63};int x 0; //局部变量需要初始化int max a[0];//假设a[0…

海量数据处理 大量数据中找出最大的前10个数 (Top K 问题)

在工作中我们常遇到此类问题,从一个大量甚至海量的数据中取出前几个大的数。必须在海量的文章中取出点击量最大的10篇文章。 此类问题其实就是Top K问题。 给定一个数据(数据量海量 N),想找到前 K 个最大的或最小的元素。 eg&…