当前位置: 首页 > news >正文

智能驾驶产品开发中如何贯彻“正向开发”理念

摘要:

基于演绎法的正向开发理念,能够让智能驾驶产品在充分满足用户需求,保证产品质量的同时,确保开发目标合理且得到落实。

前段时间,微博CEO吐槽理想L9智能驾驶“行驶轨迹不居中”,在网上引发了热烈讨论。目前,问题的原因已得到澄清:维保时碰到摄像头,产生微小误差,导致远端感知产生较大偏差;理想后续会升级固件,解决该问题。

不过,从广大网友的发言来看,理想的智能驾驶确实存在“车道不居中、遇到大车不避让”的问题,希望理想后续能够优化。

我们认为,遇到问题后及时解决固然是好的,但如果能在一开始就把问题消灭在源头,那么用户对产品的体验会更好。

如果能贯彻“正向开发”的理念,理想智能驾驶的上述问题完全可以避免:摄像头安装误差对感知效果的鲁棒性,在前期产品设计和需求阶段,就可以明确要求;车道居中和大车避让的需求,作为市场上已有的成熟案例,也是可以在功能需求中明确定义的,没有必要等问题出现了再去优化。

引言

从智能驾驶的量产化进程来看,目前基本的单车道级L2功能已经普及,高速NOA功能逐渐趋于标配,城市NOA功能也逐渐铺开,但是,我们也看到,整体而言,智能驾驶产品的效果和用户体验并不能让人完全满意。

用户体验不佳的原因有很多,如软硬件协同没做好、为了控制成本而把硬件减配做得太激进,还有一个极容易被忽略但又直击本质的原因是:缺乏正向开发理念,对汽车行业的开发流程不够敬畏。

以智驾硬件方案的定义为例,需要多少颗摄像头、多少颗毫米波雷达、是否需要激光雷达、计算平台的AI算力应该多大、选用什么芯片更合理,市场上大多数玩家会从归纳法思维出发,直接套用市场上已有的传感器方案和计算平台,实现现有方案对应的功能:

“通过XXX传感器配置和XXX计算平台,可以实现XXX功能,可以达到X级智能驾驶。”这属于“先有果后有因”的逆向开发思路。

这种通过模仿、先有方案后有功能的思路,不仅容易造成产品同质化,更会导致功能受限,难以实现具有自身特色与亮点的新功能。

正确的做法应该是:从演绎法的思维出发,基于正向开发理念,从产品需求出发,正向定义出满足功能需求的传感器配置方案,并匹配相应的计算平台:

“因为要满足XXX功能,实现LX级智能驾驶,因此需要XXX传感器配置和XXX计算平台。”这是一种基于演绎法思维的开发理念,强调从本质和源头出发。

本文将从智能驾驶开发的一般流程出发,并通过硬件方案和软件方案的正向定义,结合项目实例,说明如何在智能驾驶开发过程中贯彻正向开发的理念。

一 正向开发的优势
 

我们先谈一个跟正向开发相对的概念:逆向开发。

逆向开发,即先锁定固定的配置、技术,然后再反推这些配置和技术能够实现什么样的功能。逆向开发表面上能够降低开发成本、缩短开发周期,因为一切都是对现有产品的“拿来主义”。

但是,逆向开发出来的产品,上限永远只能是别人家已有的方案,并且由于缺乏对产品的深刻理解,只“知其然”,不能“知其所以然”,导致产品质量难以保证,并且产品效果难以提升。

同时,逆向开发过程中如果出现技术难题,可能会无法解决,从而出现项目整体停滞的情况,原因就是逆向开发的本质是归纳和复刻,缺乏正向开发所具备的对产品整体的深刻理解,以及对各项技术的整体把控。

以热门话题“去高精地图”为例,如果采用逆向开发的理念,围绕是否配置高精地图,可能会有一轮又一轮的多部门讨论、开会、决策,最后公司领导拍板:“高精地图太贵了,要去掉,但是要保证功能不打折。”

在逆向开发的认知中,城市NOA功能不是目的,是否需要高精地图才是最大的问题。但是,实际上,在感知算法的水平不足的情况下,缺乏高精地图,是很难实现城市NOA等高阶功能的。

相比之下,正向开发理念将开发目标回归到需求层面,所有的设计和后续开发工作,都是为了满足用户需求,达成产品效果。

还是以“去高精地图”为例,如果采用正向开发的理念,思路就会变成这样:因为要搭载城市NOA功能,所以要么提升感知算法水平,要么让高精地图更精准,应该综合评估哪种方式更容易实现、成本更低。

在正向开发理念中,高精地图不是一个问题或者结论,而是一种措施和手段,最终目标是实现城市NOA功能,而不是解决高精地图的有无问题,因为除了高精地图,还会有其他多种因素,影响城市NOA功能的落地。

正向开发需要从零开始,对产品整体和开发过程的每一步都有深入的理解和完整的把握。虽然看起来正向开发需要更长的开发周期和更高的成本,但当整体流程打通后,正向开发的优势会显而易见:

它能够帮助开发者更好地理解用户需求、关注用户体验,并将需求和开发目标贯彻始终,从而提升产品质量和用户满意度,进而提高产品的竞争力和市场占有率。

不仅能确保产品开发目标得到完全落实,从根源上提升产品实力,还能让整体开发过程有序、严谨,项目的关键节点更容易得到保证,从而顺利达成预期的产品和项目效果。

如果从哲学的维度来说,正向开发更像是一种“道”,逆向开发更像是一种“术”。短期来看,“术”可以解决一些问题,但长期主义者,更应该去追求“道”,通过正向开发理念,把目标聚焦在根源,开发出经得起时间考验的产品。

二 智能驾驶的正向开发流程
 

基于正向开发的理念,在智能驾驶的开发过程中,可以借鉴软件开发的V型流程,形成适用于智能驾驶开发的V型流程体系,如图1所示。

图片

图1 智能驾驶的V型开发流程

可以看到,按照工作流的顺序,智能驾驶V型流程依次包含产品设计与定义、系统分析与设计、硬件分析设计、软件分析设计、硬件开发、软件开发、软件模块测试、台架仿真测试、实车测试等关键阶段。

图1的开发流程是典型的正向开发流程,智能驾驶方案从产品设计与定义开始,经过对智驾系统的详细分析与架构设计,将开发目标传递到硬件和软件层面,硬件和软件分别根据产品需求,开展具体的开发工作;再经过软件测试、台架测试、实车测试等不同等级的测试验证,确认达到产品开发目标,最终完成开发任务并交付。

产品设计与定义通常由产品经理负责,基于市场发展和用户调研,结合公司战略和技术水平,并考虑法规政策限制,完成功能原理、逻辑流程、场景分解、关键参数等,形成产品需求文档(Product Requirement Document,PRD)。

系统分析与设计通常由系统工程师或架构工程师负责,根据PRD、法规和技术标准,制定系统架构、功能状态机、软硬件接口、信号定义、详细性能参数等,形成系统技术规范(System Technical Specification,STS)。

硬件分析与设计通常由硬件工程师负责,根据产品需求和系统技术规范,制定硬件详细需求与方案,包括硬件的型号、参数和技术规范等,形成零部件技术规范(Component Technical Specification,CTS)。

软件分析与设计通常由软件算法工程师负责,根据产品需求和系统技术规范,制定软件详细需求与方案,形成软件需求说明书(Software Requirement Specification,SRS)。

硬件开发包括各类传感器以及智驾域控制器的开发,通常由专业的硬件供应商完成,但也有主机厂会参与开发部分硬件,如激光雷达、毫米波雷达等。

软件开发包括操作系统、中间件和应用层算法等模块的开发,是目前行业内争夺和竞争最为激烈的环节,主机厂想要自研、Tier 1想要把控、各类算法供应商想坚持黑盒,但最终都会完成各类功能的软件算法模块。

硬件与软件开发完成后,进入到测试和验证阶段。首先在软件层面搭建软件测试环境,设计测试用例与脚本,制定软件模块测试方案,并完成软件模块测试;然后将智能驾驶的软件算法搭载到控制器上,搭建台架测试环境,完成基于台架的集成仿真测试,又称为硬件在环测试(Hardware-In-Loop,HIL);最后,将所开发的智能驾驶系统,装载到实车上,通过场地和道路测试,最终验证智能驾驶产品的效果,包括功能、性能、交互、用户体验等内容。

可以看出,对于正向开发来说,智能驾驶的开发应该严格遵循图1所示的V型流程,在产品设计与定义阶段,明确产品需求与开发目标,并逐层传递到具体的开发工作中,然后再逐步集成化测试,在整车层面验证产品达到目标的效果。

不过,在现阶段,由于市场竞争激烈、缺乏统一规范等原因,智能驾驶实际的开发过程,往往难以遵循正向开发流程,出现了一些违背正向开发理念的做法,导致产品质量难以保证,用户体验不佳,并增加了大量的改进成本。

下面,我们分别从硬件方案和软件方案2个方面,展开讲述在智能驾驶开发过程中,如何按正向开发流程开展工作,并避免出现简单归纳法思维以及逆向开发的情况。

三 硬件方案的正向定义

【本文提到的硬件方案,有些已经是众所周知的知识,但我们仍希望通过本文的解释,能让读者“知其然,更知其所以然”,获得“先有产品定义,后有硬件方案”的正向开发理念。——作者注】 

我们经常在发布会上听到这样的说法:“我们的产品配置了激光雷达,拥有三十多个传感器,还用了先进的高算力芯片,是先进的智能驾驶。”

也经常在工作中听到这样的说法:“我们去和英伟达/地平线合作,先把芯片定下来,再看看能做到什么程度。”

甚至会听到公司高层这么说:“你们去看看小鹏/蔚来/理想/大疆的选型方案,我们跟他们用一样的,效果应该差不多。”

以上现象的背后,是一种典型的硬件方向逆向开发的思维方式。在逆向开发的认知中,“配置了高端的硬件,就有了高端的智能驾驶;把市场上别人用的硬件方案归纳一下,选择差不多的方案,就能做出类似的效果”。

但事实很可能是:你用8M像素的摄像头,做出的功能体验不一定比得上别人5M摄像头的效果;你用100TOPS算力的芯片,实现的功能未必有别人30TOPS芯片实现的功能多。

这种情况与软、硬件的综合能力有关,但更本质的原因还是在于:没有按照正向开发的思路,前期开发目标不明确。

根据前面提到的正向开发流程,在定义硬件方案前,更重要的是做好产品层面、系统层面的分析、设计与定义。也就是说,硬件方案应该是服务于功能需求、性能要求和产品整体开发目标的,应该是“需求先行”,而不是“硬件先行”。

下面,我们以功能需求展开,说明如何按照正向开发流程,根据功能需求定义硬件(传感器+计算平台)方案。

在九章智驾之前的文章《详解智能驾驶的功能与场景体系》中,已经系统化地总结了目前主要的智能驾驶功能,包含行车功能、泊车功能、主动安全功能等。

智能驾驶的传感器主要包括摄像头、毫米波雷达、超声波雷达与激光雷达,通过在车身的不同位置布置多种类型的传感器,实现对车辆周围区域的检测;广义的传感器还包括地图定位。传感器的分布和作用,大部分人已经非常熟悉,在此不作赘述,直接参考图1即可。

图片

图1 传感器检测范围

智能驾驶各项功能的实现,依赖于传感器对相关区域的检测,因此不同的功能需求,对应着不同的传感器方案。根据各项智驾功能的效果,以及图1所示的传感器检测范围,可以得出各项功能所需的传感器配置,如表1所示。需要说明的是,表1中勾选的传感器配置,是该功能至少需要的传感器,如果成本允许,当然是越多传感器越好。

表1 智驾功能与传感器对应关系

图片

根据表1,在定义传感器方案时,对于行车功能,单车道L2级功能如LCC只需前视摄像头+前向毫米波雷达;多车道L2级功能涉及相邻车道,还需要前、后角毫米波雷达;点到点的领航驾驶功能,需要增加侧视摄像头与后视摄像头,而城区路况更加复杂,因此C-NOA还需要激光雷达。

对于泊车功能时,停车位区域的自动泊车需环视摄像头+超声波雷达,而停车场范围的记忆泊车、智能召唤、自主代客泊车等功能,涉及低速行驶的场景,因此需要增加行车功能相同的传感器。

主动安全功能的传感器,主要与功能所覆盖的方位有关。

在定义传感器配置方案时,通常可以根据产品的功能需求,参考表1的汇总结果,根据功能,逐一确定所需配置的传感器类型。至于传感器的具体参数、型号,则需进一步根据产品性能要求,按照同样的思路来定义。

智能驾驶的计算平台,主要是指域控制器,其重点是SoC芯片与MCU芯片。其中SoC芯片主要用于AI计算,即处理大量的环境感知与定位数据,以及作出任务决策和轨迹规划等;MCU主要负责执行指令,以及安全可靠性。

SoC芯片的最重要任务是处理环境感知与定位信息,因此,智驾方案对SoC的AI算力的需求与环境数据的丰富程度紧密相关。

根据正向开发流程,在传感器配置方案完成后,应该根据各传感器的数据量,评估SoC芯片所需的算力水平。由于各家的算法不同,不同SoC芯片的内部架构不同,因此同一套传感器配置,可能会出现不同的AI算力要求,但算力水平的大概量级,应该是一致的。

例如,单车道L2级智能驾驶只需要前视摄像头与前向毫米波雷达,5TOPS以内的AI算力足以满足;多车道L2级智能驾驶还需要角毫米波雷达,因此需要5TOPS以上的AI算力;高速领航驾驶H-NOA还涉及侧视摄像头的数据,通常需要30TOPS以上的AI算力;城区领航驾驶C-NOA由于需要处理大量的激光雷达点云数据,通常要求AI算力达到200TOPS以上。

表2汇总了现阶段的主要智驾SoC芯片。在确定智驾产品所需的AI算力水平后,可以从表2中,选取相应的SoC芯片,完成计算平台的核心选型。不过,在实际应用中,AI算力只是关键参数,此外还要综合考虑软件与芯片的匹配度、平台成熟度、成本等多种因素,定义出最适合自己的方案。

表2 智驾SoC芯片汇总

图片

以上,就是从功能需求→硬件方案的正向定义方法,这种正向演绎的思维,能够从功能需求出发,在充分理解各传感器用途和算力分布的基础上,定义出最优的硬件方案。

四 软件方案的正向定义
 

在软件方案中,操作系统和中间件往往是成熟的方案,并且难以在产品效果层面直接体现;但应用层算法,尤其是各项功能的实现逻辑和关键参数,是影响智驾产品最终效果的重要因素。

按照正向开发的流程,智能驾驶算法的逻辑和参数,应该是在产品设计与定义阶段提出,经系统分析与设计阶段细化后,传递到软件开发层面。但在实际的开发过程中,往往容易出现需求定义不清、具体模块开发人员不闻不问,随便拍脑袋,甚至直接照搬其他车型方案的情况,导致最终开发出来的功能,偏离最初的开发目标。

下面通过几个功能的真实案例来说明,软件方案的常见逆向开发做法,以及正确的正向开发方式。


案例一:自动泊车APA

某公司的APA功能开发时,由于项目时间紧任务重,在缺乏产品需求和系统关键参数的情况下,算法工程师认为“目前市场上的APA功能已经很成熟,可以直接拿来用”。在简单了解了某款车型的泊车关键参数后,就迅速开展工作,达到了与该车型大概相同的自动泊车效果。

但在实车测试时发现,车辆泊车完成后的位置,不能够根据周围环境自动调整,导致在周围有障碍物时,有时距离障碍物过近,不方便用户开门下车。并且,在泊车过程中,多次出现方向盘大幅左右晃动、车身不稳的情况。

根源就是因为软件参数不是通过正向开发得到的,而是工程师归纳式简单参考的结果。

原本可以通过正向开发避免的问题,由于急功近利的逆向开发方式,导致泊车功能缺乏亮点,无法让用户满意,没有达到预期的产品效果。

对于这种情况,按照正向开发的流程,首先应该考虑的是在产品设计与定义阶段,通过竞品分析、用户调研等方法,提前考虑到泊车过程中对舒适度的要求,明确对横向控制稳定性的要求,以及泊车完成后的车身位置要求。即使项目时间紧张,也可以压缩各阶段的项目周期,而不能直接“裁剪”掉最重要的源头阶段。


案例二:自适应巡航ACC

有一次,ACC功能开发过程中,我们遇到了ACC目标车速变更和ACC跟车停止逻辑的问题。

在开发ACC功能时,我们团队的产品经理经过市场对标和用户体验分析后,在产品需求中明确提出:用户使用ACC功能时,通过“短按”方向盘的车速调节按键,控制目标车速按步长5kph不变化,通过“长按”按键,控制目标车速按步长1kph变化。

原因是,在道路中行驶时,车速变化1kph的场景极少且没有明显意义,因此通过“长按”的方式来控制;车速变化5kph对于改变车速更有意义,因此通过“短按”这一更为简单的方式来控制。

但是,在开发过程中发现,负责对应开发模块的工程师,忽略了产品需求,通过自己的判断和市场上某一款车型的做法,私自更改产品需求,导致开发结果偏离目标。

这种简单的经验式归纳,直接导致该功能的效果是由软件需求反向影响产品需求,也降低了产品效果。虽然最终得到了改正,但对项目整体来说,产生了额外的成本。

另外,ACC控制车辆停车时,出于功能一致性和连续性的考虑,产品需求中要求在任何时候,用户踩下制动踏板,ACC功能都应该完全退出,但在开发过程中,负责对应模块的工程师,忽略了产品需求,自行定义为“车辆静止状态下,哪怕用户踩下制动踏板,ACC功能仍然能保持”。这不仅违背了功能整体逻辑,也额外增加了软件工作量。

以上情况,虽然开发过程是按照正向流程,产品→系统→软件,但在执行过程中,软件模块的开发人员仍没有意识到正向开发的重要性,按照个人经验去逆向定义甚至忽略产品的需求,导致偏离开发目标,也导致项目的时间和人力成本增加。

这种是个典型的“有流程,但没有意识”的案例。很多时候,公司高层和项目负责人已经认识到正向开发的重要性,并且制定了具体的工作流程,但公司的一些研发人员却没有正向开发的意识,仍然按照个人经验,照搬过去的做法,导致正向开发难以完全贯彻落实,新产品的亮点难以得到百分百地呈现。

针对这种意识、观念层面的问题,我们能做的就是首先在团队整体明确正向开发的理念和方法,然后去培养工程师的正向开发思维,通过团队的影响力,带动个人的意识提升。

案例三:高速领航H-NOA

H-NOA功能开发过程中,我们遇到了默认车道策略和进入匝道前变道时机的问题。

团队在定义H-NOA功能时,对默认的行驶车道没有作出明确定义,仅要求“在合理的车道中行驶”。算法人员在开发时,为降低感知的难度,将默认车道设定为高速公路的最左侧车道。

实际上,根据大量老司机的驾驶经验,以及《道路交通安全法》的要求,高速公路中的长时间行驶车道应该是左侧第二车道,车辆不应该长期保持在最左侧车道行驶。

同样,对于进入匝道前的变道逻辑,前期也没有作明确定义,仅要求“能够在进入匝道前,变道至缓冲车道或最右侧车道”。算法人员在缺乏沟通和调研的情况下,对变道时机的参数定义过于激进,导致测试时,多次出现无法成功进入匝道的情况。

这种情况是由于在项目前期缺乏全面的考虑,导致对产品的某些参数缺乏定义,具体开发时缺乏依据。

按照正向开发流程,在产品和系统层面,相关人员应该尽可能地全面定义各项关键参数;对于NOA这类相对复杂的功能,如果前期确实遗漏了某些参数的定义,那么具体模块的开发人员在缺乏依据时,应该主动向产品或系统人员确认、沟通,而不是自作主张地“拍脑袋”。

前期产品需求全面细致,各具体模块负责人员主动沟通,这样才能让正向开发的流程更好地推进,产品效果得到保证;否则,如果需求定义不清,后续模块人员自作主张,那么实际上又变成了逆向开发的模式,正向开发也就成了表面文章。

五 结语
 

以上,就是智能驾驶的正向开发方法,以及如何在实际工作中,贯彻正向开发理念的一些理论和经验总结。基于演绎法的正向开发理念,能够让智能驾驶产品在充分满足用户需求,保证产品质量的同时,确保开发目标合理且得到落实。

不过,本文的内容属于基本的思路和方法论,在具体的产品开发过程中,还需根据实际情况,如开发能力、成本、周期、资源等,灵活定义方案,及时调整,作出最合理、能落地的选择。

来源 | 九章智驾

相关文章:

智能驾驶产品开发中如何贯彻“正向开发”理念

摘要: 基于演绎法的正向开发理念,能够让智能驾驶产品在充分满足用户需求,保证产品质量的同时,确保开发目标合理且得到落实。 前段时间,微博CEO吐槽理想L9智能驾驶“行驶轨迹不居中”,在网上引发了热烈讨论…...

【机器学习】038_梯度消失、梯度爆炸

一、原因 神经网络梯度 假设现在有一个 层的神经网络,每层的输出为一个对输入作 变换的函数结果 用 来表示第 层的输出,那么有下列公式: 链式法则计算损失 关于某一层某个参数 的梯度: 注意到, 为向量&am…...

【转】OAK-D双目相机进行标定及标定结果说明

编辑:OAK中国 首发:A. hyhCSDN 喜欢的话,请多多👍⭐️✍ 内容来自用户的分享,如有疑问请与原作者交流! ▌前言 Hello,大家好,这里是OAK中国,我是助手君。 近期在CSDN刷…...

whip和whep

原文为runner365.git大佬的文章 原文链接:https://blog.csdn.net/sweibd/article/details/124552793 WHIP接口 什么是whip 全称: WebRTC-HTTP ingestion protocol (WHIP). rfc地址: rfc-draft-murillo-whip-00 简单说,就是通过HTTP接口能导入webrtc媒…...

SpringBoot集成jjwt和使用

1.引入jwt依赖&#xff08;这里以jjwt为例&#xff0c;具体其他jwt产品可以参见jwt官网&#xff09; <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>…...

RedisConnectionFactory is required已解决!!!!

1.起因&#x1f936;&#x1f936;&#x1f936;&#x1f936; redis搭建完成后&#xff0c;准备启动主程序&#xff0c;异常兴奋&#xff0c;结果报错了&#xff01;&#xff01;&#xff01;&#xff01; 2.究竟是何原因 &#x1f62d;&#x1f62d;&#x1f62d;&#x1f…...

redis的高可用之持久化

1、redis的高可用考虑指标 &#xff08;1&#xff09;正常服务 &#xff08;2&#xff09;数据容量的扩展 &#xff08;3&#xff09;数据的安全性 2、redis实现高可用的四种方式 &#xff08;1&#xff09;持久化 &#xff08;2&#xff09;主从复制 &#xff08;3&…...

onnx模型转换opset版本和固定动态输入尺寸

背景&#xff1a;之前我想把onnx模型从opset12变成opset12&#xff0c;太慌乱就没找着&#xff0c;最近找到了官网上有示例的&#xff0c;大爱onnx官网&#xff0c;分享给有需求没找着的小伙伴们。 1. onnx模型转换opset版本 官网示例&#xff1a; import onnx from onnx im…...

远程运维如何更高效的远程管理?向日葵的这几项功能会帮到你

远程运维如何更高效的远程管理&#xff1f;向日葵的这几项功能会帮到你 具备一定规模的企业&#xff0c;其IT运维需求普遍会面临设备数量众多、难以统一高效管理、始终存在安全敞口等问题&#xff0c;尤其是针对分部广泛的无人值守设备时&#xff0c;更是如此。 举一个简单的例…...

python BDD 的相关概念

在Python 语言中进行BDD的规格和测试文件的编写的时候&#xff0c;常常会遇到下面的概念&#xff1a; Fixture : 测试设施。设定测试环境的预设状态或值的机制。Background&#xff1a; 背景。所有场景的公共部分。Scenario&#xff1a; 场景。Given &#xff1a; 前置条件Whe…...

【Exception】Error: Dynamic require of “path“ is not supported

Talk is cheap, show me the code. 环境 | Environment kversionOSwindows 11Node.jsv18.14.2npm9.5.0vite5.0.0vue3.3.8 报错日志 | Error log >npm run dev> app10.0.0 dev > viteERROR failed to load config from C:\code\frontend\app1\vite.config.js …...

【蓝桥杯选拔赛真题25】C++两个数比大小 第十三届蓝桥杯青少年创意编程大赛C++编程选拔赛真题解析

目录 C/C++两个数比大小 一、题目要求 1、编程实现 2、输入输出 二、算法分析...

C++学习——C++运算符重载(含义、格式、示例、遵循的规则)

以下内容源于C语言中文网的学习与整理&#xff0c;非原创&#xff0c;如有侵权请告知删除。 一、运算符重载的含义 所谓重载&#xff0c;就是赋予新的含义。函数重载&#xff08;Function Overloading&#xff09;可以让一个函数名有多种功能&#xff0c;在不同情况下进行不同…...

【unity实战】unity3D中的PRG库存系统和换装系统(附项目源码)

文章目录 先来看看最终效果前言素材简单绘制库存UI前往mixamo获取人物模型动画获取一些自己喜欢的装备物品模型库存系统换装系统装备偏移问题添加消耗品最终效果源码完结 先来看看最终效果 前言 之前2d的换装和库存系统我们都做过不少了&#xff0c;这次就来学习一个3d版本的&…...

编程语言发展史:C语言的诞生及其影响

预计更新 第一部分&#xff1a;早期编程语言 1.1布尔代数和机器语言 1.2汇编语言的出现和发展 1.3高级语言的兴起 第二部分&#xff1a;主流编程语言 1.1 C语言的诞生及其影响 1.2 C语言的发展和应用 1.3 Java语言的出现和发展 1.4 Python语言的兴起和特点 1.5 JavaScript语言…...

(二)pytest自动化测试框架之添加测试用例步骤(@allure.step())

前言 在编写自动化测试用例的时候经常会遇到需要编写流程性测试用例的场景&#xff0c;一般流程性的测试用例的测试步骤比较多&#xff0c;我们在测试用例中添加详细的步骤会提高测试用例的可阅读性。 allure提供的装饰器allure.step()是allure测试报告框架非常有用的功能&am…...

【用unity实现100个游戏之16】Unity程序化生成随机2D地牢游戏2(附项目源码)

文章目录 先看看最终效果前言生成走廊生成房间修复死胡同增加走廊宽度获取走廊位置信息集合方法一方法二 源码完结 先看看最终效果 前言 上期已经实现了房间的生成&#xff0c;本期紧跟着上期内容&#xff0c;生成走廊并结合上期内容生成连通的房间。 生成走廊 修改Procedur…...

潮玩宇宙大逃杀游戏开发源码说明

潮玩宇宙大逃杀游戏是一款简单而刺激的游戏。玩家在倒计时结束前从8个房间中选择一个房间并投入宝石。倒计时结束后&#xff0c;系统会自动生成一个敌人&#xff0c;然后随机挑选一个房间并清除这个房间内的人。其余7个房间内的玩家就可以按照投入比例获得被清除掉玩家的宝石。…...

UE5 操作WebSocket

插件&#xff1a;https://www.unrealengine.com/marketplace/zh-CN/product/websocket-client 参考&#xff1a;http://dascad.net/html/websocket/bp_index.html 1. 安装Plugings 2.测试websocket服务器 http://www.websocket-test.com/ 3.连接服务器 如果在Level BP里使用&a…...

Linux文件

目录 一、基本概念 二、研究进程和被打开文件的关系 &#xff08;一&#xff09;w方式 &#xff08;二&#xff09;a方式 三、认识系统接口&#xff0c;操作文件 &#xff08;一&#xff09;认识文件描述符 &#xff08;二&#xff09;举例 &#xff08;三&#xff09;…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...