一种基于形式化模型的ROS代码生成器及代码生成方法与流程

文档序号:18409184发布日期:2019-08-10 00:47阅读:394来源:国知局
一种基于形式化模型的ROS代码生成器及代码生成方法与流程

本发明涉及一种基于形式化模型的ros代码生成器及代码生成方法,是一种软件开发领域的自动代码生成技术,主要应用于高可靠性机器人系统的从设计模型到代码的自动实现系统,属于软件开发领域。



背景技术:

近年来,机器人被广泛地应用于各种各样的工业和生活领域,极大地推动了社会的发展。然而,机器人在推动社会快速发展的同时,也存在着许多的安全隐患,这要求机器人系统的开发必须满足其严格的安全性和可靠性需求。

一种典型的方法是利用模型验证技术来检验系统的安全性需求和行为规范。该方法首先利用时间自动机对机器人系统的内部交互进行建模,然后根据模型抽象出与系统安全性和可靠性相关的需求规约并且将其转换成计算树逻辑。最后,利用模型验证技术来验证系统的安全性能是否得到满足。然而这种可视化的数据模型仅仅是在系统设计的初级阶段对系统交互行为的底层抽象,其并不能直接运行在机器人操作系统上。因此,为了将模型的行为控制映射为目标平台的动作输出,我们需要将可视化的模型结构转换成与其具有相同时序逻辑的操作代码。然而手动的代码转换不仅会引入许多人为的错误,系统的正确性难以被保障;而且还会降低软件的开发效率,延长软件的开发周期。

针对这一问题,研究者将自动代码生成技术应用于模型驱动开发领域,并在此基础上提出了多种解决方案。乌普萨拉大学开发的原型c代码生成工具timestool是一个包含自动代码生成功能的集成开发工具包。该工具能够从含有任务调度的时间自动机中自动地生成可执行的c代码。但生成的代码主要是用于基于brickos操作系统的乐高机器人,而ros开发环境的主要特点比如节点,话题等没有被嵌入到生成的代码框架。开源的模型驱动开发工具rosmod利用元语言对ros工作空间进行建模并且能够将构造的系统模型自动地转换成可执行的vhdl代码。然而,代码转换单元只负责将嵌入在模型中的业务逻辑代码提取出来并放置在生成骨架的相应部分,对于模型和操作代码的严格的形式化检测功能尚未被支持。



技术实现要素:

为了保证系统的形式化模型与其实现机制的一致性,同时提高代码生成的效率和正确性,本发明提供一种基于形式化模型的ros代码生成器及代码生成方法。本发明能够从满足uppaal验证需求的机器人系统模型中自动地生成可执行的c++代码,生成的代码提供了一种与ros系统相适应的框架结构,并且支持新的、可模块化的ros指令的封装和调用,具有极大的灵活性和可扩展性。通过在ros平台上运行生成的代码,能够实现与手写代码一致的机器人的运动控制。本发明不仅降低了手工编码引入错误的概率,而且提高了代码生成的质量和效率,从而为ros系统的开发提供了便利。

本发明一种基于形式化模型的ros代码生成器,设计原理如图1所示。它是由四部分构成:输入模块(input),java解析器(parser),逻辑控制器(controller)以及输出模块(output)。下面分别对其介绍:

输入模块:所述的输入模块用于指定模型文件的类型,系统的时间自动机模型被映射成一个xml文件,该文件采用了抽象语法树结构来存储和定义模型中的状态、转换等数据元素以及元素之间的依赖关系。

java解析器:该组件是代码生成器的核心组件之一,它实现了从模型到代码的低层抽象。首先,解析器读取xml文档并且使用dom4j技术提取文件中的数据元素;然后,根据所提取的数据元素构建一系列的数据表,其中包含三张静态查找表(locations,syncs,tran_syncs)和一张动态查找表(transitions)。数据表之间的映射关系由模型自身的控制转换逻辑所决定。

逻辑控制器:逻辑控制器是代码生成器的另一个核心组件,它实现了从模型到代码的高层抽象。首先,逻辑控制器读取表格中的数据元素,然后根据模型内部的状态转换机制定义一系列的时序控制规则,比如,转换分支的选择,转换条件的评估以及同步时钟的设置等。最后,逻辑控制器将一系列的与时间自动机模型的控制转换相一致的时序规则抽象成逻辑规约的形式,并且将该规约用c++代码的形式呈现出来。

输出模块:该部分将以c++代码形式所表示的抽象时序规约写入到c++文件中,其中包含三个源文件(.cpp)和四个头文件(.h)。

一种基于形式化模型的ros代码生成方法,具体包括如下步骤:

s1、建立模型

模型构建单元主要负责对系统进行可视化建模,系统组件间的交互能够被建模成一个时间自动机网络,系统在不同时刻的状态被映射成模型中的节点,状态之间的迁移对应于模型里的转换;一旦标记在边上或节点中的条件满足指定要求,则转换发生。

文本编辑器定义了模型转换中涉及到的变量、函数,以此来支持转换的执行。

s2、解析模型数据并且构建数据表

时间自动机的存储和转换依赖于一系列由java解析器构建的数据表;其中,静态表存储了模型中可视化的数据元素,表中数据元素之间的依赖关系由该元素在模型中的排列方式决定;动态表是用来描述时间自动机模型分支转换逻辑的主要设计手段,状态之间的转换被映射成动态表的查找和更新;通过迭代地读取和修改数据表中的数据能够实现与时间自动机模型相同的转换输出。

s3、定义模型到代码的映射规则

具体包含三个设计模块:committed模块,主控逻辑框架以及时钟处理单元;其中,主控逻辑框架用来评估模型的输出转换,使得生成的代码能够与模型保持一致的状态输出;committed模块用来改变模型当前的输出转换,它在保证整个时间自动机模型时序逻辑正确性的前提下,优先执行了committed状态输出的转换。时钟处理单元实现了系统时钟的同步增长功能,从而解决时钟模块与不同目标平台之间的缺口。

s4、进行代码生成

通过代码生成器能够自动地将模型转换成c++代码并写入到七个c++文件中。这七个文件包含了三个.cpp文件和四个.h文件。

所述的七个文件包含了三个.cpp文件:*.cpp,ros_kernel.cpp,*_init.cpp,四个.h文件:*_init.h,*.h,ros_interface.h,ros_system.h,其中文件*.cpp是程序执行的入口,它存储了一系列数据表和相关函数的定义,ros_kernel.cpp中包含了时间自动机模型的核心算法设计,该算法描述了模型的转换控制逻辑,*_init.cpp文件初始化了ros工作空间以及一些定义的数据变量;其它四个.h文件定义了结构体变量和ros封装模块来支持.cpp文件的运行。

本发明一种基于形式化模型的ros代码生成器及代码生成方法,其优点及功效在于:本发明能够从uppaal工具验证的时间自动机模型中快速、高效地生成可执行的c++代码,不仅避免了手写代码容易引入错误的情况,而且极高地提高了代码生成的效率,提高准确率,从而缩短了软件开发的周期。

附图说明

图1所示为本发明一种基于形式化模型的ros代码生成器的设计原理图。

图2所示为本发明的设计框架。

图3所示为本发明模型转换过程中的动态表结构。

图4所示为本发明模型转换规则中的主控逻辑设计流程。

图5所示为本发明生成代码的关联图。

具体实施方案

下面结合附图和实施案例,对本发明的技术方案做进一步的说明。

(一)实现平台

本发明使用的形式化建模工具为uppaal,适用于可以被描述为非确定性的并行过程的积的系统。生成的代码用于linux系统下的ros平台来对其正确性和有效性进行测试。

如图1所示,首先将描述了机器人系统时序控制的时间自动机模型输入到代码生成工具中,其次,代码生成工具中的解析器提取了模型中的数据元素并由此构建了一系列的数据表;接着,逻辑控制器根据数据表中的数据元素定义了与模型的转换控制逻辑相关的一系列的映射规则,该映射规则被转换成c++代码的形式存储在存储器中。最后,将自动生成的c++代码应用到ros台上来实现与手写代码相同的控制输出。

(二)方法

1.建立模型

模型构建单元主要负责对系统进行可视化建模。系统组件间的交互能够被建模成一个时间自动机网络,系统在不同时刻的状态被映射成模型中的节点,状态之间的迁移对应于模型里的转换。一旦标记在边上或节点中的条件满足指定要求,则转换发生。文本编辑器定义了模型转换中涉及到的变量、函数等以此来支持转换的执行。为了使时间自动机更加准确地反映系统的行为,具有更高级和复杂特点的元素被加入到系统模型中。

invariant:该属性是可以包含时钟变量、整型变量以及常量的表达式。在表达式中,主要采用x<e或x<=e等形式的条件,也可以是二者的条件合取,其中,x是时钟变量,e是常量。

committedlocations:该属性主要用来处理紧急转换的输出。如果系统模型当前处在committed状态,那么模型下一次的输出转换将是committed转换之一。

guard:该属性代表了条件表达式,它可以包含时钟条件,布尔条件等不同的条件表达式。一旦当前转换条件满足,则转换发生。

synchronization:该属性被表示为ch?或ch!形式,其中ch?代表从信道ch上接收一个事件,ch!代表向信道ch上发送一个事件。如果两条转换分别标有ch?与ch!,那么这两条转换称为互补转换。

2.解析模型数据并且构建数据表

uppaal时间自动机的存储和转换依赖于一系列由java解析器构建的数据表。其中,静态表存储了模型中可视化的数据元素,比如状态,转换以及转换之间的条件约束等。表中数据元素之间的依赖关系由该元素在模型中的排列方式决定。动态表是用来描述时间自动机模型分支转换逻辑的主要设计手段,状态之间的转换被映射成动态表的查找和更新。通过迭代地读取和修改数据表中的数据能够实现与时间自动机模型相同的转换输出。

图3显示了动态表的数据结构。该数据表由若干条记录构成,每一条记录对应于模型中的一条转换。根据记录在数据表中的存储顺序,依次对其进行从小到大编号,且越先存储的记录,其编号也越小。每条记录包含七个数据域:active,name,from,to,guard,sync以及assignment。其中,active是状态转换标志,它用来标识一条转换在当前状态是否可以被执行;name是用来区别不同转换的标识符;from和to分别代表了一条转换的源状态和目标状态,且数据域中的数据值是locations数据表的引用。guard存储了转换上的条件评估;当一条转换发生时往往会执行存储在assignment中的相应操作,比如变量更新和函数调用等;sync域或者为空或者包含了转换上的同步信号,该数据域中的数据值取自syncs表。为了确保同一源状态的多条输出转换在同一时刻仅有一条被执行,模型中指定了转换的优先级。正如图3所示,编号越小的转换(转换的编号与记录编号保持一致),其优先级越大。

3.定义模型到代码的映射规则

图4所示为模型控制逻辑的程序流程设计,该模块描述了模型的动态转换机制,使得时间自动机模型与代码能够保持一致的逻辑输出(如状态序列,执行轨迹等),其它的算法模块都是在该算法的基础上进行的功能模块的设计与优化。在该算法中,包含三个设计模块:committed模块,主控逻辑框架以及时钟处理单元。其中,主控逻辑框架用来评估模型的输出转换,使得生成的代码能够与模型保持一致的状态输出;committed模块用来改变模型当前的输出转换,它在保证整个时间自动机模型时序逻辑正确性的前提下,优先执行了committed状态输出的转换。时钟处理单元实现了系统时钟的同步增长功能,从而解决了时钟模块与不同目标平台之间的缺口。

下面给出三个核心算法的设计:

(1)主控逻辑框架

(如下表1)algorithm1是模型控制逻辑的核心算法设计,该算法定义了模型的动态转换机制,使得模型与代码能够保持一致的逻辑输出;其中,第7-8行查找和执行了标有committed源位置的紧急转换输出,函数committed_cha()用来改变模型当前的输出转换。第9-21行定义了模型的转换控制逻辑。通过执行该段程序,能够确定当前所选择的转换是否可行。如果一条转换上包含同步信号,那么它的互补转换是以同样的方式被评估了,这一过程被描述在5-9行。第23-27行定义了同步时钟的操作模块,该模块的主要功能是实现模型中的时钟变量与系统时间同步地增长。函数clock_process()判断和修改了位于转换上的时间变量值,需要指出的是,时间变量值的修改基于某一个固定的步长常量,此外,14-17行定义了同步时钟的操作,主要用来模拟系统时间的改变。

表1

(2)同步时钟的设计

同步时钟是uppaal工具的主要特点之一,它能够保证时间自动机模型之间的实时性交互。在模型中,时钟变量主要是以不变式(invariant)或者评估条件(guard)的形式出现。其中,不变式被定义在位置结点上,而评估条件存储在转换上。这里,使用数组clocks[]来存储模型中的时钟变量,且所有的时钟变量以固定的步长同步增加,尽管当前转换的发生可能仅依赖于其中的某一个时钟变量,如下表2。(如果当前转换的发生依赖于模型中的某一个时钟变量,那么模型中其他所有的时钟变量以相同的步长同步增加。)

表2

(3)committed模块的设计

由于committed结点要优于其他结点进行处理,因此只要转换到达该结点,则必然从该状态产生输出效果,否则模型会发生死锁现象。图5所示为committed结点处理流程,变量i代表数据表中一条任意的转换(包含committed转换),而变量j仅代表模型中committed状态的输出转换。如果当前状态为committed状态,则优先评估该状态处所有的输出转换,否则,按照数据表中转换的定义顺序依次评估。值得注意的是,程序的终止包含两种情况:(a)模型中不存在可以执行的转换,即正常退出状态;(b)程序中存在其他可以执行的转换,但是,由于committed状态的输出转换不满足转换发生的情况,导致模型的执行发生死锁现象,从而使得程序异常退出。

4.进行代码生成

通过代码生成器能够自动地将模型转换成c++代码并写入到七个c++文件中。这七个文件包含了三个.cpp文件(*.cpp,ros_kernel.cpp,*_init.cpp)和四个.h文件(*_init.h,*.h,ros_interface.h,ros_system.h),其中文件*.cpp是程序执行的入口,它存储了一系列数据表和相关函数的定义,ros_kernel.cpp中包含了时间自动机模型的核心算法设计,该算法描述了模型的转换控制逻辑,*_init.cpp文件初始化了ros工作空间以及一些定义的数据变量。其它四个.h文件定义了一些结构体变量和ros封装模块来支持.cpp文件的运行。七个文件之间的关联关系如图5所示。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1