草庐IT

汽车软件开发的下一个阶段是什么样的

eng2mot 2023-03-28 原文
近几年,汽车行业一直朝着软件定义汽车发展,更多的特性和功能主要通过软件实现,这些软件可以快速、轻松的进行远程更新。

当前一辆车上的代码量达到数以千万计,但是在车辆网联、自动驾驶、用户体验方面还仅仅是初级阶段,这其中每项创新都需要复杂的软件来支撑。

确保开发人员拥有更好的工具、流程和结构来高效地创建、测试和更新软件,这是整个行业的首要任务。

答案在于持续集成和持续部署 (CI/CD),但平台必须具有足够强大的云原生开发和编译环境,以实现实时、全球协作并执行严格、广泛的测试汽车应用。

一个更好的方法

随着软件将车辆的安全性、舒适性和便利性提升到新的水平,开发人员现在需要比传统系统更现代、更强大的软件开发环境。

过去,软件开发遵循僵化、缓慢的瀑布方法,并使用高度分散的工具链。开发将经历离散的阶段,每个阶段都在下一个阶段开始之前完成。许多开发过程是手动的,从工具链的一个部分到下一个部分的切换也是如此。以这种方法一版软件需要六到八个月的时间的开发时间。

如今,汽车领域的软件越来越从硬件中抽象出来,开发人员有机会利用这种架构转变,他们可以使用敏捷和DevOps 方法按自己的时间表来更新软件,并且不受硬件更改或其他物理更新的影响。这种方法提供了前所未有的速度、可扩展性、质量和安全水平。

在持续集成 (CI) 中,构建软件的工作是自动化的,软件生产的所有步骤都包含在 CI 链中,因为一个部分的输出成为下一个部分的输入。持续部署 (CD) 是在现场自动部署新版本软件。CI/CD 以及连续测试 (CT) 现在可以在汽车中进行,但测试新的高级应用程序在汽车行业提出了一个独特的问题,因为测试需要在物理车辆上或在试验台上进行复杂的模拟测试。

理想的方法是通过基于云的集中式平台消除开发和测试过程中的瓶颈,使开发人员能够在位于世界任何测试中心的相关测试台上执行任何测试。这些测试可以将软件在环 (SIL)、硬件在环 (HIL) 甚至车辆在环 (VIL) 置于更真实的测试中。这种方法允许使用全球资源来应对当今最严峻的挑战所需的规模。

传统方法的问题

当开发人员每天编写数百万行代码时,传统的开发、测试、集成和部署软件的方法是不可持续的。对HIL测试的需求意味着,由于在CI期间代码更改已经集成到软件中,CI系统必须在物理上位于HIL工作台的旁边。这种方法有许多缺点:

1.单个构建可能需要数小时,而它需要在几分钟或更短的时间内完成。这是影响上市速度和质量的一个重大瓶颈,因为更长的构建通常会导致执行自动化测试的时间更少。当构建时间过长时,它会消耗宝贵的时间,这些时间可以更好地用于额外的测试或功能开发。

2.如果没有普遍接受的软件方法,影子 IT 不可避免地会出现,这意味着开发人员有时会使用自己喜欢的工具。这不仅会造成效率低下,而且还可能成为安全风险,因为 IT 缺乏对开发过程的可见性。当开发人员使用不同的工具集时,他们更难与客户或彼此协作。

3.为同一软件项目贡献的CI链已经分布在世界各地的多个技术中心,每个中心都有自己的HIL测试台。如果没有标准的方法,企业就无法在云中进行开发,也无法实现全球标准化所带来的一致性和可重复性。

4.随着多个团队甚至供应商为当今的移动软件产品做出贡献,集成点的增加推动了质量、交付和时间问题的增加。最佳实践是尽早且经常地集成代码,但传统方法在开发过程中创建了不灵活的闸,导致在下一个合并门之前无法测试的问题。这会导致整个项目出现不必要的延误。

云端

由于车辆是生命安全系统,汽车公司长期以来一直采用以需求为中心的方法来设计和测试它们。他们根据一系列的要求来验证系统,以确保安全和法律方面的考虑得到了适当的解决,事实上,行业的ISO 26262功能安全标准导致了需要测试功能的每一个需求。简而言之,制造商必须证明他们的解决方案在第一天就符合规格,并且在发布后的每次更新中,他们必须确保所有昨天能用的东西今天仍然能用。

在过去的 10 年里,汽车行业应用中的软件需求数量已从数百增长到数万。其中许多要求必须使用运行在与车辆相同的电子控制单元 (ECU) 硬件上的嵌入式软件进行测试。测试还必须实时执行,以确保响应时间是可预测的,这意味着每个测试平均需要几分钟。最重要的是,软件通常分布在多个 ECU、传感器和其他设备上,并且由不同公司的同等分布的团队开发。

这些因素导致公司在多个地点使用多个CI链,都有自己的HIL测试平台,并且都为同一个项目做出贡献。

更好的方法是为每个程序创建一个单一的、统一的工具链。这个工具链应该是基于云的,并且可以在全球范围内使用。而且应该有一种机制来快速和轻松地部署新的工具链。

基于云的工具链具有可伸缩性,可以确保CI构建时间不会成为瓶颈,这一点很重要,因为瓶颈会压缩可用的测试时间,并可能导致软件延迟发布。

使用基于云的方法,开发是顺畅的,因为代码更新在开发团队之间共享,因此每个人都在同一页面上了解项目的状态。这可以提高自动化、远程故障排除、快速反馈、明确的团队分配和明确的产品所有权。

使用基于云的CI意味着开发团队创建的新代码可以自动集成到代码库中,而使用OTA更新的基于云的CD可以确保成功构建的代码自动部署到测试或生产环境中,无论它们在哪里。如果处理得当,云方法还可以在整个过程中构建安全性,包括灾难恢复。而且,托管在云中的集中式基础设施允许使用单一的管理视图来查看所有这些高度安全和弹性的CI链。

此外,灵活性允许开发人员在开发周期的后期改进产品。开发人员可以在前一年定义需求,对它们进行测试,从而构建更接近消费者期望的系统,而不是今天决定消费者在几年内想要什么。

然后,他们可以在未来几年根据需要部署 OTA 软件更新,从而降低保修成本并确保软件继续满足消费者的期望。

测试

在汽车工业中,为了确保软件在各种驾驶条件下都能正常工作,试驾可能需要数十万英里。

仿真程序使软件供应商能够降低成本,同时提供灵活性和可重复性。此外,通过模拟可以在复杂解决方案的开发过程中测试代码片段或组件,而不是等待整个产品完成然后进行测试,然后返回并进行修复,重复测试和修复。

借助仿真技术,结合 SIL 或 HIL,可以测试和验证日常构建。并且多线程 SIL 或 HIL 可以同时进行多个测试而不是顺序进行,这也节省了时间并提高了效率。

SIL 测试完全在软件生成的建模环境中进行。SIL 测试的优点是不需要特殊硬件(几乎可以在任何笔记本电脑或其他计算平台上进行),并且最适合在早期阶段测试设计。

在HIL测试中,系统会模拟车辆和ECU的环境输入,使其误以为与真实车辆相连。HIL工作台包含所有相关的车辆组件。模拟器向实际的摄像机和雷达系统提供输入信号,然后向被测系统发送信号,以查看系统是否对输入信号作出正确响应。

例如,测试脚本可以创建一个场景,在这个场景中,一辆在雨中以60km/h的速度绕着弯道行驶的汽车在路上遇到一个未知的物体,或者一辆迎面驶来的汽车在中线上急转弯。连接在HIL试验台上的摄像机和雷达将图像发送到ECU,被测系统必须实时处理这些数据,并决定采取何种行动。

模拟还允许测试人员快速测试罕见或潜在危险的用例。通常为了尝试重现特定的驾驶条件或部件问题,不得不驾驶数百公里。模拟允许按需测试,通过重新模拟特别具有挑战性的场景来显示不同版本的软件如何对相同的输入做出反应。

基于云的CI/CD/CT的优势

持续测试(来源APTIV)

基于开放标准和敏捷软件开发原则的全球集成云原生架构消除了传统瓶颈,并为汽车行业开发先进软件的公司带来了关键优势。这些包括 :

性能:  基于云的、全球可用的体系结构可以在世界任何地方远程控制测试平台。这增加了可扩展性和灵活性。

速度:自动化可以将构建时间缩短多达 80%。公司可以通过基于容器的架构和代码合并的方法来消除瓶颈。他们可以仅重建和测试更改的部分,从而将部署速度提高 60%。

联合开发:当多个合作伙伴实时测试彼此的代码时,开发人员都可以在合作伙伴提交代码的同一天进行集成、测试和问题修复。其结果是为 OEM 提供快速、高质量、低风险的复杂软件功能,在成本效益、维护和后期迭代上也具有明显优势。

质量:  与远程SIL/ HIL测试平台的完全集成可以提高产品质量,因为开发人员可以在任何地方进行测试,并且并行进行无限的测试。

透明度:整个团队可以全面了解所有软件开发链的最新状态,无论程序大小、复杂性或修改的内容。CI最佳实践可以得到实施和支持,并且可以在提前识别出问题。这也极大地简化了安全策略的执行。

有关汽车软件开发的下一个阶段是什么样的的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  6. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  7. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  8. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  9. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  10. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

    它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

随机推荐