系统架构风格

陈杰杰12个月前软考-系统架构工程师33

论软件系统架构风格


摘要

2021年,我所在的公司需要开发《******绕障系统》,之后简称《绕障系统》,该系统为建筑机器人导航系统的一个子系统,主要完成的任务是:实现机器人自主导航从A点到地图任意一点B点,同时避开障碍物安全精准的达到。项目核心功能点有,任务提取解析,机器人的感知,障碍物的识别和提取,全局路径规划、局部路径规划、速度规划、轨迹跟踪,机器人的运行学部分和安全告警部分。我在该项目中承担系统架构工程师一职,主要负责该系统的架构设计相关工作。本文将以该系统为例,详细阐述软件系统架构风格在项目中的具体应用。我采取了三种架构风格:面向对象,抽象出了很多的对象和行为;事件驱动,保证了外部信号的变更能及时的通知到整个系统;基于规则的系统,这里我们使用了行为树,对各个行为进行了定义。

 

正文

今年来随着建筑行业的快速发展,外加越来越多的年轻人不愿再从事辛苦的建筑行业,据国家统计局数据显示,传统建筑从业者更多集中在高龄农名工中,其中30岁以下群体中从事建筑及装修行业的仅占15.0%,而50岁以上人群比例确高达42.7%。随着公司建筑机器人的快速发展,建筑机器人应用而生,同时为提高建筑机器人的智能化程度和安全性及高效性,公司进行了一系列的技术研发。

2021年1月《绕障系统》也应用而生,而我有幸作为该项目的系统架构师,主要负责整个系统的架构设计。项目的产品经理,开发,测试等角色合计20余人。从2021年1月开始到2021年12月底结束,耗时12个月顺利结束。该项目主要完成了若干核心算法的研发,实现了对外接口封装,任务解析处理,机器人安全识别及处理,激光雷达数据梳理,动态障碍物的识别,全局及局部路径的规划,基于PID的轨迹跟踪算法,机器人的运动学和动力学模块。整个项目输出一整套的SDK方案和对应的测试用例和demo程序。

在做软件架构设计的时候,为了提高系统的复用性和和提升开发效率,我们通常会使用一些架构风格。我们经常用的架构风格有:数据流风格,调用返回风格,独立构件,虚拟机风格和仓库风格。数据流风格主要是将前一步的处理结果作为下一步的输入内容,主要包含批处理和管道过滤器,批处理序列强调的是大量整体的数据一起处理,而管得到过滤器强调的是流式数据的处理;调用返回主要包含主、子程序,面向对象和层次结构三种风格,主子程序是面向过程的调用,面向对象主要是对对象的调用,层次结构使层与层的调用方法。独立构件风格强调的构件之间不直接交互从而降低系统的耦合性,主要包含进程通信和事件驱动两种风格,进程通信通过进程间通信方式进行通信,如消息队列等,事件驱动是指不直接调用对应接口,而是通过事件的方式进行触发和执行。虚拟机风格的特点是可以灵活定义自定义场景,包含解释器和基于规则的系统,而规则系统其实是在解释器的基础上增加了经验规则;仓库风格强调的是以数据为中心,主要包含了数据库系统,黑板系统和超文本系统三种风格。

以上五种经典的架构风格,并非在系统中都要用上,二是需要根据实际情况选择合适的架构风格,所以在《绕障系统》中,我选择用了三种架构风格:面向对象风格,事件驱动风格和基于规则的系统。下面我将结合该系统阐述这三种架构是如何具体实施的。

面向对象风格。面向对象方法以客观世界中的对象为中心,其分析和设计思想符合人们的思维方式,分析和设计的结构与客观世界的实际比较接近容易被人们接收。该风格是要求我们在前期尽可能的识别出系统中的对象和行为信息,所以,我们一开始就根据系统的需求,对系统中包含的对象和行为做了识别。首先,我们根据项目的需求,识别并抽象了很多的对象,如车体信息,轮系信息,手动遥控包,自动行走指令包,里程计信息,路径信息,告警信息等。另外,我们还抽象了对象的行为,如任务解析,任务执行,任务状态反馈,全局路径生成,局部路径生成,轨迹跟随,参数更新,版本获取等等。然后所有的交互,基本都是一个对象对另一个对象的方法调用,如任务解析需要先有自动行走指令,从中解析到起点、终点,行走方式等信息。局部路径的生成需要障碍物信息,全局路径信息和地图信息,通过调用对象获取到值,再执行相应的方法。报警操作等也需要获取当前的告警信息进行处理,然后执行对应的动作。通过面向对象的方法,我们可以方便的将各个对象和行为进行抽象。

事件驱动架构风格。由于该系统的主要目的是响应用户动作,执行对应的指令。所以系统的自动任务、手动任务下发,状态请求等都要及时的通知到系统的各类用户,此时,我们就使用了时间驱动风格。如当系统收到了一个自动走点任务后,会通知到我们任务处理模块,然后会进行任务的解析,再将系统状态由空闲切换到自动走点状态,执行对应的走点逻辑。同时,我们手动遥控指令会取消不再接收手动遥控指令。异常监控模块也开始监控定位信息是否正常等。我们对外的接口部分只负责对应的任务接收,并不关心具体在接收到后的执行哪些动作,这些刚好使用事件驱动架构风格时能把其解耦出来。同时,我们也引入了类似ROS的中间件,使用了公司其他部分开发的BROS作为中间件,进行消息的管理和转发等,消息发布后,然后订阅者能及时的订阅到对应的消息进行对应的动作。另外,把电机故障,告警信息等上报给到中间件,其他节点也能快速的响应并作出对应动作。将状态的改变和其他模块处理解耦开来,使我们程序更加健壮。

基于规则的系统。在智能小车方向,我们经常会使用基于规则的系统,来应对环境的不断的变化,比如,我们会实时检查定位数据状态,当在一个周期跳动的距离大于最大距离阈值时,我们会减速停车,跳动大小为小或者中等时,我们会按照规则进行减速。再比如当靠近障碍物时,先进行减速,当安全模块检测到距离障碍物距离很近时,我们会触发停障,以保证机器人的安全性。再比如任务处理模块在接收到自动走点任务时,会进行当前状态判断,比如当前正在走点时,会触发拒绝。基于规则的系统刚好满足我们的要求,该风格的优点是可以灵活的自定义场景。这里我们具体使用了行为树对各个环境变化做出不同的响应,这里也对整个程序的拓展性和可修改性进行较大的提升,比如之后继续往行树种添加的决策节点,比如路径偏移,斜坡检测等,都可以做到快速的开发适配。

由于该系统使用了以上三种架构风格,所有整个项目在开发阶段都进行的非常顺利,同时也让该系统的可拓展性,松耦合,重用性,可修改性等等方面都达到了设计要求,系统在2021年底顺利上线,系统上线后,陆陆续续的在不同项目上进行应用,目前已在28款建筑机器人包括室内装修类,内墙喷涂类,地库类机器人上进行使用,使用过程中系统运行问题,未发现重大问题,收到了客户和公司领导的一致好评。

虽然使用了架构风格的实践效果显著,但是还是存在一些不足之处,比如,我们在使用事件驱动架构风格时,当事件量过大时,会存在有些事件是耗时动作,比如电机复位等动作,我们使用的中间件在一个进程内部,所有的消息是串行的,这会导致某些耗时的事件会阻塞整个系统消息的收发,这里我们约束了所有的事件接收到后,只做触发类事件,将所有的耗时动作都放入到线程池内,单独创建线程进行处理,再将执行结果返回即可。这样就满足了消息实时性的问题。当然,该系统后续还会不断的演化,让系统越来越好,力争在建筑机器人行业能闯出一片天。

 

 

 

 

 

 


标签: 软考
每天进步一点点!

相关文章

论基于架构的软件设计方法的应用

论基于架构的软件设计方法的应用摘要2021年,我所在公司正在开发一套《AGV自动绕障系统》,该项目主要功能为完成机器人自动绕开障碍物并到达指定目标位置。我在该项目中担任系统架构师一职,主要负责对整个项...

可靠性设计技术

可靠性设计技术题目随着软件的日益普及,系统中软件成分不断增加,是得系统对软件的依赖越来越强。软件的可靠性对系统的可靠性影响越来越大。而实践证明,保障软件可靠性具有最高效,最经济,最重要的手段是在软件设...

论架构评估

论架构评估摘要2021年1月,我所在公司**公司正在开发一套机器人绕障系统,这里简称《绕障系统》,该项目主要完成机器人自动绕开障碍物并精准到达用户下发的指定位置,我有幸在其中担任系统架构师一职,主要负...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。