张忠坤,林泓宇,谭智元,邢明杰,武延军1,+
(1.南京中医药大学 人工智能与信息技术学院,江苏 南京 210023;2.中科南京软件技术研究院智能软件研究中心,江苏 南京 210000;3.中国科学院软件研究所 智能软件研究中心,北京 100190;4.中国科学院大学 计算机科学与技术学院,北京 100190)
智能规划[1]是人工智能系统实现智能决策和行动的必要组成部分之一。其中规划领域定义语言(planning domain definition language,PDDL)[2]是智能规划社区中广泛使用的一种领域描述语言,具有形式化、标准化等特点。PDDL语义的实现与特定的功能设计和语法支持密切相关,开发者需要针对功能需求来设计专用编译系统以实现并优化相关系统运行的性能。比如Fast Downward[3]的编译系统是针对其规划任务的优化而设计,流程包括PDDL的词法分析、语法分析、格式转换和问题建模等。而PDDL.jl[4]的编译系统是将PDDL解析为Julia数据结构,以便用户可以通过Julia语言来操作和处理PDDL数据。此前我们对PDDL的集成开发环境如MyPDDL[5]和PDDLStudio[6]等存在的版本特性支持不完善、文本编辑困难和缺少应用指导等问题,设计了一个图形化PDDL在线编辑网站来帮助开发者提高PDDL的编写效率(https://graphplan ner.isrc.ac.cn)。网站通过jsMind[7]思维导图作为图形化PDDL代替文本PDDL来提高开发的效率,并能够解析用户上传的思维导图和PDDL文件,还为用户提供了在机器人操作系统(robot operating system,ROS)[8]环境下的应用指导。为此本文设计了专用编译系统Graph Compiler,其不仅支持编译jsMind思维导图,也支持对多版本PDDL文件的编译,还可以将规划结果转换为ROS机器人具体行动的动作序列信息。对多届国际规划竞赛(international planning competition,IPC)[9]的PDDL用例的实验结果表明,Graph Compiler能够正确编译测试集上的所有用例。此外,我们对图形化PDDL语言指导机器人任务规划做了实验,将Graph Compiler应用到ROS工程中,拓展了它的应用空间。
PDDL语言结构一般如图1所示,分为域模型(domain)和问题模型(problem)。
图1 常见PDDL文件结构关系
域模型包括Types、Fluents和Action Schemata等结构。
Types指定了在域模型和问题模型中定义变量时可以使用的所有类型。Fluents包括谓词和函数,它有n个对象参数,Fluents描述这些参数之间的某种属性和关系。Action Schemata是一个动作列表,其中每个Action都是一个元组,包含Parameters、Precondition和Effect。Parameters充当具体操作时所操作对象的占位符。Precondition是一组逻辑公式,指定了动作发生需要满足的属性条件或逻辑关系。Effect也是一组逻辑公式,指定了动作发生后,改变了哪些属性条件或逻辑关系。
问题模型包括Domain(域模型)、Init State和Goal State。Init State定义了问题模型中的所有对象及其对应的初始状态,而Goal State则是当问题解决时模型中的对象应处于的状态。初始状态和目标状态都被指定为一组逻辑公式。
编译系统的运行架构如图2所示,用户在前端中产生的PDDL数据、jsMind数据和规划结果数据,在前端经过简单的语法检查后,被传到后端的编译系统中。编译系统将输入数据传到对应的编译模块,包括PDDL编译模块、jsMind编译模块和ROS应用模块。如果PDDL或jsMind编译成功,系统会将生成的目标代码存储到临时文件中并返回到前端展示,否则返回给前端错误原因;规划结果则通过ROS交互模块被转为ROS话题消息,通过话题发送节点持续发布,可以被动作节点订阅,进而用于指导机器人的任务规划。
图2 编译系统运行架构
输出到临时文件中保存的PDDL问题模型文件可以被系统集成的规划器求解。系统提供两种规划求解方案,一种是planutils[10]项目的本地规划器接口,可以选择使用包括OPTIC[11]、POPF[12]和TFD[13]等规划器,另一种是Planning Editor[14]项目的在线规划器接口。两种方案可以求解多个版本的PDDL文件,为开发者获得图形化PDDL问题模型的求解结果提供了支持。
前端界面包括功能教学页面、问题模型编辑页面、域模型编辑页面和ROS交互页面等。前端与编译系统关联的功能如图3所示,包括:编辑思维导图生成PDDL域模型和问题模型;转换思维导图为文本形式的PDDL;解析用户上传的PDDL文件为思维导图;解析ChatGPT[15]返回的PDDL数据为思维导图;将规划结果解析为话题消息发送到ROS系统等。
图3 前端ROS USE页面
为了减少用户的编辑时间,系统设计结合了ChatGPT模型,用户可以通过自然语言描述PDDL模型关键内容,编译系统会将ChatGPT的返回内容转为思维导图表示的PDDL,功能展示如图4所示。
图4 ChatGPT使用页面
根据上述功能需求,编译系统的数据输入可以分为3类,包括思维导图表示的图形化PDDL数据、ChatGPT模型生成或用户直接上传的PDDL文本数据以及通过规划求解器得到的规划结果。编译系统针对这3类数据,分别设计了相应的编译模块,其中思维导图数据对应的jsMind编译模块和PDDL数据对应的PDDL编译模块将在4章节讲述,规划结果话题消息对应的ROS应用模块将在5章节讲述。
编译系统使用的jsMind数据格式是node_tree,数据格式如下所示:
node:{
可以看到,node_tree中的数据采用树形结构进行组织,其中topic值代表节点显示在思维导图中的内容,children值代表子节点列表,可以嵌套任意深度。node_tree通过这两对键值,可以准确地描述思维导图中节点的内容与亲属关系。而PDDL的语言文法是基于LISP的S表达式语法[16],其特点是可以使用括号来表示嵌套结构。通过括号的嵌套使用,形成不断延申的树状结构,从而可以表示复杂的数据关系。从图3左下方的PDDL域模型文件示例中,可以看到通过括号嵌套的方式,PDDL表现出明显的层级关系。
通过观察两者的数据格式可以得出结论,PDDL和jsMind在数据内容上具有相同的嵌套结构,PDDL的括号对应于jsMind的children,括号中的内容则对应于jsMind的topic值。两种语法格式的语义对应关系表明,jsMind与PDDL可以实现语义上的等价转换。
系统的编译流程主要包括两个模块。分别是jsMind编译模块和PDDL编译模块。jsMind编译模块的功能是将用户在前端编辑的思维导图编译为PDDL文本;PDDL编译模块的功能是将ChatGPT生成或用户上传的PDDL文本编译为jsMind数据。
4.2.1 jsMind编译模块
jsMind数据的编译流程如图5(左)所示。
图5 编译流程
首先进行词法分析,任务是解析jsMind的node_tree格式数据,将每个节点的层级结构信息提取出来。根据topic键值和children键值划分token,去掉其它无用字符,生成token流。
之后进行语法分析,首先根据PDDL的语言文法设计相应的PDDL数据存储结构。如针对谓词、初始状态和动作等结构,根据其语法规则来定制对应的数据结构。下面是对动作结构进行定义的示例:
之后对词法分析器生成的token流进行分析,并将token流按照数据类别补充到相应的数据结构中,从而生成AST。
之后生成中间表示,其结构是节点属性为键值对的属性树。该步骤将优化后的AST按照PDDL的不同属性提取数据到定义的属性树中。
最后生成PDDL文件,系统根据生成的中间表示,将数据按照PDDL文法组合在一起,生成PDDL数据存储到临时文件中。之后系统取出临时文件内容并嵌入HTML标签,使数据返回到前端后可以高亮显示。
4.2.2 PDDL数据编译模块
PDDL数据的编译流程如图5(右)所示。
首先使用正则表达式构造词法分析器。过滤掉空格、注释和其它无用的字符。生成token流。
接着进行语法分析,主要是将词法分析器输出的token流,转化为特定的语法结构。系统使用递归下降分析法构建语法分析器。语法分析器会对多个PDDL版本中的多个语法结构进行识别和处理。
之后进行语义分析,主要任务是对程序进行合法性检查。确定输入数据符合语言规范和语义约束,并进行相应的语义处理。我们根据PDDL不同特性文法,做了语义分析处理。同时在处理过程中对PDDL的每个语法结构都进行了大量的错误判断处理,设计了共计28种错误反馈。
在语法语义分析之后是AST扩展阶段,系统需要对产生的AST进行扩展,根据requirement导入的PDDL模块,在生成的AST中添加对应键值。例如requirement 可以导入PDDL3版本特性:preference,其表示在问题模型中,可以使用软目标定义。使用preference需要在模型文件中使用同名关键词。根据这些特殊requirement是否存在于域模型的requirements列表中,来判断是否在AST中添加相应的键值,最终生成一个包含所有关键信息的AST。
最后是生成jsMind,系统将扩展的AST在后端针对jsMind语法做了补充、优化和简化,组合其中的数据,并最终生成jsMind返回到前端以思维导图的形式展示。
在机器人的任务规划中,开发者可以将机器人的已知信息包括机器人获取的传感器信息和可使用的动作信息等通过PDDL的域模型进行描述,之后在问题模型中定义机器人的任务目标,再通过规划求解获得机器人执行任务的最佳动作序列,以满足目标条件并最小化某些指标(如时间、资源消耗等)。
然而,当前机器人开发调度与PDDL的编辑规划通常是独立进行的,这导致两者之间的信息交流依赖于开发人员的观察与操作。开发人员在获得规划结果后,在ROS系统中构建行为树[17]或状态机来执行任务,开发效率较低。
为更好的将图形化PDDL应用在机器人开发领域中,系统设计了ROS应用模块,旨在与当前流行的ROS系统结合。节点是ROS的基本执行单元,节点之间通过发布和订阅话题进行通信。ROS应用模块的功能是创建节点,将规划结果转为话题并持续发布出去,供动作节点订阅以使机器人能够按照规划结果进行运动。
开发者可以在ROS交互页面中使用自然语言描述机器人的任务场景和目标,系统通过ChatGPT生成PDDL并转为思维导图形式,开发者在调整PDDL内容后可以进行规划求解,在规划成功后,返回的规划结果会被转为相应格式的话题消息,实验中机器人运动的话题格式如下所示:
time start_time
string action_name
string[] action_params //动作参数
duration duration_time //持续时间
ROS应用模块的具体流程可分为以下3步:
(1)是根据规划结果的输出样式构建正则表达式,获取规划结果中包含有效内容的部分,去除包括调用IP、耗费时间和运行状态等无用字符,得到相应的token流,获得的内容见表1,主要包括动作开始时间、动作序列(动作名和参数)和动作持续时间。
表1 OPTIC规划器求解结果
(2)是对token 流进行语法分析,将解析出的规划结果按照特定结构转为话题的中间数据,下面是针对实验话题格式设定的中间数据结构:
(3)则是将数据转为话题。这是一个简单的映射过程,将生成的中间表示数据,根据语义对应关系转化为话题数据,并且进行合法性检验,包括参数类型和格式等。确保输出匹配的话题数据。
最后将话题以多线程的方式发布到ROS网络中,确保ROS话题的发布不会影响到编译系统其它功能的使用。
实验分为两部分:第一部分测试Graph Compiler对于多版本PDDL数据和jsMind数据的编译能力;第二部分是验证Graph Compiler应用在ROS项目中的实际效果。
IPC比赛为智能规划领域提供了广泛使用的基准。我们使用Assembly、Gripper和Blocks等IPC比赛中的经典测试用例,来测试Graph Compiler在编译多版本PDDL数据方面的表现(PDDL+的版本用例来自于PDDL wiki[18])。此外在Graph Compiler测试中,我们针对每一个测试用例都随机挑选一个PDDL模型文件并使用jsMind思维导图来表示,测试该模型文件是否能够如图3所示被顺利的编译为PDDL数据,测试结果见表2。
表2 PDDL用例编译测试(√表示成功编译,×表示无法编译)
测试结果表明,Graph Compiler相较于Fase Downward和PDDL.jl而言,支持编译更多的PDDL版本,且编译成功率达到100%;也可以将用户编辑的jsMind思维导图正确编译为PDDL格式数据。满足了在线编辑工具的功能需求。
我们使用中科院软件所博物馆导览项目[19]作为ROS应用实验的场景,测试从自然语言输入到机器人调度的半自动流程。
首先开发者在ROS USE界面中使用图4所示的自然语言建模,得到域模型和问题模型。域模型建模输入的prompt如下:”我需要一个domain.pddl,内容如下:包括两个类型:waypoint和robot,3个谓词:at代表机器人在路径点上、worked代表机器人在这个路径点巡视过和not_worked代表机器人并没有在这个路径点巡视,以及两个动作:move和work。”。系统会调用ChatGPT接口并根据prompt生成对应的域模型数据,并以思维导图的形式在聊天框下方显示。问题模型同样由自然语言输入生成,内容包括定义5个路径点,按照目标顺序依次移动到5个路径点并在路径点上巡视一段时间等,生成内容如下所示:
(define (problem navigation_waypoint_demo)
wa wb wc wd we-waypoint //定义5个路径点
init-waypoint
robot-robot)
(robot_on robot init)
(not_worked wa) //5个点都还未巡视
(not_worked wb)
(not_worked wc)
(not_worked wd)
(not_worked we))
(and
(worked we)
(worked wd)
(worked wc)
(worked wb)
(worked wa)))) //5个路径点都已完成巡视
通过ROS交互模块,将规划结果转换为ROS话题,并发布到ROS话题网络中,之后在机器人的运动节点中订阅该话题,并根据规划结果设计并发布相应的动作指令,使导览机器人按照表1中的规划结果移动和工作。机器人实验的部分画面如图6~图7所示,可以看到机器人正在按照规划结果给出的移动和巡视顺序在完成任务。
图6 小车在PDDL指导下完成巡航任务(1)
图7 小车在PDDL指导下完成巡航任务(2)
实验结果表明,我们成功将Graph Compiler应用在ROS项目中,完成了通过图形化PDDL指导机器人任务规划的目标。
为满足图形化PDDL编辑的功能需求,本文基于领域专用编译技术设计了一个图形化PDDL编译系统。通过词法分析、语法分析、语义分析和AST优化扩展等方法,设计了对文本PDDL和思维导图表示的图形化PDDL的编译模块,具有优秀的版本兼容性和编译正确性。并基于ROS节点之间的通信机制设计了ROS应用模块,可以将规划结果以话题的消息格式发布出去,用于指导机器人的任务规划。
在后续工作中,将继续探索Graph Compiler的规划应用,完善从自然语言输入到PDDL生成再到ROS机器人运动的自动化流程,并通过实现一个图形化PDDL专用规划器来进一步提高系统的运行效率。