張忠坤,林泓宇,譚智元,邢明杰,武延軍1,+
(1.南京中醫(yī)藥大學(xué) 人工智能與信息技術(shù)學(xué)院,江蘇 南京 210023;2.中科南京軟件技術(shù)研究院智能軟件研究中心,江蘇 南京 210000;3.中國科學(xué)院軟件研究所 智能軟件研究中心,北京 100190;4.中國科學(xué)院大學(xué) 計算機(jī)科學(xué)與技術(shù)學(xué)院,北京 100190)
智能規(guī)劃[1]是人工智能系統(tǒng)實現(xiàn)智能決策和行動的必要組成部分之一。其中規(guī)劃領(lǐng)域定義語言(planning domain definition language,PDDL)[2]是智能規(guī)劃社區(qū)中廣泛使用的一種領(lǐng)域描述語言,具有形式化、標(biāo)準(zhǔn)化等特點。PDDL語義的實現(xiàn)與特定的功能設(shè)計和語法支持密切相關(guān),開發(fā)者需要針對功能需求來設(shè)計專用編譯系統(tǒng)以實現(xiàn)并優(yōu)化相關(guān)系統(tǒng)運(yùn)行的性能。比如Fast Downward[3]的編譯系統(tǒng)是針對其規(guī)劃任務(wù)的優(yōu)化而設(shè)計,流程包括PDDL的詞法分析、語法分析、格式轉(zhuǎn)換和問題建模等。而PDDL.jl[4]的編譯系統(tǒng)是將PDDL解析為Julia數(shù)據(jù)結(jié)構(gòu),以便用戶可以通過Julia語言來操作和處理PDDL數(shù)據(jù)。此前我們對PDDL的集成開發(fā)環(huán)境如MyPDDL[5]和PDDLStudio[6]等存在的版本特性支持不完善、文本編輯困難和缺少應(yīng)用指導(dǎo)等問題,設(shè)計了一個圖形化PDDL在線編輯網(wǎng)站來幫助開發(fā)者提高PDDL的編寫效率(https://graphplan ner.isrc.ac.cn)。網(wǎng)站通過jsMind[7]思維導(dǎo)圖作為圖形化PDDL代替文本PDDL來提高開發(fā)的效率,并能夠解析用戶上傳的思維導(dǎo)圖和PDDL文件,還為用戶提供了在機(jī)器人操作系統(tǒng)(robot operating system,ROS)[8]環(huán)境下的應(yīng)用指導(dǎo)。為此本文設(shè)計了專用編譯系統(tǒng)Graph Compiler,其不僅支持編譯jsMind思維導(dǎo)圖,也支持對多版本PDDL文件的編譯,還可以將規(guī)劃結(jié)果轉(zhuǎn)換為ROS機(jī)器人具體行動的動作序列信息。對多屆國際規(guī)劃競賽(international planning competition,IPC)[9]的PDDL用例的實驗結(jié)果表明,Graph Compiler能夠正確編譯測試集上的所有用例。此外,我們對圖形化PDDL語言指導(dǎo)機(jī)器人任務(wù)規(guī)劃做了實驗,將Graph Compiler應(yīng)用到ROS工程中,拓展了它的應(yīng)用空間。
PDDL語言結(jié)構(gòu)一般如圖1所示,分為域模型(domain)和問題模型(problem)。
圖1 常見PDDL文件結(jié)構(gòu)關(guān)系
域模型包括Types、Fluents和Action Schemata等結(jié)構(gòu)。
Types指定了在域模型和問題模型中定義變量時可以使用的所有類型。Fluents包括謂詞和函數(shù),它有n個對象參數(shù),F(xiàn)luents描述這些參數(shù)之間的某種屬性和關(guān)系。Action Schemata是一個動作列表,其中每個Action都是一個元組,包含Parameters、Precondition和Effect。Parameters充當(dāng)具體操作時所操作對象的占位符。Precondition是一組邏輯公式,指定了動作發(fā)生需要滿足的屬性條件或邏輯關(guān)系。Effect也是一組邏輯公式,指定了動作發(fā)生后,改變了哪些屬性條件或邏輯關(guān)系。
問題模型包括Domain(域模型)、Init State和Goal State。Init State定義了問題模型中的所有對象及其對應(yīng)的初始狀態(tài),而Goal State則是當(dāng)問題解決時模型中的對象應(yīng)處于的狀態(tài)。初始狀態(tài)和目標(biāo)狀態(tài)都被指定為一組邏輯公式。
編譯系統(tǒng)的運(yùn)行架構(gòu)如圖2所示,用戶在前端中產(chǎn)生的PDDL數(shù)據(jù)、jsMind數(shù)據(jù)和規(guī)劃結(jié)果數(shù)據(jù),在前端經(jīng)過簡單的語法檢查后,被傳到后端的編譯系統(tǒng)中。編譯系統(tǒng)將輸入數(shù)據(jù)傳到對應(yīng)的編譯模塊,包括PDDL編譯模塊、jsMind編譯模塊和ROS應(yīng)用模塊。如果PDDL或jsMind編譯成功,系統(tǒng)會將生成的目標(biāo)代碼存儲到臨時文件中并返回到前端展示,否則返回給前端錯誤原因;規(guī)劃結(jié)果則通過ROS交互模塊被轉(zhuǎn)為ROS話題消息,通過話題發(fā)送節(jié)點持續(xù)發(fā)布,可以被動作節(jié)點訂閱,進(jìn)而用于指導(dǎo)機(jī)器人的任務(wù)規(guī)劃。
圖2 編譯系統(tǒng)運(yùn)行架構(gòu)
輸出到臨時文件中保存的PDDL問題模型文件可以被系統(tǒng)集成的規(guī)劃器求解。系統(tǒng)提供兩種規(guī)劃求解方案,一種是planutils[10]項目的本地規(guī)劃器接口,可以選擇使用包括OPTIC[11]、POPF[12]和TFD[13]等規(guī)劃器,另一種是Planning Editor[14]項目的在線規(guī)劃器接口。兩種方案可以求解多個版本的PDDL文件,為開發(fā)者獲得圖形化PDDL問題模型的求解結(jié)果提供了支持。
前端界面包括功能教學(xué)頁面、問題模型編輯頁面、域模型編輯頁面和ROS交互頁面等。前端與編譯系統(tǒng)關(guān)聯(lián)的功能如圖3所示,包括:編輯思維導(dǎo)圖生成PDDL域模型和問題模型;轉(zhuǎn)換思維導(dǎo)圖為文本形式的PDDL;解析用戶上傳的PDDL文件為思維導(dǎo)圖;解析ChatGPT[15]返回的PDDL數(shù)據(jù)為思維導(dǎo)圖;將規(guī)劃結(jié)果解析為話題消息發(fā)送到ROS系統(tǒng)等。
圖3 前端ROS USE頁面
為了減少用戶的編輯時間,系統(tǒng)設(shè)計結(jié)合了ChatGPT模型,用戶可以通過自然語言描述PDDL模型關(guān)鍵內(nèi)容,編譯系統(tǒng)會將ChatGPT的返回內(nèi)容轉(zhuǎn)為思維導(dǎo)圖表示的PDDL,功能展示如圖4所示。
圖4 ChatGPT使用頁面
根據(jù)上述功能需求,編譯系統(tǒng)的數(shù)據(jù)輸入可以分為3類,包括思維導(dǎo)圖表示的圖形化PDDL數(shù)據(jù)、ChatGPT模型生成或用戶直接上傳的PDDL文本數(shù)據(jù)以及通過規(guī)劃求解器得到的規(guī)劃結(jié)果。編譯系統(tǒng)針對這3類數(shù)據(jù),分別設(shè)計了相應(yīng)的編譯模塊,其中思維導(dǎo)圖數(shù)據(jù)對應(yīng)的jsMind編譯模塊和PDDL數(shù)據(jù)對應(yīng)的PDDL編譯模塊將在4章節(jié)講述,規(guī)劃結(jié)果話題消息對應(yīng)的ROS應(yīng)用模塊將在5章節(jié)講述。
編譯系統(tǒng)使用的jsMind數(shù)據(jù)格式是node_tree,數(shù)據(jù)格式如下所示:
node:{
可以看到,node_tree中的數(shù)據(jù)采用樹形結(jié)構(gòu)進(jìn)行組織,其中topic值代表節(jié)點顯示在思維導(dǎo)圖中的內(nèi)容,children值代表子節(jié)點列表,可以嵌套任意深度。node_tree通過這兩對鍵值,可以準(zhǔn)確地描述思維導(dǎo)圖中節(jié)點的內(nèi)容與親屬關(guān)系。而PDDL的語言文法是基于LISP的S表達(dá)式語法[16],其特點是可以使用括號來表示嵌套結(jié)構(gòu)。通過括號的嵌套使用,形成不斷延申的樹狀結(jié)構(gòu),從而可以表示復(fù)雜的數(shù)據(jù)關(guān)系。從圖3左下方的PDDL域模型文件示例中,可以看到通過括號嵌套的方式,PDDL表現(xiàn)出明顯的層級關(guān)系。
通過觀察兩者的數(shù)據(jù)格式可以得出結(jié)論,PDDL和jsMind在數(shù)據(jù)內(nèi)容上具有相同的嵌套結(jié)構(gòu),PDDL的括號對應(yīng)于jsMind的children,括號中的內(nèi)容則對應(yīng)于jsMind的topic值。兩種語法格式的語義對應(yīng)關(guān)系表明,jsMind與PDDL可以實現(xiàn)語義上的等價轉(zhuǎn)換。
系統(tǒng)的編譯流程主要包括兩個模塊。分別是jsMind編譯模塊和PDDL編譯模塊。jsMind編譯模塊的功能是將用戶在前端編輯的思維導(dǎo)圖編譯為PDDL文本;PDDL編譯模塊的功能是將ChatGPT生成或用戶上傳的PDDL文本編譯為jsMind數(shù)據(jù)。
4.2.1 jsMind編譯模塊
jsMind數(shù)據(jù)的編譯流程如圖5(左)所示。
圖5 編譯流程
首先進(jìn)行詞法分析,任務(wù)是解析jsMind的node_tree格式數(shù)據(jù),將每個節(jié)點的層級結(jié)構(gòu)信息提取出來。根據(jù)topic鍵值和children鍵值劃分token,去掉其它無用字符,生成token流。
之后進(jìn)行語法分析,首先根據(jù)PDDL的語言文法設(shè)計相應(yīng)的PDDL數(shù)據(jù)存儲結(jié)構(gòu)。如針對謂詞、初始狀態(tài)和動作等結(jié)構(gòu),根據(jù)其語法規(guī)則來定制對應(yīng)的數(shù)據(jù)結(jié)構(gòu)。下面是對動作結(jié)構(gòu)進(jìn)行定義的示例:
之后對詞法分析器生成的token流進(jìn)行分析,并將token流按照數(shù)據(jù)類別補(bǔ)充到相應(yīng)的數(shù)據(jù)結(jié)構(gòu)中,從而生成AST。
之后生成中間表示,其結(jié)構(gòu)是節(jié)點屬性為鍵值對的屬性樹。該步驟將優(yōu)化后的AST按照PDDL的不同屬性提取數(shù)據(jù)到定義的屬性樹中。
最后生成PDDL文件,系統(tǒng)根據(jù)生成的中間表示,將數(shù)據(jù)按照PDDL文法組合在一起,生成PDDL數(shù)據(jù)存儲到臨時文件中。之后系統(tǒng)取出臨時文件內(nèi)容并嵌入HTML標(biāo)簽,使數(shù)據(jù)返回到前端后可以高亮顯示。
4.2.2 PDDL數(shù)據(jù)編譯模塊
PDDL數(shù)據(jù)的編譯流程如圖5(右)所示。
首先使用正則表達(dá)式構(gòu)造詞法分析器。過濾掉空格、注釋和其它無用的字符。生成token流。
接著進(jìn)行語法分析,主要是將詞法分析器輸出的token流,轉(zhuǎn)化為特定的語法結(jié)構(gòu)。系統(tǒng)使用遞歸下降分析法構(gòu)建語法分析器。語法分析器會對多個PDDL版本中的多個語法結(jié)構(gòu)進(jìn)行識別和處理。
之后進(jìn)行語義分析,主要任務(wù)是對程序進(jìn)行合法性檢查。確定輸入數(shù)據(jù)符合語言規(guī)范和語義約束,并進(jìn)行相應(yīng)的語義處理。我們根據(jù)PDDL不同特性文法,做了語義分析處理。同時在處理過程中對PDDL的每個語法結(jié)構(gòu)都進(jìn)行了大量的錯誤判斷處理,設(shè)計了共計28種錯誤反饋。
在語法語義分析之后是AST擴(kuò)展階段,系統(tǒng)需要對產(chǎn)生的AST進(jìn)行擴(kuò)展,根據(jù)requirement導(dǎo)入的PDDL模塊,在生成的AST中添加對應(yīng)鍵值。例如requirement 可以導(dǎo)入PDDL3版本特性:preference,其表示在問題模型中,可以使用軟目標(biāo)定義。使用preference需要在模型文件中使用同名關(guān)鍵詞。根據(jù)這些特殊requirement是否存在于域模型的requirements列表中,來判斷是否在AST中添加相應(yīng)的鍵值,最終生成一個包含所有關(guān)鍵信息的AST。
最后是生成jsMind,系統(tǒng)將擴(kuò)展的AST在后端針對jsMind語法做了補(bǔ)充、優(yōu)化和簡化,組合其中的數(shù)據(jù),并最終生成jsMind返回到前端以思維導(dǎo)圖的形式展示。
在機(jī)器人的任務(wù)規(guī)劃中,開發(fā)者可以將機(jī)器人的已知信息包括機(jī)器人獲取的傳感器信息和可使用的動作信息等通過PDDL的域模型進(jìn)行描述,之后在問題模型中定義機(jī)器人的任務(wù)目標(biāo),再通過規(guī)劃求解獲得機(jī)器人執(zhí)行任務(wù)的最佳動作序列,以滿足目標(biāo)條件并最小化某些指標(biāo)(如時間、資源消耗等)。
然而,當(dāng)前機(jī)器人開發(fā)調(diào)度與PDDL的編輯規(guī)劃通常是獨(dú)立進(jìn)行的,這導(dǎo)致兩者之間的信息交流依賴于開發(fā)人員的觀察與操作。開發(fā)人員在獲得規(guī)劃結(jié)果后,在ROS系統(tǒng)中構(gòu)建行為樹[17]或狀態(tài)機(jī)來執(zhí)行任務(wù),開發(fā)效率較低。
為更好的將圖形化PDDL應(yīng)用在機(jī)器人開發(fā)領(lǐng)域中,系統(tǒng)設(shè)計了ROS應(yīng)用模塊,旨在與當(dāng)前流行的ROS系統(tǒng)結(jié)合。節(jié)點是ROS的基本執(zhí)行單元,節(jié)點之間通過發(fā)布和訂閱話題進(jìn)行通信。ROS應(yīng)用模塊的功能是創(chuàng)建節(jié)點,將規(guī)劃結(jié)果轉(zhuǎn)為話題并持續(xù)發(fā)布出去,供動作節(jié)點訂閱以使機(jī)器人能夠按照規(guī)劃結(jié)果進(jìn)行運(yùn)動。
開發(fā)者可以在ROS交互頁面中使用自然語言描述機(jī)器人的任務(wù)場景和目標(biāo),系統(tǒng)通過ChatGPT生成PDDL并轉(zhuǎn)為思維導(dǎo)圖形式,開發(fā)者在調(diào)整PDDL內(nèi)容后可以進(jìn)行規(guī)劃求解,在規(guī)劃成功后,返回的規(guī)劃結(jié)果會被轉(zhuǎn)為相應(yīng)格式的話題消息,實驗中機(jī)器人運(yùn)動的話題格式如下所示:
time start_time
string action_name
string[] action_params //動作參數(shù)
duration duration_time //持續(xù)時間
ROS應(yīng)用模塊的具體流程可分為以下3步:
(1)是根據(jù)規(guī)劃結(jié)果的輸出樣式構(gòu)建正則表達(dá)式,獲取規(guī)劃結(jié)果中包含有效內(nèi)容的部分,去除包括調(diào)用IP、耗費(fèi)時間和運(yùn)行狀態(tài)等無用字符,得到相應(yīng)的token流,獲得的內(nèi)容見表1,主要包括動作開始時間、動作序列(動作名和參數(shù))和動作持續(xù)時間。
表1 OPTIC規(guī)劃器求解結(jié)果
(2)是對token 流進(jìn)行語法分析,將解析出的規(guī)劃結(jié)果按照特定結(jié)構(gòu)轉(zhuǎn)為話題的中間數(shù)據(jù),下面是針對實驗話題格式設(shè)定的中間數(shù)據(jù)結(jié)構(gòu):
(3)則是將數(shù)據(jù)轉(zhuǎn)為話題。這是一個簡單的映射過程,將生成的中間表示數(shù)據(jù),根據(jù)語義對應(yīng)關(guān)系轉(zhuǎn)化為話題數(shù)據(jù),并且進(jìn)行合法性檢驗,包括參數(shù)類型和格式等。確保輸出匹配的話題數(shù)據(jù)。
最后將話題以多線程的方式發(fā)布到ROS網(wǎng)絡(luò)中,確保ROS話題的發(fā)布不會影響到編譯系統(tǒng)其它功能的使用。
實驗分為兩部分:第一部分測試Graph Compiler對于多版本PDDL數(shù)據(jù)和jsMind數(shù)據(jù)的編譯能力;第二部分是驗證Graph Compiler應(yīng)用在ROS項目中的實際效果。
IPC比賽為智能規(guī)劃領(lǐng)域提供了廣泛使用的基準(zhǔn)。我們使用Assembly、Gripper和Blocks等IPC比賽中的經(jīng)典測試用例,來測試Graph Compiler在編譯多版本PDDL數(shù)據(jù)方面的表現(xiàn)(PDDL+的版本用例來自于PDDL wiki[18])。此外在Graph Compiler測試中,我們針對每一個測試用例都隨機(jī)挑選一個PDDL模型文件并使用jsMind思維導(dǎo)圖來表示,測試該模型文件是否能夠如圖3所示被順利的編譯為PDDL數(shù)據(jù),測試結(jié)果見表2。
表2 PDDL用例編譯測試(√表示成功編譯,×表示無法編譯)
測試結(jié)果表明,Graph Compiler相較于Fase Downward和PDDL.jl而言,支持編譯更多的PDDL版本,且編譯成功率達(dá)到100%;也可以將用戶編輯的jsMind思維導(dǎo)圖正確編譯為PDDL格式數(shù)據(jù)。滿足了在線編輯工具的功能需求。
我們使用中科院軟件所博物館導(dǎo)覽項目[19]作為ROS應(yīng)用實驗的場景,測試從自然語言輸入到機(jī)器人調(diào)度的半自動流程。
首先開發(fā)者在ROS USE界面中使用圖4所示的自然語言建模,得到域模型和問題模型。域模型建模輸入的prompt如下:”我需要一個domain.pddl,內(nèi)容如下:包括兩個類型:waypoint和robot,3個謂詞:at代表機(jī)器人在路徑點上、worked代表機(jī)器人在這個路徑點巡視過和not_worked代表機(jī)器人并沒有在這個路徑點巡視,以及兩個動作:move和work?!?。系統(tǒng)會調(diào)用ChatGPT接口并根據(jù)prompt生成對應(yīng)的域模型數(shù)據(jù),并以思維導(dǎo)圖的形式在聊天框下方顯示。問題模型同樣由自然語言輸入生成,內(nèi)容包括定義5個路徑點,按照目標(biāo)順序依次移動到5個路徑點并在路徑點上巡視一段時間等,生成內(nèi)容如下所示:
(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交互模塊,將規(guī)劃結(jié)果轉(zhuǎn)換為ROS話題,并發(fā)布到ROS話題網(wǎng)絡(luò)中,之后在機(jī)器人的運(yùn)動節(jié)點中訂閱該話題,并根據(jù)規(guī)劃結(jié)果設(shè)計并發(fā)布相應(yīng)的動作指令,使導(dǎo)覽機(jī)器人按照表1中的規(guī)劃結(jié)果移動和工作。機(jī)器人實驗的部分畫面如圖6~圖7所示,可以看到機(jī)器人正在按照規(guī)劃結(jié)果給出的移動和巡視順序在完成任務(wù)。
圖6 小車在PDDL指導(dǎo)下完成巡航任務(wù)(1)
圖7 小車在PDDL指導(dǎo)下完成巡航任務(wù)(2)
實驗結(jié)果表明,我們成功將Graph Compiler應(yīng)用在ROS項目中,完成了通過圖形化PDDL指導(dǎo)機(jī)器人任務(wù)規(guī)劃的目標(biāo)。
為滿足圖形化PDDL編輯的功能需求,本文基于領(lǐng)域?qū)S镁幾g技術(shù)設(shè)計了一個圖形化PDDL編譯系統(tǒng)。通過詞法分析、語法分析、語義分析和AST優(yōu)化擴(kuò)展等方法,設(shè)計了對文本PDDL和思維導(dǎo)圖表示的圖形化PDDL的編譯模塊,具有優(yōu)秀的版本兼容性和編譯正確性。并基于ROS節(jié)點之間的通信機(jī)制設(shè)計了ROS應(yīng)用模塊,可以將規(guī)劃結(jié)果以話題的消息格式發(fā)布出去,用于指導(dǎo)機(jī)器人的任務(wù)規(guī)劃。
在后續(xù)工作中,將繼續(xù)探索Graph Compiler的規(guī)劃應(yīng)用,完善從自然語言輸入到PDDL生成再到ROS機(jī)器人運(yùn)動的自動化流程,并通過實現(xiàn)一個圖形化PDDL專用規(guī)劃器來進(jìn)一步提高系統(tǒng)的運(yùn)行效率。