Merge branch 'main' of github.com:HPCL-EI/RoboWaiter
|
@ -0,0 +1,230 @@
|
|||
import random
|
||||
import numpy as np
|
||||
import copy
|
||||
import time
|
||||
|
||||
from OptimalBTExpansionAlgorithm_single_goal import ControlBT,Leaf,generate_random_state,Action,state_transition,conflict
|
||||
import re
|
||||
|
||||
|
||||
# 本文所提出的完备规划算法
|
||||
class BTExpAlgorithm:
|
||||
def __init__(self,verbose=False):
|
||||
self.bt = None
|
||||
self.nodes = []
|
||||
self.traversed = []
|
||||
self.conditions = []
|
||||
self.conditions_index = []
|
||||
self.verbose = verbose
|
||||
# print (self.conditions_list[0])
|
||||
|
||||
def clear(self):
|
||||
self.bt = None
|
||||
self.nodes = []
|
||||
self.traversed = []
|
||||
self.conditions = []
|
||||
self.conditions_index = []
|
||||
|
||||
def run_algorithm_selTree(self, start, goal, actions):
|
||||
# 初始行为树只包含目标条件
|
||||
bt = ControlBT(type='cond')
|
||||
g_node = Leaf(type='cond', content=goal,mincost=0)
|
||||
bt.add_child([g_node])
|
||||
|
||||
self.conditions.append(goal)
|
||||
self.nodes.append(g_node) # condition node list
|
||||
# 尝试在初始状态执行行为树
|
||||
val, obj = bt.tick(start)
|
||||
canrun = False
|
||||
if val == 'success' or val == 'running':
|
||||
canrun = True
|
||||
# 循环扩展,直到行为树能够在初始状态运行
|
||||
while not canrun:
|
||||
index = -1
|
||||
for i in range(0, len(self.nodes)):
|
||||
if self.nodes[i].content in self.traversed:
|
||||
continue
|
||||
else:
|
||||
c_node = self.nodes[i]
|
||||
index = i
|
||||
break
|
||||
if index == -1: # 树中结点扩展完毕,仍无法运行行为树,返回失败
|
||||
print('Failure')
|
||||
return False
|
||||
# 根据所选择条件结点扩展子树
|
||||
subtree = ControlBT(type='?')
|
||||
subtree.add_child([copy.deepcopy(c_node)]) # 子树首先保留所扩展结点
|
||||
c = c_node.content # 子树所扩展结点对应的条件(一个文字的set)
|
||||
|
||||
for i in range(0, len(actions)): # 选择符合条件的行动,
|
||||
# print("have action")
|
||||
if not c & ((actions[i].pre | actions[i].add) - actions[i].del_set) <= set():
|
||||
# print ("pass add")
|
||||
if (c - actions[i].del_set) == c:
|
||||
# print("pass delete")
|
||||
c_attr = (actions[i].pre | c) - actions[i].add
|
||||
valid = True
|
||||
|
||||
# 这样剪枝存在错误性
|
||||
# if conflict(c_attr):
|
||||
# continue
|
||||
|
||||
for j in self.traversed: # 剪枝操作
|
||||
if j <= c_attr:
|
||||
valid = False
|
||||
break
|
||||
|
||||
if valid:
|
||||
# print("pass prune")
|
||||
# 构建行动的顺序结构
|
||||
sequence_structure = ControlBT(type='>')
|
||||
c_attr_node = Leaf(type='cond', content=c_attr, mincost=0)
|
||||
a_node = Leaf(type='act', content=actions[i], mincost=0)
|
||||
sequence_structure.add_child([c_attr_node, a_node])
|
||||
# 将顺序结构添加到子树
|
||||
subtree.add_child([sequence_structure])
|
||||
|
||||
self.nodes.append(c_attr_node)
|
||||
# 将原条件结点c_node替换为扩展后子树subtree
|
||||
parent_of_c = c_node.parent
|
||||
parent_of_c.children[0] = subtree
|
||||
# 记录已扩展条件
|
||||
self.traversed.append(c)
|
||||
# 尝试在初始状态运行行为树
|
||||
val, obj = bt.tick(start)
|
||||
canrun = False
|
||||
if val == 'success' or val == 'running':
|
||||
canrun = True
|
||||
return bt
|
||||
|
||||
|
||||
def run_algorithm_test(self, start, goal, actions):
|
||||
self.bt = self.run_algorithm_selTree(start, goal, actions)
|
||||
return True
|
||||
|
||||
|
||||
|
||||
def run_algorithm(self, start, goal, actions):
|
||||
# goal_ls = goal.replace(" ", "")
|
||||
# goal_ls = goal_ls.split("|")
|
||||
self.bt = ControlBT(type='cond')
|
||||
subtree = ControlBT(type='?')
|
||||
if len(goal) > 1:
|
||||
for g in goal:
|
||||
print("goal",g)
|
||||
bt_sel_tree = self.run_algorithm_selTree(start, g, actions)
|
||||
print("bt_sel_tree.children",bt_sel_tree.children)
|
||||
# print(bt_sel_tree.children[0])
|
||||
subtree.add_child([copy.deepcopy(bt_sel_tree.children[0])])
|
||||
self.bt.add_child([subtree])
|
||||
else:
|
||||
self.bt = self.run_algorithm_selTree(start, goal[0], actions)
|
||||
return True
|
||||
|
||||
|
||||
def print_solution(self):
|
||||
print("========= XiaoCaoBT ==========") # 树的bfs遍历
|
||||
nodes_ls = []
|
||||
nodes_ls.append(self.bt)
|
||||
while len(nodes_ls) != 0:
|
||||
parnode = nodes_ls[0]
|
||||
print("Parrent:", parnode.type)
|
||||
for child in parnode.children:
|
||||
if isinstance(child, Leaf):
|
||||
print("---- Leaf:", child.content)
|
||||
elif isinstance(child, ControlBT):
|
||||
print("---- ControlBT:", child.type)
|
||||
nodes_ls.append(child)
|
||||
print()
|
||||
nodes_ls.pop(0)
|
||||
print("========= XiaoCaoBT ==========\n")
|
||||
|
||||
|
||||
def dfs_ptml_many_act(self, parnode, is_root=False):
|
||||
for child in parnode.children:
|
||||
if isinstance(child, Leaf):
|
||||
if child.type == 'cond':
|
||||
|
||||
if is_root and len(child.content) > 1:
|
||||
# 把多个 cond 串起来
|
||||
self.ptml_string += "sequence{\n"
|
||||
self.ptml_string += "cond "
|
||||
c_set_str = '\n cond '.join(map(str, child.content)) + "\n"
|
||||
self.ptml_string += c_set_str
|
||||
self.ptml_string += '}\n'
|
||||
else:
|
||||
self.ptml_string += "cond "
|
||||
c_set_str = '\n cond '.join(map(str, child.content)) + "\n"
|
||||
self.ptml_string += c_set_str
|
||||
|
||||
elif child.type == 'act':
|
||||
|
||||
child.content.name = re.sub(r'\d+', '', child.content.name)
|
||||
|
||||
if '(' not in child.content.name:
|
||||
self.ptml_string += 'act ' + child.content.name + "()\n"
|
||||
else:
|
||||
self.ptml_string += 'act ' + child.content.name + "\n"
|
||||
elif isinstance(child, ControlBT):
|
||||
if child.type == '?':
|
||||
self.ptml_string += "selector{\n"
|
||||
self.dfs_ptml_many_act(parnode=child)
|
||||
elif child.type == '>':
|
||||
self.ptml_string += "sequence{\n"
|
||||
self.dfs_ptml_many_act(parnode=child)
|
||||
self.ptml_string += '}\n'
|
||||
|
||||
def get_ptml_many_act(self):
|
||||
self.ptml_string = "selector{\n"
|
||||
self.dfs_ptml_many_act(self.bt.children[0],is_root=True)
|
||||
self.ptml_string += '}\n'
|
||||
return self.ptml_string
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
bt_algo_opt = False
|
||||
|
||||
|
||||
# casestudy begin 对应论文的case study,包含三个行动的移动机械臂场景
|
||||
|
||||
actions = []
|
||||
a = Action(name='movebtob')
|
||||
a.pre = {1, 2}
|
||||
a.add = {3}
|
||||
a.del_set = {1, 4}
|
||||
actions.append(a)
|
||||
a = Action(name='moveatob')
|
||||
a.pre = {1}
|
||||
a.add = {5, 2}
|
||||
a.del_set = {1, 6}
|
||||
actions.append(a)
|
||||
a = Action(name='moveatoa')
|
||||
a.pre = {7}
|
||||
a.add = {8, 2}
|
||||
a.del_set = {7, 6}
|
||||
actions.append(a)
|
||||
|
||||
start = {1, 7, 4, 6}
|
||||
goal = {3}
|
||||
algo = BTExpAlgorithm()
|
||||
algo.clear()
|
||||
algo.run_algorithm(start, goal, list(actions))
|
||||
state = start
|
||||
steps = 0
|
||||
val, obj = algo.bt.tick(state)
|
||||
while val != 'success' and val != 'failure':
|
||||
state = state_transition(state, obj)
|
||||
print(obj.name)
|
||||
val, obj = algo.bt.tick(state)
|
||||
if (val == 'failure'):
|
||||
print("bt fails at step", steps)
|
||||
steps += 1
|
||||
if not goal <= state:
|
||||
print("wrong solution", steps)
|
||||
else:
|
||||
print("right solution", steps)
|
||||
# algo.bt.print_nodes()
|
||||
print(algo.bt.count_size() - 1)
|
||||
algo.clear()
|
||||
|
||||
# case study end
|
|
@ -0,0 +1,162 @@
|
|||
import random
|
||||
import numpy as np
|
||||
import copy
|
||||
import time
|
||||
|
||||
from OptimalBTExpansionAlgorithm import ControlBT,Leaf,generate_random_state,Action,state_transition,conflict
|
||||
|
||||
# 本文所提出的完备规划算法
|
||||
class BTExpAlgorithm:
|
||||
def __init__(self,verbose=False):
|
||||
self.bt = None
|
||||
self.nodes = []
|
||||
self.traversed = []
|
||||
self.conditions = []
|
||||
self.conditions_index = []
|
||||
self.verbose = verbose
|
||||
# print (self.conditions_list[0])
|
||||
|
||||
def clear(self):
|
||||
self.bt = None
|
||||
self.nodes = []
|
||||
self.traversed = []
|
||||
self.conditions = []
|
||||
self.conditions_index = []
|
||||
|
||||
# 运行规划算法,从初始状态、目标状态和可用行动,计算行为树self.bt
|
||||
def run_algorithm(self, start, goal, actions):
|
||||
# 初始行为树只包含目标条件
|
||||
self.bt = ControlBT(type='cond')
|
||||
g_node = Leaf(type='cond', content=goal)
|
||||
self.bt.add_child([g_node])
|
||||
|
||||
self.conditions.append(goal)
|
||||
self.nodes.append(g_node) # condition node list
|
||||
# 尝试在初始状态执行行为树
|
||||
val, obj = self.bt.tick(start)
|
||||
canrun = False
|
||||
if val == 'success' or val == 'running':
|
||||
canrun = True
|
||||
# 循环扩展,直到行为树能够在初始状态运行
|
||||
while not canrun:
|
||||
index = -1
|
||||
for i in range(0, len(self.nodes)):
|
||||
if self.nodes[i].content in self.traversed:
|
||||
continue
|
||||
else:
|
||||
c_node = self.nodes[i]
|
||||
index = i
|
||||
break
|
||||
if index == -1: # 树中结点扩展完毕,仍无法运行行为树,返回失败
|
||||
print('Failure')
|
||||
return False
|
||||
# 根据所选择条件结点扩展子树
|
||||
subtree = ControlBT(type='?')
|
||||
subtree.add_child([copy.deepcopy(c_node)]) # 子树首先保留所扩展结点
|
||||
c = c_node.content # 子树所扩展结点对应的条件(一个文字的set)
|
||||
|
||||
for i in range(0, len(actions)): # 选择符合条件的行动,
|
||||
# print("have action")
|
||||
if not c & ((actions[i].pre | actions[i].add) - actions[i].del_set) <= set():
|
||||
# print ("pass add")
|
||||
if (c - actions[i].del_set) == c:
|
||||
# print("pass delete")
|
||||
c_attr = (actions[i].pre | c) - actions[i].add
|
||||
valid = True
|
||||
|
||||
# 这样剪枝存在错误性
|
||||
# if conflict(c_attr):
|
||||
# continue
|
||||
|
||||
for j in self.traversed: # 剪枝操作
|
||||
if j <= c_attr:
|
||||
valid = False
|
||||
break
|
||||
if valid:
|
||||
# print("pass prune")
|
||||
# 构建行动的顺序结构
|
||||
sequence_structure = ControlBT(type='>')
|
||||
c_attr_node = Leaf(type='cond', content=c_attr)
|
||||
a_node = Leaf(type='act', content=actions[i])
|
||||
sequence_structure.add_child([c_attr_node, a_node])
|
||||
# 将顺序结构添加到子树
|
||||
subtree.add_child([sequence_structure])
|
||||
|
||||
self.nodes.append(c_attr_node)
|
||||
# 将原条件结点c_node替换为扩展后子树subtree
|
||||
parent_of_c = c_node.parent
|
||||
parent_of_c.children[0] = subtree
|
||||
# 记录已扩展条件
|
||||
self.traversed.append(c)
|
||||
# 尝试在初始状态运行行为树
|
||||
val, obj = self.bt.tick(start)
|
||||
canrun = False
|
||||
if val == 'success' or val == 'running':
|
||||
canrun = True
|
||||
return True
|
||||
|
||||
def print_solution(self):
|
||||
print("========= XiaoCaoBT ==========") # 树的bfs遍历
|
||||
nodes_ls = []
|
||||
nodes_ls.append(self.bt)
|
||||
while len(nodes_ls) != 0:
|
||||
parnode = nodes_ls[0]
|
||||
print("Parrent:", parnode.type)
|
||||
for child in parnode.children:
|
||||
if isinstance(child, Leaf):
|
||||
print("---- Leaf:", child.content)
|
||||
elif isinstance(child, ControlBT):
|
||||
print("---- ControlBT:", child.type)
|
||||
nodes_ls.append(child)
|
||||
print()
|
||||
nodes_ls.pop(0)
|
||||
print("========= XiaoCaoBT ==========\n")
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
bt_algo_opt = False
|
||||
|
||||
|
||||
# casestudy begin 对应论文的case study,包含三个行动的移动机械臂场景
|
||||
|
||||
actions = []
|
||||
a = Action(name='movebtob')
|
||||
a.pre = {1, 2}
|
||||
a.add = {3}
|
||||
a.del_set = {1, 4}
|
||||
actions.append(a)
|
||||
a = Action(name='moveatob')
|
||||
a.pre = {1}
|
||||
a.add = {5, 2}
|
||||
a.del_set = {1, 6}
|
||||
actions.append(a)
|
||||
a = Action(name='moveatoa')
|
||||
a.pre = {7}
|
||||
a.add = {8, 2}
|
||||
a.del_set = {7, 6}
|
||||
actions.append(a)
|
||||
|
||||
start = {1, 7, 4, 6}
|
||||
goal = {3}
|
||||
algo = BTExpAlgorithm()
|
||||
algo.clear()
|
||||
algo.run_algorithm(start, goal, list(actions))
|
||||
state = start
|
||||
steps = 0
|
||||
val, obj = algo.bt.tick(state)
|
||||
while val != 'success' and val != 'failure':
|
||||
state = state_transition(state, obj)
|
||||
print(obj.name)
|
||||
val, obj = algo.bt.tick(state)
|
||||
if (val == 'failure'):
|
||||
print("bt fails at step", steps)
|
||||
steps += 1
|
||||
if not goal <= state:
|
||||
print("wrong solution", steps)
|
||||
else:
|
||||
print("right solution", steps)
|
||||
# algo.bt.print_nodes()
|
||||
print(algo.bt.count_size() - 1)
|
||||
algo.clear()
|
||||
|
||||
# case study end
|
|
@ -0,0 +1,140 @@
|
|||
|
||||
import random
|
||||
|
||||
|
||||
#叶结点
|
||||
class Leaf:
|
||||
def __init__(self,type,content,mincost=0):
|
||||
self.type=type
|
||||
self.content=content #conditionset or action
|
||||
self.parent=None
|
||||
self.parent_index=0
|
||||
self.mincost=mincost
|
||||
|
||||
# tick 叶节点,返回返回值以及对应的条件或行动对象self.content
|
||||
def tick(self,state):
|
||||
if self.type=='cond':
|
||||
if self.content <= state:
|
||||
return 'success',self.content
|
||||
else:
|
||||
return 'failure',self.content
|
||||
if self.type=='act':
|
||||
if self.content.pre<=state:
|
||||
return 'running',self.content #action
|
||||
else:
|
||||
return 'failure',self.content
|
||||
|
||||
def cost_tick(self,state,cost,ticks):
|
||||
if self.type=='cond':
|
||||
ticks+=1
|
||||
if self.content <= state:
|
||||
return 'success',self.content,cost,ticks
|
||||
else:
|
||||
return 'failure',self.content,cost,ticks
|
||||
if self.type=='act':
|
||||
ticks += 1
|
||||
if self.content.pre<=state:
|
||||
return 'running',self.content,cost+self.content.cost,ticks #action
|
||||
else:
|
||||
return 'failure',self.content,cost,ticks
|
||||
|
||||
def __str__(self):
|
||||
print( self.content)
|
||||
return ''
|
||||
|
||||
def print_nodes(self):
|
||||
print(self.content)
|
||||
|
||||
def count_size(self):
|
||||
return 1
|
||||
|
||||
|
||||
#可能包含控制结点的行为树
|
||||
class ControlBT:
|
||||
def __init__(self,type):
|
||||
self.type=type
|
||||
self.children=[]
|
||||
self.parent=None
|
||||
self.parent_index=0
|
||||
|
||||
|
||||
def add_child(self,subtree_list):
|
||||
for subtree in subtree_list:
|
||||
self.children.append(subtree)
|
||||
subtree.parent=self
|
||||
subtree.parent_index=len(self.children)-1
|
||||
|
||||
# tick行为树,根据不同控制结点逻辑tick子结点
|
||||
def tick(self,state):
|
||||
if len(self.children) < 1:
|
||||
print("error,no child")
|
||||
if self.type =='?':#选择结点,即或结点
|
||||
for child in self.children:
|
||||
val,obj=child.tick(state)
|
||||
if val=='success':
|
||||
return val,obj
|
||||
if val=='running':
|
||||
return val,obj
|
||||
return 'failure','?fails'
|
||||
if self.type =='>':#顺序结点,即与结点
|
||||
for child in self.children:
|
||||
val,obj=child.tick(state)
|
||||
if val=='failure':
|
||||
return val,obj
|
||||
if val=='running':
|
||||
return val,obj
|
||||
return 'success', '>success'
|
||||
if self.type =='act':#行动结点
|
||||
return self.children[0].tick(state)
|
||||
if self.type =='cond':#条件结点
|
||||
return self.children[0].tick(state)
|
||||
|
||||
def cost_tick(self,state,cost,ticks):
|
||||
if len(self.children) < 1:
|
||||
print("error,no child")
|
||||
if self.type =='?':#选择结点,即或结点
|
||||
ticks += 1
|
||||
for child in self.children:
|
||||
ticks+=1
|
||||
val,obj,cost,ticks=child.cost_tick(state,cost,ticks)
|
||||
if val=='success':
|
||||
return val,obj,cost,ticks
|
||||
if val=='running':
|
||||
return val,obj,cost,ticks
|
||||
return 'failure','?fails',cost,ticks
|
||||
if self.type =='>':#顺序结点,即与结点
|
||||
for child in self.children:
|
||||
# print("state:",state,"cost",cost)
|
||||
ticks+=1
|
||||
val,obj,cost,ticks=child.cost_tick(state,cost,ticks)
|
||||
if val=='failure':
|
||||
return val,obj,cost,ticks
|
||||
if val=='running':
|
||||
return val,obj,cost,ticks
|
||||
return 'success', '>success',cost,ticks
|
||||
if self.type =='act':#行动结点
|
||||
return self.children[0].cost_tick(state,cost,ticks)
|
||||
if self.type =='cond':#条件结点
|
||||
return self.children[0].cost_tick(state,cost,ticks)
|
||||
|
||||
def getFirstChild(self):
|
||||
return self.children[0]
|
||||
|
||||
def __str__(self):
|
||||
print(self.type+'\n')
|
||||
for child in self.children:
|
||||
print (child)
|
||||
return ''
|
||||
|
||||
def print_nodes(self):
|
||||
print(self.type)
|
||||
for child in self.children:
|
||||
child.print_nodes()
|
||||
|
||||
# 递归统计树中结点数
|
||||
def count_size(self):
|
||||
result=1
|
||||
for child in self.children:
|
||||
result+= child.count_size()
|
||||
return result
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
from EXP.behavior_lib._base.Behavior import Bahavior
|
||||
|
||||
class Act(Bahavior):
|
||||
print_name_prefix = "act "
|
||||
type = 'Act'
|
||||
|
||||
def __init__(self,*args):
|
||||
super().__init__(*args)
|
||||
self.info = self.get_info(*args)
|
||||
|
||||
@classmethod
|
||||
def get_info(self,*arg):
|
||||
return None
|
|
@ -0,0 +1,153 @@
|
|||
import py_trees as ptree
|
||||
from typing import Any
|
||||
import enum
|
||||
from py_trees.common import Status
|
||||
|
||||
|
||||
# _base Behavior
|
||||
class Bahavior(ptree.behaviour.Behaviour):
|
||||
|
||||
can_be_expanded = False
|
||||
num_params = 0
|
||||
valid_params='''
|
||||
None
|
||||
'''
|
||||
scene = None
|
||||
print_name_prefix = ""
|
||||
tables_for_placement = {'Bar', 'Bar2', 'WaterTable', 'CoffeeTable', 'Table1', 'Table2', 'Table3','BrightTable6'}
|
||||
all_object = {
|
||||
'Coffee', 'Water', 'Dessert', 'Softdrink', 'BottledDrink', 'Yogurt', 'ADMilk', 'MilkDrink', 'Milk','VacuumCup',
|
||||
'Chips', 'NFCJuice', 'Bernachon', 'SpringWater'}
|
||||
tables_for_guiding = {"QuietTable1","QuietTable2",
|
||||
"BrightTable1","BrightTable2","BrightTable3","BrightTable4","BrightTable5","BrightTable6",
|
||||
'CoffeeTable','WaterTable','Table1', 'Table2', 'Table3'}
|
||||
|
||||
|
||||
# tables_for_placement = {'Bar', 'CoffeeTable', 'Table2',"BrightTable6", 'WaterTable'}
|
||||
# all_object = {'Coffee', 'Yogurt'}
|
||||
|
||||
|
||||
num_of_obj_on_place={
|
||||
'Bar': 0, # (247.0, 520.0, 100.0)
|
||||
'Bar2': 0,
|
||||
'WaterTable': 0,
|
||||
'CoffeeTable': 0,
|
||||
'Table1': 0,
|
||||
'Table2': 0,
|
||||
'Table3': 0,
|
||||
'BrightTable6': 0,
|
||||
}
|
||||
|
||||
place_xyz_dic={
|
||||
'Bar': (247.0, 520.0, 100.0), #(247.0, 520.0, 100.0)
|
||||
'Bar2': (240.0, 40.0, 100.0),
|
||||
'WaterTable':(-70.0, 500.0, 107),
|
||||
'CoffeeTable':(250.0, 310.0, 100.0),
|
||||
'Table1': (340.0, 900.0, 99.0),
|
||||
'Table2': (-55.0, 0.0, 107),
|
||||
'Table3':(-55.0, 150.0, 107),
|
||||
'BrightTable6': (5, -315, 116.5),
|
||||
}
|
||||
|
||||
place_have_obj_xyz_dic = {
|
||||
'QuietTable1': (480, 1300, 70),
|
||||
'QuietTable2': (250, -240, 70),
|
||||
'BrightTable1': (230, 1200, 35),
|
||||
'BrightTable2': (65, 1000, 35),
|
||||
'BrightTable3': (-80, 850, 35),
|
||||
'BrightTable4': (-270, 520, 70),
|
||||
'BrightTable5': (-270, 420, 35)
|
||||
}
|
||||
place_have_obj_xyz_dic.update(place_xyz_dic)
|
||||
|
||||
place_en2zh_name={
|
||||
'Bar': "吧台",
|
||||
'Bar2': "另一侧的吧台",
|
||||
'WaterTable': "大厅的茶水桌",
|
||||
'CoffeeTable': "咖啡桌",
|
||||
'Table1': "前门斜桌子",
|
||||
'Table2': "大厅长桌子西侧",
|
||||
'Table3': "大厅长桌子东侧",
|
||||
'BrightTable6': "后门靠窗边圆桌",
|
||||
'QuietTable1': "前门角落双人圆桌",
|
||||
'QuietTable2': "后门角落三人圆桌",
|
||||
'BrightTable1': "靠窗边第一个四人矮桌",
|
||||
'BrightTable2': "靠窗边第二个四人矮桌",
|
||||
'BrightTable3': "靠窗边第三个四人矮桌",
|
||||
'BrightTable4': "大厅里靠窗边长桌子",
|
||||
'BrightTable5': "大厅里靠窗边多人矮桌",
|
||||
}
|
||||
|
||||
place_xy_yaw_dic={
|
||||
'Bar': (247.0, 520.0, 180), # (247.0, 520.0, 100.0)
|
||||
'Bar2': (240.0, 40.0, 100.0),
|
||||
'WaterTable': (-70.0, 500.0, 107),
|
||||
'CoffeeTable': (250.0, 310.0, 100.0),
|
||||
'Table1': (340.0, 900.0, 99.0),
|
||||
'Table2': (-55.0, 0.0, 107),
|
||||
'Table3': (-55.0, 150.0, 107),
|
||||
'BrightTable6': (5, -315, 116.5),
|
||||
|
||||
'QuietTable1':(480,1300,90),
|
||||
'QuietTable2':(250,-240,-65),
|
||||
'BrightTable1':(230,1200,-135),
|
||||
'BrightTable2': (65, 1000, 135),
|
||||
'BrightTable3': (-80, 850, 135),
|
||||
'BrightTable4': (-270, 520, 150),
|
||||
'BrightTable5': (-270, 420, 90) #(-270, 420, -135)
|
||||
}
|
||||
container_dic={
|
||||
'Coffee':'CoffeeCup',
|
||||
'Water': 'Glass',
|
||||
'Dessert':'Plate'
|
||||
}
|
||||
|
||||
|
||||
|
||||
@classmethod
|
||||
def get_ins_name(cls,*args):
|
||||
name = cls.__name__
|
||||
if len(args) > 0:
|
||||
ins_name = f'{name}({",".join(list(args))})'
|
||||
else:
|
||||
ins_name = f'{name}()'
|
||||
return ins_name
|
||||
|
||||
def __init__(self,*args):
|
||||
ins_name = self.__class__.get_ins_name(*args)
|
||||
self.args = args
|
||||
|
||||
super().__init__(ins_name)
|
||||
|
||||
def _update(self) -> ptree.common.Status:
|
||||
print("this is just a _base behavior node.")
|
||||
return Status.INVALID
|
||||
|
||||
@property
|
||||
def print_name(self):
|
||||
return f'{self.print_name_prefix}{self.get_ins_name(*self.args)}'
|
||||
|
||||
|
||||
|
||||
# let behavior node Interact with the scene
|
||||
def set_scene(self, scene=None):
|
||||
if scene:
|
||||
self.scene = scene
|
||||
self.robot = scene.robot
|
||||
|
||||
def setup(self, **kwargs: Any) -> None:
|
||||
return super().setup(**kwargs)
|
||||
|
||||
def initialise(self) -> None:
|
||||
return super().initialise()
|
||||
|
||||
def update(self) -> Status:
|
||||
re = self._update()
|
||||
return re
|
||||
|
||||
def terminate(self, new_status: Status) -> None:
|
||||
return super().terminate(new_status)
|
||||
|
||||
@property
|
||||
def arg_str(self):
|
||||
return ",".join(self.args)
|
|
@ -0,0 +1,18 @@
|
|||
import py_trees as ptree
|
||||
from typing import Any
|
||||
from EXP.behavior_lib._base.Behavior import Bahavior, Status
|
||||
|
||||
class Cond(Bahavior):
|
||||
print_name_prefix = "cond "
|
||||
type = 'Cond'
|
||||
|
||||
def __init__(self,*args):
|
||||
super().__init__(*args)
|
||||
|
||||
|
||||
def _update(self) -> ptree.common.Status:
|
||||
# if self.scene.status?
|
||||
if self.scene.state['chat_list'] == []:
|
||||
return Status.FAILURE
|
||||
else:
|
||||
return Status.SUCCESS
|
|
@ -0,0 +1,10 @@
|
|||
import py_trees as ptree
|
||||
from typing import Any
|
||||
|
||||
class Selector(ptree.composites.Selector):
|
||||
print_name = "Selector"
|
||||
ins_name = "Selector"
|
||||
type = "Selector"
|
||||
|
||||
def __init__(self,*args,**kwargs):
|
||||
super().__init__(*args,**kwargs)
|
|
@ -0,0 +1,11 @@
|
|||
import py_trees as ptree
|
||||
from typing import Any
|
||||
|
||||
class Sequence(ptree.composites.Sequence):
|
||||
print_name = "Sequence"
|
||||
ins_name = "Selector"
|
||||
type = "Sequence"
|
||||
|
||||
def __init__(self,*args,**kwargs):
|
||||
super().__init__(*args,**kwargs)
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
|
||||
from EXP.behavior_lib._base.Sequence import Sequence
|
||||
from EXP.behavior_lib._base.Selector import Selector
|
|
@ -0,0 +1,50 @@
|
|||
import py_trees as ptree
|
||||
from typing import Any
|
||||
from EXP.behavior_lib._base.Act import Act
|
||||
from EXP.behavior_lib._base.Behavior import Status
|
||||
|
||||
class Clean(Act):
|
||||
can_be_expanded = True
|
||||
num_args = 1
|
||||
valid_args = (
|
||||
'Table1','Floor','Chairs'
|
||||
)
|
||||
|
||||
def __init__(self, *args):
|
||||
super().__init__(*args)
|
||||
self.target_obj = self.args[0]
|
||||
self.op_type = 5
|
||||
if self.target_obj=="Table1":
|
||||
self.op_type = 5
|
||||
elif self.target_obj=="Floor":
|
||||
self.op_type = 4
|
||||
elif self.target_obj=="Chairs":
|
||||
self.op_type = 7
|
||||
|
||||
|
||||
@classmethod
|
||||
def get_info(cls,arg):
|
||||
info = {}
|
||||
info["pre"]= {f'Holding(Nothing)',f'Is(HallLight,On)'}
|
||||
if arg == "Table1":
|
||||
info["add"]= {f'Is(Table1,Clean)'}
|
||||
info["del_set"] = {f'Is(Table1,Dirty)'}
|
||||
elif arg == "Floor":
|
||||
info["add"] = {f'Is(Floor,Clean)'}
|
||||
info["del_set"] = {f'Is(Floor,Dirty)'}
|
||||
elif arg == "Chairs":
|
||||
info["add"] = {f'Is(Chairs,Clean)'}
|
||||
info["del_set"] = {f'Is(Chairs,Dirty)'}
|
||||
return info
|
||||
|
||||
def _update(self) -> ptree.common.Status:
|
||||
|
||||
self.scene.move_task_area(self.op_type)
|
||||
self.scene.op_task_execute(self.op_type)
|
||||
|
||||
self.scene.state["condition_set"] |= (self.info["add"])
|
||||
self.scene.state["condition_set"] -= self.info["del_set"]
|
||||
self.scene.get_obstacle_point(self.scene.db, self.status, map_ratio=self.scene.map_ratio)
|
||||
|
||||
# print("After Clean condition_set:",self.scene.state["condition_set"] )
|
||||
return Status.RUNNING
|
|
@ -0,0 +1,68 @@
|
|||
import py_trees as ptree
|
||||
from typing import Any
|
||||
from EXP.behavior_lib._base.Act import Act
|
||||
from EXP.behavior_lib._base.Behavior import Status
|
||||
|
||||
class Make(Act):
|
||||
can_be_expanded = True
|
||||
num_args = 1
|
||||
valid_args = (
|
||||
"Coffee","Water","Dessert"
|
||||
)
|
||||
|
||||
def __init__(self, *args):
|
||||
super().__init__(*args)
|
||||
self.target_obj = self.args[0]
|
||||
self.op_type = 1
|
||||
if self.target_obj==self.valid_args[0]:
|
||||
self.op_type = 1
|
||||
elif self.target_obj==self.valid_args[1]:
|
||||
self.op_type = 2
|
||||
elif self.target_obj==self.valid_args[2]:
|
||||
self.op_type = 3
|
||||
|
||||
|
||||
@classmethod
|
||||
def get_info(cls,arg):
|
||||
info = {}
|
||||
info["pre"]= {f'Holding(Nothing)'}
|
||||
info['del_set'] = set()
|
||||
info['add'] = {f'Exist({arg})'}
|
||||
if arg == cls.valid_args[0]:
|
||||
info["add"] |= {f'On({arg},CoffeeTable)'}
|
||||
elif arg == cls.valid_args[1]:
|
||||
info["add"] |= {f'On({arg},WaterTable)'}
|
||||
elif arg == cls.valid_args[2]:
|
||||
info["add"] |= {f'On({arg},Bar)'}
|
||||
info['cost'] = 2
|
||||
return info
|
||||
|
||||
def _update(self) -> ptree.common.Status:
|
||||
|
||||
if self.scene.show_ui:
|
||||
self.scene.get_obstacle_point(self.scene.db, self.status, map_ratio=self.scene.map_ratio)
|
||||
|
||||
self.scene.move_task_area(self.op_type)
|
||||
self.scene.op_task_execute(self.op_type)
|
||||
|
||||
# self.scene.gen_obj(type=40)
|
||||
|
||||
# obj_dict = self.scene.status.objects
|
||||
# if len(obj_dict) != 0:
|
||||
# # 获取obj_id
|
||||
# for id, obj in enumerate(obj_dict):
|
||||
# print("id:",id,"obj",obj.name)
|
||||
|
||||
# if obj.name == "Coffee":
|
||||
# obj_info = obj_dict[id]
|
||||
# obj_x, obj_y, obj_z = obj_info.location.X, obj_info.location.Y, obj_info.location.Z
|
||||
# print(id,obj.name,obj_x,obj_y,obj_z)
|
||||
if self.scene.show_ui:
|
||||
self.scene.get_obstacle_point(self.scene.db, self.status, map_ratio=self.scene.map_ratio,update_info_count=1)
|
||||
|
||||
self.scene.state["condition_set"] |= (self.info["add"])
|
||||
self.scene.state["condition_set"] -= self.info["del_set"]
|
||||
|
||||
# print("condition_set:",self.scene.state["condition_set"])
|
||||
|
||||
return Status.RUNNING
|
|
@ -0,0 +1,28 @@
|
|||
import py_trees as ptree
|
||||
from EXP.behavior_lib._base.Act import Act
|
||||
|
||||
class MoveTo(Act):
|
||||
can_be_expanded = True
|
||||
num_args = 1
|
||||
valid_args = Act.all_object | Act.tables_for_placement | Act.tables_for_guiding
|
||||
valid_args.add('Customer')
|
||||
|
||||
def __init__(self, target_place):
|
||||
super().__init__(target_place)
|
||||
self.target_place = target_place
|
||||
|
||||
|
||||
@classmethod
|
||||
def get_info(cls,arg):
|
||||
info = {}
|
||||
info['pre'] = set()
|
||||
if arg in Act.all_object:
|
||||
info['pre'] |= {f'Exist({arg})'}
|
||||
info["add"] = {f'At(Robot,{arg})'}
|
||||
info["del_set"] = {f'At(Robot,{place})' for place in cls.valid_args if place != arg}
|
||||
info['cost'] = 1 #10
|
||||
# if arg!='Anything':
|
||||
# info['cost']=5
|
||||
# else:
|
||||
# info['cost']=0
|
||||
return info
|
|
@ -0,0 +1,74 @@
|
|||
import py_trees as ptree
|
||||
from typing import Any
|
||||
from EXP.behavior_lib._base.Act import Act
|
||||
from EXP.behavior_lib._base.Behavior import Status
|
||||
|
||||
class PickUp(Act):
|
||||
can_be_expanded = True
|
||||
num_args = 1
|
||||
valid_args = Act.all_object
|
||||
# valid_args.add("Anything")
|
||||
def __init__(self, *args):
|
||||
super().__init__(*args)
|
||||
self.target_obj = self.args[0]
|
||||
|
||||
|
||||
@classmethod
|
||||
def get_info(cls,arg):
|
||||
info = {}
|
||||
info["pre"] = {f'At(Robot,{arg})','Holding(Nothing)'}
|
||||
info["add"] = {f'Holding({arg})'}
|
||||
info["del_set"] = {f'Holding(Nothing)',f'Exist({arg})'} #,
|
||||
for place in cls.valid_args:
|
||||
info["del_set"] |= {f'On({arg},{place})'}
|
||||
info['cost'] = 2
|
||||
|
||||
# if arg != 'Anything':
|
||||
# info['cost'] = 1
|
||||
# else:
|
||||
# info['cost'] = 0
|
||||
#
|
||||
# info["pre"] = {}
|
||||
|
||||
return info
|
||||
|
||||
|
||||
def _update(self) -> ptree.common.Status:
|
||||
# self.scene.test_move()
|
||||
# op_type=16
|
||||
|
||||
# 遍历场景里的所有物品,根据名字匹配位置最近的 obj-id
|
||||
# 是否用容器装好
|
||||
if self.target_obj in Act.container_dic:
|
||||
target_name = Act.container_dic[self.target_obj]
|
||||
else:
|
||||
target_name = self.target_obj
|
||||
# 根据物体名字找到最近的这类物体对应的位置
|
||||
obj_id = -1
|
||||
min_dis = float('inf')
|
||||
obj_dict = self.scene.status.objects
|
||||
if len(obj_dict) != 0:
|
||||
# 获取obj_id
|
||||
for id, obj in enumerate(obj_dict):
|
||||
if obj.name == target_name:
|
||||
obj_info = obj_dict[id]
|
||||
dis = self.scene.cal_distance_to_robot(obj_info.location.X, obj_info.location.Y,
|
||||
obj_info.location.Z)
|
||||
if dis < min_dis:
|
||||
min_dis = dis
|
||||
obj_id = id
|
||||
# if self.target_place == "CoffeeCup":
|
||||
# # obj_id = 273
|
||||
# obj_id = 275
|
||||
if obj_id == -1:
|
||||
return ptree.common.Status.FAILURE
|
||||
|
||||
self.scene.move_task_area(op_type=16, obj_id=obj_id)
|
||||
self.scene.op_task_execute(op_type=16, obj_id=obj_id)
|
||||
|
||||
if self.scene.show_ui:
|
||||
self.scene.get_obstacle_point(self.scene.db, self.status, map_ratio=self.scene.map_ratio,update_info_count=1)
|
||||
|
||||
self.scene.state["condition_set"] |= (self.info["add"])
|
||||
self.scene.state["condition_set"] -= self.info["del_set"]
|
||||
return Status.RUNNING
|
|
@ -0,0 +1,64 @@
|
|||
import py_trees as ptree
|
||||
from typing import Any
|
||||
from EXP.behavior_lib._base.Act import Act
|
||||
from EXP.behavior_lib._base.Behavior import Status
|
||||
import itertools
|
||||
|
||||
class PutDown(Act):
|
||||
can_be_expanded = True
|
||||
num_args = 2
|
||||
|
||||
valid_args = list(itertools.product(Act.all_object, Act.tables_for_placement))
|
||||
valid_args.append(('Anything','Anywhere'))
|
||||
valid_args = tuple(valid_args)
|
||||
|
||||
def __init__(self, *args):
|
||||
super().__init__(*args)
|
||||
self.target_obj = self.args[0]
|
||||
self.target_place = self.args[1]
|
||||
|
||||
|
||||
@classmethod
|
||||
def get_info(cls,*arg):
|
||||
if arg[0] != 'Anything':
|
||||
info = {}
|
||||
info["pre"] = {f'Holding({arg[0]})',f'At(Robot,{arg[1]})'}
|
||||
info["add"] = {f'Holding(Nothing)',f'On({arg[0]},{arg[1]})'}
|
||||
info["del_set"] = {f'Holding({arg[0]})'}
|
||||
info['cost'] = 100 #1000
|
||||
else:
|
||||
info = {}
|
||||
info["pre"] = set()
|
||||
info['add'] = {f'Holding(Nothing)'}
|
||||
info['del_set'] = {f'Holding({obj})' for obj in cls.all_object}
|
||||
info['cost'] = 0
|
||||
|
||||
return info
|
||||
|
||||
|
||||
def _update(self) -> ptree.common.Status:
|
||||
# self.scene.test_move()
|
||||
|
||||
if self.target_obj != 'Anything':
|
||||
op_type=17
|
||||
release_pos = list(Act.place_xyz_dic[self.target_place])
|
||||
# # 原始吧台处:[247.0, 520.0, 100.0], 空调开关旁吧台:[240.0, 40.0, 70.0], 水杯桌:[-70.0, 500.0, 107]
|
||||
# # 桌子2:[-55.0, 0.0, 107],桌子3:[-55.0, 150.0, 107]
|
||||
if Act.num_of_obj_on_place[self.target_place]>=1:
|
||||
release_pos[1] += 25
|
||||
|
||||
Act.num_of_obj_on_place[self.target_place]+=1
|
||||
|
||||
self.scene.move_task_area(op_type, release_pos=release_pos)
|
||||
|
||||
if self.target_obj == "Chips":
|
||||
release_pos[2] +=3
|
||||
self.scene.op_task_execute(op_type, release_pos=release_pos)
|
||||
|
||||
if self.scene.show_ui:
|
||||
self.scene.get_obstacle_point(self.scene.db, self.status, map_ratio=self.scene.map_ratio,update_info_count=1)
|
||||
|
||||
self.scene.state["condition_set"] |= (self.info["add"])
|
||||
self.scene.state["condition_set"] -= self.info["del_set"]
|
||||
|
||||
return Status.RUNNING
|
|
@ -0,0 +1,87 @@
|
|||
import py_trees as ptree
|
||||
from typing import Any
|
||||
from EXP.behavior_lib._base.Act import Act
|
||||
from EXP.behavior_lib._base.Behavior import Status
|
||||
import itertools
|
||||
|
||||
class Turn(Act):
|
||||
can_be_expanded = True
|
||||
num_args = 2
|
||||
valid_args = [('AC','TubeLight','HallLight','Curtain'),
|
||||
('On','Off')]
|
||||
|
||||
valid_args = list(itertools.product(valid_args[0], valid_args[1]))
|
||||
valid_args.extend([('ACTemperature','Up'),('ACTemperature','Down')])
|
||||
valid_args = tuple(valid_args)
|
||||
|
||||
|
||||
|
||||
def __init__(self, *args):
|
||||
super().__init__(*args)
|
||||
self.target_obj = self.args[0]
|
||||
self.op = self.args[1]
|
||||
self.op_type = 13
|
||||
|
||||
if self.target_obj=="AC":
|
||||
self.op_type = 13
|
||||
elif self.target_obj=="ACTemperature":
|
||||
if self.op == 'Up':
|
||||
self.op_type = 14
|
||||
elif self.op == 'Down':
|
||||
self.op_type = 15
|
||||
elif self.target_obj=="TubeLight":
|
||||
if self.op == 'On':
|
||||
self.op_type = 6
|
||||
elif self.op == 'Off':
|
||||
self.op_type = 8
|
||||
elif self.target_obj=="HallLight":
|
||||
if self.op == 'On':
|
||||
self.op_type = 9
|
||||
elif self.op == 'Off':
|
||||
self.op_type = 10
|
||||
elif self.target_obj=="Curtain":
|
||||
if self.op == 'On':
|
||||
self.op_type = 12
|
||||
elif self.op == 'Off':
|
||||
self.op_type = 11
|
||||
|
||||
@classmethod
|
||||
def get_info(cls,*arg):
|
||||
info = {}
|
||||
info["pre"] = set()
|
||||
if arg[0]=="TubeLight" or arg[0]=="HallLight" or arg[0]=="Curtain" or arg[0]=='AC':
|
||||
if arg[0]!="Curtain":
|
||||
info["pre"] |= {f'Holding(Nothing)'}
|
||||
if arg[1]=="On":
|
||||
info["pre"] |= {f'Is({arg[0]},Off)'}
|
||||
info["add"] = {f'Is({arg[0]},On)'}
|
||||
info["del_set"] = {f'Is({arg[0]},Off)'}
|
||||
elif arg[1]=="Off":
|
||||
info["pre"] |= {f'Is({arg[0]},On)'}
|
||||
info["add"] = {f'Is({arg[0]},Off)'}
|
||||
info["del_set"] = {f'Is({arg[0]},On)'}
|
||||
elif arg[0]=='ACTemperature':
|
||||
info["pre"] = {f'Holding(Nothing)',f'Is(AC,On)'}
|
||||
if arg[1]=="Up":
|
||||
# info["pre"] |= {f'Is({arg[0]},Down)'}
|
||||
info["add"] = {f'Is({arg[0]},Up)'}
|
||||
info["del_set"] = {f'Is({arg[0]},Down)'}
|
||||
elif arg[1]=="Down":
|
||||
# info["pre"] |= {f'Is({arg[0]},Up)'}
|
||||
info["add"] = {f'Is({arg[0]},Down)'}
|
||||
info["del_set"] = {f'Is({arg[0]},Up)'}
|
||||
return info
|
||||
|
||||
def _update(self) -> ptree.common.Status:
|
||||
|
||||
if self.scene.show_ui:
|
||||
self.scene.get_obstacle_point(self.scene.db, self.status, map_ratio=self.scene.map_ratio)
|
||||
|
||||
self.scene.move_task_area(self.op_type)
|
||||
self.scene.op_task_execute(self.op_type)
|
||||
if self.scene.show_ui:
|
||||
self.scene.get_obstacle_point(self.scene.db, self.status, map_ratio=self.scene.map_ratio)
|
||||
self.scene.state["condition_set"] |= (self.info["add"])
|
||||
self.scene.state["condition_set"] -= self.info["del_set"]
|
||||
|
||||
return Status.RUNNING
|
|
@ -0,0 +1,31 @@
|
|||
import py_trees as ptree
|
||||
from typing import Any
|
||||
from EXP.behavior_lib._base.Cond import Cond
|
||||
import itertools
|
||||
|
||||
class At(Cond):
|
||||
can_be_expanded = True
|
||||
num_params = 2
|
||||
|
||||
valid_args = list(itertools.product(('Robot','Customer'), tuple(Cond.all_object | Cond.tables_for_placement | Cond.tables_for_guiding | {'Customer'})))
|
||||
valid_args.remove(('Customer','Customer'))
|
||||
valid_args = tuple(valid_args)
|
||||
|
||||
def __init__(self,*args):
|
||||
super().__init__(*args)
|
||||
|
||||
|
||||
def _update(self) -> ptree.common.Status:
|
||||
# if self.scene.status?
|
||||
|
||||
# self.scene.get_obstacle_point(self.scene.db, self.status, map_ratio=self.scene.map_ratio)
|
||||
|
||||
if self.name in self.scene.state["condition_set"]:
|
||||
return ptree.common.Status.SUCCESS
|
||||
else:
|
||||
return ptree.common.Status.FAILURE
|
||||
|
||||
# if self.scene.state['chat_list'] == []:
|
||||
# return ptree.common.Status.FAILURE
|
||||
# else:
|
||||
# return ptree.common.Status.SUCCESS
|
|
@ -0,0 +1,28 @@
|
|||
import py_trees as ptree
|
||||
from typing import Any
|
||||
from EXP.behavior_lib._base.Cond import Cond
|
||||
import itertools
|
||||
|
||||
class Exist(Cond):
|
||||
can_be_expanded = True
|
||||
num_params = 2
|
||||
valid_args = tuple(Cond.all_object)
|
||||
|
||||
def __init__(self,*args):
|
||||
super().__init__(*args)
|
||||
|
||||
|
||||
def _update(self) -> ptree.common.Status:
|
||||
# if self.scene.status?
|
||||
|
||||
|
||||
|
||||
if self.name in self.scene.state["condition_set"]:
|
||||
return ptree.common.Status.SUCCESS
|
||||
else:
|
||||
return ptree.common.Status.FAILURE
|
||||
|
||||
# if self.scene.state['chat_list'] == []:
|
||||
# return ptree.common.Status.FAILURE
|
||||
# else:
|
||||
# return ptree.common.Status.SUCCESS
|
|
@ -0,0 +1,27 @@
|
|||
import py_trees as ptree
|
||||
from typing import Any
|
||||
from EXP.behavior_lib._base.Cond import Cond
|
||||
|
||||
class Holding(Cond):
|
||||
can_be_expanded = True
|
||||
num_params = 2
|
||||
valid_args = [tuple(Cond.all_object|{'Nothing'})]
|
||||
|
||||
def __init__(self,*args):
|
||||
super().__init__(*args)
|
||||
|
||||
|
||||
def _update(self) -> ptree.common.Status:
|
||||
# if self.scene.status?
|
||||
|
||||
# self.scene.get_obstacle_point(self.scene.db, self.status, map_ratio=self.scene.map_ratio)
|
||||
|
||||
if self.name in self.scene.state["condition_set"]:
|
||||
return ptree.common.Status.SUCCESS
|
||||
else:
|
||||
return ptree.common.Status.FAILURE
|
||||
|
||||
# if self.scene.state['chat_list'] == []:
|
||||
# return ptree.common.Status.FAILURE
|
||||
# else:
|
||||
# return ptree.common.Status.SUCCESS
|
|
@ -0,0 +1,37 @@
|
|||
import py_trees as ptree
|
||||
from typing import Any
|
||||
from EXP.behavior_lib._base.Cond import Cond
|
||||
import itertools
|
||||
|
||||
class Is(Cond):
|
||||
can_be_expanded = True
|
||||
num_params = 2
|
||||
valid_params1 = [('AC','TubeLight','HallLight','Curtain'),
|
||||
('On','Off')]
|
||||
valid_params2 = [('Table1','Floor','Chairs'),
|
||||
('Clean','Dirty')]
|
||||
valid_params3 = [('ACTemperature'),
|
||||
('Up','Down')]
|
||||
|
||||
valid_args = list(itertools.product(valid_params1[0], valid_params1[1]))
|
||||
valid_args.extend(list(itertools.product(valid_params2[0], valid_params2[1])))
|
||||
valid_args.extend(list(itertools.product(valid_params3[0], valid_params3[1])))
|
||||
valid_args = tuple(valid_args)
|
||||
|
||||
def __init__(self,*args):
|
||||
super().__init__(*args)
|
||||
|
||||
|
||||
def _update(self) -> ptree.common.Status:
|
||||
# if self.scene.status?
|
||||
# self.scene.get_obstacle_point(self.scene.db, self.status, map_ratio=self.scene.map_ratio)
|
||||
|
||||
if self.name in self.scene.state["condition_set"]:
|
||||
return ptree.common.Status.SUCCESS
|
||||
else:
|
||||
return ptree.common.Status.FAILURE
|
||||
|
||||
# if self.scene.state['chat_list'] == []:
|
||||
# return ptree.common.Status.FAILURE
|
||||
# else:
|
||||
# return ptree.common.Status.SUCCESS
|
|
@ -0,0 +1,31 @@
|
|||
import py_trees as ptree
|
||||
from typing import Any
|
||||
from EXP.behavior_lib._base.Cond import Cond
|
||||
|
||||
class On(Cond):
|
||||
can_be_expanded = True
|
||||
num_params = 2
|
||||
valid_params = [tuple(Cond.all_object),
|
||||
tuple(Cond.tables_for_placement)]
|
||||
|
||||
|
||||
def __init__(self,*args):
|
||||
super().__init__(*args)
|
||||
|
||||
|
||||
def _update(self) -> ptree.common.Status:
|
||||
# if self.scene.status?
|
||||
|
||||
# print("self.name:",self.name)
|
||||
# print("On: condition_set:",self.scene.state["condition_set"])
|
||||
# self.scene.get_obstacle_point(self.scene.db, self.status, map_ratio=self.scene.map_ratio)
|
||||
|
||||
if self.name in self.scene.state["condition_set"]:
|
||||
return ptree.common.Status.SUCCESS
|
||||
else:
|
||||
return ptree.common.Status.FAILURE
|
||||
|
||||
# if self.scene.state['chat_list'] == []:
|
||||
# return ptree.common.Status.FAILURE
|
||||
# else:
|
||||
# return ptree.common.Status.SUCCESS
|
|
@ -0,0 +1,2 @@
|
|||
|
||||
# from robowaiter.behavior_tree.behavior_tree import BehaviorTree
|
|
@ -0,0 +1,386 @@
|
|||
At(Robot,Bar) 请给我带来菜单。
|
||||
At(Robot,Bar) 请帮我前往吧台。
|
||||
At(Robot,Bar) 您好,我需要去吧台那个位置,请问可以帮我吗?
|
||||
At(Robot,WaterTable) 请送一些茶水到茶水桌。
|
||||
At(Robot,WaterTable) 请帮我前往茶水桌。
|
||||
At(Robot,WaterTable) 您好,请问您需要我前往哪个位置呢?
|
||||
At(Robot,CoffeeTable) 请问能帮我来到这个咖啡桌吗?
|
||||
At(Robot,CoffeeTable) 请前往咖啡桌。
|
||||
At(Robot,CoffeeTable) 您好!请问您能帮我前往咖啡桌的位置吗?
|
||||
At(Robot,Bar2) 您好,请问您需要前往哪个吧台呢?
|
||||
At(Robot,Bar2) 请帮我前往另一个吧台。
|
||||
At(Robot,Bar2) 您好,机器人服务员!请问您能告诉我如何前往另一个吧台的位置吗?
|
||||
At(Robot,Table1) 请给我送一份菜单到第一桌。
|
||||
At(Robot,Table1) 请帮我前往第一桌,谢谢!
|
||||
At(Robot,Table1) 您好,我是一名AI助手,请问有什么我可以帮您的?
|
||||
At(Robot,Table2) 请帮我来到第二张桌子。
|
||||
At(Robot,Table2) 请帮我前往第二桌,谢谢!
|
||||
At(Robot,Table2) 您好,机器人服务员!请问您能否前往第二桌的位置提供服务?
|
||||
At(Robot,Table3) 请给我带来第三桌子的服务。
|
||||
At(Robot,Table3) 请前往第三张桌子。
|
||||
At(Robot,Table3) 您好,请问您需要我前往第三张桌子所在的方位吗?
|
||||
On(Softdrink,Bar) 请将软饮料放在吧台那个位置。
|
||||
On(Softdrink,Bar) 请将软饮料拿到吧台位置。
|
||||
On(Softdrink,WaterTable) 请将软饮料放在茶水桌那个位置。
|
||||
On(Softdrink,WaterTable) 请给我拿一罐软饮料,放在茶水桌的位置。
|
||||
On(Softdrink,CoffeeTable) 请将软饮料放在咖啡桌上的指定位置。
|
||||
On(Softdrink,CoffeeTable) 请把软饮料拿到我的咖啡桌位置。
|
||||
On(Softdrink,Bar2) 请将软饮料放在另一个酒吧台的位置。
|
||||
On(Softdrink,Bar2) 请将软饮料拿到另一个酒吧台位置。
|
||||
On(Softdrink,Table1) 请将软饮料放在第一桌的指定位置。
|
||||
On(Softdrink,Table1) 请给我拿一罐软饮料,放在第一桌子的位置。
|
||||
On(Softdrink,Table2) 请将软饮料放在第二桌的位置。
|
||||
On(Softdrink,Table2) 请帮我从一个位置(可能是吧台或货架)取来一瓶软饮料,然后将其放在第二张桌子上。
|
||||
On(Softdrink,Table3) 请将软饮料放在第三桌的具体位置。
|
||||
On(Softdrink,Table3) 请给我拿一罐软饮料,放 到第三张桌子的位置。
|
||||
On(BottledDrink,Bar) 您好,我想让您将瓶装饮料放在吧台那个位置。
|
||||
On(BottledDrink,Bar) 请帮我取一下瓶装饮料,放到吧台那里。
|
||||
On(BottledDrink,WaterTable) 您好,机器人服务员,我想让您放一瓶饮料在茶水桌上,可以吗?
|
||||
On(BottledDrink,WaterTable) 请帮我拿一下瓶装饮料,放到茶水桌的位置。
|
||||
On(BottledDrink,CoffeeTable) 请将瓶装饮料放在咖啡桌上的指定位置。
|
||||
On(BottledDrink,CoffeeTable) 请把瓶装饮料拿到我的咖啡桌位置。
|
||||
On(BottledDrink,Bar2) 请将瓶装饮料放在另一个酒吧台的位置。
|
||||
On(BottledDrink,Bar2) 请帮我从一个吧台位置取一个瓶装饮料,然后将其拿到另一个吧台位置。
|
||||
On(BottledDrink,Table1) 请将瓶装饮料放在第一桌的指定位置。
|
||||
On(BottledDrink,Table1) 您好,我需要您帮忙将瓶装饮料拿到第一桌的位置。
|
||||
On(BottledDrink,Table2) 您好,我需要您帮助将瓶装饮料放在第二桌的具体位置。
|
||||
On(BottledDrink,Table2) 请给我拿一罐饮料,放在第二桌的位置。
|
||||
On(BottledDrink,Table3) 请将瓶装饮料放在第三桌的位置。
|
||||
On(BottledDrink,Table3) 请给我取一瓶饮料,放到了第三桌子上。
|
||||
On(Yogurt,Bar) 您好,我需要您将酸奶放在吧台上的哪个位置。
|
||||
On(Yogurt,Bar) 请您把酸奶拿到吧台。
|
||||
On(Yogurt,WaterTable) 请将酸奶放在茶水桌那个位置。
|
||||
On(Yogurt,WaterTable) 请将酸奶放在茶水桌的位置。
|
||||
On(Yogurt,CoffeeTable) 请将酸奶放在咖啡桌上的指定位置。
|
||||
On(Yogurt,CoffeeTable) 请把酸奶放在咖啡桌的位置。
|
||||
On(Yogurt,Bar2) 请将酸奶放在另一个吧台上的那个位置。
|
||||
On(Yogurt,Bar2) 您好,机器人服务员!请问您可以帮我拿一下酸奶,放到那个靠近窗户的吧台位置吗?谢谢!
|
||||
On(Yogurt,Table1) 请将酸奶放在第一桌的第一位置。
|
||||
On(Yogurt,Table1) 请将酸奶放在第一桌的位置。
|
||||
On(Yogurt,Table2) 您好,请问能帮我将酸奶放在第二张桌子的位置吗?谢谢!
|
||||
On(Yogurt,Table2) 请把酸奶放在第二桌的位置。
|
||||
On(Yogurt,Table3) 您好,机器人服务员,我想让您把酸奶放到第三张桌子的位置。谢谢!
|
||||
On(Yogurt,Table3) 请把酸奶放在第三桌的位置。
|
||||
On(ADMilk,Bar) 请将AD钙奶放在吧台那个位置。
|
||||
On(ADMilk,Bar) 请把AD钙奶放到 bar 位置。
|
||||
On(ADMilk,WaterTable) 请将AD钙奶放在茶水桌那个位置。
|
||||
On(ADMilk,WaterTable) 请帮我取一份AD钙奶,放在茶水桌的位置上。
|
||||
On(ADMilk,CoffeeTable) 请将AD钙奶放在咖啡桌上的指定位置。
|
||||
On(ADMilk,CoffeeTable) 请将AD钙奶送到我的咖啡桌位置。
|
||||
On(ADMilk,Bar2) 请将AD钙奶放在另一个酒吧台的位置。
|
||||
On(ADMilk,Bar2) 您好,机器人服务员!请问能帮我拿一下AD钙奶,放到另一个吧台位置吗?谢谢!
|
||||
On(ADMilk,Table1) 请将AD钙奶放在第一桌的指定位置。
|
||||
On(ADMilk,Table1) 请把AD钙奶放在第一桌的位置。
|
||||
On(ADMilk,Table2) 请将AD钙奶放在第二桌的位置。
|
||||
On(ADMilk,Table2) 请把AD钙奶放在第二桌的位置。
|
||||
On(ADMilk,Table3) 您好,机器人服务员!请问能帮我将AD钙奶放到第三张桌子的位置吗?谢谢!
|
||||
On(ADMilk,Table3) 请帮我取一份AD钙奶,放至第三桌。
|
||||
On(MilkDrink,Bar) 请将牛奶饮料放在吧台那个位置。
|
||||
On(MilkDrink,Bar) 请帮我拿一罐牛奶饮料放到吧台的位置。
|
||||
On(MilkDrink,WaterTable) 请将牛奶饮料放在茶水桌那个位置。
|
||||
On(MilkDrink,WaterTable) 请帮我递一下牛奶饮料,放到茶水桌的位置。
|
||||
On(MilkDrink,CoffeeTable) 请将牛奶饮料放在咖啡桌上的指定位置。
|
||||
On(MilkDrink,CoffeeTable) 请将牛奶饮料放在我的咖啡桌上。
|
||||
On(MilkDrink,Bar2) 请将牛奶饮料放在另一个酒吧台的位置。
|
||||
On(MilkDrink,Bar2) 您好,机器人服务员!请问能否帮我拿一下牛奶饮料,并将其放在另一个吧台位置?谢谢!
|
||||
On(MilkDrink,Table1) 请将牛奶饮料放在第一桌的指定位置。
|
||||
On(MilkDrink,Table1) 请将牛奶饮料拿到第一桌。
|
||||
On(MilkDrink,Table2) 请将牛奶饮料放在第二桌的位置上。
|
||||
On(MilkDrink,Table2) 请给我拿一罐牛奶饮料,放在第二桌的位置。
|
||||
On(MilkDrink,Table3) 请将牛奶饮料放在第三桌的具体位置。
|
||||
On(MilkDrink,Table3) 请给我拿一罐牛奶饮料,放到第三张桌子的位置。
|
||||
On(Milk,Bar) 请将牛奶放在吧台那个地方。
|
||||
On(Milk,Bar) 请把牛奶拿到吧台。
|
||||
On(Milk,WaterTable) 请将牛奶放在茶水桌那个位置。
|
||||
On(Milk,WaterTable) 请将牛奶放在茶水桌附近。
|
||||
On(Milk,CoffeeTable) 请将牛奶放在咖啡桌上的指定位置。
|
||||
On(Milk,CoffeeTable) 请把牛奶放在我的咖啡桌上。
|
||||
On(Milk,Bar2) 请将牛奶放在另一个酒吧台的位置上。
|
||||
On(Milk,Bar2) 请将牛奶拿到另一个吧台位置。
|
||||
On(Milk,Table1) 请将牛奶放在第一桌的位置上。
|
||||
On(Milk,Table1) 请把牛奶放在第一桌的位置上。
|
||||
On(Milk,Table2) 请将牛奶放在第二桌那个位置。
|
||||
On(Milk,Table2) 请给我拿一罐牛奶,放的第二张桌子上。
|
||||
On(Milk,Table3) 您好,我需要您将牛奶放在第三张桌子的位置。谢谢!
|
||||
On(Milk,Table3) 请给我拿一罐牛奶,放到第三桌子的位置。
|
||||
On(VacuumCup,Bar) 请将我的保温杯放在吧台上的那个位置。
|
||||
On(VacuumCup,Bar) 请将我的保温杯拿到吧台。
|
||||
On(VacuumCup,WaterTable) 请将我的保温杯放在茶水桌那个地方。
|
||||
On(VacuumCup,WaterTable) 请将保温杯拿到茶水桌那里。
|
||||
On(VacuumCup,CoffeeTable) 请将保温杯放置在咖啡桌上的指定位置。
|
||||
On(VacuumCup,CoffeeTable) 请把保温杯放在咖啡桌附近。
|
||||
On(VacuumCup,Bar2) 请将我的保温杯放在另一个酒吧台上的那个位置。
|
||||
On(VacuumCup,Bar2) 请帮我把保温杯拿到另一个吧台位置。
|
||||
On(VacuumCup,Table1) 请将保温杯放在第一桌的指定位置。
|
||||
On(VacuumCup,Table1) 请把保温杯拿到第一桌子的位置。
|
||||
On(VacuumCup,Table2) 请将保温杯放在第二桌的具体位置。
|
||||
On(VacuumCup,Table2) 请帮我递一个保温杯到第二桌。
|
||||
On(VacuumCup,Table3) 请将保温杯放在第三桌的指定位置。
|
||||
On(VacuumCup,Table3) 请把保温杯拿到第三桌的位置。
|
||||
Is(AC,0) 当然可以,请问需要我为您执行这个操作吗?
|
||||
Is(AC,1) 您好!请问您需要我为您打开空调吗?
|
||||
Is(ACTemperature,0) 尊敬的服务员,可以请您把空调温度调高一些吗?谢谢!
|
||||
Is(ACTemperature,1) 尊敬的服务员,能否请您将空调温度调低一些呢?
|
||||
Is(HallLight,0) 当然可以,请您稍等,我这就帮您关闭大厅灯。
|
||||
Is(HallLight,1) 您好!请问您需要我为您做些什么呢?
|
||||
Is(TubeLight,0) 尊敬的服务员,请问你能把筒灯调暗一些吗?
|
||||
Is(TubeLight,1) 您好,请问您需要我帮您打开筒灯吗?
|
||||
Is(Curtain,0) 您好,我能为您做什么?
|
||||
Is(Curtain,1) 您好,请问您需要我帮您打开窗帘吗?
|
||||
Is(Chairs,0) 您好!请问需要我为您做什么?
|
||||
Is(Chairs,1) 您好,请问能帮我清理一下座位上的灰尘吗?
|
||||
Is(Floor,0) 抱歉,我理解您的意思了。请问需要我帮忙做些什么来清理地板呢?
|
||||
Is(Floor,1) 请问你能帮我打扫一下地板吗?
|
||||
Is(Table1,0) 您好,请问需要我帮助您做什么呢?如果您需要我清理桌子的灰尘或者污渍,麻烦您告诉我哪一张桌子需要清洁。
|
||||
Is(Table1,1) 请帮我清理一下这张桌子的灰尘和垃圾。
|
||||
Holding(Softdrink) 您好,我是您的机器人服务员。请问您需要什么帮助呢?
|
||||
Holding(Softdrink) 您好,我是一个机器人服务员。请问您需要什么帮助?如果您想要点软饮料,您可以告诉我您的喜好,我会为您推荐一些适合的选项。
|
||||
Holding(BottledDrink) 您好,请问您需要什么帮助?我会尽力满足您的需求。
|
||||
Holding(BottledDrink) 您好,我是一名机器人服务员。请问您需要我帮忙拿着一瓶装饮料吗?
|
||||
Holding(Yogurt) 您好,我可以帮助您点餐和回答问题。请问您需要什么食物或饮料?
|
||||
Holding(Yogurt) 请问你能一直帮我拿着这个酸奶吗?
|
||||
Holding(ADMilk) 你好,尊敬的服务员!能否帮我抓住AD钙奶并递给我呢?
|
||||
Holding(ADMilk) 您好,我无法长时间拿着 AD 钙奶。作为一个机器人服务员,我的任务是帮助您解决问题和回答问题,而不是提供物理服务。如果您需要AD钙奶,我可以告诉您在哪里可以找到它,或者指导您如何自己获取它。
|
||||
Holding(MilkDrink) 您好!请问有什么我可以帮您的吗?
|
||||
Holding(MilkDrink) 您好,我是您的机器人服务员。请问您需要我为您一直拿着这杯牛奶饮料吗?
|
||||
Holding(Milk) 你好,尊敬的服务员,能帮我拿一下牛奶吗?
|
||||
Holding(Milk) 请问你能一直拿着牛奶吗?
|
||||
Holding(VacuumCup) 您好,请问您需要什么帮助?我可以为您提供服务。
|
||||
Holding(VacuumCup) 您好,我是一名AI机器人,无法直接为您拿保温杯。但是,我可以为您提供购买保温杯的建议,或者推荐其他相关商品。请问您需要什么帮助吗?
|
||||
Holding(Nothing) 抱歉,我需要更多的信息来理解您的请求。请问您能告诉我您具体想要什么帮助吗?我会尽力回答您的问题。
|
||||
Holding(Nothing) 请问您能一直拿着无所事事吗?
|
||||
On(Coffee,Bar) 您好,我需要一杯咖啡,并希望它能够被送到吧台。
|
||||
On(Coffee,Bar) 请帮我准备一杯咖啡,然后把咖啡端到吧台这里。
|
||||
On(Coffee,WaterTable) 您好!请问您能帮我制作一杯咖啡并将其端到茶水桌 here 吗?谢谢!
|
||||
On(Coffee,WaterTable) 请帮我准备一杯咖啡,然后将它端到茶水桌旁边。
|
||||
On(Coffee,CoffeeTable) 当然可以,请问您想喝什么类型的咖啡呢?
|
||||
On(Coffee,CoffeeTable) 请帮我准备一杯咖啡,然后将它端到这个咖啡桌上来。
|
||||
On(Coffee,Bar2) 您好,机器人服务员!请问您能帮我制作一杯咖啡,然后把咖啡端到这个吧台这里来吗?谢谢!
|
||||
On(Coffee,Bar2) 请帮我准备一杯咖啡,然后把咖啡端到这个吧台这里。
|
||||
On(Coffee,Table1) 您好,我是一名人工智能助手。请问您需要什么帮助?
|
||||
On(Coffee,Table1) 请给我一杯咖啡,并将其放在第一桌子上。
|
||||
On(Coffee,Table2) 您好,机器人服务员!我想要一杯咖啡,并且希望它能够被送到第二张桌子上。
|
||||
On(Coffee,Table2) 请为我准备一杯咖啡,并将其送到第二桌。
|
||||
On(Coffee,Table3) 您好!请问您能否帮我制作一杯咖啡,然后把咖啡端到第三张桌子上呢?谢谢!
|
||||
On(Coffee,Table3) 请为我准备一杯咖啡,并将其送到第三张桌子上。
|
||||
On(Water,Bar) 您好,我需要一杯水,并且希望它能够被端到吧台那里。
|
||||
On(Water,Bar) 请为我准备一杯水,并将其送到吧台。
|
||||
On(Water,WaterTable) 您好,我需要一杯水,并希望您能将其端到茶水桌这里。
|
||||
On(Water,WaterTable) 请为我送一杯水,并将其放在茶水桌上。
|
||||
On(Water,CoffeeTable) 您好,我是一名机器人服务员。请问您需要一杯水,我可以为您制作并在准备好后将其端到咖啡桌旁边。
|
||||
On(Water,CoffeeTable) 请给我一杯水,并将其递送到我的咖啡桌上。
|
||||
On(Water,Bar2) 您好,机器人服务员!请问你能帮我制作一杯水,然后将其端到距离这里较远的另一个吧台吗?谢谢!
|
||||
On(Water,Bar2) 请给我倒一杯水,然后把水端到这个吧台这里。
|
||||
On(Water,Table1) 您好,我需要一杯水,并希望它能够被送到我所在的桌子上。
|
||||
On(Water,Table1) 请为我准备一杯水,并将其送到这张桌子的位置上。
|
||||
On(Water,Table2) 您好,我需要一杯水,并希望你能将它端到第二张桌子上。
|
||||
On(Water,Table2) 请给我倒一杯水,并把水杯端到第二桌子上。
|
||||
On(Water,Table3) 您好,机器人服务员!请问能否为您制作一杯水,并将其送到第三张桌子呢?
|
||||
On(Water,Table3) 请为我准备一杯水,并将其送到第三桌。
|
||||
On(Dessert,Bar) 您好,我需要点心和甜品。请帮我制作一下,然后把它们带到吧台来。
|
||||
On(Dessert,Bar) 您好,我可以帮您点一些点心或甜品,然后将它们送到吧台。请问您想点什么?
|
||||
On(Dessert,WaterTable) 您好,我需要点心和甜品,并将它们端到茶水桌 here。
|
||||
On(Dessert,WaterTable) 请为我准备一些点心或甜品,并将其递送到我的茶水桌子上。
|
||||
On(Dessert,CoffeeTable) 您好,我是一个人工智能助手,虽然我不能直接为您制作点心或甜品,但我可以帮助您找到附近的餐厅或店铺,为您推荐美味的点心或甜品,您可以品尝一下。如果您有其他需要帮助的地方,也请随时告诉我。
|
||||
On(Dessert,CoffeeTable) 请为我准备一些点心或甜品,然后将其放置在咖啡桌附近。
|
||||
On(Dessert,Bar2) 您好,我需要点心和甜品。请问您能帮我制作吗?然后把它们端到这里来。谢谢!
|
||||
On(Dessert,Bar2) 请帮我点一份点心或甜品,然后把它端到另一个吧台那里。
|
||||
On(Dessert,Table1) 您好,我是一位AI助手,无法直接为您制作点心或甜品。但我可以为您推荐菜单上的点心或甜品,或者帮您下单购买。请问您需要什么帮助?
|
||||
On(Dessert,Table1) 请帮我点一些点心或甜品,并把它们放在这张桌子上。
|
||||
On(Dessert,Table2) 您好,机器人服务员!我需要点心和甜品,可以帮我制作吗?把它们送到第二桌来,谢谢!
|
||||
On(Dessert,Table2) 您好,请问有什么我可以帮您的吗?您可以点一些点心或甜品,然后告诉我放在哪一张桌子上,我会马上为您送过去。
|
||||
On(Dessert,Table3) 您好,我需要点心和甜品,请把它们送到第三桌。
|
||||
On(Dessert,Table3) 您好,机器人服务员!请问您能帮我点些点心或甜品吗?我要把它们送到第三桌。
|
||||
At(Robot,Bar) 您好,机器人服务员!请问您能带路来到 Bar 吗?我想要一杯饮料和一些小吃。谢谢!
|
||||
At(Robot,Bar) 请帮我前往Bar。
|
||||
At(Robot,Bar) 请问你能带我前往Bar位置吗?
|
||||
At(Robot,WaterTable) 请帮我找到WaterTable。
|
||||
At(Robot,WaterTable) 您好,机器人服务员!请问您能帮我订一张去WaterTable的桌子吗?
|
||||
At(Robot,WaterTable) 当然可以!请问您需要我向WaterTable位置发送消息吗?
|
||||
At(Robot,CoffeeTable) 请把咖啡机移到CoffeeTable附近。
|
||||
At(Robot,CoffeeTable) 请前往CoffeeTable。
|
||||
At(Robot,CoffeeTable) 您好,我是一名人工智能助手,请问有什么我可以帮您的?
|
||||
At(Robot,Bar2) 您好,我需要去Bar2。
|
||||
At(Robot,Bar2) 您好,机器人服务员,请问您能帮我前往Bar2吗?
|
||||
At(Robot,Bar2) 您好,我是一名AI助手,无法移动到特定的位置。但我会尽力为您提供帮助。您想前往Bar2吗?如果有其他问题,欢迎随时告诉我。
|
||||
At(Robot,Table1) 请把菜单送到Table 1。
|
||||
At(Robot,Table1) 请前往Table1。
|
||||
At(Robot,Table1) 您好,我能前往Table1位置吗?
|
||||
At(Robot,Table2) 请带领我到Table 2。
|
||||
At(Robot,Table2) 请前往Table2。
|
||||
At(Robot,Table2) 您好!请问您需要我前往Table2位置吗?
|
||||
At(Robot,Table3) 请把服务生叫来Table 3。
|
||||
At(Robot,Table3) 请去Table3。
|
||||
At(Robot,Table3) 您好,我需要您前往Table3位置。
|
||||
On(Softdrink,Bar) 请将Softdrink放在Bar那个位置。
|
||||
On(Softdrink,Bar) 请把Softdrink拿到Bar位置。
|
||||
On(Softdrink,WaterTable) 您好,机器人服务员!请问能帮我将Softdrink放在WaterTable的位置上吗?谢谢!
|
||||
On(Softdrink,WaterTable) 请把Softdrink拿到WaterTable的位置。
|
||||
On(Softdrink,CoffeeTable) 请将Softdrink放在CoffeeTable那个位置。
|
||||
On(Softdrink,CoffeeTable) 请将Softdrink拿到CoffeeTable的位置。
|
||||
On(Softdrink,Bar2) 您好,机器人服务员!请问能否帮我放一下Softdrink到Bar2的位置呢?谢谢!
|
||||
On(Softdrink,Bar2) 请把Softdrink拿到Bar2的位置。
|
||||
On(Softdrink,Table1) 请将Softdrink放在Table1的位置。
|
||||
On(Softdrink,Table1) 请把Softdrink拿到Table 1的位置。
|
||||
On(Softdrink,Table2) 您好,机器人服务员!请将Softdrink放在Table 2的位置。谢谢!
|
||||
On(Softdrink,Table2) 请将Softdrink拿到Table 2的位置。
|
||||
On(Softdrink,Table3) 您好,机器人服务员!请问能否将Softdrink放在Table3的位置上?
|
||||
On(Softdrink,Table3) 请将Softdrink拿到Table 3的位置。
|
||||
On(BottledDrink,Bar) 请将瓶装饮料放在酒吧那个位置。
|
||||
On(BottledDrink,Bar) 请将瓶装饮料送到酒吧区域。
|
||||
On(BottledDrink,WaterTable) 请将瓶装饮料放在水桌那个位置。
|
||||
On(BottledDrink,WaterTable) 请把瓶装饮料拿到水桌的位置。
|
||||
On(BottledDrink,CoffeeTable) 请将瓶装饮料放在咖啡桌那个位置。
|
||||
On(BottledDrink,CoffeeTable) 请把瓶装饮料放在咖啡桌的位置。
|
||||
On(BottledDrink,Bar2) 请将瓶装饮料放在 Bar 2 的位置。
|
||||
On(BottledDrink,Bar2) 请把瓶装饮料送到酒吧2号位置。
|
||||
On(BottledDrink,Table1) 您好,机器人服务员!请将瓶装饮料放在Table1的位置上。谢谢!
|
||||
On(BottledDrink,Table1) 请将瓶装饮料拿到Table 1的位置。
|
||||
On(BottledDrink,Table2) 请将Bottled Drink放在Table 2的位置。
|
||||
On(BottledDrink,Table2) 请把瓶装饮料送到Table2位置。
|
||||
On(BottledDrink,Table3) 请将瓶装饮料放在Table3的位置上。
|
||||
On(BottledDrink,Table3) 请把瓶装饮料拿到Table3的位置。
|
||||
On(Yogurt,Bar) 您好,请问您需要将酸奶放在哪个位置?
|
||||
On(Yogurt,Bar) 请把Yogurt送到Bar位置。
|
||||
On(Yogurt,WaterTable) 请将Yogurt放在WaterTable的位置上。
|
||||
On(Yogurt,WaterTable) 请把Yogurt送到WaterTable位置。
|
||||
On(Yogurt,CoffeeTable) 请将Yogurt放在CoffeeTable那个位置。
|
||||
On(Yogurt,CoffeeTable) 请把Yogurt送到CoffeeTable那里。
|
||||
On(Yogurt,Bar2) 您好,机器人服务员!请帮我将酸奶(Yogurt)放在 Bar2 的位置上。谢谢!
|
||||
On(Yogurt,Bar2) 请将Yogurt送到Bar2位置。
|
||||
On(Yogurt,Table1) 您好,机器人服务员!请将酸奶(Yogurt)放到Table1的位置上。谢谢!
|
||||
On(Yogurt,Table1) 请将Yogurt拿到Table 1的位置。
|
||||
On(Yogurt,Table2) 请将 Yogurt 放在 Table2 的那个位置。
|
||||
On(Yogurt,Table2) 请将 Yogurt 拿到 Table 2 的位置。
|
||||
On(Yogurt,Table3) 您好,请问可以帮我将Yogurt放在Table3的位置吗?
|
||||
On(Yogurt,Table3) 请将Yogurt放在Table 3的位置上。
|
||||
On(ADMilk,Bar) 请将AD Milk放在Bar位置。
|
||||
On(ADMilk,Bar) 请把ADMilk拿到Bar位置。
|
||||
On(ADMilk,WaterTable) 请将AD Milk放在 WaterTable 的那个位置。
|
||||
On(ADMilk,WaterTable) 您好,请问能帮我拿一下ADMilk到WaterTable的位置吗?
|
||||
On(ADMilk,CoffeeTable) 您好,我需要您将ADMilk放在CoffeeTable那个位置。
|
||||
On(ADMilk,CoffeeTable) 请将AD Milk拿到Coffee Table的位置。
|
||||
On(ADMilk,Bar2) 请将AD Milk放置在Bar 2的位置。
|
||||
On(ADMilk,Bar2) 请把ADMilk拿到Bar2位置。
|
||||
On(ADMilk,Table1) 请将ADMilk放到Table1的位置。
|
||||
On(ADMilk,Table1) 请将ADMilk搬到Table1的位置。
|
||||
On(ADMilk,Table2) 请将ADMilk放在Table2的位置。
|
||||
On(ADMilk,Table2) 请把ADMilk搬到Table2的位置。
|
||||
On(ADMilk,Table3) 请将ADMilk放在Table3的位置。
|
||||
On(ADMilk,Table3) 您好,服务员!能帮我拿一下ADMilk到Table3位置吗?
|
||||
On(MilkDrink,Bar) 请将牛奶饮料放在吧台那个位置。
|
||||
On(MilkDrink,Bar) 请把牛奶饮料拿到酒吧位置。
|
||||
On(MilkDrink,WaterTable) 请将牛奶饮料放在水桌那个位置。
|
||||
On(MilkDrink,WaterTable) 请把牛奶饮料拿到水 table 位置。
|
||||
On(MilkDrink,CoffeeTable) 请将牛奶饮料放在咖啡桌那个位置。
|
||||
On(MilkDrink,CoffeeTable) 请将牛奶饮料递送到咖啡桌位置。
|
||||
On(MilkDrink,Bar2) 请将牛奶饮料放在吧台2的位置。
|
||||
On(MilkDrink,Bar2) 请把牛奶饮料递送到酒吧2号位置。
|
||||
On(MilkDrink,Table1) 请将牛奶饮料放在Table1的位置上。
|
||||
On(MilkDrink,Table1) 请把牛奶饮料拿到Table1的位置。
|
||||
On(MilkDrink,Table2) 请将牛奶饮料放到桌子2的位置。
|
||||
On(MilkDrink,Table2) 请把牛奶饮料送到Table2位置。
|
||||
On(MilkDrink,Table3) 请将牛奶饮料放在桌3的位置。
|
||||
On(MilkDrink,Table3) 请将牛奶饮料拿到 table 3 的位置。
|
||||
On(Milk,Bar) 请将牛奶放在酒吧那个位置。
|
||||
On(Milk,Bar) 请把牛奶拿到酒吧位置。
|
||||
On(Milk,WaterTable) 请将牛奶放在水 table 的那个位置。
|
||||
On(Milk,WaterTable) 请把牛奶拿到 WaterTable 那里。
|
||||
On(Milk,CoffeeTable) 请将牛奶放在咖啡桌上的指定位置。
|
||||
On(Milk,CoffeeTable) 请把牛奶拿到咖啡桌的位置。
|
||||
On(Milk,Bar2) 请将牛奶放在 Bar2 的位置。
|
||||
On(Milk,Bar2) 请把牛奶放到Bar2的位置。
|
||||
On(Milk,Table1) 您好,机器人服务员!请将牛奶放在Table1的位置。
|
||||
On(Milk,Table1) 请把牛奶拿到Table1的位置。
|
||||
On(Milk,Table2) 请将牛奶放在Table2的位置。
|
||||
On(Milk,Table2) 请把牛奶放在Table2的位置上。
|
||||
On(Milk,Table3) 请将牛奶放在Table3的位置上。
|
||||
On(Milk,Table3) 请把牛奶拿到Table3的位置。
|
||||
On(VacuumCup,Bar) 请将VacuumCup放置在Bar位置。
|
||||
On(VacuumCup,Bar) 请把VacuumCup放到Bar位置。
|
||||
On(VacuumCup,WaterTable) 请将VacuumCup放置在WaterTable上。
|
||||
On(VacuumCup,WaterTable) 请把VacuumCup放到WaterTable的位置。
|
||||
On(VacuumCup,CoffeeTable) 请将VacuumCup放在CoffeeTable那个地方。
|
||||
On(VacuumCup,CoffeeTable) 请把VacuumCup放到CoffeeTable上。
|
||||
On(VacuumCup,Bar2) 请将VacuumCup放置在Bar2的位置上。
|
||||
On(VacuumCup,Bar2) 请把VacuumCup移到Bar2的位置。
|
||||
On(VacuumCup,Table1) 请将VacuumCup放置在Table1的位置上。
|
||||
On(VacuumCup,Table1) 请把VacuumCup移到Table1的位置。
|
||||
On(VacuumCup,Table2) 请将VacuumCup放到Table2的位置。
|
||||
On(VacuumCup,Table2) 请把VacuumCup放到Table2的位置。
|
||||
On(VacuumCup,Table3) 请将VacuumCup放置在Table3的位置上。
|
||||
On(VacuumCup,Table3) 请将VacuumCup移至Table3位置。
|
||||
Is(AC,0) 请问你能帮我关掉AC吗?
|
||||
Is(AC,1) 请问你能帮我打开空调吗?
|
||||
Is(ACTemperature,0) 尊敬的服务员,请问您能否将温度调高一些呢?
|
||||
Is(ACTemperature,1) 请问你能将咖啡厅的温度调低一些吗?
|
||||
Is(HallLight,0) 当然可以,请问需要我使用哪个开关来关闭HallLight呢?
|
||||
Is(HallLight,1) 您好!请问您需要我帮助您开启还是关闭HallLight呢?
|
||||
Is(TubeLight,0) 当然可以,请问您需要我使用哪个遥控器来关闭它呢?
|
||||
Is(TubeLight,1) 您好,机器人服务员!请问您能帮我打开一下 tube light 吗?谢谢!
|
||||
Is(Curtain,0) 请问你能把窗帘关上吗?
|
||||
Is(Curtain,1) 请问你能把窗户帘打开一下吗?
|
||||
Is(Chairs,0) 您好,请问您需要我帮助清理座位上的污渍吗?
|
||||
Is(Chairs,1) 您好,我是您的顾客。我想请问您是否能帮我清理一下座位上的灰尘和垃圾?
|
||||
Is(Floor,0) 您好,我能为您做些什么呢?如果您需要我帮忙打扫地板,请告诉我哪里需要清理,我会尽快为您处理。
|
||||
Is(Floor,1) 您好,我需要您帮助打扫一下地板。
|
||||
Is(Table1,0) 您好!请问您需要我为您做什么呢?如果您需要我清理Table1,请您告诉我需要使用什么清洁用品,我会按照您的指示进行操作。
|
||||
Is(Table1,1) 您好,请问需要我帮您打扫Table1吗?
|
||||
Holding(Softdrink) 您好,我是一款人工智能助手,无法直接与现实世界进行交互。但我可以为您提供有关如何抓饮料的信息。您可以尝试用手指将Softdrink抓在手中。如果您需要更多帮助,请随时告诉我。
|
||||
Holding(Softdrink) 您好,我是您的机器人服务员。我能帮您拿住Softdrink吗?
|
||||
Holding(BottledDrink) 我能帮我拿起那瓶饮料吗?
|
||||
Holding(BottledDrink) 您好!请问您需要我帮您一直拿着这瓶饮料吗?
|
||||
Holding(Yogurt) 请问你能帮我拿一下 yogurt 吗?
|
||||
Holding(Yogurt) 您好,我可以帮助您更好地理解和使用我们的服务。请问您需要我为您拿取什么商品呢?
|
||||
Holding(ADMilk) 你能帮我拿一下AD Milk吗?
|
||||
Holding(ADMilk) 您好,我需要点一杯AD Milk。麻烦您能帮我拿一下吗?
|
||||
Holding(MilkDrink) 我想要一杯牛奶饮料,能帮我把它端过来吗?
|
||||
Holding(MilkDrink) 我需要你一直拿着牛奶饮料。
|
||||
Holding(Milk) 您好,请问有什么我可以帮助您的?
|
||||
Holding(Milk) 您好,我是您的机器人服务员。请问有什么我可以帮助您的吗?
|
||||
Holding(VacuumCup) 您好!请问您需要什么帮助?
|
||||
Holding(VacuumCup) 您好!请问您需要我帮助您一直拿着VacuumCup吗?
|
||||
Holding(Nothing) 你能帮我把"Nothing"拿在手里吗?
|
||||
Holding(Nothing) 您好!作为您的机器人服务员,我会尽力满足您的要求。请问您需要我帮忙做什么呢?
|
||||
On(Coffee,Bar) 当然可以!请问您想要什么口味的咖啡呢?
|
||||
On(Coffee,Bar) 请给我一杯咖啡,并将其送到吧台。
|
||||
On(Coffee,WaterTable) 当然可以,请告诉我您想喝的咖啡口味,我会为您制作一杯美味的咖啡,然后将其送到WaterTable桌旁。
|
||||
On(Coffee,WaterTable) 请给我一杯咖啡,并将其送到 WaterTable 那里。
|
||||
On(Coffee,CoffeeTable) 您好,我是一名机器人服务员。我能为您制作一杯咖啡,并将其端到CoffeeTable上吗?
|
||||
On(Coffee,CoffeeTable) 请给我一杯咖啡,并把它送到Coffee Table那里。
|
||||
On(Coffee,Bar2) 当然可以,请告诉我您想要什么口味的咖啡,我会为您制作并在准备好后把咖啡端到Bar 2。
|
||||
On(Coffee,Bar2) 请给我一杯咖啡,并将其送到Bar2。
|
||||
On(Coffee,Table1) 当然可以!请问您需要什么口味的咖啡呢?
|
||||
On(Coffee,Table1) 请给我一杯咖啡,并将其送到Table1。
|
||||
On(Coffee,Table2) 您好,机器人服务员!我想要一杯咖啡,并希望它能够被送到 Table 2。
|
||||
On(Coffee,Table2) 请为我准备一杯咖啡,并将其送到Table 2。
|
||||
On(Coffee,Table3) 您好,机器人服务员!请问您能帮我制作一杯咖啡,然后将其端到Table 3吗?谢谢!
|
||||
On(Coffee,Table3) 请为我准备一杯咖啡,并将其送到Table 3。
|
||||
On(Water,Bar) 您好,我需要一杯水,请能帮我制作并送到酒吧处谢谢!
|
||||
On(Water,Bar) 我需要一杯水,并希望它能够被送到酒吧区域。
|
||||
On(Water,WaterTable) 您好,我需要一杯水,并将它送到水桌子上。
|
||||
On(Water,WaterTable) 请为我准备一些水,并将其送到水桌 here。
|
||||
On(Water,CoffeeTable) 您好,我需要一杯水,并将它送到咖啡桌 here。
|
||||
On(Water,CoffeeTable) 请给我倒一杯水,然后将其放在咖啡桌子上。
|
||||
On(Water,Bar2) 当然可以!请问您在哪个咖啡厅?我想请您把水送到 Bar 2。
|
||||
On(Water,Bar2) 我需要一杯水,并希望它能够被送到Bar2那里。
|
||||
On(Water,Table1) 您好,我是一名机器人服务员。请问您需要什么帮助?
|
||||
On(Water,Table1) 请给我一杯水,并将其送到Table1位置。
|
||||
On(Water,Table2) 当然可以!请问您需要什么温度的水呢?并且您想要在哪个桌子上 receiving 水呢?
|
||||
On(Water,Table2) 请给我倒一杯水,并把水送到Table 2那里。
|
||||
On(Water,Table3) 您好,机器人服务员!请问您能给我准备一杯水,然后将其送到 Table 3 位置吗?谢谢!
|
||||
On(Water,Table3) 请给我倒一杯水,并将其送到 Table 3 桌子上。
|
||||
On(Dessert,Bar) 您好,我需要一份甜点并将其送到吧台。
|
||||
On(Dessert,Bar) 请送一些甜点来,并将其送到吧台处。
|
||||
On(Dessert,WaterTable) 您好,我需要一份甜点,并希望它能够被送到名为"WaterTable"的水 table 那里。
|
||||
On(Dessert,WaterTable) 请为我准备一些甜点,并将它送到watertable来。
|
||||
On(Dessert,CoffeeTable) 您好,我是一名机器人服务员。我能为您制作甜点,并将其送到咖啡桌旁边。请问您想点什么类型的甜点呢?
|
||||
On(Dessert,CoffeeTable) 请为我准备一些甜点,并将其送到咖啡桌这里。
|
||||
On(Dessert,Bar2) 您好,我需要一份甜点,并希望它能够被送到酒吧2。
|
||||
On(Dessert,Bar2) 请为我准备一些甜点,并将其送到Bar2。
|
||||
On(Dessert,Table1) 您好,机器人服务员!我想要一份甜点,并希望它能够被送到Table1那里。
|
||||
On(Dessert,Table1) 请为我准备一些甜点,并将其送到Table1。
|
||||
On(Dessert,Table2) 您好,我是一名机器人服务员。我能为您制作甜点并将它送到Table 2吗?
|
||||
On(Dessert,Table2) 请给我上甜点,并将它送到Table2那里。
|
||||
On(Dessert,Table3) 您好,机器人服务员!请问您能帮我制作一份甜点并将其送到Table 3吗?
|
||||
On(Dessert,Table3) 请为我准备一些甜点,并将其送到Table3桌子上。
|
|
@ -0,0 +1,388 @@
|
|||
At(Robot,Bar) 嘿,来酒吧了啊?
|
||||
At(Robot,Bar) 你可以去前台一下吗?
|
||||
At(Robot,Bar) 当然可以,我可以过去帮忙吗?
|
||||
At(Robot,WaterTable) 哎呀,你终于出现了啊!赶紧过来坐一下,我给你倒杯茶水。
|
||||
At(Robot,WaterTable) 嘿,你能帮我再去茶水桌那儿拿一下水吗?
|
||||
At(Robot,WaterTable) 当然可以啊,我马上就去茶水桌那儿。
|
||||
At(Robot,CoffeeTable) 哎呀,你终于出现了啊!赶紧过来坐一下,我给你倒杯咖啡。
|
||||
At(Robot,CoffeeTable) 你可以去 coffee table 一下哦。
|
||||
At(Robot,CoffeeTable) 当然可以呀!你可以去咖啡桌的那边坐下来,我就在这边的桌子旁陪着你。
|
||||
At(Robot,Bar2) 好的,我可以到另一个吧台帮忙吗?
|
||||
At(Robot,Bar2) 你可以去另一个酒吧台坐坐吗?
|
||||
At(Robot,Bar2) 当然可以,您想让我去哪个吧台呢?
|
||||
At(Robot,Table1) 好的,我來試著把第一張桌子搬起來。
|
||||
At(Robot,Table1) 你可以去第一桌啊,那里的东西比较好吃。
|
||||
At(Robot,Table1) 当然可以,你可以帮我稳住身体,然后我就能过去坐在第一张桌子上啦!
|
||||
At(Robot,Table2) 请把第二桌子的东西拿过来。
|
||||
At(Robot,Table2) 你可以去第二桌啊。
|
||||
At(Robot,Table2) 当然可以,你想去哪一张桌子呢?
|
||||
At(Robot,Table3) 好的,我马上去拿第三张桌子。
|
||||
At(Robot,Table3) 请你到第三桌子上坐一下。
|
||||
At(Robot,Table3) 当然可以,移到第三张桌子那边怎么样?
|
||||
On(Softdrink,Bar) 请把饮料放到酒吧柜台上。
|
||||
On(Softdrink,Bar) 嘿,能帮我拿一下饮料吗?放到酒吧台上谢谢!
|
||||
On(Softdrink,WaterTable) 你可以把软饮放在茶水桌那个地方哦。
|
||||
On(Softdrink,WaterTable) 你可以把饮料放到茶水桌那儿呀。
|
||||
On(Softdrink,CoffeeTable) 你可以把饮料放在咖啡桌那个地方呀。
|
||||
On(Softdrink,CoffeeTable) 你可以把饮料放到咖啡桌附近呀。
|
||||
On(Softdrink,Bar2) 请你把饮料放在另一个酒吧台的位置。
|
||||
On(Softdrink,Bar2) 请帮我从一个酒吧台拿杯饮料,放到另一个酒吧台吧。
|
||||
On(Softdrink,Table1) 请你把饮料放在第一桌的位子上面。
|
||||
On(Softdrink,Table1) 请把饮料放到第一桌的位子上。
|
||||
On(Softdrink,Table2) 请你把饮料放到第二桌那个地方。
|
||||
On(Softdrink,Table2) 请你把饮料放到第二桌的位置。
|
||||
On(Softdrink,Table3) 请你把饮料放到第三桌那个地方。
|
||||
On(Softdrink,Table3) 请给我一瓶饮料,放到第三桌子上。
|
||||
On(BottledDrink,Bar) 请把瓶装饮料放到酒吧那个地方。
|
||||
On(BottledDrink,Bar) 你可以把瓶装饮料放到酒吧台面上。
|
||||
On(BottledDrink,WaterTable) 你可以把瓶装饮料放在茶水桌那个地方呀。
|
||||
On(BottledDrink,WaterTable) 请把瓶装饮料放到茶水桌那儿吧。
|
||||
On(BottledDrink,CoffeeTable) 把瓶装饮料放到咖啡桌那个地方吧。
|
||||
On(BottledDrink,CoffeeTable) 请把瓶装饮料放到咖啡桌附近。
|
||||
On(BottledDrink,Bar2) 请把瓶装饮料放 到另一个酒吧那个地方。
|
||||
On(BottledDrink,Bar2) 你可以把瓶装饮料拿到另一个酒吧台的位置。
|
||||
On(BottledDrink,Table1) 请把瓶装饮料放在第一桌的相应位置。
|
||||
On(BottledDrink,Table1) 请你把瓶装饮料放到第一桌子的位置。
|
||||
On(BottledDrink,Table2) 请你把瓶装饮料放到第二大桌子的那个位置。
|
||||
On(BottledDrink,Table2) 请您把瓶装饮料放到第二桌的位置。
|
||||
On(BottledDrink,Table3) 请把瓶装饮料放到第三桌的那一边。
|
||||
On(BottledDrink,Table3) 请您把瓶装饮料放到第三桌子上。
|
||||
On(Yogurt,Bar) 把酸奶放在吧台那个位置。
|
||||
On(Yogurt,Bar) 请把酸奶放到吧台哦!
|
||||
On(Yogurt,WaterTable) 把酸奶放到茶水桌那个地方哦。
|
||||
On(Yogurt,WaterTable) 你可以把酸奶放到茶水桌附近呀。
|
||||
On(Yogurt,CoffeeTable) 请把酸奶放到咖啡桌那个地方。
|
||||
On(Yogurt,CoffeeTable) 请把酸奶放到咖啡桌附近。
|
||||
On(Yogurt,Bar2) 请你把酸奶放到另一个吧台那个位置。
|
||||
On(Yogurt,Bar2) 请把酸奶放到另一个台子的位置吧。
|
||||
On(Yogurt,Table1) 请把酸奶放在第一桌的位置哦!
|
||||
On(Yogurt,Table1) 请把酸奶放到第一桌的位置。
|
||||
On(Yogurt,Table2) 请把酸奶放到第二桌那个位置哦!
|
||||
On(Yogurt,Table2) 你可以把酸奶放到第二桌的位置呀。
|
||||
On(Yogurt,Table3) 请把酸奶放到第三桌的那儿吧。
|
||||
On(Yogurt,Table3) 请你把酸奶放到第三桌子上。
|
||||
On(ADMilk,Bar) 把AD钙奶放到吧台那个地方。
|
||||
On(ADMilk,Bar) 请把AD钙奶放到吧台哦!
|
||||
On(ADMilk,WaterTable) 好的,我帮你把AD钙奶放到茶水桌那个地方。
|
||||
On(ADMilk,WaterTable) 你可以把AD钙奶放到茶水桌附近呀。
|
||||
On(ADMilk,CoffeeTable) 好的,AD钙奶就放在咖啡桌那个地方吧。
|
||||
On(ADMilk,CoffeeTable) 你可以把AD钙奶放到咖啡桌旁边呀。
|
||||
On(ADMilk,Bar2) 你能否把AD钙奶放到另一个吧台的位置呢?
|
||||
On(ADMilk,Bar2) 你可以把AD钙奶放到另一个酒吧台的位置上。
|
||||
On(ADMilk,Table1) 请把AD钙奶放到第一桌的位子上面。
|
||||
On(ADMilk,Table1) 请把AD钙奶放到第一桌的位置。
|
||||
On(ADMilk,Table2) 请把AD钙奶放到第二桌的那儿吧。
|
||||
On(ADMilk,Table2) 请把AD钙奶放到第二桌的位置。
|
||||
On(ADMilk,Table3) 请把AD钙奶放到第三桌的那儿吧。
|
||||
On(ADMilk,Table3) 请把AD钙奶放到第三桌子的位置。
|
||||
On(MilkDrink,Bar) 把牛奶饮料放到吧台那个地方。
|
||||
On(MilkDrink,Bar) 你可以把牛奶饮料拿到吧台前面。
|
||||
On(MilkDrink,WaterTable) 你可以把牛奶饮料放在茶水桌那个地方哦。
|
||||
On(MilkDrink,WaterTable) 你可以把牛奶饮料放到茶水桌附近呀。
|
||||
On(MilkDrink,CoffeeTable) 你可以把牛奶放到了咖啡桌那个地方哦。
|
||||
On(MilkDrink,CoffeeTable) 请你把牛奶饮料放到咖啡桌附近呀。
|
||||
On(MilkDrink,Bar2) 请你把牛奶饮料放到另一个吧台那个位置,好吗?
|
||||
On(MilkDrink,Bar2) 请把牛奶饮料放到另一个酒吧台的位置。
|
||||
On(MilkDrink,Table1) 请把牛奶放第一桌的位置哦!
|
||||
On(MilkDrink,Table1) 请把牛奶饮料放到第一桌的位子上。
|
||||
On(MilkDrink,Table2) 你可以把牛奶放 到这张桌子的第二個位置。
|
||||
On(MilkDrink,Table2) 请你把牛奶饮料放到第二桌的位置。
|
||||
On(MilkDrink,Table3) 请你把牛奶放到第三桌的那儿吧。
|
||||
On(MilkDrink,Table3) 请你把牛奶饮料放到第三桌子上。
|
||||
On(Milk,Bar) 请把牛奶放到吧台那个地方。
|
||||
On(Milk,Bar) 请把牛奶放到吧台的位置哦。
|
||||
On(Milk,WaterTable) 你可以把牛奶放到茶水桌那个地方哦。
|
||||
On(Milk,WaterTable) 请你把牛奶放到茶水桌那个地方。
|
||||
On(Milk,CoffeeTable) 你可以把牛奶放在咖啡桌上的那个地方哦。
|
||||
On(Milk,CoffeeTable) 你可以把牛奶放到咖啡桌旁边呀,这样就能方便地喝牛奶了。
|
||||
On(Milk,Bar2) 请你把牛奶放到另一个吧台那个位置。
|
||||
On(Milk,Bar2) 你可以把牛奶放过去一点。
|
||||
On(Milk,Table1) 请把牛奶放到第一桌子的位置。
|
||||
On(Milk,Table1) 请你把牛奶放到第一桌的位置。
|
||||
On(Milk,Table2) 请把牛奶放到第二桌子的那个位置哦!
|
||||
On(Milk,Table2) 请你把牛奶放到第二桌的位置。
|
||||
On(Milk,Table3) 你可以把牛奶放 third table 的那个位置哦!
|
||||
On(Milk,Table3) 请把牛奶放到第三桌子上。
|
||||
On(VacuumCup,Bar) 请把保温杯放 到吧台那个地方。
|
||||
On(VacuumCup,Bar) 你可以把保温杯放到吧台哦。
|
||||
On(VacuumCup,WaterTable) 请把保温杯放茶水桌那个地方哦。
|
||||
On(VacuumCup,WaterTable) 请你把保温杯放到茶水桌那儿。
|
||||
On(VacuumCup,CoffeeTable) 你可以把你的保温杯放到咖啡桌那个地方呀。
|
||||
On(VacuumCup,CoffeeTable) 请把保温杯放到咖啡桌那里。
|
||||
On(VacuumCup,Bar2) 你可以把保温杯放到另一个吧台那个地方呀。
|
||||
On(VacuumCup,Bar2) 你可以把保温杯放到另一个酒吧台的位置呀。
|
||||
On(VacuumCup,Table1) 请把保温杯放到第一桌子的那个位置。
|
||||
On(VacuumCup,Table1) 请把保温杯放到第一桌子的位置。
|
||||
On(VacuumCup,Table2) 请把保温杯放到第二桌子的那个位置。
|
||||
On(VacuumCup,Table2) 你可以把保温杯放到第二桌子的地方。
|
||||
On(VacuumCup,Table3) 请把保温杯放到了第三张桌子的那个地方。
|
||||
On(VacuumCup,Table3) 请把保温杯放到第三桌子的地方。
|
||||
Is(AC,0) 当然可以,您想什么时候关呢?
|
||||
Is(AC,1) 当然可以,我马上为您打开空调。
|
||||
Is(ACTemperature,0) 当然可以!你把空调的温度调高一点吗?
|
||||
Is(ACTemperature,1) 可以啊,您要把空调的温度调低一些吗?
|
||||
Is(HallLight,0) 当然可以,我马上为您关掉大厅的灯。
|
||||
Is(HallLight,1) 当然可以,我马上为你开启大厅的灯光。
|
||||
Is(TubeLight,0) 当然可以,你只需按一下筒灯的开关按钮即可。
|
||||
Is(TubeLight,1) 当然可以,请告诉我你想要多亮度的筒灯呢?
|
||||
Is(Curtain,0) 好的,我马上帮您关窗帘。
|
||||
Is(Curtain,1) 当然可以,您想让阳光照进房间吗?
|
||||
Is(Chairs,0) 当然可以,把椅子弄脏一点没问题。不过要注意,我是一个人工智能助手,虽然可以理解您的请求,但实际操作能力有限,可能不能非常完美地完成这个任务。
|
||||
Is(Chairs,1) 当然可以,亲爱的。把椅子擦干净需要一些努力和耐心,但我会帮您做得干干净净的。
|
||||
Is(Floor,0) 你能把地板弄脏一点吗?
|
||||
Is(Floor,1) 能帮我打扫下地板吗?
|
||||
Is(Table1,0) 第一,你可以把桌子弄脏一点。
|
||||
Is(Table1,1) 当然可以,你想要我尽快完成这个任务吗?
|
||||
Holding(Softdrink) 你能抓住软饮吗?
|
||||
Holding(Softdrink) 你能不能一直拿着软饮呢?
|
||||
Holding(BottledDrink) 能抓住瓶装饮料吗?当然可以啊!
|
||||
Holding(BottledDrink) 你能一直拿着瓶装饮料吗?当然可以啊,只要喜欢喝 bottled water 或者饮料,就可以一直拿着瓶装饮料。不过要注意保持卫生,不要让瓶子变得太脏或者有细菌。如果觉得手持瓶装饮料不方便,也可以选择使用杯子或者其他更方便的容器来盛放饮料。
|
||||
Holding(Yogurt) 您可以把酸奶捏在手里,就像您捏着冰淇淋一样。
|
||||
Holding(Yogurt) 嗯,我可以理解你想要一直吃酸奶的想法,但是要注意不要过量食用。酸奶是非常健康的食品,富含蛋白质和钙质,对身体有很多好处。不过,每个人的身体状况和需求不同,所以要根据自己的实际情况来适量食用。如果你想要更好地享受酸奶的好处,可以尝试搭配一些水果或者坚果,让口感更丰富多彩。
|
||||
Holding(ADMilk) 你能捧起一罐AD钙奶吗?
|
||||
Holding(ADMilk) 你能不能一直拿着AD钙奶呀?
|
||||
Holding(MilkDrink) 你能把牛奶饮料抓在手里啊?
|
||||
Holding(MilkDrink) 你能一直拿著牛奶 drink 嗎?
|
||||
Holding(Milk) 哈哈,当然可以啦!你可以把牛奶抓在手里,就像你抓住一个球一样。不过要小心,不要让牛奶洒出来哦!
|
||||
Holding(Milk) 嘿,你可以一直拿着牛奶,不过我得提醒你,牛奶保质期短,不要喝坏掉的哦!
|
||||
Holding(VacuumCup) 你能 hand 住保温杯 吗?
|
||||
Holding(VacuumCup) 你能不能一直拿著保温杯呢?
|
||||
Holding(Nothing) 哈哈,把"nothing"抓在手里啊。这个表达好像不太对哦,英文里"nothing"是指没有任何东西的意思,不能被抓住。你是要问如何应对"无所适从"的情况吗?可以理解为"nothing happens"或者"没有什么事情发生"。
|
||||
Holding(Nothing) 当然可以!如果你觉得需要一直拿着某个东西,那完全可以。
|
||||
On(Coffee,Bar) 当然可以!请问您需要什么口味的咖啡呢?我可以为您制作一杯美味的咖啡,然后端到吧台供您享用。
|
||||
On(Coffee,Bar) 嘿,老板,能不能给我弄杯咖啡,然后把咖啡杯拿到吧台上来?
|
||||
On(Coffee,WaterTable) 当然可以!我马上为您制作一杯香浓的咖啡,然后端到茶水桌上来。
|
||||
On(Coffee,WaterTable) 好的,主人。请给我来杯咖啡,然后把咖啡端到茶水桌这里来。谢谢!
|
||||
On(Coffee,CoffeeTable) 当然可以!我马上为您制作一杯香浓的咖啡,然后端到咖啡桌上来。
|
||||
On(Coffee,CoffeeTable) 好的,主人。请给我一杯咖啡,然后把咖啡端到这个咖啡桌上来,谢谢!
|
||||
On(Coffee,Bar2) 当然可以!我马上为您制作一杯咖啡,然后端到这个吧台这里来。
|
||||
On(Coffee,Bar2) 好的,我给你拿杯咖啡,放在另一个吧台给你。
|
||||
On(Coffee,Table1) 当然可以!我马上为您制作一杯咖啡,然后端到第一张桌子上来。
|
||||
On(Coffee,Table1) 请给我拿杯咖啡,然后把它放到这张桌子的位置上。
|
||||
On(Coffee,Table2) 当然可以!你想要什么口味的咖啡呢?然后我就可以把咖啡端到你所在的桌子了。
|
||||
On(Coffee,Table2) 嘿,老板,我想喝杯咖啡,然后你能把它端到这里来吗?
|
||||
On(Coffee,Table3) 当然可以!请问您需要什么口味的咖啡呢?我好准备给您制作。
|
||||
On(Coffee,Table3) 嘿,老板,能不能给我来杯咖啡?然后把咖啡端到这张桌子的 third 位置上来,谢谢!
|
||||
On(Water,Bar) 当然可以!您可以告诉我您需要多少水,然后我会给您端过来。
|
||||
On(Water,Bar) 好的,我给您倒杯水,然后就放在吧台这里。
|
||||
On(Water,WaterTable) 当然可以!请问您需要我怎么制作水呢?
|
||||
On(Water,WaterTable) 好的,我给你倒杯水,然后把它放在茶水桌上。
|
||||
On(Water,CoffeeTable) 当然可以!我立刻为您制作一杯水,然后把它端到咖啡桌上来。请问您需要加些什么其他的配料呢?
|
||||
On(Water,CoffeeTable) 好的,主人,请给我倒杯水,然后把水端到咖啡桌上来,谢谢!
|
||||
On(Water,Bar2) 当然可以!我马上为您制作一杯水,然后端到这里来。
|
||||
On(Water,Bar2) 好的,请给我倒一杯水,然后把它端到这个吧台这里来。
|
||||
On(Water,Table1) 当然可以!请问你需要多少水呢?我一会儿就去烧开水,然后把它端到第一张桌子上。
|
||||
On(Water,Table1) 好的,我给你倒杯水,然后把它放在第一桌子上。
|
||||
On(Water,Table2) 当然可以!我马上给您拿来。
|
||||
On(Water,Table2) 能不能给我倒杯水啊?然后把水端到这张桌子的另一边去。
|
||||
On(Water,Table3) 当然可以!请您把第三张桌子的位置告诉我,我马上为您制作一杯水送到那儿去。
|
||||
On(Water,Table3) 好的,请给我一杯水,然后把它放在第三张桌子上。
|
||||
On(Dessert,Bar) 当然可以!我特别擅长制作各种美味的点心、甜品和糕点。如果您需要的话,我可以在吧台为您准备一份精致的小点心或甜品品尝。
|
||||
On(Dessert,Bar) 行啊,点些小吃或甜品,然后让它们送到酒吧台这附近来。
|
||||
On(Dessert,WaterTable) 你能不能帮我做些点心或甜品,然后把它端到茶水桌这儿呀?
|
||||
On(Dessert,WaterTable) 好的,请给我点些小吃或甜品,然后把它端到茶水桌这里来。
|
||||
On(Dessert,CoffeeTable) 当然可以!我是一个人工智能助手,虽然不能亲自制作点心或甜品,但我可以为您提供各种食谱和做法。您可以根据我的建议,尝试在家自己制作美味的点心或甜品,然后带到咖啡桌分享。这样不仅可以享受美食,还可以一起度过美好时光。
|
||||
On(Dessert,CoffeeTable) 行啊,您想尝点什么点心或甜品呢?然后我给您端过来,放在这咖啡桌上。
|
||||
On(Dessert,Bar2) 当然可以!我擅长制作各种美味的点心与甜品,可以随时为你端来。请问你需要什么口味或样式的点心呢?
|
||||
On(Dessert,Bar2) 行啊,点些小吃或甜品,然后给您端过去。
|
||||
On(Dessert,Table1) 当然可以,我 ability做点心和甜品,把它们放在桌子上给你吃。
|
||||
On(Dessert,Table1) 好的,我给你准备了一些小吃和甜品,现在 brings it to your table.(请注意,这里用 "brings" 代替 "portrays" 以符合口语化的风格。)
|
||||
On(Dessert,Table2) 当然可以!我可以在第一张桌子上制作点心或甜品,然后把它们端到第二张桌子那里。请问你有什么特别喜欢的点心或甜品口味吗?
|
||||
On(Dessert,Table2) 好的,主人。请给我提供一些点心或甜品,我会把它们放在第二张桌子上。
|
||||
On(Dessert,Table3) 当然可以!我马上为您制作一些美味的点心或甜品,然后 brings it to the third table for you to enjoy.
|
||||
On(Dessert,Table3) 好的,请问您想点什么种类的点心或甜品呢?然后我会把它们端到第三张桌子上。
|
||||
At(Robot,Bar) 好的,那我们来聊聊吧。你想聊什么呢?
|
||||
At(Robot,Bar) 你去一下bar吧。
|
||||
At(Robot,Bar) 你能到那个酒吧的哪个位置吗?
|
||||
At(Robot,WaterTable) 当然可以! WaterTable 是一个很棒的实时水文气象数据平台。你想了解哪个地区的天气情况呢?
|
||||
At(Robot,WaterTable) 你去一下WaterTable吧!
|
||||
At(Robot,WaterTable) 当然可以啊!你想要去哪个地方呢?
|
||||
At(Robot,CoffeeTable) 嘿,我能去拿一下咖啡桌吗?
|
||||
At(Robot,CoffeeTable) 你去一下CoffeeTable吧。
|
||||
At(Robot,CoffeeTable) 当然可以,我马上就到CoffeeTable那儿。
|
||||
At(Robot,Bar2) 好的,我来试试看 Bar 2。
|
||||
At(Robot,Bar2) 你能去bar2吗?
|
||||
At(Robot,Bar2) 当然可以啊,我马上就去Bar2那儿!
|
||||
At(Robot,Table1) 当然可以!请您提供一下 Table1 的内容,我会尽量用更口语化和合理化的方式来表述它。
|
||||
At(Robot,Table1) 嘿,你能不能去一下Table1呢?
|
||||
At(Robot,Table1) 当然可以呀,我马上就过去。
|
||||
At(Robot,Table2) 当然可以!请您提供一下Table2的内容和您想要我为您做什么,我会尽量帮您进行合理的调整和优化。
|
||||
At(Robot,Table2) 好的,我去一下Table2。
|
||||
At(Robot,Table2) 当然可以,我马上就过去。
|
||||
At(Robot,Table3) 当然可以!请问您需要我帮忙做什么呢?
|
||||
At(Robot,Table3) 嘿,去Table3看看怎么样?可能有新东西哦!
|
||||
At(Robot,Table3) 当然可以,我马上就到Table3那儿。
|
||||
On(Softdrink,Bar) 你可以这样跟Bar说:“嘿,Bar,你能帮我把Softdrink放好吗?谢谢!”
|
||||
On(Softdrink,Bar) 请把Softdrink拿到Bar那儿。
|
||||
On(Softdrink,WaterTable) 你可以把软饮放在水桌那个地方哦。
|
||||
On(Softdrink,WaterTable) 你可以把Soft drink拿到水桌的位置呀。
|
||||
On(Softdrink,CoffeeTable) 您可以尝试这样说:“嘿,能否帮我把软饮料放在咖啡桌那个位置呀?”
|
||||
On(Softdrink,CoffeeTable) 你可以把Softdrink拿到CoffeeTable前面啊。
|
||||
On(Softdrink,Bar2) 你可以把软饮放在酒吧2的位置。
|
||||
On(Softdrink,Bar2) 你可以把Softdrink拿到Bar2的位置呀。
|
||||
On(Softdrink,Table1) 你可以把这个软饮料放到表格1的第二行。
|
||||
On(Softdrink,Table1) 请把Softdrink放到Table1的位置上。
|
||||
On(Softdrink,Table2) 你可以把 Softdrink 放到 Table2 的那个位置哦!
|
||||
On(Softdrink,Table2) 你可以把Softdrink移到Table2的位置呀。
|
||||
On(Softdrink,Table3) 你可以把 Softdrink 放到 Table3 的那个位置哦!
|
||||
On(Softdrink,Table3) 你可以把Softdrink拿到Table3那里。
|
||||
On(BottledDrink,Bar) 请你把Bottled Drink放到Bar那个地方。
|
||||
On(BottledDrink,Bar) 请把 bottled drink 拿到 Bar 那里。
|
||||
On(BottledDrink,WaterTable) 你能把 bottled drink 放到 water table 那个地方吗?
|
||||
On(BottledDrink,WaterTable) 你可以把瓶装饮料放到水桌上了吗?
|
||||
On(BottledDrink,CoffeeTable) 将瓶装饮料放在咖啡桌那个地方。
|
||||
On(BottledDrink,CoffeeTable) 你可以把 bottled drink 拿到咖啡桌 (CoffeeTable) 上。
|
||||
On(BottledDrink,Bar2) 你能把 "BottledDrink" 放到 "Bar2" 的位置上吗?
|
||||
On(BottledDrink,Bar2) 请把 bottled drink 拿到 Bar2 的位置。
|
||||
On(BottledDrink,Table1) 你可以把"Bottled Drink"放到"Table1"的位置。
|
||||
On(BottledDrink,Table1) 请你把瓶装饮料拿到Table1那儿。
|
||||
On(BottledDrink,Table2) 你把Bottled Drink放到Table2那个地方吧。
|
||||
On(BottledDrink,Table2) 你可以把 bottled drink 拿到 Table 2 那里。
|
||||
On(BottledDrink,Table3) 你想把瓶装饮料放在Table3那个地方吗?
|
||||
On(BottledDrink,Table3) 请把瓶装饮料放到桌子的第三位置。
|
||||
On(Yogurt,Bar) 你可以把酸奶放在吧台那个位置哦。
|
||||
On(Yogurt,Bar) 嘿,能否帮我拿一下酸奶(Yogurt)到酒吧(Bar)的位置呀?
|
||||
On(Yogurt,WaterTable) 你可以把酸奶放在水 table 的那个地方。
|
||||
On(Yogurt,WaterTable) 你可以把酸奶放到水 table 那里一下吗?
|
||||
On(Yogurt,CoffeeTable) 请把酸奶放到咖啡桌那个地方。
|
||||
On(Yogurt,CoffeeTable) 你可以把酸奶放到咖啡桌的位置。
|
||||
On(Yogurt,Bar2) 把Yogurt放到Bar2那个地方。
|
||||
On(Yogurt,Bar2) 你可以把酸奶放到酒吧的第二的位置。
|
||||
On(Yogurt,Table1) 请把酸奶放到表格1那个位置哦!
|
||||
On(Yogurt,Table1) 请你把Yogurt移到Table1的位置上。
|
||||
On(Yogurt,Table2) 你可以把酸奶放到表格2那个位置哦。
|
||||
On(Yogurt,Table2) 你可以把酸奶放到桌子第二的位置。
|
||||
On(Yogurt,Table3) 您可以把酸奶放到表格三那个位置哦。
|
||||
On(Yogurt,Table3) 你可以把酸奶放到桌子第三的位置。
|
||||
On(ADMilk,Bar) 你能把ADMilk放到Bar那个地方吗?
|
||||
On(ADMilk,Bar) 你可以把ADMilk放到Bar那里。
|
||||
On(ADMilk,WaterTable) 你可以把ADMilk放到WaterTable那个地方。
|
||||
On(ADMilk,WaterTable) 你可以把ADMilk放到WaterTable的位置啊。
|
||||
On(ADMilk,CoffeeTable) 你可以把ADMilk放到咖啡桌那个地方。
|
||||
On(ADMilk,CoffeeTable) 你可以把AD Milk放到咖啡桌旁边呀。
|
||||
On(ADMilk,Bar2) 请把ADMilk放到Bar2那个位置哦!
|
||||
On(ADMilk,Bar2) 你可以把ADMilk放到Bar2的位置呀。
|
||||
On(ADMilk,Table1) 请把ADMilk放到Table1那个位置啦!
|
||||
On(ADMilk,Table1) 能否帮我将ADMilk放到Table1的位置呢?
|
||||
On(ADMilk,Table2) 你可以把ADMilk放到Table2那个地方哦。
|
||||
On(ADMilk,Table2) 你可以把ADMilk放到Table2的位置呀。
|
||||
On(ADMilk,Table3) 你能把ADMilk放到Table3那个地方吗?
|
||||
On(ADMilk,Table3) 你可以把ADMilk放到Table3的位置呀。
|
||||
On(MilkDrink,Bar) 你可以这样说:“把牛奶饮料放到酒吧那个位置。”
|
||||
On(MilkDrink,Bar) 你可以把牛奶带到酒吧位置吗?
|
||||
On(MilkDrink,WaterTable) 你能将"MilkDrink"放到"WaterTable"的那个地方吗?
|
||||
On(MilkDrink,WaterTable) 你可以把牛奶放到水桌的位置。
|
||||
On(MilkDrink,CoffeeTable) 你好!你可以把"MilkDrink"放到"CoffeeTable"那个地方。
|
||||
On(MilkDrink,CoffeeTable) 你可以把牛奶放到咖啡桌上了吗?
|
||||
On(MilkDrink,Bar2) 你可以把"MilkDrink"放到"Bar2"那个地方。
|
||||
On(MilkDrink,Bar2) 请把牛奶饮料拿到酒吧2号位置。
|
||||
On(MilkDrink,Table1) 你可以这样跟朋友说:嘿,你知道吗,把"MilkDrink"放到"Table1"那个位置吧!
|
||||
On(MilkDrink,Table1) 你可以把牛奶带到Table1那里吗?
|
||||
On(MilkDrink,Table2) 你能把"MilkDrink"放到Table2那个地方吗?
|
||||
On(MilkDrink,Table2) 你可以把牛奶饮料端到桌子2的位置吗?
|
||||
On(MilkDrink,Table3) 你好!我明白你的要求,但是我没有找到与“MilkDrink”相关的内容。如果你能提供更多的信息或者上下文,我会更好地帮助你完成任务。
|
||||
On(MilkDrink,Table3) 你可以把牛奶带到桌子3去。
|
||||
On(Milk,Bar) 你把牛奶放酒吧的位置吧。
|
||||
On(Milk,Bar) 你可以帮我把牛奶放到酒吧的位置吗?
|
||||
On(Milk,WaterTable) 你能帮我把牛奶放到水 table 那个地方吗?
|
||||
On(Milk,WaterTable) 你可以把牛奶放到水 table 附近吗?
|
||||
On(Milk,CoffeeTable) 你可以把牛奶放在咖啡桌那个地方。
|
||||
On(Milk,CoffeeTable) 你可以把牛奶放到咖啡桌的位置。
|
||||
On(Milk,Bar2) 你可以把牛奶放到酒吧2的位置。
|
||||
On(Milk,Bar2) 你可以把牛奶放到酒吧的第二個位置。
|
||||
On(Milk,Table1) 你可以这样跟Table1说:“Hey Table1, could you please move the Milk to that spot over there?”
|
||||
On(Milk,Table1) 你可以把牛奶放到桌子的第一位置呀。
|
||||
On(Milk,Table2) 请把牛奶放到表2的那个位置。
|
||||
On(Milk,Table2) 请你把牛奶放到Table2的位置上。
|
||||
On(Milk,Table3) 你可以把牛奶放到表格三那个位置哦。
|
||||
On(Milk,Table3) 你可以把牛奶放到桌子的第三格里呀。
|
||||
On(VacuumCup,Bar) 你能把VacuumCup放到Bar的位置吗?
|
||||
On(VacuumCup,Bar) 你可以把吸管杯放到酒吧位置吗?
|
||||
On(VacuumCup,WaterTable) 你可以尝试这样说:“嘿,把VacuumCup放到WaterTable的位置吧。”这样更加口语化和亲近。
|
||||
On(VacuumCup,WaterTable) 你可以把吸尘器杯放在水 table 位置吗?
|
||||
On(VacuumCup,CoffeeTable) 你可以把吸尘器杯放在咖啡桌那个地方。
|
||||
On(VacuumCup,CoffeeTable) 你可以把吸尘器(VacuumCup)放到咖啡桌(CoffeeTable)的位置。
|
||||
On(VacuumCup,Bar2) 你能把VacuumCup放到Bar2那个地方吗?
|
||||
On(VacuumCup,Bar2) 你可以把VacuumCup放到Bar2的地方哦。
|
||||
On(VacuumCup,Table1) 你可以把这些内容换成: "把 VacuumCup 放到 Table1 的那个地方"。
|
||||
On(VacuumCup,Table1) 你可以把VacuumCup放到Table1的位置呀。
|
||||
On(VacuumCup,Table2) 你可以把VacuumCup放到Table2那个地方哦。
|
||||
On(VacuumCup,Table2) 你可以把VacuumCup放到Table2那里呀。
|
||||
On(VacuumCup,Table3) 你可以把这个吸管杯放到表格3的位置。
|
||||
On(VacuumCup,Table3) 你可以把VacuumCup放到Table3的位置呀。
|
||||
Is(AC,0) 当然可以,您需要我帮您关闭AC吗?
|
||||
Is(AC,1) 你好,我能帮你做什么呢?关于打开AC的问题,我可能不太明白你的具体意思。如果你是想打开空调,请告诉我具体是哪个品牌的空调,这样我才能更好地帮助你。
|
||||
Is(ACTemperature,0) 当然可以!请告诉我您想将温度调到多少度呢?
|
||||
Is(ACTemperature,1) 当然可以,你想要把温度调到多少度呢?
|
||||
Is(HallLight,0) 当然可以,HallLight怎么样了?需要我帮你做些什么吗?
|
||||
Is(HallLight,1) 当然可以!请问你需要我怎么操作呢?
|
||||
Is(TubeLight,0) 当然可以!你想要立即关掉TubeLight吗?
|
||||
Is(TubeLight,1) 当然可以!你只需按住"开”按钮,或在屏幕上点击一下就可以开启TubeLight了。
|
||||
Is(Curtain,0) 当然可以,您想关闭窗帘吗?
|
||||
Is(Curtain,1) 当然可以,curtain(窗帘)打开了。
|
||||
Is(Chairs,0) 当然可以,你能把椅子弄脏一点吗?
|
||||
Is(Chairs,1) 当然可以,你能帮我打扫一下椅子吗?
|
||||
Is(Floor,0) 当然可以,不过我需要先声明一下,作为人工智能助手,我没有实体形象,所以不能直接去“操作”或“改变”现实环境。但我可以提供一些建议或者指导来帮助你完成任务。如果你想要打扫房间,可以告诉我具体是哪个部位需要清洁,然后我会给你相应的建议和步骤。
|
||||
Is(Floor,1) 当然可以,你让我来吧!
|
||||
Is(Table1,0) 当然可以!不过我需要先了解一下 Table1 包含哪些内容,以及您想要修改的具体是哪方面。这样我才能更好地帮助您进行操作。
|
||||
Is(Table1,1) 当然可以,你有什么特别要求吗?比如需要清理什么物品或者怎么清洁?
|
||||
Holding(Softdrink) 你能不能把soft drink抓在手里啊?
|
||||
Holding(Softdrink) 你能一直拿着一罐饮料吗?
|
||||
Holding(BottledDrink) 你能把瓶装饮料抓在手里吗?
|
||||
Holding(BottledDrink) 你能一直拿着这瓶饮料吗?
|
||||
Holding(Yogurt) 你能把酸奶抓在手里吗?
|
||||
Holding(Yogurt) 你能一直抱着羊酸奶吗?
|
||||
Holding(ADMilk) 你能捧着 AD Milk 吗?
|
||||
Holding(ADMilk) 你能一直拿着AD Milk吗?
|
||||
|
||||
如果我能一直拿着AD Milk,那我会很开心,因为我很喜欢喝这个品牌的牛奶。不过,我不确定我能否一直拿着它,因为我需要考虑到我的健康和生活方式。
|
||||
Holding(MilkDrink) 哦,你是指那个牛奶饮料品牌“MilkDrink”吗?当然可以啊,你可以像拿任何 other 饮料一样拿起它来。
|
||||
Holding(MilkDrink) 你好呀!我能一直拿着这个牛奶饮料吗?
|
||||
Holding(Milk) 你能把牛奶抓在手里吗?当然可以,只要你抓住瓶子或者盒子,就可以把牛奶抓在手里。不过要注意,不要把牛奶撒出来哦!
|
||||
Holding(Milk) 你能不能一直拿着牛奶呀?
|
||||
Holding(VacuumCup) 你能把吸尘器杯收入手中吗?
|
||||
Holding(VacuumCup) 你能一直拿着吸尘器杯吗?
|
||||
Holding(Nothing) 你能把“nothing”这个单词抓在手里吗?
|
||||
Holding(Nothing) 当然可以啊!如果你说的“ Nothing”是指没有任何事物或事情的话,那我可以一直保持这样的状态。不过,如果你指的是某个具体的事物或场景,那可能就需要根据实际情况来分析了。
|
||||
On(Coffee,Bar) 当然可以!我马上为你制作一杯咖啡,然后端到吧台给你。
|
||||
On(Coffee,Bar) 给我倒杯咖啡,然后把它端到酒吧这里来。
|
||||
On(Coffee,WaterTable) 当然可以!我马上为你制作一杯咖啡,然后端到水 table 这里来。
|
||||
On(Coffee,WaterTable) 好的,我给你倒杯咖啡,然后端到水 table 这里来。
|
||||
On(Coffee,CoffeeTable) 当然可以!我为您制作一杯咖啡,然后把它端到咖啡桌那里吧。
|
||||
On(Coffee,CoffeeTable) 行吗?能不能帮我倒杯咖啡,然后把咖啡端到咖啡桌上来呀?
|
||||
On(Coffee,Bar2) 当然可以!我马上为您制作一杯咖啡,然后送到Bar 2那里。请问您喜欢什么口味的咖啡呢?
|
||||
On(Coffee,Bar2) 好的,我给您准备了一杯咖啡,现在就端到 Bar 2 这里来。
|
||||
On(Coffee,Table1) 当然可以!我马上为您制作一杯咖啡,然后端到Table1这里来。请问您喜欢什么口味的咖啡呢?
|
||||
On(Coffee,Table1) 好的,请给我一杯咖啡,然后把它送到 Table1 这里来,谢谢!
|
||||
On(Coffee,Table2) 当然可以!我马上为您制作一杯咖啡,然后端到Table2这里来。
|
||||
On(Coffee,Table2) 好的,我给你拿杯咖啡,放Table2那里。
|
||||
On(Coffee,Table3) 当然可以!我马上为你制作一杯咖啡,然后端到你面前的桌子上。
|
||||
On(Coffee,Table3) 行吗?我可以给你拿杯咖啡,然后放到了Table 3这里。
|
||||
On(Water,Bar) 当然可以!去吧,我给你端来水。
|
||||
On(Water,Bar) 好的,让我给您倒一杯水,然后把它端到酒吧这里来。
|
||||
On(Water,WaterTable) 当然可以!我可以帮你制作水,然后把水送到水 table 这里来。
|
||||
On(Water,WaterTable) 好的,我给你倒一杯水,然后把它放在水 table 上。
|
||||
On(Water,CoffeeTable) 当然可以!我马上为您制作水,并把水端到咖啡桌这里来。
|
||||
On(Water,CoffeeTable) 好的,我马上给您倒杯水,然后把水端到咖啡桌这里来。
|
||||
On(Water,Bar2) 当然可以!我可以帮你制作水,然后把水端到酒吧2(Bar 2)那里。你需要我马上去做吗?
|
||||
On(Water,Bar2) 好的,我来给您倒杯水,送到酒吧2怎么样?
|
||||
On(Water,Table1) 当然可以!请问你需要多少量的水呢?我会尽快为您准备好的。
|
||||
On(Water,Table1) 好的,我给你倒一杯水,你想要端到哪个桌子呢?
|
||||
On(Water,Table2) 当然可以!我马上帮你制作水,然后把它送到 Table2 这里来。
|
||||
On(Water,Table2) 好的,我给你倒一杯水,稍等一下。
|
||||
On(Water,Table3) 当然可以!我马上帮您把水送到 Table 3 这里来。
|
||||
On(Water,Table3) 好的,我给您倒一杯水,稍等一下,我现在就去拿。请问您要放在哪个桌子上呢?是Table 1还是Table 2?还是您想要自己拿杯子接?
|
||||
On(Dessert,Bar) 你好!当然可以。Dessert(甜点)是餐后享用的食物,有很多美味的选择,比如蛋糕、饼干、布丁等。请问你想制作哪一种甜点呢?我可以帮你准备材料和制作方法。制作完成后,我们可以一起把甜点带到酒吧享用。
|
||||
On(Dessert,Bar) 请给我一点甜点,然后把它送到酒吧这里来。
|
||||
On(Dessert,WaterTable) 你能否把甜点做好,然后拿到水 table 那里去呢?
|
||||
On(Dessert,WaterTable) 好的,我给您准备了一些甜点,现在就端到水 table 这里来。您觉得怎么样?
|
||||
On(Dessert,CoffeeTable) 当然可以!我给您制作一些甜点,然后拿到咖啡桌上去吧。请问您想尝试哪种甜点呢?
|
||||
On(Dessert,CoffeeTable) 行啊,那给我来点甜点,然后把它放到咖啡桌子上。
|
||||
On(Dessert,Bar2) 当然可以!我会做一些美味的甜点,然后带到酒吧2(Bar 2)来。您想尝尝吗?
|
||||
On(Dessert,Bar2) 好的,我给你准备了一些甜点,现在就端到你所在的酒吧2。
|
||||
On(Dessert,Table1) 当然可以!我马上为您制作甜点,然后把它端到Table1这里来。
|
||||
On(Dessert,Table1) 好的,我给您准备了一些美味的甜点,现在 bring it to Table1 这里。
|
||||
On(Dessert,Table2) 当然可以!我马上为您制作甜点,然后端到Table2这里来。
|
||||
On(Dessert,Table2) 好的,我给你准备了一些甜点,现在端到你面前的桌子上。
|
||||
On(Dessert,Table3) 当然可以!我马上为您制作甜点,然后把它送到Table3这里来。
|
||||
On(Dessert,Table3) 好的,我给你准备了一些甜点,现在就端到你面前的桌子上。
|
|
@ -0,0 +1,57 @@
|
|||
At(Robot,Bar) 请问您需要什么帮助吗?我就在吧台附近,能否请您自己过来呢?
|
||||
At(Robot,Bar) 请问你能去一下吧台吗?
|
||||
At(Robot,Bar) 请问你能帮我到吧台那个位置吗?
|
||||
At(Robot,WaterTable) 请问你能过来一下吗?我正在茶水桌旁。
|
||||
At(Robot,WaterTable) 请问你可以去茶水桌一下吗?
|
||||
At(Robot,WaterTable) 你能带路去茶水桌吗?
|
||||
At(Robot,CoffeeTable) 请问你可以过来一下吗?我在这张咖啡桌旁边。
|
||||
At(Robot,CoffeeTable) 请问你可以帮我一下,去一下咖啡桌吗?
|
||||
At(Robot,CoffeeTable) 请问你能帮我前往咖啡桌那个位置吗?
|
||||
At(Robot,Bar2) 您好,请问您需要什么帮助吗?我正在另一个吧台处理一些事情。
|
||||
At(Robot,Bar2) 请问你可以去一下另一个吧台吗?
|
||||
At(Robot,Bar2) 你能去另一个吧台的位置吗?
|
||||
At(Robot,Table1) 请问你能过来一下吗?我目前在第一桌,需要你的帮助。
|
||||
At(Robot,Table1) 请问你能去一下第一桌吗?
|
||||
At(Robot,Table1) 请问你能帮我到第一张桌子那个位置吗?
|
||||
At(Robot,Table2) 请问您能过来一下吗?我正在第二张桌子这里。
|
||||
At(Robot,Table2) 请问你可以去第二张桌子一下吗?
|
||||
At(Robot,Table2) 请问你能帮我前往第二桌吗?
|
||||
At(Robot,Table3) 请问你能过来一下吗?我正在第三张桌子旁。
|
||||
At(Robot,Table3) 请问你能去第三张桌子一下吗?
|
||||
At(Robot,Table3) 你能告诉我第三张桌子的位置在哪里吗?
|
||||
On(Softdrink,Bar) 您好,请问您需要我帮您把盒装冰红茶放到哪个位置呢?
|
||||
On(Softdrink,Bar) 服务员,能否帮我拿来一盒冰红茶放到吧台呢?
|
||||
On(Softdrink,WaterTable) 您好,请问您需要我帮忙将盒装冰红茶放到哪个位置吗?
|
||||
On(Softdrink,WaterTable) 服务员,能否帮我把盒装冰红茶拿到茶水桌呢?
|
||||
On(Softdrink,CoffeeTable) 请问你能把盒装冰红茶放到咖啡桌那个位置吗?
|
||||
On(Softdrink,CoffeeTable) 服务员,把盒装冰红茶拿到咖啡桌 position 好吗?
|
||||
On(Softdrink,Bar2) 请问你能把盒装冰红茶放到另一个吧台的位置吗?
|
||||
On(Softdrink,Bar2) 请问你能把盒装冰红茶拿到另一个吧台位置吗?
|
||||
On(Softdrink,Table1) 请问您能否把盒装冰红茶放在第一桌的指定位置呢?
|
||||
On(Softdrink,Table1) 请您把盒装冰红茶拿到第一桌的位置。
|
||||
On(Softdrink,Table2) 服务员,您好,请问能否帮我將這盒裝冰红茶放 到第二張桌子那個位置呢?
|
||||
On(Softdrink,Table2) 服务员,请把盒装冰红茶拿到第二张桌子的位置。
|
||||
On(Softdrink,Table3) 请问你可以把盒装冰红茶放到第三张桌子的那个位置吗?
|
||||
On(Softdrink,Table3) 请问你能把盒装冰红茶拿到第三张桌子的位置吗?
|
||||
On(BottledDrink,Bar) 您好,请问您需要我将瓶装饮料放到哪个位置呢?
|
||||
On(BottledDrink,Bar) 请把瓶装饮料拿到吧台的位置。
|
||||
On(BottledDrink,WaterTable) 请问你可以把瓶装饮料放到茶水桌那个位置吗?
|
||||
On(BottledDrink,WaterTable) 请问你能把瓶装饮料拿到茶水桌位置吗?
|
||||
On(BottledDrink,CoffeeTable) 服务员,能否把瓶装饮料放在咖啡桌那个位置呢?
|
||||
On(BottledDrink,CoffeeTable) 服务员,能否把瓶装饮料拿到咖啡桌附近呢?
|
||||
On(BottledDrink,Bar2) 请问你能把瓶装饮料放到另一个吧台的那个位置吗?
|
||||
On(BottledDrink,Bar2) 请把瓶装饮料拿到另一个吧台位置。
|
||||
On(BottledDrink,Table1) 请问您能否帮我將瓶裝飲料放至第一張桌子的那個位置呢?
|
||||
On(BottledDrink,Table1) 请问你能把瓶装饮料拿到第一桌的位置吗?
|
||||
On(BottledDrink,Table2) 请问,你可以把瓶装饮料放到第二张桌子的那个位置吗?
|
||||
On(BottledDrink,Table2) 请问你能把瓶装饮料拿到第二张桌子的位置吗?
|
||||
On(BottledDrink,Table3) 请问,你能把瓶装饮料放到第三桌的哪个位置吗?
|
||||
On(BottledDrink,Table3) 请问你能把瓶装饮料拿到第三张桌子的位置吗?
|
||||
On(Yogurt,Bar) 请问你能把酸奶放到吧台那个位置吗?
|
||||
On(Yogurt,Bar) 请问你能把酸奶拿到吧台位置吗?
|
||||
On(Yogurt,WaterTable) 请问你能把酸奶放到茶水桌那个位置吗?
|
||||
On(Yogurt,WaterTable) 服务员,请把酸奶拿到茶水桌的位置。
|
||||
On(Yogurt,CoffeeTable) 请问,你能把酸奶放在咖啡桌那个位置吗?
|
||||
On(Yogurt,CoffeeTable) 服务员,能否把酸奶拿到咖啡桌的位置呢?
|
||||
On(Yogurt,Bar2) 请问你能把酸奶放到另一个吧台的那个位置吗?
|
||||
On(Yogurt,Bar2) 请问你能把酸奶拿到另一个吧台位置吗?
|
|
@ -0,0 +1,310 @@
|
|||
# the empty string '' represents robot holds nothing
|
||||
import os
|
||||
import re
|
||||
|
||||
Object = ['Softdrink', 'BottledDrink', 'Yogurt', 'ADMilk', 'MilkDrink', 'Milk', 'VacuumCup']
|
||||
|
||||
Cookable = ['Coffee', 'Water', 'Dessert']
|
||||
|
||||
Place = ['Bar', 'WaterTable', 'CoffeeTable', 'Bar2', 'Table1', 'Table2', 'Table3']
|
||||
|
||||
Entity = ['Robot', 'Customer']
|
||||
|
||||
Operable = ['AC', 'ACTemperature', 'HallLight', 'TubeLight', 'Curtain', 'Chairs', 'Floor', 'Table1']
|
||||
|
||||
import random
|
||||
|
||||
|
||||
def single_predict_generation(oplist_1, oplist_2, predict_pattern) -> str:
|
||||
index_1 = random.randint(0, len(oplist_1) - 1)
|
||||
if oplist_2:
|
||||
index_2 = random.randint(0, len(oplist_2) - 1)
|
||||
|
||||
match predict_pattern:
|
||||
case 'at':
|
||||
return f'At({oplist_1[index_1]}, {oplist_2[index_2]})'
|
||||
case 'is':
|
||||
return f'Is({oplist_1[index_1]}, {oplist_2[index_2]})'
|
||||
case 'hold':
|
||||
return f'Holding({oplist_1[index_1]})'
|
||||
case 'on':
|
||||
return f'On({oplist_1[index_1]}, {oplist_2[index_2]})'
|
||||
case _:
|
||||
raise RuntimeError('Incorrect predict pattern!')
|
||||
|
||||
|
||||
def enumerate_predict(oplist_1, oplist_2, predict_pattern) -> [int, list]:
|
||||
count = 0
|
||||
res = []
|
||||
|
||||
match predict_pattern:
|
||||
case 'at':
|
||||
pattern = f'At(%s,%s)'
|
||||
case 'is':
|
||||
pattern = f'Is(%s,%s)'
|
||||
case 'hold':
|
||||
pattern = f'Holding(%s)'
|
||||
case 'on':
|
||||
pattern = f'On(%s,%s)'
|
||||
case _:
|
||||
raise RuntimeError('Incorrect predict pattern!')
|
||||
|
||||
for str_1 in oplist_1:
|
||||
if oplist_2:
|
||||
for str_2 in oplist_2:
|
||||
count += 1
|
||||
res.append(pattern % (str_1, str_2))
|
||||
else:
|
||||
count += 1
|
||||
res.append(pattern % str_1)
|
||||
|
||||
return count, res
|
||||
|
||||
|
||||
def generate_goal_states(vln_num: int, vlm_num: int, opentask_num: int):
|
||||
# res stores lists of sets, while each state represent in set.
|
||||
res = []
|
||||
|
||||
# goal states for VLN
|
||||
for i in range(vln_num):
|
||||
res.append({single_predict_generation(['Robot'], Place, 'at')})
|
||||
|
||||
# goal states for VLM
|
||||
for i in range(int(vlm_num)):
|
||||
for j in range(int(vlm_num)):
|
||||
res.append(
|
||||
{
|
||||
single_predict_generation(['Robot'], Place, 'at'),
|
||||
single_predict_generation(Operable, ['0', '1'], 'is')
|
||||
}
|
||||
)
|
||||
|
||||
# goal states for Open-task-1
|
||||
for i in range(int(opentask_num)):
|
||||
for j in range(int(opentask_num)):
|
||||
res.append(
|
||||
{
|
||||
single_predict_generation(['Robot'], Place, 'at'),
|
||||
single_predict_generation(Object, Place, 'on')
|
||||
}
|
||||
)
|
||||
|
||||
print(res)
|
||||
print(len(res))
|
||||
|
||||
return res
|
||||
|
||||
|
||||
def enumerate_goal_states(total: int):
|
||||
res = []
|
||||
|
||||
point_15 = int(total * .15)
|
||||
point_10 = int(total * .10)
|
||||
|
||||
# goal states for VLN, .15
|
||||
count_vln, list_vln = enumerate_predict(['Robot'], Place, 'at')
|
||||
list_vln = ['{%s}' % i for i in list_vln]
|
||||
if count_vln < point_15:
|
||||
list_vln *= point_15 // count_vln
|
||||
for i in range(0, point_15 - len(list_vln)):
|
||||
list_vln.append('{%s}' % single_predict_generation(['Robot'], Place, 'at'))
|
||||
# print(f'VLN 任务的目标状态数:{count_vln}')
|
||||
res += list_vln
|
||||
|
||||
# goal states for VLM-1, 0.15
|
||||
count_vlm_1, list_vlm_1 = enumerate_predict(Object, Place, 'on')
|
||||
list_vlm_1 = ['{%s}' % i for i in list_vlm_1]
|
||||
if count_vlm_1 < point_15:
|
||||
list_vlm_1 *= point_15 // count_vlm_1
|
||||
for i in range(0, point_15 - len(list_vlm_1)):
|
||||
list_vlm_1.append('{%s}' % (single_predict_generation(Object, Place, 'on')))
|
||||
res += list_vlm_1
|
||||
|
||||
# goal states for VLM-2, 0.15
|
||||
count_vlm_2, list_vlm_2 = enumerate_predict(Operable, ['0', '1'], 'is')
|
||||
list_vlm_2 = ['{%s}' % i for i in list_vlm_2]
|
||||
if count_vlm_2 < point_15:
|
||||
list_vlm_2 *= point_15 // count_vlm_2
|
||||
for i in range(0, point_15 - len(list_vlm_2)):
|
||||
list_vlm_2.append('{%s}' % single_predict_generation(Operable, ['0', '1'], 'is'))
|
||||
res += list_vlm_2
|
||||
|
||||
# goal states for VLM-3, 0.1
|
||||
count_vlm_3, list_vlm_3 = enumerate_predict(Object + ['Nothing'], None, 'hold')
|
||||
list_vlm_3 = ['{%s}' % i for i in list_vlm_3]
|
||||
if count_vlm_3 < point_10:
|
||||
list_vlm_3 *= point_10 // count_vlm_3
|
||||
for i in range(0, point_10 - len(list_vlm_3)):
|
||||
list_vlm_3.append('{%s}' % single_predict_generation(Object, None, 'hold'))
|
||||
res += list_vlm_3
|
||||
|
||||
# goal states for OT, 0.15
|
||||
count_ot, list_ot = enumerate_predict(Cookable, Place, 'on')
|
||||
list_ot = ['{%s}' % i for i in list_ot]
|
||||
if count_ot < point_15:
|
||||
list_ot *= point_15 // count_ot
|
||||
for i in range(0, point_15 - len(list_ot)):
|
||||
list_ot.append('{%s}' % single_predict_generation(Cookable, Place, 'on'))
|
||||
res += list_ot
|
||||
|
||||
# goal states for compound-1, 0.1
|
||||
count_1, list_1 = enumerate_predict(['Robot'], Place, 'at')
|
||||
count_2, list_2 = enumerate_predict(Object, Place, 'on')
|
||||
list_tmp = []
|
||||
for i in list_1:
|
||||
for j in list_2:
|
||||
list_tmp.append('{%s,%s}' % (i, j))
|
||||
if len(list_tmp) < point_10:
|
||||
list_tmp *= point_10 // len(list_tmp)
|
||||
list_tmp += list_tmp[0:point_10 - len(list_tmp)]
|
||||
else:
|
||||
list_tmp = list_tmp[:point_10]
|
||||
res += list_tmp
|
||||
|
||||
# goal states for compound-2, 0.1
|
||||
count_1, list_1 = enumerate_predict(['Robot'], Place, 'at')
|
||||
count_2, list_2 = enumerate_predict(Operable, ['0', '1'], 'is')
|
||||
list_tmp = []
|
||||
for i in list_1:
|
||||
for j in list_2:
|
||||
list_tmp.append('{%s,%s}' % (i, j))
|
||||
if len(list_tmp) < point_10:
|
||||
list_tmp *= point_10 // len(list_tmp)
|
||||
list_tmp += list_tmp[0:point_10 - len(list_tmp)]
|
||||
else:
|
||||
list_tmp = list_tmp[:point_10]
|
||||
res += list_tmp
|
||||
|
||||
# goal states for compound-3, 0.1
|
||||
count_1, list_1 = enumerate_predict(Cookable, Place, 'on')
|
||||
count_2, list_2 = enumerate_predict(Operable, ['0', '1'], 'is')
|
||||
list_tmp = []
|
||||
for i in list_1:
|
||||
for j in list_2:
|
||||
list_tmp.append('{%s,%s}' % (i, j))
|
||||
if len(list_tmp) < point_10:
|
||||
list_tmp *= point_10 // len(list_tmp)
|
||||
list_tmp += list_tmp[0:point_10 - len(list_tmp)]
|
||||
else:
|
||||
list_tmp = list_tmp[:point_10]
|
||||
res += list_tmp
|
||||
|
||||
# # goal states for VLM-1, 0.15
|
||||
# count_vlm_1, list_vlm_1 = enumerate_predict(['Robot'], Place, 'at')
|
||||
# count_vlm_2, list_vlm_2 = enumerate_predict(Operable, ['0', '1'], 'is')
|
||||
# print(f'VLM 任务的目标状态数:{count_vlm_1 * count_vlm_2}')
|
||||
#
|
||||
# # goal states for open-task
|
||||
# count_opentask_1, list_opentask_1 = enumerate_predict(['Robot'], Place, 'at')
|
||||
# count_opentask_2, list_opentask_2 = enumerate_predict(Object, Place, 'on')
|
||||
# print(f'Open-task-1 任务的目标状态数:{count_opentask_1 * count_opentask_2}')
|
||||
|
||||
with open(os.path.join('./goal_states.txt'), 'w+') as file:
|
||||
for i in res:
|
||||
if 'Is' in i and 'ACTemperature' in i:
|
||||
i = re.sub(',0', ',Up', i)
|
||||
i = re.sub(',1', ',Down', i)
|
||||
elif 'Is' in i and ('AC' in i or 'HallLight' in i or 'TubeLight' in i or 'Curtain' in i):
|
||||
i = re.sub(',0', ',Off', i)
|
||||
i = re.sub(',1', ',On', i)
|
||||
elif 'Is' in i and ('Chairs' in i or 'Floor' in i or 'Table' in i):
|
||||
i = re.sub(',0', ',Dirty', i)
|
||||
i = re.sub(',1', ',Clean', i)
|
||||
|
||||
file.write(i + '\n')
|
||||
|
||||
|
||||
def translate_zero_one(i: str) -> str:
|
||||
if 'ACTemperature' in i:
|
||||
i = re.sub('On\)', '调高', i)
|
||||
i = re.sub('Off\)', '调低', i)
|
||||
elif 'AC' in i or 'HallLight' in i or 'TubeLight' in i or 'Curtain' in i:
|
||||
i = re.sub('On\)', '关闭', i)
|
||||
i = re.sub('Off\)', '打开', i)
|
||||
elif 'Chairs' in i or 'Floor' in i or 'Table' in i:
|
||||
i = re.sub('On\)', '脏', i)
|
||||
i = re.sub('Off\)', '打扫干净', i)
|
||||
|
||||
return i
|
||||
|
||||
|
||||
def enumerate_goal_states_with_describe() -> str:
|
||||
with open(os.path.join('./goal_states_with_description.txt'), 'w', encoding='utf-8') as file:
|
||||
# vln
|
||||
count, res = enumerate_predict(['Robot'], Place, 'at')
|
||||
print(count)
|
||||
for i in range(count):
|
||||
tmp = '#' + res[i].split(',')[-1][:-1]
|
||||
file.write(f'{res[i]}\t你能过来一下吗?我在{tmp}这里。\n')
|
||||
file.write(f'{res[i]}\t麻烦你去一下{tmp}。\n')
|
||||
file.write(f'{res[i]}\t你能去{tmp}那个位置吗?\n')
|
||||
|
||||
# vlm, on
|
||||
count, res = enumerate_predict(Object, Place, 'on')
|
||||
print(count)
|
||||
for i in range(count):
|
||||
tmp = res[i].split(',')
|
||||
obj = '#' + tmp[0][3:]
|
||||
pla = '#' + tmp[-1][:-1]
|
||||
file.write(f'{res[i]}\t麻烦你把{obj}放到{pla}那个位置。\n')
|
||||
file.write(f'{res[i]}\t请你拿一下{obj}到{pla}位置。\n')
|
||||
file.write(f'{res[i]}\t你好,我在{pla},请你拿一下{obj}到位置。\n')
|
||||
|
||||
# vlm, is
|
||||
count, res = enumerate_predict(Operable, ['On', 'Off'], 'is')
|
||||
print(count)
|
||||
for i in res:
|
||||
tmp = i.split(',')
|
||||
thing, op = '#' + tmp[0][3:], '#' + tmp[-1]
|
||||
file.write('%s\t%s\n' % (i, translate_zero_one(f'你能把{thing}{op}一下吗?')))
|
||||
|
||||
# vlm, holding
|
||||
count, res = enumerate_predict(Object + ['Nothing'], None, 'hold')
|
||||
print(count)
|
||||
for i in res:
|
||||
tmp = '#' + i.split('(')[-1][:-1]
|
||||
if tmp == 'Nothing':
|
||||
file.write(f'{i}\t你手里是没有东西的吗?\n')
|
||||
continue
|
||||
file.write(f'{i}\t你能把{tmp}抓在手里吗?\n')
|
||||
file.write(f'{i}\t你能一直拿着{tmp}吗?\n')
|
||||
|
||||
count, res = enumerate_predict(Cookable, Place, 'on')
|
||||
print(count)
|
||||
for i in res:
|
||||
tmp = i.split(',')
|
||||
thing, pla = '#' + tmp[0][3:], '#' + tmp[-1][:-1]
|
||||
|
||||
file.write(f'{i}\t你能制作{thing}并把它端到{pla}这里来吗?\n')
|
||||
file.write(f'{i}\t给我来点{thing},并把它端到{pla}这里来。\n')
|
||||
return './goal_states_with_description.txt'
|
||||
|
||||
|
||||
from copy import deepcopy
|
||||
|
||||
|
||||
def mutex(path: str):
|
||||
with open(os.path.join(path), 'r', encoding='utf-8') as file:
|
||||
lines = "".join(file.readlines())
|
||||
new_line = deepcopy(lines)
|
||||
|
||||
check = ['#Bar2', '#WaterTable', '#CoffeeTable', '#Bar', '#Table1', '#Table2', '#Table3', '#Coffee', '#Water',
|
||||
'#Dessert', '#Softdrink', '#BottledDrink', '#Yogurt', '#ADMilk', '#MilkDrink', '#Milk', '#VacuumCup',
|
||||
'#AC',
|
||||
'#ACTemperature', '#HallLight', '#TubeLight', '#Curtain', '#Chairs', '#Floor', '#Table1']
|
||||
repla = ['#另一个吧台', '#茶水桌', '#咖啡桌', '#吧台', '#第一张桌子', '#第二张桌子', '#第三张桌子', '#咖啡', '#水',
|
||||
'#点心或者甜品', '#盒装冰红茶', '#瓶装饮料', '#酸奶', '#AD钙奶', '#牛奶味的饮料', '#牛奶', '#保温杯', '#空调',
|
||||
'#空调温度', '#大厅灯', '#筒灯', '#窗帘', '#椅子', '#地板', '#第一张桌子']
|
||||
|
||||
for i, j in zip(check, repla):
|
||||
new_line = re.sub(i, j, new_line)
|
||||
new_line = re.sub('#', '', new_line)
|
||||
lines = re.sub('#', '', lines)
|
||||
|
||||
with open(os.path.join(path), 'w', encoding='utf-8') as file:
|
||||
file.write(new_line)
|
||||
|
||||
|
||||
# generate_goal_states(30, 6, 6)
|
||||
# enumerate_goal_states(5000)
|
||||
mutex(enumerate_goal_states_with_describe())
|
|
@ -0,0 +1,193 @@
|
|||
{"title":"你能过来一下吗?我在吧台这里。","text":"At(Robot,Bar)"}
|
||||
{"title":"麻烦你去一下吧台。","text":"At(Robot,Bar)"}
|
||||
{"title":"你能去吧台那个位置吗?","text":"At(Robot,Bar)"}
|
||||
{"title":"你能过来一下吗?我在茶水桌这里。","text":"At(Robot,WaterTable)"}
|
||||
{"title":"麻烦你去一下茶水桌。","text":"At(Robot,WaterTable)"}
|
||||
{"title":"你能去茶水桌那个位置吗?","text":"At(Robot,WaterTable)"}
|
||||
{"title":"你能过来一下吗?我在咖啡桌这里。","text":"At(Robot,CoffeeTable)"}
|
||||
{"title":"麻烦你去一下咖啡桌。","text":"At(Robot,CoffeeTable)"}
|
||||
{"title":"你能去咖啡桌那个位置吗?","text":"At(Robot,CoffeeTable)"}
|
||||
{"title":"你能过来一下吗?我在另一个吧台这里。","text":"At(Robot,Bar2)"}
|
||||
{"title":"麻烦你去一下另一个吧台。","text":"At(Robot,Bar2)"}
|
||||
{"title":"你能去另一个吧台那个位置吗?","text":"At(Robot,Bar2)"}
|
||||
{"title":"你能过来一下吗?我在第一张桌子这里。","text":"At(Robot,Table1)"}
|
||||
{"title":"麻烦你去一下第一张桌子。","text":"At(Robot,Table1)"}
|
||||
{"title":"你能去第一张桌子那个位置吗?","text":"At(Robot,Table1)"}
|
||||
{"title":"你能过来一下吗?我在第二张桌子这里。","text":"At(Robot,Table2)"}
|
||||
{"title":"麻烦你去一下第二张桌子。","text":"At(Robot,Table2)"}
|
||||
{"title":"你能去第二张桌子那个位置吗?","text":"At(Robot,Table2)"}
|
||||
{"title":"你能过来一下吗?我在第三张桌子这里。","text":"At(Robot,Table3)"}
|
||||
{"title":"麻烦你去一下第三张桌子。","text":"At(Robot,Table3)"}
|
||||
{"title":"你能去第三张桌子那个位置吗?","text":"At(Robot,Table3)"}
|
||||
{"title":"麻烦你把盒装冰红茶放到吧台那个位置。","text":"On(Softdrink,Bar)"}
|
||||
{"title":"请你拿一下盒装冰红茶到吧台位置。","text":"On(Softdrink,Bar)"}
|
||||
{"title":"麻烦你把盒装冰红茶放到茶水桌那个位置。","text":"On(Softdrink,WaterTable)"}
|
||||
{"title":"请你拿一下盒装冰红茶到茶水桌位置。","text":"On(Softdrink,WaterTable)"}
|
||||
{"title":"麻烦你把盒装冰红茶放到咖啡桌那个位置。","text":"On(Softdrink,CoffeeTable)"}
|
||||
{"title":"请你拿一下盒装冰红茶到咖啡桌位置。","text":"On(Softdrink,CoffeeTable)"}
|
||||
{"title":"麻烦你把盒装冰红茶放到另一个吧台那个位置。","text":"On(Softdrink,Bar2)"}
|
||||
{"title":"请你拿一下盒装冰红茶到另一个吧台位置。","text":"On(Softdrink,Bar2)"}
|
||||
{"title":"麻烦你把盒装冰红茶放到第一张桌子那个位置。","text":"On(Softdrink,Table1)"}
|
||||
{"title":"请你拿一下盒装冰红茶到第一张桌子位置。","text":"On(Softdrink,Table1)"}
|
||||
{"title":"麻烦你把盒装冰红茶放到第二张桌子那个位置。","text":"On(Softdrink,Table2)"}
|
||||
{"title":"请你拿一下盒装冰红茶到第二张桌子位置。","text":"On(Softdrink,Table2)"}
|
||||
{"title":"麻烦你把盒装冰红茶放到第三张桌子那个位置。","text":"On(Softdrink,Table3)"}
|
||||
{"title":"请你拿一下盒装冰红茶到第三张桌子位置。","text":"On(Softdrink,Table3)"}
|
||||
{"title":"麻烦你把瓶装饮料放到吧台那个位置。","text":"On(BottledDrink,Bar)"}
|
||||
{"title":"请你拿一下瓶装饮料到吧台位置。","text":"On(BottledDrink,Bar)"}
|
||||
{"title":"麻烦你把瓶装饮料放到茶水桌那个位置。","text":"On(BottledDrink,WaterTable)"}
|
||||
{"title":"请你拿一下瓶装饮料到茶水桌位置。","text":"On(BottledDrink,WaterTable)"}
|
||||
{"title":"麻烦你把瓶装饮料放到咖啡桌那个位置。","text":"On(BottledDrink,CoffeeTable)"}
|
||||
{"title":"请你拿一下瓶装饮料到咖啡桌位置。","text":"On(BottledDrink,CoffeeTable)"}
|
||||
{"title":"麻烦你把瓶装饮料放到另一个吧台那个位置。","text":"On(BottledDrink,Bar2)"}
|
||||
{"title":"请你拿一下瓶装饮料到另一个吧台位置。","text":"On(BottledDrink,Bar2)"}
|
||||
{"title":"麻烦你把瓶装饮料放到第一张桌子那个位置。","text":"On(BottledDrink,Table1)"}
|
||||
{"title":"请你拿一下瓶装饮料到第一张桌子位置。","text":"On(BottledDrink,Table1)"}
|
||||
{"title":"麻烦你把瓶装饮料放到第二张桌子那个位置。","text":"On(BottledDrink,Table2)"}
|
||||
{"title":"请你拿一下瓶装饮料到第二张桌子位置。","text":"On(BottledDrink,Table2)"}
|
||||
{"title":"麻烦你把瓶装饮料放到第三张桌子那个位置。","text":"On(BottledDrink,Table3)"}
|
||||
{"title":"请你拿一下瓶装饮料到第三张桌子位置。","text":"On(BottledDrink,Table3)"}
|
||||
{"title":"麻烦你把酸奶放到吧台那个位置。","text":"On(Yogurt,Bar)"}
|
||||
{"title":"请你拿一下酸奶到吧台位置。","text":"On(Yogurt,Bar)"}
|
||||
{"title":"麻烦你把酸奶放到茶水桌那个位置。","text":"On(Yogurt,WaterTable)"}
|
||||
{"title":"请你拿一下酸奶到茶水桌位置。","text":"On(Yogurt,WaterTable)"}
|
||||
{"title":"麻烦你把酸奶放到咖啡桌那个位置。","text":"On(Yogurt,CoffeeTable)"}
|
||||
{"title":"请你拿一下酸奶到咖啡桌位置。","text":"On(Yogurt,CoffeeTable)"}
|
||||
{"title":"麻烦你把酸奶放到另一个吧台那个位置。","text":"On(Yogurt,Bar2)"}
|
||||
{"title":"请你拿一下酸奶到另一个吧台位置。","text":"On(Yogurt,Bar2)"}
|
||||
{"title":"麻烦你把酸奶放到第一张桌子那个位置。","text":"On(Yogurt,Table1)"}
|
||||
{"title":"请你拿一下酸奶到第一张桌子位置。","text":"On(Yogurt,Table1)"}
|
||||
{"title":"麻烦你把酸奶放到第二张桌子那个位置。","text":"On(Yogurt,Table2)"}
|
||||
{"title":"请你拿一下酸奶到第二张桌子位置。","text":"On(Yogurt,Table2)"}
|
||||
{"title":"麻烦你把酸奶放到第三张桌子那个位置。","text":"On(Yogurt,Table3)"}
|
||||
{"title":"请你拿一下酸奶到第三张桌子位置。","text":"On(Yogurt,Table3)"}
|
||||
{"title":"麻烦你把AD钙奶放到吧台那个位置。","text":"On(ADMilk,Bar)"}
|
||||
{"title":"请你拿一下AD钙奶到吧台位置。","text":"On(ADMilk,Bar)"}
|
||||
{"title":"麻烦你把AD钙奶放到茶水桌那个位置。","text":"On(ADMilk,WaterTable)"}
|
||||
{"title":"请你拿一下AD钙奶到茶水桌位置。","text":"On(ADMilk,WaterTable)"}
|
||||
{"title":"麻烦你把AD钙奶放到咖啡桌那个位置。","text":"On(ADMilk,CoffeeTable)"}
|
||||
{"title":"请你拿一下AD钙奶到咖啡桌位置。","text":"On(ADMilk,CoffeeTable)"}
|
||||
{"title":"麻烦你把AD钙奶放到另一个吧台那个位置。","text":"On(ADMilk,Bar2)"}
|
||||
{"title":"请你拿一下AD钙奶到另一个吧台位置。","text":"On(ADMilk,Bar2)"}
|
||||
{"title":"麻烦你把AD钙奶放到第一张桌子那个位置。","text":"On(ADMilk,Table1)"}
|
||||
{"title":"请你拿一下AD钙奶到第一张桌子位置。","text":"On(ADMilk,Table1)"}
|
||||
{"title":"麻烦你把AD钙奶放到第二张桌子那个位置。","text":"On(ADMilk,Table2)"}
|
||||
{"title":"请你拿一下AD钙奶到第二张桌子位置。","text":"On(ADMilk,Table2)"}
|
||||
{"title":"麻烦你把AD钙奶放到第三张桌子那个位置。","text":"On(ADMilk,Table3)"}
|
||||
{"title":"请你拿一下AD钙奶到第三张桌子位置。","text":"On(ADMilk,Table3)"}
|
||||
{"title":"麻烦你把牛奶味的饮料放到吧台那个位置。","text":"On(MilkDrink,Bar)"}
|
||||
{"title":"请你拿一下牛奶味的饮料到吧台位置。","text":"On(MilkDrink,Bar)"}
|
||||
{"title":"麻烦你把牛奶味的饮料放到茶水桌那个位置。","text":"On(MilkDrink,WaterTable)"}
|
||||
{"title":"请你拿一下牛奶味的饮料到茶水桌位置。","text":"On(MilkDrink,WaterTable)"}
|
||||
{"title":"麻烦你把牛奶味的饮料放到咖啡桌那个位置。","text":"On(MilkDrink,CoffeeTable)"}
|
||||
{"title":"请你拿一下牛奶味的饮料到咖啡桌位置。","text":"On(MilkDrink,CoffeeTable)"}
|
||||
{"title":"麻烦你把牛奶味的饮料放到另一个吧台那个位置。","text":"On(MilkDrink,Bar2)"}
|
||||
{"title":"请你拿一下牛奶味的饮料到另一个吧台位置。","text":"On(MilkDrink,Bar2)"}
|
||||
{"title":"麻烦你把牛奶味的饮料放到第一张桌子那个位置。","text":"On(MilkDrink,Table1)"}
|
||||
{"title":"请你拿一下牛奶味的饮料到第一张桌子位置。","text":"On(MilkDrink,Table1)"}
|
||||
{"title":"麻烦你把牛奶味的饮料放到第二张桌子那个位置。","text":"On(MilkDrink,Table2)"}
|
||||
{"title":"请你拿一下牛奶味的饮料到第二张桌子位置。","text":"On(MilkDrink,Table2)"}
|
||||
{"title":"麻烦你把牛奶味的饮料放到第三张桌子那个位置。","text":"On(MilkDrink,Table3)"}
|
||||
{"title":"请你拿一下牛奶味的饮料到第三张桌子位置。","text":"On(MilkDrink,Table3)"}
|
||||
{"title":"麻烦你把牛奶放到吧台那个位置。","text":"On(Milk,Bar)"}
|
||||
{"title":"请你拿一下牛奶到吧台位置。","text":"On(Milk,Bar)"}
|
||||
{"title":"麻烦你把牛奶放到茶水桌那个位置。","text":"On(Milk,WaterTable)"}
|
||||
{"title":"请你拿一下牛奶到茶水桌位置。","text":"On(Milk,WaterTable)"}
|
||||
{"title":"麻烦你把牛奶放到咖啡桌那个位置。","text":"On(Milk,CoffeeTable)"}
|
||||
{"title":"请你拿一下牛奶到咖啡桌位置。","text":"On(Milk,CoffeeTable)"}
|
||||
{"title":"麻烦你把牛奶放到另一个吧台那个位置。","text":"On(Milk,Bar2)"}
|
||||
{"title":"请你拿一下牛奶到另一个吧台位置。","text":"On(Milk,Bar2)"}
|
||||
{"title":"麻烦你把牛奶放到第一张桌子那个位置。","text":"On(Milk,Table1)"}
|
||||
{"title":"请你拿一下牛奶到第一张桌子位置。","text":"On(Milk,Table1)"}
|
||||
{"title":"麻烦你把牛奶放到第二张桌子那个位置。","text":"On(Milk,Table2)"}
|
||||
{"title":"请你拿一下牛奶到第二张桌子位置。","text":"On(Milk,Table2)"}
|
||||
{"title":"麻烦你把牛奶放到第三张桌子那个位置。","text":"On(Milk,Table3)"}
|
||||
{"title":"请你拿一下牛奶到第三张桌子位置。","text":"On(Milk,Table3)"}
|
||||
{"title":"麻烦你把保温杯放到吧台那个位置。","text":"On(VacuumCup,Bar)"}
|
||||
{"title":"请你拿一下保温杯到吧台位置。","text":"On(VacuumCup,Bar)"}
|
||||
{"title":"麻烦你把保温杯放到茶水桌那个位置。","text":"On(VacuumCup,WaterTable)"}
|
||||
{"title":"请你拿一下保温杯到茶水桌位置。","text":"On(VacuumCup,WaterTable)"}
|
||||
{"title":"麻烦你把保温杯放到咖啡桌那个位置。","text":"On(VacuumCup,CoffeeTable)"}
|
||||
{"title":"请你拿一下保温杯到咖啡桌位置。","text":"On(VacuumCup,CoffeeTable)"}
|
||||
{"title":"麻烦你把保温杯放到另一个吧台那个位置。","text":"On(VacuumCup,Bar2)"}
|
||||
{"title":"请你拿一下保温杯到另一个吧台位置。","text":"On(VacuumCup,Bar2)"}
|
||||
{"title":"麻烦你把保温杯放到第一张桌子那个位置。","text":"On(VacuumCup,Table1)"}
|
||||
{"title":"请你拿一下保温杯到第一张桌子位置。","text":"On(VacuumCup,Table1)"}
|
||||
{"title":"麻烦你把保温杯放到第二张桌子那个位置。","text":"On(VacuumCup,Table2)"}
|
||||
{"title":"请你拿一下保温杯到第二张桌子位置。","text":"On(VacuumCup,Table2)"}
|
||||
{"title":"麻烦你把保温杯放到第三张桌子那个位置。","text":"On(VacuumCup,Table3)"}
|
||||
{"title":"请你拿一下保温杯到第三张桌子位置。","text":"On(VacuumCup,Table3)"}
|
||||
{"title":"你能把空调关闭一下吗?","text":"Is(AC,On)"}
|
||||
{"title":"你能把空调打开一下吗?","text":"Is(AC,Off)"}
|
||||
{"title":"你能把空调Temperature调高一下吗?","text":"Is(ACTemperature,On)"}
|
||||
{"title":"你能把空调Temperature调低一下吗?","text":"Is(ACTemperature,Off)"}
|
||||
{"title":"你能把大厅灯关闭一下吗?","text":"Is(HallLight,On)"}
|
||||
{"title":"你能把大厅灯打开一下吗?","text":"Is(HallLight,Off)"}
|
||||
{"title":"你能把筒灯关闭一下吗?","text":"Is(TubeLight,On)"}
|
||||
{"title":"你能把筒灯打开一下吗?","text":"Is(TubeLight,Off)"}
|
||||
{"title":"你能把窗帘关闭一下吗?","text":"Is(Curtain,On)"}
|
||||
{"title":"你能把窗帘打开一下吗?","text":"Is(Curtain,Off)"}
|
||||
{"title":"你能把椅子脏一下吗?","text":"Is(Chairs,On)"}
|
||||
{"title":"你能把椅子打扫干净一下吗?","text":"Is(Chairs,Off)"}
|
||||
{"title":"你能把地板脏一下吗?","text":"Is(Floor,On)"}
|
||||
{"title":"你能把地板打扫干净一下吗?","text":"Is(Floor,Off)"}
|
||||
{"title":"你能把第一张桌子脏一下吗?","text":"Is(Table1,On)"}
|
||||
{"title":"你能把第一张桌子打扫干净一下吗?","text":"Is(Table1,Off)"}
|
||||
{"title":"你能把盒装冰红茶抓在手里吗?","text":"Holding(Softdrink)"}
|
||||
{"title":"你能一直拿着盒装冰红茶吗?","text":"Holding(Softdrink)"}
|
||||
{"title":"你能把瓶装饮料抓在手里吗?","text":"Holding(BottledDrink)"}
|
||||
{"title":"你能一直拿着瓶装饮料吗?","text":"Holding(BottledDrink)"}
|
||||
{"title":"你能把酸奶抓在手里吗?","text":"Holding(Yogurt)"}
|
||||
{"title":"你能一直拿着酸奶吗?","text":"Holding(Yogurt)"}
|
||||
{"title":"你能把AD钙奶抓在手里吗?","text":"Holding(ADMilk)"}
|
||||
{"title":"你能一直拿着AD钙奶吗?","text":"Holding(ADMilk)"}
|
||||
{"title":"你能把牛奶味的饮料抓在手里吗?","text":"Holding(MilkDrink)"}
|
||||
{"title":"你能一直拿着牛奶味的饮料吗?","text":"Holding(MilkDrink)"}
|
||||
{"title":"你能把牛奶抓在手里吗?","text":"Holding(Milk)"}
|
||||
{"title":"你能一直拿着牛奶吗?","text":"Holding(Milk)"}
|
||||
{"title":"你能把保温杯抓在手里吗?","text":"Holding(VacuumCup)"}
|
||||
{"title":"你能一直拿着保温杯吗?","text":"Holding(VacuumCup)"}
|
||||
{"title":"你能把Nothing抓在手里吗?","text":"Holding(Nothing)"}
|
||||
{"title":"你能一直拿着Nothing吗?","text":"Holding(Nothing)"}
|
||||
{"title":"你能制作咖啡并把它端到吧台这里来吗?","text":"On(Coffee,Bar)"}
|
||||
{"title":"给我来点咖啡,并把它端到吧台这里来。","text":"On(Coffee,Bar)"}
|
||||
{"title":"你能制作咖啡并把它端到茶水桌这里来吗?","text":"On(Coffee,WaterTable)"}
|
||||
{"title":"给我来点咖啡,并把它端到茶水桌这里来。","text":"On(Coffee,WaterTable)"}
|
||||
{"title":"你能制作咖啡并把它端到咖啡桌这里来吗?","text":"On(Coffee,CoffeeTable)"}
|
||||
{"title":"给我来点咖啡,并把它端到咖啡桌这里来。","text":"On(Coffee,CoffeeTable)"}
|
||||
{"title":"你能制作咖啡并把它端到另一个吧台这里来吗?","text":"On(Coffee,Bar2)"}
|
||||
{"title":"给我来点咖啡,并把它端到另一个吧台这里来。","text":"On(Coffee,Bar2)"}
|
||||
{"title":"你能制作咖啡并把它端到第一张桌子这里来吗?","text":"On(Coffee,Table1)"}
|
||||
{"title":"给我来点咖啡,并把它端到第一张桌子这里来。","text":"On(Coffee,Table1)"}
|
||||
{"title":"你能制作咖啡并把它端到第二张桌子这里来吗?","text":"On(Coffee,Table2)"}
|
||||
{"title":"给我来点咖啡,并把它端到第二张桌子这里来。","text":"On(Coffee,Table2)"}
|
||||
{"title":"你能制作咖啡并把它端到第三张桌子这里来吗?","text":"On(Coffee,Table3)"}
|
||||
{"title":"给我来点咖啡,并把它端到第三张桌子这里来。","text":"On(Coffee,Table3)"}
|
||||
{"title":"你能制作水并把它端到吧台这里来吗?","text":"On(Water,Bar)"}
|
||||
{"title":"给我来点水,并把它端到吧台这里来。","text":"On(Water,Bar)"}
|
||||
{"title":"你能制作水并把它端到茶水桌这里来吗?","text":"On(Water,WaterTable)"}
|
||||
{"title":"给我来点水,并把它端到茶水桌这里来。","text":"On(Water,WaterTable)"}
|
||||
{"title":"你能制作水并把它端到咖啡桌这里来吗?","text":"On(Water,CoffeeTable)"}
|
||||
{"title":"给我来点水,并把它端到咖啡桌这里来。","text":"On(Water,CoffeeTable)"}
|
||||
{"title":"你能制作水并把它端到另一个吧台这里来吗?","text":"On(Water,Bar2)"}
|
||||
{"title":"给我来点水,并把它端到另一个吧台这里来。","text":"On(Water,Bar2)"}
|
||||
{"title":"你能制作水并把它端到第一张桌子这里来吗?","text":"On(Water,Table1)"}
|
||||
{"title":"给我来点水,并把它端到第一张桌子这里来。","text":"On(Water,Table1)"}
|
||||
{"title":"你能制作水并把它端到第二张桌子这里来吗?","text":"On(Water,Table2)"}
|
||||
{"title":"给我来点水,并把它端到第二张桌子这里来。","text":"On(Water,Table2)"}
|
||||
{"title":"你能制作水并把它端到第三张桌子这里来吗?","text":"On(Water,Table3)"}
|
||||
{"title":"给我来点水,并把它端到第三张桌子这里来。","text":"On(Water,Table3)"}
|
||||
{"title":"你能制作点心或者甜品并把它端到吧台这里来吗?","text":"On(Dessert,Bar)"}
|
||||
{"title":"给我来点点心或者甜品,并把它端到吧台这里来。","text":"On(Dessert,Bar)"}
|
||||
{"title":"你能制作点心或者甜品并把它端到茶水桌这里来吗?","text":"On(Dessert,WaterTable)"}
|
||||
{"title":"给我来点点心或者甜品,并把它端到茶水桌这里来。","text":"On(Dessert,WaterTable)"}
|
||||
{"title":"你能制作点心或者甜品并把它端到咖啡桌这里来吗?","text":"On(Dessert,CoffeeTable)"}
|
||||
{"title":"给我来点点心或者甜品,并把它端到咖啡桌这里来。","text":"On(Dessert,CoffeeTable)"}
|
||||
{"title":"你能制作点心或者甜品并把它端到另一个吧台这里来吗?","text":"On(Dessert,Bar2)"}
|
||||
{"title":"给我来点点心或者甜品,并把它端到另一个吧台这里来。","text":"On(Dessert,Bar2)"}
|
||||
{"title":"你能制作点心或者甜品并把它端到第一张桌子这里来吗?","text":"On(Dessert,Table1)"}
|
||||
{"title":"给我来点点心或者甜品,并把它端到第一张桌子这里来。","text":"On(Dessert,Table1)"}
|
||||
{"title":"你能制作点心或者甜品并把它端到第二张桌子这里来吗?","text":"On(Dessert,Table2)"}
|
||||
{"title":"给我来点点心或者甜品,并把它端到第二张桌子这里来。","text":"On(Dessert,Table2)"}
|
||||
{"title":"你能制作点心或者甜品并把它端到第三张桌子这里来吗?","text":"On(Dessert,Table3)"}
|
||||
{"title":"给我来点点心或者甜品,并把它端到第三张桌子这里来。","text":"On(Dessert,Table3)"}
|
|
@ -0,0 +1,193 @@
|
|||
At(Robot,Bar) 你能过来一下吗?我在吧台这里。
|
||||
At(Robot,Bar) 麻烦你去一下吧台。
|
||||
At(Robot,Bar) 你能去吧台那个位置吗?
|
||||
At(Robot,WaterTable) 你能过来一下吗?我在茶水桌这里。
|
||||
At(Robot,WaterTable) 麻烦你去一下茶水桌。
|
||||
At(Robot,WaterTable) 你能去茶水桌那个位置吗?
|
||||
At(Robot,CoffeeTable) 你能过来一下吗?我在咖啡桌这里。
|
||||
At(Robot,CoffeeTable) 麻烦你去一下咖啡桌。
|
||||
At(Robot,CoffeeTable) 你能去咖啡桌那个位置吗?
|
||||
At(Robot,Bar2) 你能过来一下吗?我在另一个吧台这里。
|
||||
At(Robot,Bar2) 麻烦你去一下另一个吧台。
|
||||
At(Robot,Bar2) 你能去另一个吧台那个位置吗?
|
||||
At(Robot,Table1) 你能过来一下吗?我在第一张桌子这里。
|
||||
At(Robot,Table1) 麻烦你去一下第一张桌子。
|
||||
At(Robot,Table1) 你能去第一张桌子那个位置吗?
|
||||
At(Robot,Table2) 你能过来一下吗?我在第二张桌子这里。
|
||||
At(Robot,Table2) 麻烦你去一下第二张桌子。
|
||||
At(Robot,Table2) 你能去第二张桌子那个位置吗?
|
||||
At(Robot,Table3) 你能过来一下吗?我在第三张桌子这里。
|
||||
At(Robot,Table3) 麻烦你去一下第三张桌子。
|
||||
At(Robot,Table3) 你能去第三张桌子那个位置吗?
|
||||
On(Softdrink,Bar) 麻烦你把盒装冰红茶放到吧台那个位置。
|
||||
On(Softdrink,Bar) 请你拿一下盒装冰红茶到吧台位置。
|
||||
On(Softdrink,WaterTable) 麻烦你把盒装冰红茶放到茶水桌那个位置。
|
||||
On(Softdrink,WaterTable) 请你拿一下盒装冰红茶到茶水桌位置。
|
||||
On(Softdrink,CoffeeTable) 麻烦你把盒装冰红茶放到咖啡桌那个位置。
|
||||
On(Softdrink,CoffeeTable) 请你拿一下盒装冰红茶到咖啡桌位置。
|
||||
On(Softdrink,Bar2) 麻烦你把盒装冰红茶放到另一个吧台那个位置。
|
||||
On(Softdrink,Bar2) 请你拿一下盒装冰红茶到另一个吧台位置。
|
||||
On(Softdrink,Table1) 麻烦你把盒装冰红茶放到第一张桌子那个位置。
|
||||
On(Softdrink,Table1) 请你拿一下盒装冰红茶到第一张桌子位置。
|
||||
On(Softdrink,Table2) 麻烦你把盒装冰红茶放到第二张桌子那个位置。
|
||||
On(Softdrink,Table2) 请你拿一下盒装冰红茶到第二张桌子位置。
|
||||
On(Softdrink,Table3) 麻烦你把盒装冰红茶放到第三张桌子那个位置。
|
||||
On(Softdrink,Table3) 请你拿一下盒装冰红茶到第三张桌子位置。
|
||||
On(BottledDrink,Bar) 麻烦你把瓶装饮料放到吧台那个位置。
|
||||
On(BottledDrink,Bar) 请你拿一下瓶装饮料到吧台位置。
|
||||
On(BottledDrink,WaterTable) 麻烦你把瓶装饮料放到茶水桌那个位置。
|
||||
On(BottledDrink,WaterTable) 请你拿一下瓶装饮料到茶水桌位置。
|
||||
On(BottledDrink,CoffeeTable) 麻烦你把瓶装饮料放到咖啡桌那个位置。
|
||||
On(BottledDrink,CoffeeTable) 请你拿一下瓶装饮料到咖啡桌位置。
|
||||
On(BottledDrink,Bar2) 麻烦你把瓶装饮料放到另一个吧台那个位置。
|
||||
On(BottledDrink,Bar2) 请你拿一下瓶装饮料到另一个吧台位置。
|
||||
On(BottledDrink,Table1) 麻烦你把瓶装饮料放到第一张桌子那个位置。
|
||||
On(BottledDrink,Table1) 请你拿一下瓶装饮料到第一张桌子位置。
|
||||
On(BottledDrink,Table2) 麻烦你把瓶装饮料放到第二张桌子那个位置。
|
||||
On(BottledDrink,Table2) 请你拿一下瓶装饮料到第二张桌子位置。
|
||||
On(BottledDrink,Table3) 麻烦你把瓶装饮料放到第三张桌子那个位置。
|
||||
On(BottledDrink,Table3) 请你拿一下瓶装饮料到第三张桌子位置。
|
||||
On(Yogurt,Bar) 麻烦你把酸奶放到吧台那个位置。
|
||||
On(Yogurt,Bar) 请你拿一下酸奶到吧台位置。
|
||||
On(Yogurt,WaterTable) 麻烦你把酸奶放到茶水桌那个位置。
|
||||
On(Yogurt,WaterTable) 请你拿一下酸奶到茶水桌位置。
|
||||
On(Yogurt,CoffeeTable) 麻烦你把酸奶放到咖啡桌那个位置。
|
||||
On(Yogurt,CoffeeTable) 请你拿一下酸奶到咖啡桌位置。
|
||||
On(Yogurt,Bar2) 麻烦你把酸奶放到另一个吧台那个位置。
|
||||
On(Yogurt,Bar2) 请你拿一下酸奶到另一个吧台位置。
|
||||
On(Yogurt,Table1) 麻烦你把酸奶放到第一张桌子那个位置。
|
||||
On(Yogurt,Table1) 请你拿一下酸奶到第一张桌子位置。
|
||||
On(Yogurt,Table2) 麻烦你把酸奶放到第二张桌子那个位置。
|
||||
On(Yogurt,Table2) 请你拿一下酸奶到第二张桌子位置。
|
||||
On(Yogurt,Table3) 麻烦你把酸奶放到第三张桌子那个位置。
|
||||
On(Yogurt,Table3) 请你拿一下酸奶到第三张桌子位置。
|
||||
On(ADMilk,Bar) 麻烦你把AD钙奶放到吧台那个位置。
|
||||
On(ADMilk,Bar) 请你拿一下AD钙奶到吧台位置。
|
||||
On(ADMilk,WaterTable) 麻烦你把AD钙奶放到茶水桌那个位置。
|
||||
On(ADMilk,WaterTable) 请你拿一下AD钙奶到茶水桌位置。
|
||||
On(ADMilk,CoffeeTable) 麻烦你把AD钙奶放到咖啡桌那个位置。
|
||||
On(ADMilk,CoffeeTable) 请你拿一下AD钙奶到咖啡桌位置。
|
||||
On(ADMilk,Bar2) 麻烦你把AD钙奶放到另一个吧台那个位置。
|
||||
On(ADMilk,Bar2) 请你拿一下AD钙奶到另一个吧台位置。
|
||||
On(ADMilk,Table1) 麻烦你把AD钙奶放到第一张桌子那个位置。
|
||||
On(ADMilk,Table1) 请你拿一下AD钙奶到第一张桌子位置。
|
||||
On(ADMilk,Table2) 麻烦你把AD钙奶放到第二张桌子那个位置。
|
||||
On(ADMilk,Table2) 请你拿一下AD钙奶到第二张桌子位置。
|
||||
On(ADMilk,Table3) 麻烦你把AD钙奶放到第三张桌子那个位置。
|
||||
On(ADMilk,Table3) 请你拿一下AD钙奶到第三张桌子位置。
|
||||
On(MilkDrink,Bar) 麻烦你把牛奶味的饮料放到吧台那个位置。
|
||||
On(MilkDrink,Bar) 请你拿一下牛奶味的饮料到吧台位置。
|
||||
On(MilkDrink,WaterTable) 麻烦你把牛奶味的饮料放到茶水桌那个位置。
|
||||
On(MilkDrink,WaterTable) 请你拿一下牛奶味的饮料到茶水桌位置。
|
||||
On(MilkDrink,CoffeeTable) 麻烦你把牛奶味的饮料放到咖啡桌那个位置。
|
||||
On(MilkDrink,CoffeeTable) 请你拿一下牛奶味的饮料到咖啡桌位置。
|
||||
On(MilkDrink,Bar2) 麻烦你把牛奶味的饮料放到另一个吧台那个位置。
|
||||
On(MilkDrink,Bar2) 请你拿一下牛奶味的饮料到另一个吧台位置。
|
||||
On(MilkDrink,Table1) 麻烦你把牛奶味的饮料放到第一张桌子那个位置。
|
||||
On(MilkDrink,Table1) 请你拿一下牛奶味的饮料到第一张桌子位置。
|
||||
On(MilkDrink,Table2) 麻烦你把牛奶味的饮料放到第二张桌子那个位置。
|
||||
On(MilkDrink,Table2) 请你拿一下牛奶味的饮料到第二张桌子位置。
|
||||
On(MilkDrink,Table3) 麻烦你把牛奶味的饮料放到第三张桌子那个位置。
|
||||
On(MilkDrink,Table3) 请你拿一下牛奶味的饮料到第三张桌子位置。
|
||||
On(Milk,Bar) 麻烦你把牛奶放到吧台那个位置。
|
||||
On(Milk,Bar) 请你拿一下牛奶到吧台位置。
|
||||
On(Milk,WaterTable) 麻烦你把牛奶放到茶水桌那个位置。
|
||||
On(Milk,WaterTable) 请你拿一下牛奶到茶水桌位置。
|
||||
On(Milk,CoffeeTable) 麻烦你把牛奶放到咖啡桌那个位置。
|
||||
On(Milk,CoffeeTable) 请你拿一下牛奶到咖啡桌位置。
|
||||
On(Milk,Bar2) 麻烦你把牛奶放到另一个吧台那个位置。
|
||||
On(Milk,Bar2) 请你拿一下牛奶到另一个吧台位置。
|
||||
On(Milk,Table1) 麻烦你把牛奶放到第一张桌子那个位置。
|
||||
On(Milk,Table1) 请你拿一下牛奶到第一张桌子位置。
|
||||
On(Milk,Table2) 麻烦你把牛奶放到第二张桌子那个位置。
|
||||
On(Milk,Table2) 请你拿一下牛奶到第二张桌子位置。
|
||||
On(Milk,Table3) 麻烦你把牛奶放到第三张桌子那个位置。
|
||||
On(Milk,Table3) 请你拿一下牛奶到第三张桌子位置。
|
||||
On(VacuumCup,Bar) 麻烦你把保温杯放到吧台那个位置。
|
||||
On(VacuumCup,Bar) 请你拿一下保温杯到吧台位置。
|
||||
On(VacuumCup,WaterTable) 麻烦你把保温杯放到茶水桌那个位置。
|
||||
On(VacuumCup,WaterTable) 请你拿一下保温杯到茶水桌位置。
|
||||
On(VacuumCup,CoffeeTable) 麻烦你把保温杯放到咖啡桌那个位置。
|
||||
On(VacuumCup,CoffeeTable) 请你拿一下保温杯到咖啡桌位置。
|
||||
On(VacuumCup,Bar2) 麻烦你把保温杯放到另一个吧台那个位置。
|
||||
On(VacuumCup,Bar2) 请你拿一下保温杯到另一个吧台位置。
|
||||
On(VacuumCup,Table1) 麻烦你把保温杯放到第一张桌子那个位置。
|
||||
On(VacuumCup,Table1) 请你拿一下保温杯到第一张桌子位置。
|
||||
On(VacuumCup,Table2) 麻烦你把保温杯放到第二张桌子那个位置。
|
||||
On(VacuumCup,Table2) 请你拿一下保温杯到第二张桌子位置。
|
||||
On(VacuumCup,Table3) 麻烦你把保温杯放到第三张桌子那个位置。
|
||||
On(VacuumCup,Table3) 请你拿一下保温杯到第三张桌子位置。
|
||||
Is(AC,On) 你能把空调关闭一下吗?
|
||||
Is(AC,Off) 你能把空调打开一下吗?
|
||||
Is(ACTemperature,On) 你能把空调Temperature调高一下吗?
|
||||
Is(ACTemperature,Off) 你能把空调Temperature调低一下吗?
|
||||
Is(HallLight,On) 你能把大厅灯关闭一下吗?
|
||||
Is(HallLight,Off) 你能把大厅灯打开一下吗?
|
||||
Is(TubeLight,On) 你能把筒灯关闭一下吗?
|
||||
Is(TubeLight,Off) 你能把筒灯打开一下吗?
|
||||
Is(Curtain,On) 你能把窗帘关闭一下吗?
|
||||
Is(Curtain,Off) 你能把窗帘打开一下吗?
|
||||
Is(Chairs,On) 你能把椅子脏一下吗?
|
||||
Is(Chairs,Off) 你能把椅子打扫干净一下吗?
|
||||
Is(Floor,On) 你能把地板脏一下吗?
|
||||
Is(Floor,Off) 你能把地板打扫干净一下吗?
|
||||
Is(Table1,On) 你能把第一张桌子脏一下吗?
|
||||
Is(Table1,Off) 你能把第一张桌子打扫干净一下吗?
|
||||
Holding(Softdrink) 你能把盒装冰红茶抓在手里吗?
|
||||
Holding(Softdrink) 你能一直拿着盒装冰红茶吗?
|
||||
Holding(BottledDrink) 你能把瓶装饮料抓在手里吗?
|
||||
Holding(BottledDrink) 你能一直拿着瓶装饮料吗?
|
||||
Holding(Yogurt) 你能把酸奶抓在手里吗?
|
||||
Holding(Yogurt) 你能一直拿着酸奶吗?
|
||||
Holding(ADMilk) 你能把AD钙奶抓在手里吗?
|
||||
Holding(ADMilk) 你能一直拿着AD钙奶吗?
|
||||
Holding(MilkDrink) 你能把牛奶味的饮料抓在手里吗?
|
||||
Holding(MilkDrink) 你能一直拿着牛奶味的饮料吗?
|
||||
Holding(Milk) 你能把牛奶抓在手里吗?
|
||||
Holding(Milk) 你能一直拿着牛奶吗?
|
||||
Holding(VacuumCup) 你能把保温杯抓在手里吗?
|
||||
Holding(VacuumCup) 你能一直拿着保温杯吗?
|
||||
Holding(Nothing) 你能把Nothing抓在手里吗?
|
||||
Holding(Nothing) 你能一直拿着Nothing吗?
|
||||
On(Coffee,Bar) 你能制作咖啡并把它端到吧台这里来吗?
|
||||
On(Coffee,Bar) 给我来点咖啡,并把它端到吧台这里来。
|
||||
On(Coffee,WaterTable) 你能制作咖啡并把它端到茶水桌这里来吗?
|
||||
On(Coffee,WaterTable) 给我来点咖啡,并把它端到茶水桌这里来。
|
||||
On(Coffee,CoffeeTable) 你能制作咖啡并把它端到咖啡桌这里来吗?
|
||||
On(Coffee,CoffeeTable) 给我来点咖啡,并把它端到咖啡桌这里来。
|
||||
On(Coffee,Bar2) 你能制作咖啡并把它端到另一个吧台这里来吗?
|
||||
On(Coffee,Bar2) 给我来点咖啡,并把它端到另一个吧台这里来。
|
||||
On(Coffee,Table1) 你能制作咖啡并把它端到第一张桌子这里来吗?
|
||||
On(Coffee,Table1) 给我来点咖啡,并把它端到第一张桌子这里来。
|
||||
On(Coffee,Table2) 你能制作咖啡并把它端到第二张桌子这里来吗?
|
||||
On(Coffee,Table2) 给我来点咖啡,并把它端到第二张桌子这里来。
|
||||
On(Coffee,Table3) 你能制作咖啡并把它端到第三张桌子这里来吗?
|
||||
On(Coffee,Table3) 给我来点咖啡,并把它端到第三张桌子这里来。
|
||||
On(Water,Bar) 你能制作水并把它端到吧台这里来吗?
|
||||
On(Water,Bar) 给我来点水,并把它端到吧台这里来。
|
||||
On(Water,WaterTable) 你能制作水并把它端到茶水桌这里来吗?
|
||||
On(Water,WaterTable) 给我来点水,并把它端到茶水桌这里来。
|
||||
On(Water,CoffeeTable) 你能制作水并把它端到咖啡桌这里来吗?
|
||||
On(Water,CoffeeTable) 给我来点水,并把它端到咖啡桌这里来。
|
||||
On(Water,Bar2) 你能制作水并把它端到另一个吧台这里来吗?
|
||||
On(Water,Bar2) 给我来点水,并把它端到另一个吧台这里来。
|
||||
On(Water,Table1) 你能制作水并把它端到第一张桌子这里来吗?
|
||||
On(Water,Table1) 给我来点水,并把它端到第一张桌子这里来。
|
||||
On(Water,Table2) 你能制作水并把它端到第二张桌子这里来吗?
|
||||
On(Water,Table2) 给我来点水,并把它端到第二张桌子这里来。
|
||||
On(Water,Table3) 你能制作水并把它端到第三张桌子这里来吗?
|
||||
On(Water,Table3) 给我来点水,并把它端到第三张桌子这里来。
|
||||
On(Dessert,Bar) 你能制作点心或者甜品并把它端到吧台这里来吗?
|
||||
On(Dessert,Bar) 给我来点点心或者甜品,并把它端到吧台这里来。
|
||||
On(Dessert,WaterTable) 你能制作点心或者甜品并把它端到茶水桌这里来吗?
|
||||
On(Dessert,WaterTable) 给我来点点心或者甜品,并把它端到茶水桌这里来。
|
||||
On(Dessert,CoffeeTable) 你能制作点心或者甜品并把它端到咖啡桌这里来吗?
|
||||
On(Dessert,CoffeeTable) 给我来点点心或者甜品,并把它端到咖啡桌这里来。
|
||||
On(Dessert,Bar2) 你能制作点心或者甜品并把它端到另一个吧台这里来吗?
|
||||
On(Dessert,Bar2) 给我来点点心或者甜品,并把它端到另一个吧台这里来。
|
||||
On(Dessert,Table1) 你能制作点心或者甜品并把它端到第一张桌子这里来吗?
|
||||
On(Dessert,Table1) 给我来点点心或者甜品,并把它端到第一张桌子这里来。
|
||||
On(Dessert,Table2) 你能制作点心或者甜品并把它端到第二张桌子这里来吗?
|
||||
On(Dessert,Table2) 给我来点点心或者甜品,并把它端到第二张桌子这里来。
|
||||
On(Dessert,Table3) 你能制作点心或者甜品并把它端到第三张桌子这里来吗?
|
||||
On(Dessert,Table3) 给我来点点心或者甜品,并把它端到第三张桌子这里来。
|
|
@ -0,0 +1,10 @@
|
|||
import os
|
||||
|
||||
with open(os.path.join('./goal_states_with_description.txt'), 'r', encoding='utf-8') as file:
|
||||
lines = file.readlines()
|
||||
|
||||
with open(os.path.join('./goal_states_with_description.jsonl'), 'w', encoding='utf-8') as file:
|
||||
|
||||
for line in lines:
|
||||
tmp = line[:-1].split('\t')
|
||||
file.write("""{"title":"%s","text":"%s"}\n""" % (tmp[1], tmp[0]))
|
|
@ -0,0 +1,61 @@
|
|||
import os
|
||||
import requests
|
||||
import urllib3
|
||||
from tqdm import tqdm
|
||||
|
||||
########################################
|
||||
# 该文件实现了与大模型的简单通信
|
||||
########################################
|
||||
|
||||
# 忽略https的安全性警告
|
||||
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
||||
|
||||
|
||||
def single_round(question, prefix=""):
|
||||
url = "https://45.125.46.134:25344/v1/chat/completions"
|
||||
headers = {"Content-Type": "application/json"}
|
||||
data = {
|
||||
"model": "RoboWaiter",
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
# "content": "你是一个机器人服务员:RoboWaiter. 你的职责是为顾客提供对话及具身服务。"
|
||||
"content": """
|
||||
假设现在你是咖啡厅的一个顾客,请将以下你对咖啡厅服务员说的话改写成更清晰更合理的顾客表述。注意:句中的你指的是咖啡厅服务员,也不要说能帮我。
|
||||
例如:麻烦你去一下吧台。可以转述成:服务员,你能去下吧台吗?
|
||||
另一个例子:请你拿一下酸奶到吧台位置。可以转述成:服务员,拿一杯酸奶来吧台。
|
||||
|
||||
"""
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": prefix + question
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
response = requests.post(url, headers=headers, json=data, verify=False)
|
||||
|
||||
if response.status_code == 200:
|
||||
result = response.json()
|
||||
return result['choices'][0]['message']['content'].strip()
|
||||
else:
|
||||
return "大模型请求失败:", response.status_code
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
with open('./goal_states_with_description.txt', 'r', encoding='utf-8') as file:
|
||||
lines = file.readlines()
|
||||
|
||||
output_file = './expansion_out/output2.txt'
|
||||
with open(output_file, 'a', encoding='utf-8') as file:
|
||||
file.truncate(0)
|
||||
for line in tqdm(lines):
|
||||
tmp = line[:-1].split('\t')
|
||||
# file.write("""{"title":"%s","text":"%s"}\n""" % (tmp[1], tmp[0]))
|
||||
question = tmp[1]
|
||||
# print(single_round(question))
|
||||
# print(tmp[1])
|
||||
with open(output_file, 'a', encoding='utf-8') as file:
|
||||
file.write(tmp[0] + "\t" + single_round(question, prefix="现在改写一下句子:") + '\n')
|
||||
print("输出完成")
|
|
@ -0,0 +1,386 @@
|
|||
At(Robot,Bar) 请给我带来菜单。
|
||||
At(Robot,Bar) 请帮我前往吧台。
|
||||
At(Robot,Bar) 您好,我需要去吧台那个位置,请问可以帮我吗?
|
||||
At(Robot,WaterTable) 请送一些茶水到茶水桌。
|
||||
At(Robot,WaterTable) 请帮我前往茶水桌。
|
||||
At(Robot,WaterTable) 您好,请问您需要我前往哪个位置呢?
|
||||
At(Robot,CoffeeTable) 请问能帮我来到这个咖啡桌吗?
|
||||
At(Robot,CoffeeTable) 请前往咖啡桌。
|
||||
At(Robot,CoffeeTable) 您好!请问您能帮我前往咖啡桌的位置吗?
|
||||
At(Robot,Bar2) 您好,请问您需要前往哪个吧台呢?
|
||||
At(Robot,Bar2) 请帮我前往另一个吧台。
|
||||
At(Robot,Bar2) 您好,机器人服务员!请问您能告诉我如何前往另一个吧台的位置吗?
|
||||
At(Robot,Table1) 请给我送一份菜单到第一桌。
|
||||
At(Robot,Table1) 请帮我前往第一桌,谢谢!
|
||||
At(Robot,Table1) 您好,我是一名AI助手,请问有什么我可以帮您的?
|
||||
At(Robot,Table2) 请帮我来到第二张桌子。
|
||||
At(Robot,Table2) 请帮我前往第二桌,谢谢!
|
||||
At(Robot,Table2) 您好,机器人服务员!请问您能否前往第二桌的位置提供服务?
|
||||
At(Robot,Table3) 请给我带来第三桌子的服务。
|
||||
At(Robot,Table3) 请前往第三张桌子。
|
||||
At(Robot,Table3) 您好,请问您需要我前往第三张桌子所在的方位吗?
|
||||
On(Softdrink,Bar) 请将软饮料放在吧台那个位置。
|
||||
On(Softdrink,Bar) 请将软饮料拿到吧台位置。
|
||||
On(Softdrink,WaterTable) 请将软饮料放在茶水桌那个位置。
|
||||
On(Softdrink,WaterTable) 请给我拿一罐软饮料,放在茶水桌的位置。
|
||||
On(Softdrink,CoffeeTable) 请将软饮料放在咖啡桌上的指定位置。
|
||||
On(Softdrink,CoffeeTable) 请把软饮料拿到我的咖啡桌位置。
|
||||
On(Softdrink,Bar2) 请将软饮料放在另一个酒吧台的位置。
|
||||
On(Softdrink,Bar2) 请将软饮料拿到另一个酒吧台位置。
|
||||
On(Softdrink,Table1) 请将软饮料放在第一桌的指定位置。
|
||||
On(Softdrink,Table1) 请给我拿一罐软饮料,放在第一桌子的位置。
|
||||
On(Softdrink,Table2) 请将软饮料放在第二桌的位置。
|
||||
On(Softdrink,Table2) 请帮我从一个位置(可能是吧台或货架)取来一瓶软饮料,然后将其放在第二张桌子上。
|
||||
On(Softdrink,Table3) 请将软饮料放在第三桌的具体位置。
|
||||
On(Softdrink,Table3) 请给我拿一罐软饮料,放 到第三张桌子的位置。
|
||||
On(BottledDrink,Bar) 您好,我想让您将瓶装饮料放在吧台那个位置。
|
||||
On(BottledDrink,Bar) 请帮我取一下瓶装饮料,放到吧台那里。
|
||||
On(BottledDrink,WaterTable) 您好,机器人服务员,我想让您放一瓶饮料在茶水桌上,可以吗?
|
||||
On(BottledDrink,WaterTable) 请帮我拿一下瓶装饮料,放到茶水桌的位置。
|
||||
On(BottledDrink,CoffeeTable) 请将瓶装饮料放在咖啡桌上的指定位置。
|
||||
On(BottledDrink,CoffeeTable) 请把瓶装饮料拿到我的咖啡桌位置。
|
||||
On(BottledDrink,Bar2) 请将瓶装饮料放在另一个酒吧台的位置。
|
||||
On(BottledDrink,Bar2) 请帮我从一个吧台位置取一个瓶装饮料,然后将其拿到另一个吧台位置。
|
||||
On(BottledDrink,Table1) 请将瓶装饮料放在第一桌的指定位置。
|
||||
On(BottledDrink,Table1) 您好,我需要您帮忙将瓶装饮料拿到第一桌的位置。
|
||||
On(BottledDrink,Table2) 您好,我需要您帮助将瓶装饮料放在第二桌的具体位置。
|
||||
On(BottledDrink,Table2) 请给我拿一罐饮料,放在第二桌的位置。
|
||||
On(BottledDrink,Table3) 请将瓶装饮料放在第三桌的位置。
|
||||
On(BottledDrink,Table3) 请给我取一瓶饮料,放到了第三桌子上。
|
||||
On(Yogurt,Bar) 您好,我需要您将酸奶放在吧台上的哪个位置。
|
||||
On(Yogurt,Bar) 请您把酸奶拿到吧台。
|
||||
On(Yogurt,WaterTable) 请将酸奶放在茶水桌那个位置。
|
||||
On(Yogurt,WaterTable) 请将酸奶放在茶水桌的位置。
|
||||
On(Yogurt,CoffeeTable) 请将酸奶放在咖啡桌上的指定位置。
|
||||
On(Yogurt,CoffeeTable) 请把酸奶放在咖啡桌的位置。
|
||||
On(Yogurt,Bar2) 请将酸奶放在另一个吧台上的那个位置。
|
||||
On(Yogurt,Bar2) 您好,机器人服务员!请问您可以帮我拿一下酸奶,放到那个靠近窗户的吧台位置吗?谢谢!
|
||||
On(Yogurt,Table1) 请将酸奶放在第一桌的第一位置。
|
||||
On(Yogurt,Table1) 请将酸奶放在第一桌的位置。
|
||||
On(Yogurt,Table2) 您好,请问能帮我将酸奶放在第二张桌子的位置吗?谢谢!
|
||||
On(Yogurt,Table2) 请把酸奶放在第二桌的位置。
|
||||
On(Yogurt,Table3) 您好,机器人服务员,我想让您把酸奶放到第三张桌子的位置。谢谢!
|
||||
On(Yogurt,Table3) 请把酸奶放在第三桌的位置。
|
||||
On(ADMilk,Bar) 请将AD钙奶放在吧台那个位置。
|
||||
On(ADMilk,Bar) 请把AD钙奶放到 bar 位置。
|
||||
On(ADMilk,WaterTable) 请将AD钙奶放在茶水桌那个位置。
|
||||
On(ADMilk,WaterTable) 请帮我取一份AD钙奶,放在茶水桌的位置上。
|
||||
On(ADMilk,CoffeeTable) 请将AD钙奶放在咖啡桌上的指定位置。
|
||||
On(ADMilk,CoffeeTable) 请将AD钙奶送到我的咖啡桌位置。
|
||||
On(ADMilk,Bar2) 请将AD钙奶放在另一个酒吧台的位置。
|
||||
On(ADMilk,Bar2) 您好,机器人服务员!请问能帮我拿一下AD钙奶,放到另一个吧台位置吗?谢谢!
|
||||
On(ADMilk,Table1) 请将AD钙奶放在第一桌的指定位置。
|
||||
On(ADMilk,Table1) 请把AD钙奶放在第一桌的位置。
|
||||
On(ADMilk,Table2) 请将AD钙奶放在第二桌的位置。
|
||||
On(ADMilk,Table2) 请把AD钙奶放在第二桌的位置。
|
||||
On(ADMilk,Table3) 您好,机器人服务员!请问能帮我将AD钙奶放到第三张桌子的位置吗?谢谢!
|
||||
On(ADMilk,Table3) 请帮我取一份AD钙奶,放至第三桌。
|
||||
On(MilkDrink,Bar) 请将牛奶饮料放在吧台那个位置。
|
||||
On(MilkDrink,Bar) 请帮我拿一罐牛奶饮料放到吧台的位置。
|
||||
On(MilkDrink,WaterTable) 请将牛奶饮料放在茶水桌那个位置。
|
||||
On(MilkDrink,WaterTable) 请帮我递一下牛奶饮料,放到茶水桌的位置。
|
||||
On(MilkDrink,CoffeeTable) 请将牛奶饮料放在咖啡桌上的指定位置。
|
||||
On(MilkDrink,CoffeeTable) 请将牛奶饮料放在我的咖啡桌上。
|
||||
On(MilkDrink,Bar2) 请将牛奶饮料放在另一个酒吧台的位置。
|
||||
On(MilkDrink,Bar2) 您好,机器人服务员!请问能否帮我拿一下牛奶饮料,并将其放在另一个吧台位置?谢谢!
|
||||
On(MilkDrink,Table1) 请将牛奶饮料放在第一桌的指定位置。
|
||||
On(MilkDrink,Table1) 请将牛奶饮料拿到第一桌。
|
||||
On(MilkDrink,Table2) 请将牛奶饮料放在第二桌的位置上。
|
||||
On(MilkDrink,Table2) 请给我拿一罐牛奶饮料,放在第二桌的位置。
|
||||
On(MilkDrink,Table3) 请将牛奶饮料放在第三桌的具体位置。
|
||||
On(MilkDrink,Table3) 请给我拿一罐牛奶饮料,放到第三张桌子的位置。
|
||||
On(Milk,Bar) 请将牛奶放在吧台那个地方。
|
||||
On(Milk,Bar) 请把牛奶拿到吧台。
|
||||
On(Milk,WaterTable) 请将牛奶放在茶水桌那个位置。
|
||||
On(Milk,WaterTable) 请将牛奶放在茶水桌附近。
|
||||
On(Milk,CoffeeTable) 请将牛奶放在咖啡桌上的指定位置。
|
||||
On(Milk,CoffeeTable) 请把牛奶放在我的咖啡桌上。
|
||||
On(Milk,Bar2) 请将牛奶放在另一个酒吧台的位置上。
|
||||
On(Milk,Bar2) 请将牛奶拿到另一个吧台位置。
|
||||
On(Milk,Table1) 请将牛奶放在第一桌的位置上。
|
||||
On(Milk,Table1) 请把牛奶放在第一桌的位置上。
|
||||
On(Milk,Table2) 请将牛奶放在第二桌那个位置。
|
||||
On(Milk,Table2) 请给我拿一罐牛奶,放的第二张桌子上。
|
||||
On(Milk,Table3) 您好,我需要您将牛奶放在第三张桌子的位置。谢谢!
|
||||
On(Milk,Table3) 请给我拿一罐牛奶,放到第三桌子的位置。
|
||||
On(VacuumCup,Bar) 请将我的保温杯放在吧台上的那个位置。
|
||||
On(VacuumCup,Bar) 请将我的保温杯拿到吧台。
|
||||
On(VacuumCup,WaterTable) 请将我的保温杯放在茶水桌那个地方。
|
||||
On(VacuumCup,WaterTable) 请将保温杯拿到茶水桌那里。
|
||||
On(VacuumCup,CoffeeTable) 请将保温杯放置在咖啡桌上的指定位置。
|
||||
On(VacuumCup,CoffeeTable) 请把保温杯放在咖啡桌附近。
|
||||
On(VacuumCup,Bar2) 请将我的保温杯放在另一个酒吧台上的那个位置。
|
||||
On(VacuumCup,Bar2) 请帮我把保温杯拿到另一个吧台位置。
|
||||
On(VacuumCup,Table1) 请将保温杯放在第一桌的指定位置。
|
||||
On(VacuumCup,Table1) 请把保温杯拿到第一桌子的位置。
|
||||
On(VacuumCup,Table2) 请将保温杯放在第二桌的具体位置。
|
||||
On(VacuumCup,Table2) 请帮我递一个保温杯到第二桌。
|
||||
On(VacuumCup,Table3) 请将保温杯放在第三桌的指定位置。
|
||||
On(VacuumCup,Table3) 请把保温杯拿到第三桌的位置。
|
||||
Is(AC,0) 当然可以,请问需要我为您执行这个操作吗?
|
||||
Is(AC,1) 您好!请问您需要我为您打开空调吗?
|
||||
Is(ACTemperature,0) 尊敬的服务员,可以请您把空调温度调高一些吗?谢谢!
|
||||
Is(ACTemperature,1) 尊敬的服务员,能否请您将空调温度调低一些呢?
|
||||
Is(HallLight,0) 当然可以,请您稍等,我这就帮您关闭大厅灯。
|
||||
Is(HallLight,1) 您好!请问您需要我为您做些什么呢?
|
||||
Is(TubeLight,0) 尊敬的服务员,请问你能把筒灯调暗一些吗?
|
||||
Is(TubeLight,1) 您好,请问您需要我帮您打开筒灯吗?
|
||||
Is(Curtain,0) 您好,我能为您做什么?
|
||||
Is(Curtain,1) 您好,请问您需要我帮您打开窗帘吗?
|
||||
Is(Chairs,0) 您好!请问需要我为您做什么?
|
||||
Is(Chairs,1) 您好,请问能帮我清理一下座位上的灰尘吗?
|
||||
Is(Floor,0) 抱歉,我理解您的意思了。请问需要我帮忙做些什么来清理地板呢?
|
||||
Is(Floor,1) 请问你能帮我打扫一下地板吗?
|
||||
Is(Table1,0) 您好,请问需要我帮助您做什么呢?如果您需要我清理桌子的灰尘或者污渍,麻烦您告诉我哪一张桌子需要清洁。
|
||||
Is(Table1,1) 请帮我清理一下这张桌子的灰尘和垃圾。
|
||||
Holding(Softdrink) 您好,我是您的机器人服务员。请问您需要什么帮助呢?
|
||||
Holding(Softdrink) 您好,我是一个机器人服务员。请问您需要什么帮助?如果您想要点软饮料,您可以告诉我您的喜好,我会为您推荐一些适合的选项。
|
||||
Holding(BottledDrink) 您好,请问您需要什么帮助?我会尽力满足您的需求。
|
||||
Holding(BottledDrink) 您好,我是一名机器人服务员。请问您需要我帮忙拿着一瓶装饮料吗?
|
||||
Holding(Yogurt) 您好,我可以帮助您点餐和回答问题。请问您需要什么食物或饮料?
|
||||
Holding(Yogurt) 请问你能一直帮我拿着这个酸奶吗?
|
||||
Holding(ADMilk) 你好,尊敬的服务员!能否帮我抓住AD钙奶并递给我呢?
|
||||
Holding(ADMilk) 您好,我无法长时间拿着 AD 钙奶。作为一个机器人服务员,我的任务是帮助您解决问题和回答问题,而不是提供物理服务。如果您需要AD钙奶,我可以告诉您在哪里可以找到它,或者指导您如何自己获取它。
|
||||
Holding(MilkDrink) 您好!请问有什么我可以帮您的吗?
|
||||
Holding(MilkDrink) 您好,我是您的机器人服务员。请问您需要我为您一直拿着这杯牛奶饮料吗?
|
||||
Holding(Milk) 你好,尊敬的服务员,能帮我拿一下牛奶吗?
|
||||
Holding(Milk) 请问你能一直拿着牛奶吗?
|
||||
Holding(VacuumCup) 您好,请问您需要什么帮助?我可以为您提供服务。
|
||||
Holding(VacuumCup) 您好,我是一名AI机器人,无法直接为您拿保温杯。但是,我可以为您提供购买保温杯的建议,或者推荐其他相关商品。请问您需要什么帮助吗?
|
||||
Holding(Nothing) 抱歉,我需要更多的信息来理解您的请求。请问您能告诉我您具体想要什么帮助吗?我会尽力回答您的问题。
|
||||
Holding(Nothing) 请问您能一直拿着无所事事吗?
|
||||
On(Coffee,Bar) 您好,我需要一杯咖啡,并希望它能够被送到吧台。
|
||||
On(Coffee,Bar) 请帮我准备一杯咖啡,然后把咖啡端到吧台这里。
|
||||
On(Coffee,WaterTable) 您好!请问您能帮我制作一杯咖啡并将其端到茶水桌 here 吗?谢谢!
|
||||
On(Coffee,WaterTable) 请帮我准备一杯咖啡,然后将它端到茶水桌旁边。
|
||||
On(Coffee,CoffeeTable) 当然可以,请问您想喝什么类型的咖啡呢?
|
||||
On(Coffee,CoffeeTable) 请帮我准备一杯咖啡,然后将它端到这个咖啡桌上来。
|
||||
On(Coffee,Bar2) 您好,机器人服务员!请问您能帮我制作一杯咖啡,然后把咖啡端到这个吧台这里来吗?谢谢!
|
||||
On(Coffee,Bar2) 请帮我准备一杯咖啡,然后把咖啡端到这个吧台这里。
|
||||
On(Coffee,Table1) 您好,我是一名人工智能助手。请问您需要什么帮助?
|
||||
On(Coffee,Table1) 请给我一杯咖啡,并将其放在第一桌子上。
|
||||
On(Coffee,Table2) 您好,机器人服务员!我想要一杯咖啡,并且希望它能够被送到第二张桌子上。
|
||||
On(Coffee,Table2) 请为我准备一杯咖啡,并将其送到第二桌。
|
||||
On(Coffee,Table3) 您好!请问您能否帮我制作一杯咖啡,然后把咖啡端到第三张桌子上呢?谢谢!
|
||||
On(Coffee,Table3) 请为我准备一杯咖啡,并将其送到第三张桌子上。
|
||||
On(Water,Bar) 您好,我需要一杯水,并且希望它能够被端到吧台那里。
|
||||
On(Water,Bar) 请为我准备一杯水,并将其送到吧台。
|
||||
On(Water,WaterTable) 您好,我需要一杯水,并希望您能将其端到茶水桌这里。
|
||||
On(Water,WaterTable) 请为我送一杯水,并将其放在茶水桌上。
|
||||
On(Water,CoffeeTable) 您好,我是一名机器人服务员。请问您需要一杯水,我可以为您制作并在准备好后将其端到咖啡桌旁边。
|
||||
On(Water,CoffeeTable) 请给我一杯水,并将其递送到我的咖啡桌上。
|
||||
On(Water,Bar2) 您好,机器人服务员!请问你能帮我制作一杯水,然后将其端到距离这里较远的另一个吧台吗?谢谢!
|
||||
On(Water,Bar2) 请给我倒一杯水,然后把水端到这个吧台这里。
|
||||
On(Water,Table1) 您好,我需要一杯水,并希望它能够被送到我所在的桌子上。
|
||||
On(Water,Table1) 请为我准备一杯水,并将其送到这张桌子的位置上。
|
||||
On(Water,Table2) 您好,我需要一杯水,并希望你能将它端到第二张桌子上。
|
||||
On(Water,Table2) 请给我倒一杯水,并把水杯端到第二桌子上。
|
||||
On(Water,Table3) 您好,机器人服务员!请问能否为您制作一杯水,并将其送到第三张桌子呢?
|
||||
On(Water,Table3) 请为我准备一杯水,并将其送到第三桌。
|
||||
On(Dessert,Bar) 您好,我需要点心和甜品。请帮我制作一下,然后把它们带到吧台来。
|
||||
On(Dessert,Bar) 您好,我可以帮您点一些点心或甜品,然后将它们送到吧台。请问您想点什么?
|
||||
On(Dessert,WaterTable) 您好,我需要点心和甜品,并将它们端到茶水桌 here。
|
||||
On(Dessert,WaterTable) 请为我准备一些点心或甜品,并将其递送到我的茶水桌子上。
|
||||
On(Dessert,CoffeeTable) 您好,我是一个人工智能助手,虽然我不能直接为您制作点心或甜品,但我可以帮助您找到附近的餐厅或店铺,为您推荐美味的点心或甜品,您可以品尝一下。如果您有其他需要帮助的地方,也请随时告诉我。
|
||||
On(Dessert,CoffeeTable) 请为我准备一些点心或甜品,然后将其放置在咖啡桌附近。
|
||||
On(Dessert,Bar2) 您好,我需要点心和甜品。请问您能帮我制作吗?然后把它们端到这里来。谢谢!
|
||||
On(Dessert,Bar2) 请帮我点一份点心或甜品,然后把它端到另一个吧台那里。
|
||||
On(Dessert,Table1) 您好,我是一位AI助手,无法直接为您制作点心或甜品。但我可以为您推荐菜单上的点心或甜品,或者帮您下单购买。请问您需要什么帮助?
|
||||
On(Dessert,Table1) 请帮我点一些点心或甜品,并把它们放在这张桌子上。
|
||||
On(Dessert,Table2) 您好,机器人服务员!我需要点心和甜品,可以帮我制作吗?把它们送到第二桌来,谢谢!
|
||||
On(Dessert,Table2) 您好,请问有什么我可以帮您的吗?您可以点一些点心或甜品,然后告诉我放在哪一张桌子上,我会马上为您送过去。
|
||||
On(Dessert,Table3) 您好,我需要点心和甜品,请把它们送到第三桌。
|
||||
On(Dessert,Table3) 您好,机器人服务员!请问您能帮我点些点心或甜品吗?我要把它们送到第三桌。
|
||||
At(Robot,Bar) 您好,机器人服务员!请问您能带路来到 Bar 吗?我想要一杯饮料和一些小吃。谢谢!
|
||||
At(Robot,Bar) 请帮我前往Bar。
|
||||
At(Robot,Bar) 请问你能带我前往Bar位置吗?
|
||||
At(Robot,WaterTable) 请帮我找到WaterTable。
|
||||
At(Robot,WaterTable) 您好,机器人服务员!请问您能帮我订一张去WaterTable的桌子吗?
|
||||
At(Robot,WaterTable) 当然可以!请问您需要我向WaterTable位置发送消息吗?
|
||||
At(Robot,CoffeeTable) 请把咖啡机移到CoffeeTable附近。
|
||||
At(Robot,CoffeeTable) 请前往CoffeeTable。
|
||||
At(Robot,CoffeeTable) 您好,我是一名人工智能助手,请问有什么我可以帮您的?
|
||||
At(Robot,Bar2) 您好,我需要去Bar2。
|
||||
At(Robot,Bar2) 您好,机器人服务员,请问您能帮我前往Bar2吗?
|
||||
At(Robot,Bar2) 您好,我是一名AI助手,无法移动到特定的位置。但我会尽力为您提供帮助。您想前往Bar2吗?如果有其他问题,欢迎随时告诉我。
|
||||
At(Robot,Table1) 请把菜单送到Table 1。
|
||||
At(Robot,Table1) 请前往Table1。
|
||||
At(Robot,Table1) 您好,我能前往Table1位置吗?
|
||||
At(Robot,Table2) 请带领我到Table 2。
|
||||
At(Robot,Table2) 请前往Table2。
|
||||
At(Robot,Table2) 您好!请问您需要我前往Table2位置吗?
|
||||
At(Robot,Table3) 请把服务生叫来Table 3。
|
||||
At(Robot,Table3) 请去Table3。
|
||||
At(Robot,Table3) 您好,我需要您前往Table3位置。
|
||||
On(Softdrink,Bar) 请将Softdrink放在Bar那个位置。
|
||||
On(Softdrink,Bar) 请把Softdrink拿到Bar位置。
|
||||
On(Softdrink,WaterTable) 您好,机器人服务员!请问能帮我将Softdrink放在WaterTable的位置上吗?谢谢!
|
||||
On(Softdrink,WaterTable) 请把Softdrink拿到WaterTable的位置。
|
||||
On(Softdrink,CoffeeTable) 请将Softdrink放在CoffeeTable那个位置。
|
||||
On(Softdrink,CoffeeTable) 请将Softdrink拿到CoffeeTable的位置。
|
||||
On(Softdrink,Bar2) 您好,机器人服务员!请问能否帮我放一下Softdrink到Bar2的位置呢?谢谢!
|
||||
On(Softdrink,Bar2) 请把Softdrink拿到Bar2的位置。
|
||||
On(Softdrink,Table1) 请将Softdrink放在Table1的位置。
|
||||
On(Softdrink,Table1) 请把Softdrink拿到Table 1的位置。
|
||||
On(Softdrink,Table2) 您好,机器人服务员!请将Softdrink放在Table 2的位置。谢谢!
|
||||
On(Softdrink,Table2) 请将Softdrink拿到Table 2的位置。
|
||||
On(Softdrink,Table3) 您好,机器人服务员!请问能否将Softdrink放在Table3的位置上?
|
||||
On(Softdrink,Table3) 请将Softdrink拿到Table 3的位置。
|
||||
On(BottledDrink,Bar) 请将瓶装饮料放在酒吧那个位置。
|
||||
On(BottledDrink,Bar) 请将瓶装饮料送到酒吧区域。
|
||||
On(BottledDrink,WaterTable) 请将瓶装饮料放在水桌那个位置。
|
||||
On(BottledDrink,WaterTable) 请把瓶装饮料拿到水桌的位置。
|
||||
On(BottledDrink,CoffeeTable) 请将瓶装饮料放在咖啡桌那个位置。
|
||||
On(BottledDrink,CoffeeTable) 请把瓶装饮料放在咖啡桌的位置。
|
||||
On(BottledDrink,Bar2) 请将瓶装饮料放在 Bar 2 的位置。
|
||||
On(BottledDrink,Bar2) 请把瓶装饮料送到酒吧2号位置。
|
||||
On(BottledDrink,Table1) 您好,机器人服务员!请将瓶装饮料放在Table1的位置上。谢谢!
|
||||
On(BottledDrink,Table1) 请将瓶装饮料拿到Table 1的位置。
|
||||
On(BottledDrink,Table2) 请将Bottled Drink放在Table 2的位置。
|
||||
On(BottledDrink,Table2) 请把瓶装饮料送到Table2位置。
|
||||
On(BottledDrink,Table3) 请将瓶装饮料放在Table3的位置上。
|
||||
On(BottledDrink,Table3) 请把瓶装饮料拿到Table3的位置。
|
||||
On(Yogurt,Bar) 您好,请问您需要将酸奶放在哪个位置?
|
||||
On(Yogurt,Bar) 请把Yogurt送到Bar位置。
|
||||
On(Yogurt,WaterTable) 请将Yogurt放在WaterTable的位置上。
|
||||
On(Yogurt,WaterTable) 请把Yogurt送到WaterTable位置。
|
||||
On(Yogurt,CoffeeTable) 请将Yogurt放在CoffeeTable那个位置。
|
||||
On(Yogurt,CoffeeTable) 请把Yogurt送到CoffeeTable那里。
|
||||
On(Yogurt,Bar2) 您好,机器人服务员!请帮我将酸奶(Yogurt)放在 Bar2 的位置上。谢谢!
|
||||
On(Yogurt,Bar2) 请将Yogurt送到Bar2位置。
|
||||
On(Yogurt,Table1) 您好,机器人服务员!请将酸奶(Yogurt)放到Table1的位置上。谢谢!
|
||||
On(Yogurt,Table1) 请将Yogurt拿到Table 1的位置。
|
||||
On(Yogurt,Table2) 请将 Yogurt 放在 Table2 的那个位置。
|
||||
On(Yogurt,Table2) 请将 Yogurt 拿到 Table 2 的位置。
|
||||
On(Yogurt,Table3) 您好,请问可以帮我将Yogurt放在Table3的位置吗?
|
||||
On(Yogurt,Table3) 请将Yogurt放在Table 3的位置上。
|
||||
On(ADMilk,Bar) 请将AD Milk放在Bar位置。
|
||||
On(ADMilk,Bar) 请把ADMilk拿到Bar位置。
|
||||
On(ADMilk,WaterTable) 请将AD Milk放在 WaterTable 的那个位置。
|
||||
On(ADMilk,WaterTable) 您好,请问能帮我拿一下ADMilk到WaterTable的位置吗?
|
||||
On(ADMilk,CoffeeTable) 您好,我需要您将ADMilk放在CoffeeTable那个位置。
|
||||
On(ADMilk,CoffeeTable) 请将AD Milk拿到Coffee Table的位置。
|
||||
On(ADMilk,Bar2) 请将AD Milk放置在Bar 2的位置。
|
||||
On(ADMilk,Bar2) 请把ADMilk拿到Bar2位置。
|
||||
On(ADMilk,Table1) 请将ADMilk放到Table1的位置。
|
||||
On(ADMilk,Table1) 请将ADMilk搬到Table1的位置。
|
||||
On(ADMilk,Table2) 请将ADMilk放在Table2的位置。
|
||||
On(ADMilk,Table2) 请把ADMilk搬到Table2的位置。
|
||||
On(ADMilk,Table3) 请将ADMilk放在Table3的位置。
|
||||
On(ADMilk,Table3) 您好,服务员!能帮我拿一下ADMilk到Table3位置吗?
|
||||
On(MilkDrink,Bar) 请将牛奶饮料放在吧台那个位置。
|
||||
On(MilkDrink,Bar) 请把牛奶饮料拿到酒吧位置。
|
||||
On(MilkDrink,WaterTable) 请将牛奶饮料放在水桌那个位置。
|
||||
On(MilkDrink,WaterTable) 请把牛奶饮料拿到水 table 位置。
|
||||
On(MilkDrink,CoffeeTable) 请将牛奶饮料放在咖啡桌那个位置。
|
||||
On(MilkDrink,CoffeeTable) 请将牛奶饮料递送到咖啡桌位置。
|
||||
On(MilkDrink,Bar2) 请将牛奶饮料放在吧台2的位置。
|
||||
On(MilkDrink,Bar2) 请把牛奶饮料递送到酒吧2号位置。
|
||||
On(MilkDrink,Table1) 请将牛奶饮料放在Table1的位置上。
|
||||
On(MilkDrink,Table1) 请把牛奶饮料拿到Table1的位置。
|
||||
On(MilkDrink,Table2) 请将牛奶饮料放到桌子2的位置。
|
||||
On(MilkDrink,Table2) 请把牛奶饮料送到Table2位置。
|
||||
On(MilkDrink,Table3) 请将牛奶饮料放在桌3的位置。
|
||||
On(MilkDrink,Table3) 请将牛奶饮料拿到 table 3 的位置。
|
||||
On(Milk,Bar) 请将牛奶放在酒吧那个位置。
|
||||
On(Milk,Bar) 请把牛奶拿到酒吧位置。
|
||||
On(Milk,WaterTable) 请将牛奶放在水 table 的那个位置。
|
||||
On(Milk,WaterTable) 请把牛奶拿到 WaterTable 那里。
|
||||
On(Milk,CoffeeTable) 请将牛奶放在咖啡桌上的指定位置。
|
||||
On(Milk,CoffeeTable) 请把牛奶拿到咖啡桌的位置。
|
||||
On(Milk,Bar2) 请将牛奶放在 Bar2 的位置。
|
||||
On(Milk,Bar2) 请把牛奶放到Bar2的位置。
|
||||
On(Milk,Table1) 您好,机器人服务员!请将牛奶放在Table1的位置。
|
||||
On(Milk,Table1) 请把牛奶拿到Table1的位置。
|
||||
On(Milk,Table2) 请将牛奶放在Table2的位置。
|
||||
On(Milk,Table2) 请把牛奶放在Table2的位置上。
|
||||
On(Milk,Table3) 请将牛奶放在Table3的位置上。
|
||||
On(Milk,Table3) 请把牛奶拿到Table3的位置。
|
||||
On(VacuumCup,Bar) 请将VacuumCup放置在Bar位置。
|
||||
On(VacuumCup,Bar) 请把VacuumCup放到Bar位置。
|
||||
On(VacuumCup,WaterTable) 请将VacuumCup放置在WaterTable上。
|
||||
On(VacuumCup,WaterTable) 请把VacuumCup放到WaterTable的位置。
|
||||
On(VacuumCup,CoffeeTable) 请将VacuumCup放在CoffeeTable那个地方。
|
||||
On(VacuumCup,CoffeeTable) 请把VacuumCup放到CoffeeTable上。
|
||||
On(VacuumCup,Bar2) 请将VacuumCup放置在Bar2的位置上。
|
||||
On(VacuumCup,Bar2) 请把VacuumCup移到Bar2的位置。
|
||||
On(VacuumCup,Table1) 请将VacuumCup放置在Table1的位置上。
|
||||
On(VacuumCup,Table1) 请把VacuumCup移到Table1的位置。
|
||||
On(VacuumCup,Table2) 请将VacuumCup放到Table2的位置。
|
||||
On(VacuumCup,Table2) 请把VacuumCup放到Table2的位置。
|
||||
On(VacuumCup,Table3) 请将VacuumCup放置在Table3的位置上。
|
||||
On(VacuumCup,Table3) 请将VacuumCup移至Table3位置。
|
||||
Is(AC,0) 请问你能帮我关掉AC吗?
|
||||
Is(AC,1) 请问你能帮我打开空调吗?
|
||||
Is(ACTemperature,0) 尊敬的服务员,请问您能否将温度调高一些呢?
|
||||
Is(ACTemperature,1) 请问你能将咖啡厅的温度调低一些吗?
|
||||
Is(HallLight,0) 当然可以,请问需要我使用哪个开关来关闭HallLight呢?
|
||||
Is(HallLight,1) 您好!请问您需要我帮助您开启还是关闭HallLight呢?
|
||||
Is(TubeLight,0) 当然可以,请问您需要我使用哪个遥控器来关闭它呢?
|
||||
Is(TubeLight,1) 您好,机器人服务员!请问您能帮我打开一下 tube light 吗?谢谢!
|
||||
Is(Curtain,0) 请问你能把窗帘关上吗?
|
||||
Is(Curtain,1) 请问你能把窗户帘打开一下吗?
|
||||
Is(Chairs,0) 您好,请问您需要我帮助清理座位上的污渍吗?
|
||||
Is(Chairs,1) 您好,我是您的顾客。我想请问您是否能帮我清理一下座位上的灰尘和垃圾?
|
||||
Is(Floor,0) 您好,我能为您做些什么呢?如果您需要我帮忙打扫地板,请告诉我哪里需要清理,我会尽快为您处理。
|
||||
Is(Floor,1) 您好,我需要您帮助打扫一下地板。
|
||||
Is(Table1,0) 您好!请问您需要我为您做什么呢?如果您需要我清理Table1,请您告诉我需要使用什么清洁用品,我会按照您的指示进行操作。
|
||||
Is(Table1,1) 您好,请问需要我帮您打扫Table1吗?
|
||||
Holding(Softdrink) 您好,我是一款人工智能助手,无法直接与现实世界进行交互。但我可以为您提供有关如何抓饮料的信息。您可以尝试用手指将Softdrink抓在手中。如果您需要更多帮助,请随时告诉我。
|
||||
Holding(Softdrink) 您好,我是您的机器人服务员。我能帮您拿住Softdrink吗?
|
||||
Holding(BottledDrink) 我能帮我拿起那瓶饮料吗?
|
||||
Holding(BottledDrink) 您好!请问您需要我帮您一直拿着这瓶饮料吗?
|
||||
Holding(Yogurt) 请问你能帮我拿一下 yogurt 吗?
|
||||
Holding(Yogurt) 您好,我可以帮助您更好地理解和使用我们的服务。请问您需要我为您拿取什么商品呢?
|
||||
Holding(ADMilk) 你能帮我拿一下AD Milk吗?
|
||||
Holding(ADMilk) 您好,我需要点一杯AD Milk。麻烦您能帮我拿一下吗?
|
||||
Holding(MilkDrink) 我想要一杯牛奶饮料,能帮我把它端过来吗?
|
||||
Holding(MilkDrink) 我需要你一直拿着牛奶饮料。
|
||||
Holding(Milk) 您好,请问有什么我可以帮助您的?
|
||||
Holding(Milk) 您好,我是您的机器人服务员。请问有什么我可以帮助您的吗?
|
||||
Holding(VacuumCup) 您好!请问您需要什么帮助?
|
||||
Holding(VacuumCup) 您好!请问您需要我帮助您一直拿着VacuumCup吗?
|
||||
Holding(Nothing) 你能帮我把"Nothing"拿在手里吗?
|
||||
Holding(Nothing) 您好!作为您的机器人服务员,我会尽力满足您的要求。请问您需要我帮忙做什么呢?
|
||||
On(Coffee,Bar) 当然可以!请问您想要什么口味的咖啡呢?
|
||||
On(Coffee,Bar) 请给我一杯咖啡,并将其送到吧台。
|
||||
On(Coffee,WaterTable) 当然可以,请告诉我您想喝的咖啡口味,我会为您制作一杯美味的咖啡,然后将其送到WaterTable桌旁。
|
||||
On(Coffee,WaterTable) 请给我一杯咖啡,并将其送到 WaterTable 那里。
|
||||
On(Coffee,CoffeeTable) 您好,我是一名机器人服务员。我能为您制作一杯咖啡,并将其端到CoffeeTable上吗?
|
||||
On(Coffee,CoffeeTable) 请给我一杯咖啡,并把它送到Coffee Table那里。
|
||||
On(Coffee,Bar2) 当然可以,请告诉我您想要什么口味的咖啡,我会为您制作并在准备好后把咖啡端到Bar 2。
|
||||
On(Coffee,Bar2) 请给我一杯咖啡,并将其送到Bar2。
|
||||
On(Coffee,Table1) 当然可以!请问您需要什么口味的咖啡呢?
|
||||
On(Coffee,Table1) 请给我一杯咖啡,并将其送到Table1。
|
||||
On(Coffee,Table2) 您好,机器人服务员!我想要一杯咖啡,并希望它能够被送到 Table 2。
|
||||
On(Coffee,Table2) 请为我准备一杯咖啡,并将其送到Table 2。
|
||||
On(Coffee,Table3) 您好,机器人服务员!请问您能帮我制作一杯咖啡,然后将其端到Table 3吗?谢谢!
|
||||
On(Coffee,Table3) 请为我准备一杯咖啡,并将其送到Table 3。
|
||||
On(Water,Bar) 您好,我需要一杯水,请能帮我制作并送到酒吧处谢谢!
|
||||
On(Water,Bar) 我需要一杯水,并希望它能够被送到酒吧区域。
|
||||
On(Water,WaterTable) 您好,我需要一杯水,并将它送到水桌子上。
|
||||
On(Water,WaterTable) 请为我准备一些水,并将其送到水桌 here。
|
||||
On(Water,CoffeeTable) 您好,我需要一杯水,并将它送到咖啡桌 here。
|
||||
On(Water,CoffeeTable) 请给我倒一杯水,然后将其放在咖啡桌子上。
|
||||
On(Water,Bar2) 当然可以!请问您在哪个咖啡厅?我想请您把水送到 Bar 2。
|
||||
On(Water,Bar2) 我需要一杯水,并希望它能够被送到Bar2那里。
|
||||
On(Water,Table1) 您好,我是一名机器人服务员。请问您需要什么帮助?
|
||||
On(Water,Table1) 请给我一杯水,并将其送到Table1位置。
|
||||
On(Water,Table2) 当然可以!请问您需要什么温度的水呢?并且您想要在哪个桌子上 receiving 水呢?
|
||||
On(Water,Table2) 请给我倒一杯水,并把水送到Table 2那里。
|
||||
On(Water,Table3) 您好,机器人服务员!请问您能给我准备一杯水,然后将其送到 Table 3 位置吗?谢谢!
|
||||
On(Water,Table3) 请给我倒一杯水,并将其送到 Table 3 桌子上。
|
||||
On(Dessert,Bar) 您好,我需要一份甜点并将其送到吧台。
|
||||
On(Dessert,Bar) 请送一些甜点来,并将其送到吧台处。
|
||||
On(Dessert,WaterTable) 您好,我需要一份甜点,并希望它能够被送到名为"WaterTable"的水 table 那里。
|
||||
On(Dessert,WaterTable) 请为我准备一些甜点,并将它送到watertable来。
|
||||
On(Dessert,CoffeeTable) 您好,我是一名机器人服务员。我能为您制作甜点,并将其送到咖啡桌旁边。请问您想点什么类型的甜点呢?
|
||||
On(Dessert,CoffeeTable) 请为我准备一些甜点,并将其送到咖啡桌这里。
|
||||
On(Dessert,Bar2) 您好,我需要一份甜点,并希望它能够被送到酒吧2。
|
||||
On(Dessert,Bar2) 请为我准备一些甜点,并将其送到Bar2。
|
||||
On(Dessert,Table1) 您好,机器人服务员!我想要一份甜点,并希望它能够被送到Table1那里。
|
||||
On(Dessert,Table1) 请为我准备一些甜点,并将其送到Table1。
|
||||
On(Dessert,Table2) 您好,我是一名机器人服务员。我能为您制作甜点并将它送到Table 2吗?
|
||||
On(Dessert,Table2) 请给我上甜点,并将它送到Table2那里。
|
||||
On(Dessert,Table3) 您好,机器人服务员!请问您能帮我制作一份甜点并将其送到Table 3吗?
|
||||
On(Dessert,Table3) 请为我准备一些甜点,并将其送到Table3桌子上。
|
|
@ -0,0 +1,388 @@
|
|||
At(Robot,Bar) 嘿,来酒吧了啊?
|
||||
At(Robot,Bar) 你可以去前台一下吗?
|
||||
At(Robot,Bar) 当然可以,我可以过去帮忙吗?
|
||||
At(Robot,WaterTable) 哎呀,你终于出现了啊!赶紧过来坐一下,我给你倒杯茶水。
|
||||
At(Robot,WaterTable) 嘿,你能帮我再去茶水桌那儿拿一下水吗?
|
||||
At(Robot,WaterTable) 当然可以啊,我马上就去茶水桌那儿。
|
||||
At(Robot,CoffeeTable) 哎呀,你终于出现了啊!赶紧过来坐一下,我给你倒杯咖啡。
|
||||
At(Robot,CoffeeTable) 你可以去 coffee table 一下哦。
|
||||
At(Robot,CoffeeTable) 当然可以呀!你可以去咖啡桌的那边坐下来,我就在这边的桌子旁陪着你。
|
||||
At(Robot,Bar2) 好的,我可以到另一个吧台帮忙吗?
|
||||
At(Robot,Bar2) 你可以去另一个酒吧台坐坐吗?
|
||||
At(Robot,Bar2) 当然可以,您想让我去哪个吧台呢?
|
||||
At(Robot,Table1) 好的,我來試著把第一張桌子搬起來。
|
||||
At(Robot,Table1) 你可以去第一桌啊,那里的东西比较好吃。
|
||||
At(Robot,Table1) 当然可以,你可以帮我稳住身体,然后我就能过去坐在第一张桌子上啦!
|
||||
At(Robot,Table2) 请把第二桌子的东西拿过来。
|
||||
At(Robot,Table2) 你可以去第二桌啊。
|
||||
At(Robot,Table2) 当然可以,你想去哪一张桌子呢?
|
||||
At(Robot,Table3) 好的,我马上去拿第三张桌子。
|
||||
At(Robot,Table3) 请你到第三桌子上坐一下。
|
||||
At(Robot,Table3) 当然可以,移到第三张桌子那边怎么样?
|
||||
On(Softdrink,Bar) 请把饮料放到酒吧柜台上。
|
||||
On(Softdrink,Bar) 嘿,能帮我拿一下饮料吗?放到酒吧台上谢谢!
|
||||
On(Softdrink,WaterTable) 你可以把软饮放在茶水桌那个地方哦。
|
||||
On(Softdrink,WaterTable) 你可以把饮料放到茶水桌那儿呀。
|
||||
On(Softdrink,CoffeeTable) 你可以把饮料放在咖啡桌那个地方呀。
|
||||
On(Softdrink,CoffeeTable) 你可以把饮料放到咖啡桌附近呀。
|
||||
On(Softdrink,Bar2) 请你把饮料放在另一个酒吧台的位置。
|
||||
On(Softdrink,Bar2) 请帮我从一个酒吧台拿杯饮料,放到另一个酒吧台吧。
|
||||
On(Softdrink,Table1) 请你把饮料放在第一桌的位子上面。
|
||||
On(Softdrink,Table1) 请把饮料放到第一桌的位子上。
|
||||
On(Softdrink,Table2) 请你把饮料放到第二桌那个地方。
|
||||
On(Softdrink,Table2) 请你把饮料放到第二桌的位置。
|
||||
On(Softdrink,Table3) 请你把饮料放到第三桌那个地方。
|
||||
On(Softdrink,Table3) 请给我一瓶饮料,放到第三桌子上。
|
||||
On(BottledDrink,Bar) 请把瓶装饮料放到酒吧那个地方。
|
||||
On(BottledDrink,Bar) 你可以把瓶装饮料放到酒吧台面上。
|
||||
On(BottledDrink,WaterTable) 你可以把瓶装饮料放在茶水桌那个地方呀。
|
||||
On(BottledDrink,WaterTable) 请把瓶装饮料放到茶水桌那儿吧。
|
||||
On(BottledDrink,CoffeeTable) 把瓶装饮料放到咖啡桌那个地方吧。
|
||||
On(BottledDrink,CoffeeTable) 请把瓶装饮料放到咖啡桌附近。
|
||||
On(BottledDrink,Bar2) 请把瓶装饮料放 到另一个酒吧那个地方。
|
||||
On(BottledDrink,Bar2) 你可以把瓶装饮料拿到另一个酒吧台的位置。
|
||||
On(BottledDrink,Table1) 请把瓶装饮料放在第一桌的相应位置。
|
||||
On(BottledDrink,Table1) 请你把瓶装饮料放到第一桌子的位置。
|
||||
On(BottledDrink,Table2) 请你把瓶装饮料放到第二大桌子的那个位置。
|
||||
On(BottledDrink,Table2) 请您把瓶装饮料放到第二桌的位置。
|
||||
On(BottledDrink,Table3) 请把瓶装饮料放到第三桌的那一边。
|
||||
On(BottledDrink,Table3) 请您把瓶装饮料放到第三桌子上。
|
||||
On(Yogurt,Bar) 把酸奶放在吧台那个位置。
|
||||
On(Yogurt,Bar) 请把酸奶放到吧台哦!
|
||||
On(Yogurt,WaterTable) 把酸奶放到茶水桌那个地方哦。
|
||||
On(Yogurt,WaterTable) 你可以把酸奶放到茶水桌附近呀。
|
||||
On(Yogurt,CoffeeTable) 请把酸奶放到咖啡桌那个地方。
|
||||
On(Yogurt,CoffeeTable) 请把酸奶放到咖啡桌附近。
|
||||
On(Yogurt,Bar2) 请你把酸奶放到另一个吧台那个位置。
|
||||
On(Yogurt,Bar2) 请把酸奶放到另一个台子的位置吧。
|
||||
On(Yogurt,Table1) 请把酸奶放在第一桌的位置哦!
|
||||
On(Yogurt,Table1) 请把酸奶放到第一桌的位置。
|
||||
On(Yogurt,Table2) 请把酸奶放到第二桌那个位置哦!
|
||||
On(Yogurt,Table2) 你可以把酸奶放到第二桌的位置呀。
|
||||
On(Yogurt,Table3) 请把酸奶放到第三桌的那儿吧。
|
||||
On(Yogurt,Table3) 请你把酸奶放到第三桌子上。
|
||||
On(ADMilk,Bar) 把AD钙奶放到吧台那个地方。
|
||||
On(ADMilk,Bar) 请把AD钙奶放到吧台哦!
|
||||
On(ADMilk,WaterTable) 好的,我帮你把AD钙奶放到茶水桌那个地方。
|
||||
On(ADMilk,WaterTable) 你可以把AD钙奶放到茶水桌附近呀。
|
||||
On(ADMilk,CoffeeTable) 好的,AD钙奶就放在咖啡桌那个地方吧。
|
||||
On(ADMilk,CoffeeTable) 你可以把AD钙奶放到咖啡桌旁边呀。
|
||||
On(ADMilk,Bar2) 你能否把AD钙奶放到另一个吧台的位置呢?
|
||||
On(ADMilk,Bar2) 你可以把AD钙奶放到另一个酒吧台的位置上。
|
||||
On(ADMilk,Table1) 请把AD钙奶放到第一桌的位子上面。
|
||||
On(ADMilk,Table1) 请把AD钙奶放到第一桌的位置。
|
||||
On(ADMilk,Table2) 请把AD钙奶放到第二桌的那儿吧。
|
||||
On(ADMilk,Table2) 请把AD钙奶放到第二桌的位置。
|
||||
On(ADMilk,Table3) 请把AD钙奶放到第三桌的那儿吧。
|
||||
On(ADMilk,Table3) 请把AD钙奶放到第三桌子的位置。
|
||||
On(MilkDrink,Bar) 把牛奶饮料放到吧台那个地方。
|
||||
On(MilkDrink,Bar) 你可以把牛奶饮料拿到吧台前面。
|
||||
On(MilkDrink,WaterTable) 你可以把牛奶饮料放在茶水桌那个地方哦。
|
||||
On(MilkDrink,WaterTable) 你可以把牛奶饮料放到茶水桌附近呀。
|
||||
On(MilkDrink,CoffeeTable) 你可以把牛奶放到了咖啡桌那个地方哦。
|
||||
On(MilkDrink,CoffeeTable) 请你把牛奶饮料放到咖啡桌附近呀。
|
||||
On(MilkDrink,Bar2) 请你把牛奶饮料放到另一个吧台那个位置,好吗?
|
||||
On(MilkDrink,Bar2) 请把牛奶饮料放到另一个酒吧台的位置。
|
||||
On(MilkDrink,Table1) 请把牛奶放第一桌的位置哦!
|
||||
On(MilkDrink,Table1) 请把牛奶饮料放到第一桌的位子上。
|
||||
On(MilkDrink,Table2) 你可以把牛奶放 到这张桌子的第二個位置。
|
||||
On(MilkDrink,Table2) 请你把牛奶饮料放到第二桌的位置。
|
||||
On(MilkDrink,Table3) 请你把牛奶放到第三桌的那儿吧。
|
||||
On(MilkDrink,Table3) 请你把牛奶饮料放到第三桌子上。
|
||||
On(Milk,Bar) 请把牛奶放到吧台那个地方。
|
||||
On(Milk,Bar) 请把牛奶放到吧台的位置哦。
|
||||
On(Milk,WaterTable) 你可以把牛奶放到茶水桌那个地方哦。
|
||||
On(Milk,WaterTable) 请你把牛奶放到茶水桌那个地方。
|
||||
On(Milk,CoffeeTable) 你可以把牛奶放在咖啡桌上的那个地方哦。
|
||||
On(Milk,CoffeeTable) 你可以把牛奶放到咖啡桌旁边呀,这样就能方便地喝牛奶了。
|
||||
On(Milk,Bar2) 请你把牛奶放到另一个吧台那个位置。
|
||||
On(Milk,Bar2) 你可以把牛奶放过去一点。
|
||||
On(Milk,Table1) 请把牛奶放到第一桌子的位置。
|
||||
On(Milk,Table1) 请你把牛奶放到第一桌的位置。
|
||||
On(Milk,Table2) 请把牛奶放到第二桌子的那个位置哦!
|
||||
On(Milk,Table2) 请你把牛奶放到第二桌的位置。
|
||||
On(Milk,Table3) 你可以把牛奶放 third table 的那个位置哦!
|
||||
On(Milk,Table3) 请把牛奶放到第三桌子上。
|
||||
On(VacuumCup,Bar) 请把保温杯放 到吧台那个地方。
|
||||
On(VacuumCup,Bar) 你可以把保温杯放到吧台哦。
|
||||
On(VacuumCup,WaterTable) 请把保温杯放茶水桌那个地方哦。
|
||||
On(VacuumCup,WaterTable) 请你把保温杯放到茶水桌那儿。
|
||||
On(VacuumCup,CoffeeTable) 你可以把你的保温杯放到咖啡桌那个地方呀。
|
||||
On(VacuumCup,CoffeeTable) 请把保温杯放到咖啡桌那里。
|
||||
On(VacuumCup,Bar2) 你可以把保温杯放到另一个吧台那个地方呀。
|
||||
On(VacuumCup,Bar2) 你可以把保温杯放到另一个酒吧台的位置呀。
|
||||
On(VacuumCup,Table1) 请把保温杯放到第一桌子的那个位置。
|
||||
On(VacuumCup,Table1) 请把保温杯放到第一桌子的位置。
|
||||
On(VacuumCup,Table2) 请把保温杯放到第二桌子的那个位置。
|
||||
On(VacuumCup,Table2) 你可以把保温杯放到第二桌子的地方。
|
||||
On(VacuumCup,Table3) 请把保温杯放到了第三张桌子的那个地方。
|
||||
On(VacuumCup,Table3) 请把保温杯放到第三桌子的地方。
|
||||
Is(AC,0) 当然可以,您想什么时候关呢?
|
||||
Is(AC,1) 当然可以,我马上为您打开空调。
|
||||
Is(ACTemperature,0) 当然可以!你把空调的温度调高一点吗?
|
||||
Is(ACTemperature,1) 可以啊,您要把空调的温度调低一些吗?
|
||||
Is(HallLight,0) 当然可以,我马上为您关掉大厅的灯。
|
||||
Is(HallLight,1) 当然可以,我马上为你开启大厅的灯光。
|
||||
Is(TubeLight,0) 当然可以,你只需按一下筒灯的开关按钮即可。
|
||||
Is(TubeLight,1) 当然可以,请告诉我你想要多亮度的筒灯呢?
|
||||
Is(Curtain,0) 好的,我马上帮您关窗帘。
|
||||
Is(Curtain,1) 当然可以,您想让阳光照进房间吗?
|
||||
Is(Chairs,0) 当然可以,把椅子弄脏一点没问题。不过要注意,我是一个人工智能助手,虽然可以理解您的请求,但实际操作能力有限,可能不能非常完美地完成这个任务。
|
||||
Is(Chairs,1) 当然可以,亲爱的。把椅子擦干净需要一些努力和耐心,但我会帮您做得干干净净的。
|
||||
Is(Floor,0) 你能把地板弄脏一点吗?
|
||||
Is(Floor,1) 能帮我打扫下地板吗?
|
||||
Is(Table1,0) 第一,你可以把桌子弄脏一点。
|
||||
Is(Table1,1) 当然可以,你想要我尽快完成这个任务吗?
|
||||
Holding(Softdrink) 你能抓住软饮吗?
|
||||
Holding(Softdrink) 你能不能一直拿着软饮呢?
|
||||
Holding(BottledDrink) 能抓住瓶装饮料吗?当然可以啊!
|
||||
Holding(BottledDrink) 你能一直拿着瓶装饮料吗?当然可以啊,只要喜欢喝 bottled water 或者饮料,就可以一直拿着瓶装饮料。不过要注意保持卫生,不要让瓶子变得太脏或者有细菌。如果觉得手持瓶装饮料不方便,也可以选择使用杯子或者其他更方便的容器来盛放饮料。
|
||||
Holding(Yogurt) 您可以把酸奶捏在手里,就像您捏着冰淇淋一样。
|
||||
Holding(Yogurt) 嗯,我可以理解你想要一直吃酸奶的想法,但是要注意不要过量食用。酸奶是非常健康的食品,富含蛋白质和钙质,对身体有很多好处。不过,每个人的身体状况和需求不同,所以要根据自己的实际情况来适量食用。如果你想要更好地享受酸奶的好处,可以尝试搭配一些水果或者坚果,让口感更丰富多彩。
|
||||
Holding(ADMilk) 你能捧起一罐AD钙奶吗?
|
||||
Holding(ADMilk) 你能不能一直拿着AD钙奶呀?
|
||||
Holding(MilkDrink) 你能把牛奶饮料抓在手里啊?
|
||||
Holding(MilkDrink) 你能一直拿著牛奶 drink 嗎?
|
||||
Holding(Milk) 哈哈,当然可以啦!你可以把牛奶抓在手里,就像你抓住一个球一样。不过要小心,不要让牛奶洒出来哦!
|
||||
Holding(Milk) 嘿,你可以一直拿着牛奶,不过我得提醒你,牛奶保质期短,不要喝坏掉的哦!
|
||||
Holding(VacuumCup) 你能 hand 住保温杯 吗?
|
||||
Holding(VacuumCup) 你能不能一直拿著保温杯呢?
|
||||
Holding(Nothing) 哈哈,把"nothing"抓在手里啊。这个表达好像不太对哦,英文里"nothing"是指没有任何东西的意思,不能被抓住。你是要问如何应对"无所适从"的情况吗?可以理解为"nothing happens"或者"没有什么事情发生"。
|
||||
Holding(Nothing) 当然可以!如果你觉得需要一直拿着某个东西,那完全可以。
|
||||
On(Coffee,Bar) 当然可以!请问您需要什么口味的咖啡呢?我可以为您制作一杯美味的咖啡,然后端到吧台供您享用。
|
||||
On(Coffee,Bar) 嘿,老板,能不能给我弄杯咖啡,然后把咖啡杯拿到吧台上来?
|
||||
On(Coffee,WaterTable) 当然可以!我马上为您制作一杯香浓的咖啡,然后端到茶水桌上来。
|
||||
On(Coffee,WaterTable) 好的,主人。请给我来杯咖啡,然后把咖啡端到茶水桌这里来。谢谢!
|
||||
On(Coffee,CoffeeTable) 当然可以!我马上为您制作一杯香浓的咖啡,然后端到咖啡桌上来。
|
||||
On(Coffee,CoffeeTable) 好的,主人。请给我一杯咖啡,然后把咖啡端到这个咖啡桌上来,谢谢!
|
||||
On(Coffee,Bar2) 当然可以!我马上为您制作一杯咖啡,然后端到这个吧台这里来。
|
||||
On(Coffee,Bar2) 好的,我给你拿杯咖啡,放在另一个吧台给你。
|
||||
On(Coffee,Table1) 当然可以!我马上为您制作一杯咖啡,然后端到第一张桌子上来。
|
||||
On(Coffee,Table1) 请给我拿杯咖啡,然后把它放到这张桌子的位置上。
|
||||
On(Coffee,Table2) 当然可以!你想要什么口味的咖啡呢?然后我就可以把咖啡端到你所在的桌子了。
|
||||
On(Coffee,Table2) 嘿,老板,我想喝杯咖啡,然后你能把它端到这里来吗?
|
||||
On(Coffee,Table3) 当然可以!请问您需要什么口味的咖啡呢?我好准备给您制作。
|
||||
On(Coffee,Table3) 嘿,老板,能不能给我来杯咖啡?然后把咖啡端到这张桌子的 third 位置上来,谢谢!
|
||||
On(Water,Bar) 当然可以!您可以告诉我您需要多少水,然后我会给您端过来。
|
||||
On(Water,Bar) 好的,我给您倒杯水,然后就放在吧台这里。
|
||||
On(Water,WaterTable) 当然可以!请问您需要我怎么制作水呢?
|
||||
On(Water,WaterTable) 好的,我给你倒杯水,然后把它放在茶水桌上。
|
||||
On(Water,CoffeeTable) 当然可以!我立刻为您制作一杯水,然后把它端到咖啡桌上来。请问您需要加些什么其他的配料呢?
|
||||
On(Water,CoffeeTable) 好的,主人,请给我倒杯水,然后把水端到咖啡桌上来,谢谢!
|
||||
On(Water,Bar2) 当然可以!我马上为您制作一杯水,然后端到这里来。
|
||||
On(Water,Bar2) 好的,请给我倒一杯水,然后把它端到这个吧台这里来。
|
||||
On(Water,Table1) 当然可以!请问你需要多少水呢?我一会儿就去烧开水,然后把它端到第一张桌子上。
|
||||
On(Water,Table1) 好的,我给你倒杯水,然后把它放在第一桌子上。
|
||||
On(Water,Table2) 当然可以!我马上给您拿来。
|
||||
On(Water,Table2) 能不能给我倒杯水啊?然后把水端到这张桌子的另一边去。
|
||||
On(Water,Table3) 当然可以!请您把第三张桌子的位置告诉我,我马上为您制作一杯水送到那儿去。
|
||||
On(Water,Table3) 好的,请给我一杯水,然后把它放在第三张桌子上。
|
||||
On(Dessert,Bar) 当然可以!我特别擅长制作各种美味的点心、甜品和糕点。如果您需要的话,我可以在吧台为您准备一份精致的小点心或甜品品尝。
|
||||
On(Dessert,Bar) 行啊,点些小吃或甜品,然后让它们送到酒吧台这附近来。
|
||||
On(Dessert,WaterTable) 你能不能帮我做些点心或甜品,然后把它端到茶水桌这儿呀?
|
||||
On(Dessert,WaterTable) 好的,请给我点些小吃或甜品,然后把它端到茶水桌这里来。
|
||||
On(Dessert,CoffeeTable) 当然可以!我是一个人工智能助手,虽然不能亲自制作点心或甜品,但我可以为您提供各种食谱和做法。您可以根据我的建议,尝试在家自己制作美味的点心或甜品,然后带到咖啡桌分享。这样不仅可以享受美食,还可以一起度过美好时光。
|
||||
On(Dessert,CoffeeTable) 行啊,您想尝点什么点心或甜品呢?然后我给您端过来,放在这咖啡桌上。
|
||||
On(Dessert,Bar2) 当然可以!我擅长制作各种美味的点心与甜品,可以随时为你端来。请问你需要什么口味或样式的点心呢?
|
||||
On(Dessert,Bar2) 行啊,点些小吃或甜品,然后给您端过去。
|
||||
On(Dessert,Table1) 当然可以,我 ability做点心和甜品,把它们放在桌子上给你吃。
|
||||
On(Dessert,Table1) 好的,我给你准备了一些小吃和甜品,现在 brings it to your table.(请注意,这里用 "brings" 代替 "portrays" 以符合口语化的风格。)
|
||||
On(Dessert,Table2) 当然可以!我可以在第一张桌子上制作点心或甜品,然后把它们端到第二张桌子那里。请问你有什么特别喜欢的点心或甜品口味吗?
|
||||
On(Dessert,Table2) 好的,主人。请给我提供一些点心或甜品,我会把它们放在第二张桌子上。
|
||||
On(Dessert,Table3) 当然可以!我马上为您制作一些美味的点心或甜品,然后 brings it to the third table for you to enjoy.
|
||||
On(Dessert,Table3) 好的,请问您想点什么种类的点心或甜品呢?然后我会把它们端到第三张桌子上。
|
||||
At(Robot,Bar) 好的,那我们来聊聊吧。你想聊什么呢?
|
||||
At(Robot,Bar) 你去一下bar吧。
|
||||
At(Robot,Bar) 你能到那个酒吧的哪个位置吗?
|
||||
At(Robot,WaterTable) 当然可以! WaterTable 是一个很棒的实时水文气象数据平台。你想了解哪个地区的天气情况呢?
|
||||
At(Robot,WaterTable) 你去一下WaterTable吧!
|
||||
At(Robot,WaterTable) 当然可以啊!你想要去哪个地方呢?
|
||||
At(Robot,CoffeeTable) 嘿,我能去拿一下咖啡桌吗?
|
||||
At(Robot,CoffeeTable) 你去一下CoffeeTable吧。
|
||||
At(Robot,CoffeeTable) 当然可以,我马上就到CoffeeTable那儿。
|
||||
At(Robot,Bar2) 好的,我来试试看 Bar 2。
|
||||
At(Robot,Bar2) 你能去bar2吗?
|
||||
At(Robot,Bar2) 当然可以啊,我马上就去Bar2那儿!
|
||||
At(Robot,Table1) 当然可以!请您提供一下 Table1 的内容,我会尽量用更口语化和合理化的方式来表述它。
|
||||
At(Robot,Table1) 嘿,你能不能去一下Table1呢?
|
||||
At(Robot,Table1) 当然可以呀,我马上就过去。
|
||||
At(Robot,Table2) 当然可以!请您提供一下Table2的内容和您想要我为您做什么,我会尽量帮您进行合理的调整和优化。
|
||||
At(Robot,Table2) 好的,我去一下Table2。
|
||||
At(Robot,Table2) 当然可以,我马上就过去。
|
||||
At(Robot,Table3) 当然可以!请问您需要我帮忙做什么呢?
|
||||
At(Robot,Table3) 嘿,去Table3看看怎么样?可能有新东西哦!
|
||||
At(Robot,Table3) 当然可以,我马上就到Table3那儿。
|
||||
On(Softdrink,Bar) 你可以这样跟Bar说:“嘿,Bar,你能帮我把Softdrink放好吗?谢谢!”
|
||||
On(Softdrink,Bar) 请把Softdrink拿到Bar那儿。
|
||||
On(Softdrink,WaterTable) 你可以把软饮放在水桌那个地方哦。
|
||||
On(Softdrink,WaterTable) 你可以把Soft drink拿到水桌的位置呀。
|
||||
On(Softdrink,CoffeeTable) 您可以尝试这样说:“嘿,能否帮我把软饮料放在咖啡桌那个位置呀?”
|
||||
On(Softdrink,CoffeeTable) 你可以把Softdrink拿到CoffeeTable前面啊。
|
||||
On(Softdrink,Bar2) 你可以把软饮放在酒吧2的位置。
|
||||
On(Softdrink,Bar2) 你可以把Softdrink拿到Bar2的位置呀。
|
||||
On(Softdrink,Table1) 你可以把这个软饮料放到表格1的第二行。
|
||||
On(Softdrink,Table1) 请把Softdrink放到Table1的位置上。
|
||||
On(Softdrink,Table2) 你可以把 Softdrink 放到 Table2 的那个位置哦!
|
||||
On(Softdrink,Table2) 你可以把Softdrink移到Table2的位置呀。
|
||||
On(Softdrink,Table3) 你可以把 Softdrink 放到 Table3 的那个位置哦!
|
||||
On(Softdrink,Table3) 你可以把Softdrink拿到Table3那里。
|
||||
On(BottledDrink,Bar) 请你把Bottled Drink放到Bar那个地方。
|
||||
On(BottledDrink,Bar) 请把 bottled drink 拿到 Bar 那里。
|
||||
On(BottledDrink,WaterTable) 你能把 bottled drink 放到 water table 那个地方吗?
|
||||
On(BottledDrink,WaterTable) 你可以把瓶装饮料放到水桌上了吗?
|
||||
On(BottledDrink,CoffeeTable) 将瓶装饮料放在咖啡桌那个地方。
|
||||
On(BottledDrink,CoffeeTable) 你可以把 bottled drink 拿到咖啡桌 (CoffeeTable) 上。
|
||||
On(BottledDrink,Bar2) 你能把 "BottledDrink" 放到 "Bar2" 的位置上吗?
|
||||
On(BottledDrink,Bar2) 请把 bottled drink 拿到 Bar2 的位置。
|
||||
On(BottledDrink,Table1) 你可以把"Bottled Drink"放到"Table1"的位置。
|
||||
On(BottledDrink,Table1) 请你把瓶装饮料拿到Table1那儿。
|
||||
On(BottledDrink,Table2) 你把Bottled Drink放到Table2那个地方吧。
|
||||
On(BottledDrink,Table2) 你可以把 bottled drink 拿到 Table 2 那里。
|
||||
On(BottledDrink,Table3) 你想把瓶装饮料放在Table3那个地方吗?
|
||||
On(BottledDrink,Table3) 请把瓶装饮料放到桌子的第三位置。
|
||||
On(Yogurt,Bar) 你可以把酸奶放在吧台那个位置哦。
|
||||
On(Yogurt,Bar) 嘿,能否帮我拿一下酸奶(Yogurt)到酒吧(Bar)的位置呀?
|
||||
On(Yogurt,WaterTable) 你可以把酸奶放在水 table 的那个地方。
|
||||
On(Yogurt,WaterTable) 你可以把酸奶放到水 table 那里一下吗?
|
||||
On(Yogurt,CoffeeTable) 请把酸奶放到咖啡桌那个地方。
|
||||
On(Yogurt,CoffeeTable) 你可以把酸奶放到咖啡桌的位置。
|
||||
On(Yogurt,Bar2) 把Yogurt放到Bar2那个地方。
|
||||
On(Yogurt,Bar2) 你可以把酸奶放到酒吧的第二的位置。
|
||||
On(Yogurt,Table1) 请把酸奶放到表格1那个位置哦!
|
||||
On(Yogurt,Table1) 请你把Yogurt移到Table1的位置上。
|
||||
On(Yogurt,Table2) 你可以把酸奶放到表格2那个位置哦。
|
||||
On(Yogurt,Table2) 你可以把酸奶放到桌子第二的位置。
|
||||
On(Yogurt,Table3) 您可以把酸奶放到表格三那个位置哦。
|
||||
On(Yogurt,Table3) 你可以把酸奶放到桌子第三的位置。
|
||||
On(ADMilk,Bar) 你能把ADMilk放到Bar那个地方吗?
|
||||
On(ADMilk,Bar) 你可以把ADMilk放到Bar那里。
|
||||
On(ADMilk,WaterTable) 你可以把ADMilk放到WaterTable那个地方。
|
||||
On(ADMilk,WaterTable) 你可以把ADMilk放到WaterTable的位置啊。
|
||||
On(ADMilk,CoffeeTable) 你可以把ADMilk放到咖啡桌那个地方。
|
||||
On(ADMilk,CoffeeTable) 你可以把AD Milk放到咖啡桌旁边呀。
|
||||
On(ADMilk,Bar2) 请把ADMilk放到Bar2那个位置哦!
|
||||
On(ADMilk,Bar2) 你可以把ADMilk放到Bar2的位置呀。
|
||||
On(ADMilk,Table1) 请把ADMilk放到Table1那个位置啦!
|
||||
On(ADMilk,Table1) 能否帮我将ADMilk放到Table1的位置呢?
|
||||
On(ADMilk,Table2) 你可以把ADMilk放到Table2那个地方哦。
|
||||
On(ADMilk,Table2) 你可以把ADMilk放到Table2的位置呀。
|
||||
On(ADMilk,Table3) 你能把ADMilk放到Table3那个地方吗?
|
||||
On(ADMilk,Table3) 你可以把ADMilk放到Table3的位置呀。
|
||||
On(MilkDrink,Bar) 你可以这样说:“把牛奶饮料放到酒吧那个位置。”
|
||||
On(MilkDrink,Bar) 你可以把牛奶带到酒吧位置吗?
|
||||
On(MilkDrink,WaterTable) 你能将"MilkDrink"放到"WaterTable"的那个地方吗?
|
||||
On(MilkDrink,WaterTable) 你可以把牛奶放到水桌的位置。
|
||||
On(MilkDrink,CoffeeTable) 你好!你可以把"MilkDrink"放到"CoffeeTable"那个地方。
|
||||
On(MilkDrink,CoffeeTable) 你可以把牛奶放到咖啡桌上了吗?
|
||||
On(MilkDrink,Bar2) 你可以把"MilkDrink"放到"Bar2"那个地方。
|
||||
On(MilkDrink,Bar2) 请把牛奶饮料拿到酒吧2号位置。
|
||||
On(MilkDrink,Table1) 你可以这样跟朋友说:嘿,你知道吗,把"MilkDrink"放到"Table1"那个位置吧!
|
||||
On(MilkDrink,Table1) 你可以把牛奶带到Table1那里吗?
|
||||
On(MilkDrink,Table2) 你能把"MilkDrink"放到Table2那个地方吗?
|
||||
On(MilkDrink,Table2) 你可以把牛奶饮料端到桌子2的位置吗?
|
||||
On(MilkDrink,Table3) 你好!我明白你的要求,但是我没有找到与“MilkDrink”相关的内容。如果你能提供更多的信息或者上下文,我会更好地帮助你完成任务。
|
||||
On(MilkDrink,Table3) 你可以把牛奶带到桌子3去。
|
||||
On(Milk,Bar) 你把牛奶放酒吧的位置吧。
|
||||
On(Milk,Bar) 你可以帮我把牛奶放到酒吧的位置吗?
|
||||
On(Milk,WaterTable) 你能帮我把牛奶放到水 table 那个地方吗?
|
||||
On(Milk,WaterTable) 你可以把牛奶放到水 table 附近吗?
|
||||
On(Milk,CoffeeTable) 你可以把牛奶放在咖啡桌那个地方。
|
||||
On(Milk,CoffeeTable) 你可以把牛奶放到咖啡桌的位置。
|
||||
On(Milk,Bar2) 你可以把牛奶放到酒吧2的位置。
|
||||
On(Milk,Bar2) 你可以把牛奶放到酒吧的第二個位置。
|
||||
On(Milk,Table1) 你可以这样跟Table1说:“Hey Table1, could you please move the Milk to that spot over there?”
|
||||
On(Milk,Table1) 你可以把牛奶放到桌子的第一位置呀。
|
||||
On(Milk,Table2) 请把牛奶放到表2的那个位置。
|
||||
On(Milk,Table2) 请你把牛奶放到Table2的位置上。
|
||||
On(Milk,Table3) 你可以把牛奶放到表格三那个位置哦。
|
||||
On(Milk,Table3) 你可以把牛奶放到桌子的第三格里呀。
|
||||
On(VacuumCup,Bar) 你能把VacuumCup放到Bar的位置吗?
|
||||
On(VacuumCup,Bar) 你可以把吸管杯放到酒吧位置吗?
|
||||
On(VacuumCup,WaterTable) 你可以尝试这样说:“嘿,把VacuumCup放到WaterTable的位置吧。”这样更加口语化和亲近。
|
||||
On(VacuumCup,WaterTable) 你可以把吸尘器杯放在水 table 位置吗?
|
||||
On(VacuumCup,CoffeeTable) 你可以把吸尘器杯放在咖啡桌那个地方。
|
||||
On(VacuumCup,CoffeeTable) 你可以把吸尘器(VacuumCup)放到咖啡桌(CoffeeTable)的位置。
|
||||
On(VacuumCup,Bar2) 你能把VacuumCup放到Bar2那个地方吗?
|
||||
On(VacuumCup,Bar2) 你可以把VacuumCup放到Bar2的地方哦。
|
||||
On(VacuumCup,Table1) 你可以把这些内容换成: "把 VacuumCup 放到 Table1 的那个地方"。
|
||||
On(VacuumCup,Table1) 你可以把VacuumCup放到Table1的位置呀。
|
||||
On(VacuumCup,Table2) 你可以把VacuumCup放到Table2那个地方哦。
|
||||
On(VacuumCup,Table2) 你可以把VacuumCup放到Table2那里呀。
|
||||
On(VacuumCup,Table3) 你可以把这个吸管杯放到表格3的位置。
|
||||
On(VacuumCup,Table3) 你可以把VacuumCup放到Table3的位置呀。
|
||||
Is(AC,0) 当然可以,您需要我帮您关闭AC吗?
|
||||
Is(AC,1) 你好,我能帮你做什么呢?关于打开AC的问题,我可能不太明白你的具体意思。如果你是想打开空调,请告诉我具体是哪个品牌的空调,这样我才能更好地帮助你。
|
||||
Is(ACTemperature,0) 当然可以!请告诉我您想将温度调到多少度呢?
|
||||
Is(ACTemperature,1) 当然可以,你想要把温度调到多少度呢?
|
||||
Is(HallLight,0) 当然可以,HallLight怎么样了?需要我帮你做些什么吗?
|
||||
Is(HallLight,1) 当然可以!请问你需要我怎么操作呢?
|
||||
Is(TubeLight,0) 当然可以!你想要立即关掉TubeLight吗?
|
||||
Is(TubeLight,1) 当然可以!你只需按住"开”按钮,或在屏幕上点击一下就可以开启TubeLight了。
|
||||
Is(Curtain,0) 当然可以,您想关闭窗帘吗?
|
||||
Is(Curtain,1) 当然可以,curtain(窗帘)打开了。
|
||||
Is(Chairs,0) 当然可以,你能把椅子弄脏一点吗?
|
||||
Is(Chairs,1) 当然可以,你能帮我打扫一下椅子吗?
|
||||
Is(Floor,0) 当然可以,不过我需要先声明一下,作为人工智能助手,我没有实体形象,所以不能直接去“操作”或“改变”现实环境。但我可以提供一些建议或者指导来帮助你完成任务。如果你想要打扫房间,可以告诉我具体是哪个部位需要清洁,然后我会给你相应的建议和步骤。
|
||||
Is(Floor,1) 当然可以,你让我来吧!
|
||||
Is(Table1,0) 当然可以!不过我需要先了解一下 Table1 包含哪些内容,以及您想要修改的具体是哪方面。这样我才能更好地帮助您进行操作。
|
||||
Is(Table1,1) 当然可以,你有什么特别要求吗?比如需要清理什么物品或者怎么清洁?
|
||||
Holding(Softdrink) 你能不能把soft drink抓在手里啊?
|
||||
Holding(Softdrink) 你能一直拿着一罐饮料吗?
|
||||
Holding(BottledDrink) 你能把瓶装饮料抓在手里吗?
|
||||
Holding(BottledDrink) 你能一直拿着这瓶饮料吗?
|
||||
Holding(Yogurt) 你能把酸奶抓在手里吗?
|
||||
Holding(Yogurt) 你能一直抱着羊酸奶吗?
|
||||
Holding(ADMilk) 你能捧着 AD Milk 吗?
|
||||
Holding(ADMilk) 你能一直拿着AD Milk吗?
|
||||
|
||||
如果我能一直拿着AD Milk,那我会很开心,因为我很喜欢喝这个品牌的牛奶。不过,我不确定我能否一直拿着它,因为我需要考虑到我的健康和生活方式。
|
||||
Holding(MilkDrink) 哦,你是指那个牛奶饮料品牌“MilkDrink”吗?当然可以啊,你可以像拿任何 other 饮料一样拿起它来。
|
||||
Holding(MilkDrink) 你好呀!我能一直拿着这个牛奶饮料吗?
|
||||
Holding(Milk) 你能把牛奶抓在手里吗?当然可以,只要你抓住瓶子或者盒子,就可以把牛奶抓在手里。不过要注意,不要把牛奶撒出来哦!
|
||||
Holding(Milk) 你能不能一直拿着牛奶呀?
|
||||
Holding(VacuumCup) 你能把吸尘器杯收入手中吗?
|
||||
Holding(VacuumCup) 你能一直拿着吸尘器杯吗?
|
||||
Holding(Nothing) 你能把“nothing”这个单词抓在手里吗?
|
||||
Holding(Nothing) 当然可以啊!如果你说的“ Nothing”是指没有任何事物或事情的话,那我可以一直保持这样的状态。不过,如果你指的是某个具体的事物或场景,那可能就需要根据实际情况来分析了。
|
||||
On(Coffee,Bar) 当然可以!我马上为你制作一杯咖啡,然后端到吧台给你。
|
||||
On(Coffee,Bar) 给我倒杯咖啡,然后把它端到酒吧这里来。
|
||||
On(Coffee,WaterTable) 当然可以!我马上为你制作一杯咖啡,然后端到水 table 这里来。
|
||||
On(Coffee,WaterTable) 好的,我给你倒杯咖啡,然后端到水 table 这里来。
|
||||
On(Coffee,CoffeeTable) 当然可以!我为您制作一杯咖啡,然后把它端到咖啡桌那里吧。
|
||||
On(Coffee,CoffeeTable) 行吗?能不能帮我倒杯咖啡,然后把咖啡端到咖啡桌上来呀?
|
||||
On(Coffee,Bar2) 当然可以!我马上为您制作一杯咖啡,然后送到Bar 2那里。请问您喜欢什么口味的咖啡呢?
|
||||
On(Coffee,Bar2) 好的,我给您准备了一杯咖啡,现在就端到 Bar 2 这里来。
|
||||
On(Coffee,Table1) 当然可以!我马上为您制作一杯咖啡,然后端到Table1这里来。请问您喜欢什么口味的咖啡呢?
|
||||
On(Coffee,Table1) 好的,请给我一杯咖啡,然后把它送到 Table1 这里来,谢谢!
|
||||
On(Coffee,Table2) 当然可以!我马上为您制作一杯咖啡,然后端到Table2这里来。
|
||||
On(Coffee,Table2) 好的,我给你拿杯咖啡,放Table2那里。
|
||||
On(Coffee,Table3) 当然可以!我马上为你制作一杯咖啡,然后端到你面前的桌子上。
|
||||
On(Coffee,Table3) 行吗?我可以给你拿杯咖啡,然后放到了Table 3这里。
|
||||
On(Water,Bar) 当然可以!去吧,我给你端来水。
|
||||
On(Water,Bar) 好的,让我给您倒一杯水,然后把它端到酒吧这里来。
|
||||
On(Water,WaterTable) 当然可以!我可以帮你制作水,然后把水送到水 table 这里来。
|
||||
On(Water,WaterTable) 好的,我给你倒一杯水,然后把它放在水 table 上。
|
||||
On(Water,CoffeeTable) 当然可以!我马上为您制作水,并把水端到咖啡桌这里来。
|
||||
On(Water,CoffeeTable) 好的,我马上给您倒杯水,然后把水端到咖啡桌这里来。
|
||||
On(Water,Bar2) 当然可以!我可以帮你制作水,然后把水端到酒吧2(Bar 2)那里。你需要我马上去做吗?
|
||||
On(Water,Bar2) 好的,我来给您倒杯水,送到酒吧2怎么样?
|
||||
On(Water,Table1) 当然可以!请问你需要多少量的水呢?我会尽快为您准备好的。
|
||||
On(Water,Table1) 好的,我给你倒一杯水,你想要端到哪个桌子呢?
|
||||
On(Water,Table2) 当然可以!我马上帮你制作水,然后把它送到 Table2 这里来。
|
||||
On(Water,Table2) 好的,我给你倒一杯水,稍等一下。
|
||||
On(Water,Table3) 当然可以!我马上帮您把水送到 Table 3 这里来。
|
||||
On(Water,Table3) 好的,我给您倒一杯水,稍等一下,我现在就去拿。请问您要放在哪个桌子上呢?是Table 1还是Table 2?还是您想要自己拿杯子接?
|
||||
On(Dessert,Bar) 你好!当然可以。Dessert(甜点)是餐后享用的食物,有很多美味的选择,比如蛋糕、饼干、布丁等。请问你想制作哪一种甜点呢?我可以帮你准备材料和制作方法。制作完成后,我们可以一起把甜点带到酒吧享用。
|
||||
On(Dessert,Bar) 请给我一点甜点,然后把它送到酒吧这里来。
|
||||
On(Dessert,WaterTable) 你能否把甜点做好,然后拿到水 table 那里去呢?
|
||||
On(Dessert,WaterTable) 好的,我给您准备了一些甜点,现在就端到水 table 这里来。您觉得怎么样?
|
||||
On(Dessert,CoffeeTable) 当然可以!我给您制作一些甜点,然后拿到咖啡桌上去吧。请问您想尝试哪种甜点呢?
|
||||
On(Dessert,CoffeeTable) 行啊,那给我来点甜点,然后把它放到咖啡桌子上。
|
||||
On(Dessert,Bar2) 当然可以!我会做一些美味的甜点,然后带到酒吧2(Bar 2)来。您想尝尝吗?
|
||||
On(Dessert,Bar2) 好的,我给你准备了一些甜点,现在就端到你所在的酒吧2。
|
||||
On(Dessert,Table1) 当然可以!我马上为您制作甜点,然后把它端到Table1这里来。
|
||||
On(Dessert,Table1) 好的,我给您准备了一些美味的甜点,现在 bring it to Table1 这里。
|
||||
On(Dessert,Table2) 当然可以!我马上为您制作甜点,然后端到Table2这里来。
|
||||
On(Dessert,Table2) 好的,我给你准备了一些甜点,现在端到你面前的桌子上。
|
||||
On(Dessert,Table3) 当然可以!我马上为您制作甜点,然后把它送到Table3这里来。
|
||||
On(Dessert,Table3) 好的,我给你准备了一些甜点,现在就端到你面前的桌子上。
|
|
@ -0,0 +1,57 @@
|
|||
At(Robot,Bar) 请问您需要什么帮助吗?我就在吧台附近,能否请您自己过来呢?
|
||||
At(Robot,Bar) 请问你能去一下吧台吗?
|
||||
At(Robot,Bar) 请问你能帮我到吧台那个位置吗?
|
||||
At(Robot,WaterTable) 请问你能过来一下吗?我正在茶水桌旁。
|
||||
At(Robot,WaterTable) 请问你可以去茶水桌一下吗?
|
||||
At(Robot,WaterTable) 你能带路去茶水桌吗?
|
||||
At(Robot,CoffeeTable) 请问你可以过来一下吗?我在这张咖啡桌旁边。
|
||||
At(Robot,CoffeeTable) 请问你可以帮我一下,去一下咖啡桌吗?
|
||||
At(Robot,CoffeeTable) 请问你能帮我前往咖啡桌那个位置吗?
|
||||
At(Robot,Bar2) 您好,请问您需要什么帮助吗?我正在另一个吧台处理一些事情。
|
||||
At(Robot,Bar2) 请问你可以去一下另一个吧台吗?
|
||||
At(Robot,Bar2) 你能去另一个吧台的位置吗?
|
||||
At(Robot,Table1) 请问你能过来一下吗?我目前在第一桌,需要你的帮助。
|
||||
At(Robot,Table1) 请问你能去一下第一桌吗?
|
||||
At(Robot,Table1) 请问你能帮我到第一张桌子那个位置吗?
|
||||
At(Robot,Table2) 请问您能过来一下吗?我正在第二张桌子这里。
|
||||
At(Robot,Table2) 请问你可以去第二张桌子一下吗?
|
||||
At(Robot,Table2) 请问你能帮我前往第二桌吗?
|
||||
At(Robot,Table3) 请问你能过来一下吗?我正在第三张桌子旁。
|
||||
At(Robot,Table3) 请问你能去第三张桌子一下吗?
|
||||
At(Robot,Table3) 你能告诉我第三张桌子的位置在哪里吗?
|
||||
On(Softdrink,Bar) 您好,请问您需要我帮您把盒装冰红茶放到哪个位置呢?
|
||||
On(Softdrink,Bar) 服务员,能否帮我拿来一盒冰红茶放到吧台呢?
|
||||
On(Softdrink,WaterTable) 您好,请问您需要我帮忙将盒装冰红茶放到哪个位置吗?
|
||||
On(Softdrink,WaterTable) 服务员,能否帮我把盒装冰红茶拿到茶水桌呢?
|
||||
On(Softdrink,CoffeeTable) 请问你能把盒装冰红茶放到咖啡桌那个位置吗?
|
||||
On(Softdrink,CoffeeTable) 服务员,把盒装冰红茶拿到咖啡桌 position 好吗?
|
||||
On(Softdrink,Bar2) 请问你能把盒装冰红茶放到另一个吧台的位置吗?
|
||||
On(Softdrink,Bar2) 请问你能把盒装冰红茶拿到另一个吧台位置吗?
|
||||
On(Softdrink,Table1) 请问您能否把盒装冰红茶放在第一桌的指定位置呢?
|
||||
On(Softdrink,Table1) 请您把盒装冰红茶拿到第一桌的位置。
|
||||
On(Softdrink,Table2) 服务员,您好,请问能否帮我將這盒裝冰红茶放 到第二張桌子那個位置呢?
|
||||
On(Softdrink,Table2) 服务员,请把盒装冰红茶拿到第二张桌子的位置。
|
||||
On(Softdrink,Table3) 请问你可以把盒装冰红茶放到第三张桌子的那个位置吗?
|
||||
On(Softdrink,Table3) 请问你能把盒装冰红茶拿到第三张桌子的位置吗?
|
||||
On(BottledDrink,Bar) 您好,请问您需要我将瓶装饮料放到哪个位置呢?
|
||||
On(BottledDrink,Bar) 请把瓶装饮料拿到吧台的位置。
|
||||
On(BottledDrink,WaterTable) 请问你可以把瓶装饮料放到茶水桌那个位置吗?
|
||||
On(BottledDrink,WaterTable) 请问你能把瓶装饮料拿到茶水桌位置吗?
|
||||
On(BottledDrink,CoffeeTable) 服务员,能否把瓶装饮料放在咖啡桌那个位置呢?
|
||||
On(BottledDrink,CoffeeTable) 服务员,能否把瓶装饮料拿到咖啡桌附近呢?
|
||||
On(BottledDrink,Bar2) 请问你能把瓶装饮料放到另一个吧台的那个位置吗?
|
||||
On(BottledDrink,Bar2) 请把瓶装饮料拿到另一个吧台位置。
|
||||
On(BottledDrink,Table1) 请问您能否帮我將瓶裝飲料放至第一張桌子的那個位置呢?
|
||||
On(BottledDrink,Table1) 请问你能把瓶装饮料拿到第一桌的位置吗?
|
||||
On(BottledDrink,Table2) 请问,你可以把瓶装饮料放到第二张桌子的那个位置吗?
|
||||
On(BottledDrink,Table2) 请问你能把瓶装饮料拿到第二张桌子的位置吗?
|
||||
On(BottledDrink,Table3) 请问,你能把瓶装饮料放到第三桌的哪个位置吗?
|
||||
On(BottledDrink,Table3) 请问你能把瓶装饮料拿到第三张桌子的位置吗?
|
||||
On(Yogurt,Bar) 请问你能把酸奶放到吧台那个位置吗?
|
||||
On(Yogurt,Bar) 请问你能把酸奶拿到吧台位置吗?
|
||||
On(Yogurt,WaterTable) 请问你能把酸奶放到茶水桌那个位置吗?
|
||||
On(Yogurt,WaterTable) 服务员,请把酸奶拿到茶水桌的位置。
|
||||
On(Yogurt,CoffeeTable) 请问,你能把酸奶放在咖啡桌那个位置吗?
|
||||
On(Yogurt,CoffeeTable) 服务员,能否把酸奶拿到咖啡桌的位置呢?
|
||||
On(Yogurt,Bar2) 请问你能把酸奶放到另一个吧台的那个位置吗?
|
||||
On(Yogurt,Bar2) 请问你能把酸奶拿到另一个吧台位置吗?
|
|
@ -0,0 +1,172 @@
|
|||
import copy
|
||||
import re
|
||||
import spacy
|
||||
nlp_en = spacy.load('en_core_web_lg')
|
||||
|
||||
reply = "at(coffee,Table)"
|
||||
# 正则表达式
|
||||
replay_words = re.sub(r'[^A-Za-z0-9]', ' ', reply)
|
||||
replay_words = replay_words.split() #['at','coffee','Table']
|
||||
|
||||
noun_words_ls = [['At','On','Is'],[]]# 完整文档n*2(动作,单词)
|
||||
together_words_ls = []
|
||||
# 示例代码:如何使用Python逐行读取txt文件
|
||||
# 打开一个示例的txt文件(这里假设文件名为example.txt)
|
||||
file_path = './goal_states_unique.txt'
|
||||
try:
|
||||
with open(file_path, 'r', encoding='utf-8') as file:
|
||||
# 逐行读取文件
|
||||
for line in file:
|
||||
cleaned_line = re.sub(r'[^A-Za-z0-9]', ' ', line)
|
||||
words = cleaned_line.split()
|
||||
# print(words)
|
||||
noun_words_ls[-1].extend(words)
|
||||
# print(line.strip()) # 打印每一行内容,去除行尾的换行符
|
||||
|
||||
cleaned_line = line.replace("{", "").replace("}", "").replace("\n", "")
|
||||
together_words_ls.append(cleaned_line)
|
||||
|
||||
except FileNotFoundError:
|
||||
print(f"File not found: {file_path}")
|
||||
except Exception as e:
|
||||
print(f"An error occurred: {e}")
|
||||
|
||||
|
||||
# 建立语料库
|
||||
|
||||
file_path = './goal_states_unique.txt'
|
||||
try:
|
||||
with open(file_path, 'r', encoding='utf-8') as file:
|
||||
# 逐行读取文件
|
||||
for line in file:
|
||||
cleaned_line = re.sub(r'[^A-Za-z0-9]', ' ', line)
|
||||
words = cleaned_line.split()
|
||||
# print(words)
|
||||
noun_words_ls[-1].extend(words)
|
||||
# print(line.strip()) # 打印每一行内容,去除行尾的换行符
|
||||
|
||||
cleaned_line = line.replace("{", "").replace("}", "").replace("\n", "")
|
||||
together_words_ls.append(cleaned_line)
|
||||
|
||||
except FileNotFoundError:
|
||||
print(f"File not found: {file_path}")
|
||||
except Exception as e:
|
||||
print(f"An error occurred: {e}")
|
||||
|
||||
|
||||
|
||||
# import datetime
|
||||
# from gensim.models import word2vec
|
||||
# import numpy as np
|
||||
# from scipy import spatial
|
||||
# pre_time=datetime.datetime.now()
|
||||
# model = word2vec.Word2Vec(together_words_ls,
|
||||
# vector_size=10,#特征向量的维度
|
||||
# alpha=0.04,#学习率
|
||||
# window=5,#一个句子内,当前词和预测词之间的最大距离 文本(window)大小:skip-gram通常在10附近,CBOW通常在5附近
|
||||
# min_count=0,#最低词频 没有大的变化
|
||||
# max_vocab_size=None,
|
||||
# sample=0.0001, #随机下采样的阈值
|
||||
# seed=1,#随机数种子
|
||||
# workers=10,#进程数
|
||||
# min_alpha=0.00001,#学习率下降的最小值
|
||||
# sg=1, #训练算法的选择,sg=1,采用skip-gram,sg=0,采用CBOW---skip-gram(慢、对罕见字有利)vs CBOW(快)
|
||||
# hs=1,# hs=1,采用hierarchica·softmax,hs=0,采用negative sampling
|
||||
# #分层softmax(对罕见字有利)vs 负采样(对常见词和低纬向量有利)
|
||||
# negative=0,#这个值大于0,使用negative sampling去掉'noise words'的个数(通常设置5-20);为0,不使用negative sampling
|
||||
# #cbow_mean=1,#为0,使用词向量的和,为1,使用均值;只适用于cbow的情况
|
||||
# null_word = 0,
|
||||
# trim_rule = None, #裁剪词汇规则,使用None(会使用最小min_count)
|
||||
# sorted_vocab =1,#对词汇降序排序
|
||||
# batch_words = 8192,#训练时,每一批次的单词数量
|
||||
# compute_loss = False,
|
||||
# callbacks = ())
|
||||
# model.train(together_words_ls, total_examples=len(together_words_ls), epochs=10)
|
||||
# model.save("./W2V_CI.model") # 保存模型
|
||||
# post_time=datetime.datetime.now()
|
||||
# print("word2vec模型训练保存结束,时间为: ",(post_time-pre_time).seconds*1.0)#1106.0s
|
||||
#
|
||||
# w2v_model = word2vec.Word2Vec.load("./W2V_CI.model")
|
||||
# # w2v_model[word]
|
||||
#
|
||||
# def replay_together_w2v(reply):
|
||||
# return model.wv.most_similar(reply)
|
||||
# # max_similarity = -1
|
||||
# # similar_word = None
|
||||
# # query_token = w2v_model[reply]
|
||||
# # for state in together_words_ls:
|
||||
# # word_token = w2v_model[state]
|
||||
# # # 计算余弦相似度. spatial.distance.cosine 函数计算的是余弦距离
|
||||
# # # 余弦相似度(Cosine similarity),如在 Word2Vec 模型中用来比较两个向量的相似性,其值的范围是 -1 到 1。
|
||||
# # similarity = 1 - spatial.distance.cosine(query_token, word_token)
|
||||
# # # print("similarity:",similarity,real_obj_name)
|
||||
# # if similarity > max_similarity:
|
||||
# # max_similarity = similarity
|
||||
# # similar_word = state
|
||||
# # if similar_word==None:
|
||||
# # print("Error: Not Match!")
|
||||
# # else:
|
||||
# # return similar_word
|
||||
|
||||
|
||||
|
||||
def replay_one_by_one(replay_words):
|
||||
replace_ind = []
|
||||
replace_word = []
|
||||
for i,word in enumerate(replay_words):
|
||||
query_token = nlp_en(word)
|
||||
k=1
|
||||
if i==0: k=0
|
||||
if not word in noun_words_ls[k]:
|
||||
max_similarity = 0
|
||||
similar_word = None
|
||||
for act in noun_words_ls[k]:
|
||||
word_token = nlp_en(act)
|
||||
# print(act)
|
||||
# print(word_token)
|
||||
similarity = query_token.similarity(word_token)
|
||||
# print("similarity:",similarity,real_obj_name)
|
||||
if similarity > max_similarity:
|
||||
max_similarity = similarity
|
||||
similar_word = act
|
||||
if similar_word==None:
|
||||
print("Error: Not Match!")
|
||||
else:
|
||||
replay_words[i]=similar_word
|
||||
# replace_word.append(similar_word)
|
||||
# replace_ind.append(i)
|
||||
new_replay = f'{replay_words[0]}({replay_words[1]},{replay_words[2]})'
|
||||
return new_replay
|
||||
|
||||
# print(replace_word)
|
||||
# print(replace_ind)
|
||||
# replace_word = ['on','Table1']
|
||||
# replace_ind = [0,2]
|
||||
# 替换reply中单词
|
||||
# for new_word,ind in zip(replace_word,replace_ind):
|
||||
# 把第 ind 个单词替换成 new_word
|
||||
|
||||
def replay_together(reply):
|
||||
max_similarity = 0
|
||||
similar_word = None
|
||||
query_token = nlp_en(reply)
|
||||
for state in together_words_ls:
|
||||
word_token = nlp_en(state)
|
||||
similarity = query_token.similarity(word_token)
|
||||
# print("similarity:",similarity,real_obj_name)
|
||||
if similarity > max_similarity:
|
||||
max_similarity = similarity
|
||||
similar_word = state
|
||||
if similar_word==None:
|
||||
print("Error: Not Match!")
|
||||
else:
|
||||
return similar_word
|
||||
|
||||
print("原来的:",reply)
|
||||
new_replay = replay_one_by_one(copy.deepcopy(replay_words))
|
||||
print("逐个比较后的现在的:",new_replay)
|
||||
new_replay2 = replay_together(copy.deepcopy(reply))
|
||||
print("集体比较后的现在的:",new_replay2)
|
||||
# new_replay3 = replay_together_w2v(copy.deepcopy(reply))
|
||||
# print("W2V比较后的现在的:",new_replay3)
|
||||
|
|
@ -0,0 +1,322 @@
|
|||
# the empty string '' represents robot holds nothing
|
||||
import os
|
||||
import re
|
||||
|
||||
Object = ['Coffee', 'Water', 'Dessert', 'Softdrink', 'BottledDrink', 'Yogurt', 'ADMilk', 'MilkDrink', 'Milk','VacuumCup','Chips', 'NFCJuice', 'Bernachon', 'SpringWater']
|
||||
Cookable = ['Coffee', 'Water', 'Dessert']
|
||||
Place = ['Bar', 'Bar2', 'WaterTable', 'CoffeeTable', 'Table1', 'Table2', 'Table3','BrightTable6']
|
||||
Entity = ['Robot']
|
||||
Operable = ['AC', 'ACTemperature', 'HallLight', 'TubeLight', 'Curtain', 'Chairs', 'Floor', 'Table1']
|
||||
|
||||
import random
|
||||
|
||||
|
||||
def single_predict_generation(oplist_1, oplist_2, predict_pattern) -> str:
|
||||
index_1 = random.randint(0, len(oplist_1) - 1)
|
||||
if oplist_2:
|
||||
index_2 = random.randint(0, len(oplist_2) - 1)
|
||||
|
||||
match predict_pattern:
|
||||
case 'at':
|
||||
return f'At({oplist_1[index_1]},{oplist_2[index_2]})'
|
||||
case 'is':
|
||||
return f'Is({oplist_1[index_1]},{oplist_2[index_2]})'
|
||||
case 'hold':
|
||||
return f'Holding({oplist_1[index_1]})'
|
||||
case 'on':
|
||||
return f'On({oplist_1[index_1]},{oplist_2[index_2]})'
|
||||
case 'exist':
|
||||
return f'Exist({oplist_1[index_1]})'
|
||||
case _:
|
||||
raise RuntimeError('Incorrect predict pattern!')
|
||||
|
||||
|
||||
def enumerate_predict(oplist_1, oplist_2, predict_pattern) -> [int, list]:
|
||||
count = 0
|
||||
res = []
|
||||
|
||||
match predict_pattern:
|
||||
case 'at':
|
||||
pattern = f'At(%s,%s)'
|
||||
case 'is':
|
||||
pattern = f'Is(%s,%s)'
|
||||
case 'hold':
|
||||
pattern = f'Holding(%s)'
|
||||
case 'on':
|
||||
pattern = f'On(%s,%s)'
|
||||
case 'exist':
|
||||
pattern = f'Exist(%s)'
|
||||
case _:
|
||||
raise RuntimeError('Incorrect predict pattern!')
|
||||
|
||||
for str_1 in oplist_1:
|
||||
if oplist_2:
|
||||
for str_2 in oplist_2:
|
||||
count += 1
|
||||
res.append(pattern % (str_1, str_2))
|
||||
else:
|
||||
count += 1
|
||||
res.append(pattern % str_1)
|
||||
|
||||
return count, res
|
||||
|
||||
|
||||
def generate_goal_states(vln_num: int, vlm_num: int, opentask_num: int):
|
||||
# res stores lists of sets, while each state represent in set.
|
||||
res = []
|
||||
|
||||
# goal states for VLN
|
||||
for i in range(vln_num):
|
||||
res.append({single_predict_generation(['Robot'], Place, 'at')})
|
||||
|
||||
# goal states for VLM
|
||||
for i in range(int(vlm_num)):
|
||||
for j in range(int(vlm_num)):
|
||||
res.append(
|
||||
{
|
||||
single_predict_generation(['Robot'], Place, 'at'),
|
||||
single_predict_generation(Operable, ['0', '1'], 'is')
|
||||
}
|
||||
)
|
||||
|
||||
# goal states for Open-task-1
|
||||
for i in range(int(opentask_num)):
|
||||
for j in range(int(opentask_num)):
|
||||
res.append(
|
||||
{
|
||||
single_predict_generation(['Robot'], Place, 'at'),
|
||||
single_predict_generation(Object, Place, 'on')
|
||||
}
|
||||
)
|
||||
|
||||
print(res)
|
||||
print(len(res))
|
||||
|
||||
return res
|
||||
|
||||
|
||||
def enumerate_goal_states(total: int):
|
||||
res = []
|
||||
|
||||
point_15 = int(total * .15)
|
||||
point_10 = int(total * .10)
|
||||
|
||||
# goal states for VLN, .15
|
||||
count_vln, list_vln = enumerate_predict(['Robot'], Place, 'at')
|
||||
list_vln = ['{%s}' % i for i in list_vln]
|
||||
if count_vln < point_15:
|
||||
list_vln *= point_15 // count_vln
|
||||
for i in range(0, point_15 - len(list_vln)):
|
||||
list_vln.append('{%s}' % single_predict_generation(['Robot'], Place, 'at'))
|
||||
# print(f'VLN 任务的目标状态数:{count_vln}')
|
||||
res += list_vln
|
||||
|
||||
# goal states for VLM-1, 0.15
|
||||
count_vlm_1, list_vlm_1 = enumerate_predict(Object, Place, 'on')
|
||||
list_vlm_1 = ['{%s}' % i for i in list_vlm_1]
|
||||
if count_vlm_1 < point_15:
|
||||
list_vlm_1 *= point_15 // count_vlm_1
|
||||
for i in range(0, point_15 - len(list_vlm_1)):
|
||||
list_vlm_1.append('{%s}' % (single_predict_generation(Object, Place, 'on')))
|
||||
res += list_vlm_1
|
||||
|
||||
# goal states for VLM-2, 0.15
|
||||
count_vlm_2, list_vlm_2 = enumerate_predict(Operable, ['0', '1'], 'is')
|
||||
list_vlm_2 = ['{%s}' % i for i in list_vlm_2]
|
||||
if count_vlm_2 < point_15:
|
||||
list_vlm_2 *= point_15 // count_vlm_2
|
||||
for i in range(0, point_15 - len(list_vlm_2)):
|
||||
list_vlm_2.append('{%s}' % single_predict_generation(Operable, ['0', '1'], 'is'))
|
||||
res += list_vlm_2
|
||||
|
||||
# goal states for VLM-3, 0.1
|
||||
count_vlm_3, list_vlm_3 = enumerate_predict(Object + ['Nothing'], None, 'hold')
|
||||
list_vlm_3 = ['{%s}' % i for i in list_vlm_3]
|
||||
if count_vlm_3 < point_10:
|
||||
list_vlm_3 *= point_10 // count_vlm_3
|
||||
for i in range(0, point_10 - len(list_vlm_3)):
|
||||
list_vlm_3.append('{%s}' % single_predict_generation(Object, None, 'hold'))
|
||||
res += list_vlm_3
|
||||
|
||||
count_vlm_4, list_vlm_4 = enumerate_predict(Object, None, 'exist')
|
||||
list_vlm_4 = ['{%s}' % i for i in list_vlm_4]
|
||||
if count_vlm_4 < point_10:
|
||||
list_vlm_4 *= point_10 // count_vlm_4
|
||||
for i in range(0, point_10 - len(list_vlm_4)):
|
||||
list_vlm_4.append('{%s}' % single_predict_generation(Object, None, 'exist'))
|
||||
res += list_vlm_4
|
||||
|
||||
# goal states for OT, 0.15
|
||||
# count_ot, list_ot = enumerate_predict(Cookable, Place, 'on')
|
||||
# list_ot = ['{%s}' % i for i in list_ot]
|
||||
# if count_ot < point_15:
|
||||
# list_ot *= point_15 // count_ot
|
||||
# for i in range(0, point_15 - len(list_ot)):
|
||||
# list_ot.append('{%s}' % single_predict_generation(Cookable, Place, 'on'))
|
||||
# res += list_ot
|
||||
|
||||
# goal states for compound-1, 0.1
|
||||
# count_1, list_1 = enumerate_predict(['Robot'], Place, 'at')
|
||||
# count_2, list_2 = enumerate_predict(Object, Place, 'on')
|
||||
# list_tmp = []
|
||||
# for i in list_1:
|
||||
# for j in list_2:
|
||||
# list_tmp.append('{%s,%s}' % (i, j))
|
||||
# if len(list_tmp) < point_10:
|
||||
# list_tmp *= point_10 // len(list_tmp)
|
||||
# list_tmp += list_tmp[0:point_10 - len(list_tmp)]
|
||||
# else:
|
||||
# list_tmp = list_tmp[:point_10]
|
||||
# res += list_tmp
|
||||
|
||||
# goal states for compound-2, 0.1
|
||||
# count_1, list_1 = enumerate_predict(['Robot'], Place, 'at')
|
||||
# count_2, list_2 = enumerate_predict(Operable, ['0', '1'], 'is')
|
||||
# list_tmp = []
|
||||
# for i in list_1:
|
||||
# for j in list_2:
|
||||
# list_tmp.append('{%s,%s}' % (i, j))
|
||||
# if len(list_tmp) < point_10:
|
||||
# list_tmp *= point_10 // len(list_tmp)
|
||||
# list_tmp += list_tmp[0:point_10 - len(list_tmp)]
|
||||
# else:
|
||||
# list_tmp = list_tmp[:point_10]
|
||||
# res += list_tmp
|
||||
|
||||
# goal states for compound-3, 0.1
|
||||
# count_1, list_1 = enumerate_predict(Cookable, Place, 'on')
|
||||
# count_2, list_2 = enumerate_predict(Operable, ['0', '1'], 'is')
|
||||
# list_tmp = []
|
||||
# for i in list_1:
|
||||
# for j in list_2:
|
||||
# list_tmp.append('{%s,%s}' % (i, j))
|
||||
# if len(list_tmp) < point_10:
|
||||
# list_tmp *= point_10 // len(list_tmp)
|
||||
# list_tmp += list_tmp[0:point_10 - len(list_tmp)]
|
||||
# else:
|
||||
# list_tmp = list_tmp[:point_10]
|
||||
# res += list_tmp
|
||||
|
||||
# # goal states for VLM-1, 0.15
|
||||
# count_vlm_1, list_vlm_1 = enumerate_predict(['Robot'], Place, 'at')
|
||||
# count_vlm_2, list_vlm_2 = enumerate_predict(Operable, ['0', '1'], 'is')
|
||||
# print(f'VLM 任务的目标状态数:{count_vlm_1 * count_vlm_2}')
|
||||
#
|
||||
# # goal states for open-task
|
||||
# count_opentask_1, list_opentask_1 = enumerate_predict(['Robot'], Place, 'at')
|
||||
# count_opentask_2, list_opentask_2 = enumerate_predict(Object, Place, 'on')
|
||||
# print(f'Open-task-1 任务的目标状态数:{count_opentask_1 * count_opentask_2}')
|
||||
|
||||
with open(os.path.join('./goal_states.txt'), 'w+') as file:
|
||||
for i in res:
|
||||
if 'Is' in i and 'ACTemperature' in i:
|
||||
i = re.sub(',0', ',Up', i)
|
||||
i = re.sub(',1', ',Down', i)
|
||||
elif 'Is' in i and ('AC' in i or 'HallLight' in i or 'TubeLight' in i or 'Curtain' in i):
|
||||
i = re.sub(',0', ',Off', i)
|
||||
i = re.sub(',1', ',On', i)
|
||||
elif 'Is' in i and ('Chairs' in i or 'Floor' in i or 'Table' in i):
|
||||
i = re.sub(',0', ',Dirty', i)
|
||||
i = re.sub(',1', ',Clean', i)
|
||||
|
||||
file.write(i + '\n')
|
||||
|
||||
|
||||
def translate_zero_one(i: str) -> str:
|
||||
if 'ACTemperature' in i:
|
||||
i = re.sub('On\)', '调高', i)
|
||||
i = re.sub('Off\)', '调低', i)
|
||||
elif 'AC' in i or 'HallLight' in i or 'TubeLight' in i or 'Curtain' in i:
|
||||
i = re.sub('On\)', '关闭', i)
|
||||
i = re.sub('Off\)', '打开', i)
|
||||
elif 'Chairs' in i or 'Floor' in i or 'Table' in i:
|
||||
i = re.sub('On\)', '脏', i)
|
||||
i = re.sub('Off\)', '打扫干净', i)
|
||||
|
||||
return i
|
||||
|
||||
|
||||
def enumerate_goal_states_with_describe() -> str:
|
||||
with open(os.path.join('./goal_states_with_description.txt'), 'w', encoding='utf-8') as file:
|
||||
# vln
|
||||
count, res = enumerate_predict(['Robot'], Place, 'at')
|
||||
print(count)
|
||||
for i in range(count):
|
||||
tmp = '#' + res[i].split(',')[-1][:-1]
|
||||
file.write(f'{res[i]}\t你能过来一下吗?我在{tmp}这里。\n')
|
||||
file.write(f'{res[i]}\t麻烦你去一下{tmp}。\n')
|
||||
file.write(f'{res[i]}\t你能去{tmp}那个位置吗?\n')
|
||||
|
||||
# vlm, on
|
||||
count, res = enumerate_predict(Object, Place, 'on')
|
||||
print(count)
|
||||
for i in range(count):
|
||||
tmp = res[i].split(',')
|
||||
obj = '#' + tmp[0][3:]
|
||||
pla = '#' + tmp[-1][:-1]
|
||||
file.write(f'{res[i]}\t麻烦你把{obj}放到{pla}那个位置。\n')
|
||||
file.write(f'{res[i]}\t请你拿一下{obj}到{pla}位置。\n')
|
||||
file.write(f'{res[i]}\t你好,我在{pla},请你拿一下{obj}到位置。\n')
|
||||
|
||||
# vlm, is
|
||||
count, res = enumerate_predict(Operable, ['On', 'Off'], 'is')
|
||||
print(count)
|
||||
for i in res:
|
||||
tmp = i.split(',')
|
||||
thing, op = '#' + tmp[0][3:], '#' + tmp[-1]
|
||||
file.write('%s\t%s\n' % (i, translate_zero_one(f'你能把{thing}{op}一下吗?')))
|
||||
|
||||
|
||||
# vlm, holding
|
||||
count, res = enumerate_predict(Object + ['Nothing'], None, 'hold')
|
||||
print(count)
|
||||
for i in res:
|
||||
tmp = '#' + i.split('(')[-1][:-1]
|
||||
if tmp == 'Nothing':
|
||||
file.write(f'{i}\t你手里是没有东西的吗?\n')
|
||||
continue
|
||||
file.write(f'{i}\t你能把{tmp}抓在手里吗?\n')
|
||||
file.write(f'{i}\t你能一直拿着{tmp}吗?\n')
|
||||
|
||||
|
||||
count, res = enumerate_predict(Cookable, Place, 'on')
|
||||
print(count)
|
||||
for i in res:
|
||||
tmp = i.split(',')
|
||||
thing, pla = '#' + tmp[0][3:], '#' + tmp[-1][:-1]
|
||||
|
||||
file.write(f'{i}\t你能制作{thing}并把它端到{pla}这里来吗?\n')
|
||||
file.write(f'{i}\t给我来点{thing},并把它端到{pla}这里来。\n')
|
||||
return './goal_states_with_description.txt'
|
||||
|
||||
|
||||
from copy import deepcopy
|
||||
|
||||
|
||||
def mutex(path: str):
|
||||
with open(os.path.join(path), 'r', encoding='utf-8') as file:
|
||||
lines = "".join(file.readlines())
|
||||
new_line = deepcopy(lines)
|
||||
|
||||
check = ['#Bar2', '#WaterTable', '#CoffeeTable', '#Bar', '#Table1', '#Table2', '#Table3', '#BrightTable6',
|
||||
'#Coffee', '#Water','#Dessert', '#Softdrink', '#BottledDrink', '#Yogurt', '#ADMilk', '#MilkDrink', '#Milk', '#VacuumCup',
|
||||
'#Chips', '#NFCJuice', '#Bernachon', '#SpringWater',
|
||||
'#AC',
|
||||
'#ACTemperature', '#HallLight', '#TubeLight', '#Curtain', '#Chairs', '#Floor', '#Table1']
|
||||
repla = ['#另一侧的吧台', '#茶水桌', '#咖啡桌', '#吧台', '#前门斜桌子', '#大厅长桌子西侧', '#大厅长桌子东侧', '#后门靠窗边圆桌', '#咖啡', '#水',
|
||||
'#点心', '#盒装冰红茶', '#瓶装饮料', '#酸奶', '#AD钙奶', '#牛奶味的饮料', '#牛奶', '#保温杯',
|
||||
'#薯片', '#NFC果汁', '#贝纳颂咖啡', '#矿泉水',
|
||||
'#空调',
|
||||
'#空调温度', '#大厅灯', '#筒灯', '#窗帘', '#椅子', '#地板', '#前门斜桌子']
|
||||
|
||||
for i, j in zip(check, repla):
|
||||
new_line = re.sub(i, j, new_line)
|
||||
new_line = re.sub('#', '', new_line)
|
||||
lines = re.sub('#', '', lines)
|
||||
|
||||
with open(os.path.join(path), 'w', encoding='utf-8') as file:
|
||||
file.write(new_line)
|
||||
|
||||
# generate_goal_states(30, 6, 6)
|
||||
enumerate_goal_states(5000)
|
||||
mutex(enumerate_goal_states_with_describe())
|
|
@ -0,0 +1,165 @@
|
|||
{At(Robot,Bar)}
|
||||
{At(Robot,Bar2)}
|
||||
{At(Robot,WaterTable)}
|
||||
{At(Robot,CoffeeTable)}
|
||||
{At(Robot,Table1)}
|
||||
{At(Robot,Table2)}
|
||||
{At(Robot,Table3)}
|
||||
{At(Robot,BrightTable6)}
|
||||
{On(Coffee,Bar)}
|
||||
{On(Coffee,Bar2)}
|
||||
{On(Coffee,WaterTable)}
|
||||
{On(Coffee,CoffeeTable)}
|
||||
{On(Coffee,Table1)}
|
||||
{On(Coffee,Table2)}
|
||||
{On(Coffee,Table3)}
|
||||
{On(Coffee,BrightTable6)}
|
||||
{On(Water,Bar)}
|
||||
{On(Water,Bar2)}
|
||||
{On(Water,WaterTable)}
|
||||
{On(Water,CoffeeTable)}
|
||||
{On(Water,Table1)}
|
||||
{On(Water,Table2)}
|
||||
{On(Water,Table3)}
|
||||
{On(Water,BrightTable6)}
|
||||
{On(Dessert,Bar)}
|
||||
{On(Dessert,Bar2)}
|
||||
{On(Dessert,WaterTable)}
|
||||
{On(Dessert,CoffeeTable)}
|
||||
{On(Dessert,Table1)}
|
||||
{On(Dessert,Table2)}
|
||||
{On(Dessert,Table3)}
|
||||
{On(Dessert,BrightTable6)}
|
||||
{On(Softdrink,Bar)}
|
||||
{On(Softdrink,Bar2)}
|
||||
{On(Softdrink,WaterTable)}
|
||||
{On(Softdrink,CoffeeTable)}
|
||||
{On(Softdrink,Table1)}
|
||||
{On(Softdrink,Table2)}
|
||||
{On(Softdrink,Table3)}
|
||||
{On(Softdrink,BrightTable6)}
|
||||
{On(BottledDrink,Bar)}
|
||||
{On(BottledDrink,Bar2)}
|
||||
{On(BottledDrink,WaterTable)}
|
||||
{On(BottledDrink,CoffeeTable)}
|
||||
{On(BottledDrink,Table1)}
|
||||
{On(BottledDrink,Table2)}
|
||||
{On(BottledDrink,Table3)}
|
||||
{On(BottledDrink,BrightTable6)}
|
||||
{On(Yogurt,Bar)}
|
||||
{On(Yogurt,Bar2)}
|
||||
{On(Yogurt,WaterTable)}
|
||||
{On(Yogurt,CoffeeTable)}
|
||||
{On(Yogurt,Table1)}
|
||||
{On(Yogurt,Table2)}
|
||||
{On(Yogurt,Table3)}
|
||||
{On(Yogurt,BrightTable6)}
|
||||
{On(ADMilk,Bar)}
|
||||
{On(ADMilk,Bar2)}
|
||||
{On(ADMilk,WaterTable)}
|
||||
{On(ADMilk,CoffeeTable)}
|
||||
{On(ADMilk,Table1)}
|
||||
{On(ADMilk,Table2)}
|
||||
{On(ADMilk,Table3)}
|
||||
{On(ADMilk,BrightTable6)}
|
||||
{On(MilkDrink,Bar)}
|
||||
{On(MilkDrink,Bar2)}
|
||||
{On(MilkDrink,WaterTable)}
|
||||
{On(MilkDrink,CoffeeTable)}
|
||||
{On(MilkDrink,Table1)}
|
||||
{On(MilkDrink,Table2)}
|
||||
{On(MilkDrink,Table3)}
|
||||
{On(MilkDrink,BrightTable6)}
|
||||
{On(Milk,Bar)}
|
||||
{On(Milk,Bar2)}
|
||||
{On(Milk,WaterTable)}
|
||||
{On(Milk,CoffeeTable)}
|
||||
{On(Milk,Table1)}
|
||||
{On(Milk,Table2)}
|
||||
{On(Milk,Table3)}
|
||||
{On(Milk,BrightTable6)}
|
||||
{On(VacuumCup,Bar)}
|
||||
{On(VacuumCup,Bar2)}
|
||||
{On(VacuumCup,WaterTable)}
|
||||
{On(VacuumCup,CoffeeTable)}
|
||||
{On(VacuumCup,Table1)}
|
||||
{On(VacuumCup,Table2)}
|
||||
{On(VacuumCup,Table3)}
|
||||
{On(VacuumCup,BrightTable6)}
|
||||
{On(Chips,Bar)}
|
||||
{On(Chips,Bar2)}
|
||||
{On(Chips,WaterTable)}
|
||||
{On(Chips,CoffeeTable)}
|
||||
{On(Chips,Table1)}
|
||||
{On(Chips,Table2)}
|
||||
{On(Chips,Table3)}
|
||||
{On(Chips,BrightTable6)}
|
||||
{On(NFCJuice,Bar)}
|
||||
{On(NFCJuice,Bar2)}
|
||||
{On(NFCJuice,WaterTable)}
|
||||
{On(NFCJuice,CoffeeTable)}
|
||||
{On(NFCJuice,Table1)}
|
||||
{On(NFCJuice,Table2)}
|
||||
{On(NFCJuice,Table3)}
|
||||
{On(NFCJuice,BrightTable6)}
|
||||
{On(Bernachon,Bar)}
|
||||
{On(Bernachon,Bar2)}
|
||||
{On(Bernachon,WaterTable)}
|
||||
{On(Bernachon,CoffeeTable)}
|
||||
{On(Bernachon,Table1)}
|
||||
{On(Bernachon,Table2)}
|
||||
{On(Bernachon,Table3)}
|
||||
{On(Bernachon,BrightTable6)}
|
||||
{On(SpringWater,Bar)}
|
||||
{On(SpringWater,Bar2)}
|
||||
{On(SpringWater,WaterTable)}
|
||||
{On(SpringWater,CoffeeTable)}
|
||||
{On(SpringWater,Table1)}
|
||||
{On(SpringWater,Table2)}
|
||||
{On(SpringWater,Table3)}
|
||||
{On(SpringWater,BrightTable6)}
|
||||
{Is(AC,Off)}
|
||||
{Is(AC,On)}
|
||||
{Is(ACTemperature,Up)}
|
||||
{Is(ACTemperature,Down)}
|
||||
{Is(HallLight,Off)}
|
||||
{Is(HallLight,On)}
|
||||
{Is(TubeLight,Off)}
|
||||
{Is(TubeLight,On)}
|
||||
{Is(Curtain,Off)}
|
||||
{Is(Curtain,On)}
|
||||
{Is(Chairs,Dirty)}
|
||||
{Is(Chairs,Clean)}
|
||||
{Is(Floor,Dirty)}
|
||||
{Is(Floor,Clean)}
|
||||
{Is(Table1,Dirty)}
|
||||
{Is(Table1,Clean)}
|
||||
{Holding(Coffee)}
|
||||
{Holding(Water)}
|
||||
{Holding(Dessert)}
|
||||
{Holding(Softdrink)}
|
||||
{Holding(BottledDrink)}
|
||||
{Holding(Yogurt)}
|
||||
{Holding(ADMilk)}
|
||||
{Holding(MilkDrink)}
|
||||
{Holding(Milk)}
|
||||
{Holding(VacuumCup)}
|
||||
{Holding(Chips)}
|
||||
{Holding(NFCJuice)}
|
||||
{Holding(Bernachon)}
|
||||
{Holding(SpringWater)}
|
||||
{Holding(Nothing)}
|
||||
{Exist(Coffee)}
|
||||
{Exist(Water)}
|
||||
{Exist(Dessert)}
|
||||
{Exist(Softdrink)}
|
||||
{Exist(BottledDrink)}
|
||||
{Exist(Yogurt)}
|
||||
{Exist(ADMilk)}
|
||||
{Exist(MilkDrink)}
|
||||
{Exist(Milk)}
|
||||
{Exist(VacuumCup)}
|
||||
{Exist(Chips)}
|
||||
{Exist(NFCJuice)}
|
||||
{Exist(Bernachon)}
|
||||
{Exist(SpringWater)}
|
|
@ -0,0 +1,193 @@
|
|||
{"title":"你能过来一下吗?我在吧台这里。","text":"At(Robot,Bar)"}
|
||||
{"title":"麻烦你去一下吧台。","text":"At(Robot,Bar)"}
|
||||
{"title":"你能去吧台那个位置吗?","text":"At(Robot,Bar)"}
|
||||
{"title":"你能过来一下吗?我在茶水桌这里。","text":"At(Robot,WaterTable)"}
|
||||
{"title":"麻烦你去一下茶水桌。","text":"At(Robot,WaterTable)"}
|
||||
{"title":"你能去茶水桌那个位置吗?","text":"At(Robot,WaterTable)"}
|
||||
{"title":"你能过来一下吗?我在咖啡桌这里。","text":"At(Robot,CoffeeTable)"}
|
||||
{"title":"麻烦你去一下咖啡桌。","text":"At(Robot,CoffeeTable)"}
|
||||
{"title":"你能去咖啡桌那个位置吗?","text":"At(Robot,CoffeeTable)"}
|
||||
{"title":"你能过来一下吗?我在另一个吧台这里。","text":"At(Robot,Bar2)"}
|
||||
{"title":"麻烦你去一下另一个吧台。","text":"At(Robot,Bar2)"}
|
||||
{"title":"你能去另一个吧台那个位置吗?","text":"At(Robot,Bar2)"}
|
||||
{"title":"你能过来一下吗?我在第一张桌子这里。","text":"At(Robot,Table1)"}
|
||||
{"title":"麻烦你去一下第一张桌子。","text":"At(Robot,Table1)"}
|
||||
{"title":"你能去第一张桌子那个位置吗?","text":"At(Robot,Table1)"}
|
||||
{"title":"你能过来一下吗?我在第二张桌子这里。","text":"At(Robot,Table2)"}
|
||||
{"title":"麻烦你去一下第二张桌子。","text":"At(Robot,Table2)"}
|
||||
{"title":"你能去第二张桌子那个位置吗?","text":"At(Robot,Table2)"}
|
||||
{"title":"你能过来一下吗?我在第三张桌子这里。","text":"At(Robot,Table3)"}
|
||||
{"title":"麻烦你去一下第三张桌子。","text":"At(Robot,Table3)"}
|
||||
{"title":"你能去第三张桌子那个位置吗?","text":"At(Robot,Table3)"}
|
||||
{"title":"麻烦你把盒装冰红茶放到吧台那个位置。","text":"On(Softdrink,Bar)"}
|
||||
{"title":"请你拿一下盒装冰红茶到吧台位置。","text":"On(Softdrink,Bar)"}
|
||||
{"title":"麻烦你把盒装冰红茶放到茶水桌那个位置。","text":"On(Softdrink,WaterTable)"}
|
||||
{"title":"请你拿一下盒装冰红茶到茶水桌位置。","text":"On(Softdrink,WaterTable)"}
|
||||
{"title":"麻烦你把盒装冰红茶放到咖啡桌那个位置。","text":"On(Softdrink,CoffeeTable)"}
|
||||
{"title":"请你拿一下盒装冰红茶到咖啡桌位置。","text":"On(Softdrink,CoffeeTable)"}
|
||||
{"title":"麻烦你把盒装冰红茶放到另一个吧台那个位置。","text":"On(Softdrink,Bar2)"}
|
||||
{"title":"请你拿一下盒装冰红茶到另一个吧台位置。","text":"On(Softdrink,Bar2)"}
|
||||
{"title":"麻烦你把盒装冰红茶放到第一张桌子那个位置。","text":"On(Softdrink,Table1)"}
|
||||
{"title":"请你拿一下盒装冰红茶到第一张桌子位置。","text":"On(Softdrink,Table1)"}
|
||||
{"title":"麻烦你把盒装冰红茶放到第二张桌子那个位置。","text":"On(Softdrink,Table2)"}
|
||||
{"title":"请你拿一下盒装冰红茶到第二张桌子位置。","text":"On(Softdrink,Table2)"}
|
||||
{"title":"麻烦你把盒装冰红茶放到第三张桌子那个位置。","text":"On(Softdrink,Table3)"}
|
||||
{"title":"请你拿一下盒装冰红茶到第三张桌子位置。","text":"On(Softdrink,Table3)"}
|
||||
{"title":"麻烦你把瓶装饮料放到吧台那个位置。","text":"On(BottledDrink,Bar)"}
|
||||
{"title":"请你拿一下瓶装饮料到吧台位置。","text":"On(BottledDrink,Bar)"}
|
||||
{"title":"麻烦你把瓶装饮料放到茶水桌那个位置。","text":"On(BottledDrink,WaterTable)"}
|
||||
{"title":"请你拿一下瓶装饮料到茶水桌位置。","text":"On(BottledDrink,WaterTable)"}
|
||||
{"title":"麻烦你把瓶装饮料放到咖啡桌那个位置。","text":"On(BottledDrink,CoffeeTable)"}
|
||||
{"title":"请你拿一下瓶装饮料到咖啡桌位置。","text":"On(BottledDrink,CoffeeTable)"}
|
||||
{"title":"麻烦你把瓶装饮料放到另一个吧台那个位置。","text":"On(BottledDrink,Bar2)"}
|
||||
{"title":"请你拿一下瓶装饮料到另一个吧台位置。","text":"On(BottledDrink,Bar2)"}
|
||||
{"title":"麻烦你把瓶装饮料放到第一张桌子那个位置。","text":"On(BottledDrink,Table1)"}
|
||||
{"title":"请你拿一下瓶装饮料到第一张桌子位置。","text":"On(BottledDrink,Table1)"}
|
||||
{"title":"麻烦你把瓶装饮料放到第二张桌子那个位置。","text":"On(BottledDrink,Table2)"}
|
||||
{"title":"请你拿一下瓶装饮料到第二张桌子位置。","text":"On(BottledDrink,Table2)"}
|
||||
{"title":"麻烦你把瓶装饮料放到第三张桌子那个位置。","text":"On(BottledDrink,Table3)"}
|
||||
{"title":"请你拿一下瓶装饮料到第三张桌子位置。","text":"On(BottledDrink,Table3)"}
|
||||
{"title":"麻烦你把酸奶放到吧台那个位置。","text":"On(Yogurt,Bar)"}
|
||||
{"title":"请你拿一下酸奶到吧台位置。","text":"On(Yogurt,Bar)"}
|
||||
{"title":"麻烦你把酸奶放到茶水桌那个位置。","text":"On(Yogurt,WaterTable)"}
|
||||
{"title":"请你拿一下酸奶到茶水桌位置。","text":"On(Yogurt,WaterTable)"}
|
||||
{"title":"麻烦你把酸奶放到咖啡桌那个位置。","text":"On(Yogurt,CoffeeTable)"}
|
||||
{"title":"请你拿一下酸奶到咖啡桌位置。","text":"On(Yogurt,CoffeeTable)"}
|
||||
{"title":"麻烦你把酸奶放到另一个吧台那个位置。","text":"On(Yogurt,Bar2)"}
|
||||
{"title":"请你拿一下酸奶到另一个吧台位置。","text":"On(Yogurt,Bar2)"}
|
||||
{"title":"麻烦你把酸奶放到第一张桌子那个位置。","text":"On(Yogurt,Table1)"}
|
||||
{"title":"请你拿一下酸奶到第一张桌子位置。","text":"On(Yogurt,Table1)"}
|
||||
{"title":"麻烦你把酸奶放到第二张桌子那个位置。","text":"On(Yogurt,Table2)"}
|
||||
{"title":"请你拿一下酸奶到第二张桌子位置。","text":"On(Yogurt,Table2)"}
|
||||
{"title":"麻烦你把酸奶放到第三张桌子那个位置。","text":"On(Yogurt,Table3)"}
|
||||
{"title":"请你拿一下酸奶到第三张桌子位置。","text":"On(Yogurt,Table3)"}
|
||||
{"title":"麻烦你把AD钙奶放到吧台那个位置。","text":"On(ADMilk,Bar)"}
|
||||
{"title":"请你拿一下AD钙奶到吧台位置。","text":"On(ADMilk,Bar)"}
|
||||
{"title":"麻烦你把AD钙奶放到茶水桌那个位置。","text":"On(ADMilk,WaterTable)"}
|
||||
{"title":"请你拿一下AD钙奶到茶水桌位置。","text":"On(ADMilk,WaterTable)"}
|
||||
{"title":"麻烦你把AD钙奶放到咖啡桌那个位置。","text":"On(ADMilk,CoffeeTable)"}
|
||||
{"title":"请你拿一下AD钙奶到咖啡桌位置。","text":"On(ADMilk,CoffeeTable)"}
|
||||
{"title":"麻烦你把AD钙奶放到另一个吧台那个位置。","text":"On(ADMilk,Bar2)"}
|
||||
{"title":"请你拿一下AD钙奶到另一个吧台位置。","text":"On(ADMilk,Bar2)"}
|
||||
{"title":"麻烦你把AD钙奶放到第一张桌子那个位置。","text":"On(ADMilk,Table1)"}
|
||||
{"title":"请你拿一下AD钙奶到第一张桌子位置。","text":"On(ADMilk,Table1)"}
|
||||
{"title":"麻烦你把AD钙奶放到第二张桌子那个位置。","text":"On(ADMilk,Table2)"}
|
||||
{"title":"请你拿一下AD钙奶到第二张桌子位置。","text":"On(ADMilk,Table2)"}
|
||||
{"title":"麻烦你把AD钙奶放到第三张桌子那个位置。","text":"On(ADMilk,Table3)"}
|
||||
{"title":"请你拿一下AD钙奶到第三张桌子位置。","text":"On(ADMilk,Table3)"}
|
||||
{"title":"麻烦你把牛奶味的饮料放到吧台那个位置。","text":"On(MilkDrink,Bar)"}
|
||||
{"title":"请你拿一下牛奶味的饮料到吧台位置。","text":"On(MilkDrink,Bar)"}
|
||||
{"title":"麻烦你把牛奶味的饮料放到茶水桌那个位置。","text":"On(MilkDrink,WaterTable)"}
|
||||
{"title":"请你拿一下牛奶味的饮料到茶水桌位置。","text":"On(MilkDrink,WaterTable)"}
|
||||
{"title":"麻烦你把牛奶味的饮料放到咖啡桌那个位置。","text":"On(MilkDrink,CoffeeTable)"}
|
||||
{"title":"请你拿一下牛奶味的饮料到咖啡桌位置。","text":"On(MilkDrink,CoffeeTable)"}
|
||||
{"title":"麻烦你把牛奶味的饮料放到另一个吧台那个位置。","text":"On(MilkDrink,Bar2)"}
|
||||
{"title":"请你拿一下牛奶味的饮料到另一个吧台位置。","text":"On(MilkDrink,Bar2)"}
|
||||
{"title":"麻烦你把牛奶味的饮料放到第一张桌子那个位置。","text":"On(MilkDrink,Table1)"}
|
||||
{"title":"请你拿一下牛奶味的饮料到第一张桌子位置。","text":"On(MilkDrink,Table1)"}
|
||||
{"title":"麻烦你把牛奶味的饮料放到第二张桌子那个位置。","text":"On(MilkDrink,Table2)"}
|
||||
{"title":"请你拿一下牛奶味的饮料到第二张桌子位置。","text":"On(MilkDrink,Table2)"}
|
||||
{"title":"麻烦你把牛奶味的饮料放到第三张桌子那个位置。","text":"On(MilkDrink,Table3)"}
|
||||
{"title":"请你拿一下牛奶味的饮料到第三张桌子位置。","text":"On(MilkDrink,Table3)"}
|
||||
{"title":"麻烦你把牛奶放到吧台那个位置。","text":"On(Milk,Bar)"}
|
||||
{"title":"请你拿一下牛奶到吧台位置。","text":"On(Milk,Bar)"}
|
||||
{"title":"麻烦你把牛奶放到茶水桌那个位置。","text":"On(Milk,WaterTable)"}
|
||||
{"title":"请你拿一下牛奶到茶水桌位置。","text":"On(Milk,WaterTable)"}
|
||||
{"title":"麻烦你把牛奶放到咖啡桌那个位置。","text":"On(Milk,CoffeeTable)"}
|
||||
{"title":"请你拿一下牛奶到咖啡桌位置。","text":"On(Milk,CoffeeTable)"}
|
||||
{"title":"麻烦你把牛奶放到另一个吧台那个位置。","text":"On(Milk,Bar2)"}
|
||||
{"title":"请你拿一下牛奶到另一个吧台位置。","text":"On(Milk,Bar2)"}
|
||||
{"title":"麻烦你把牛奶放到第一张桌子那个位置。","text":"On(Milk,Table1)"}
|
||||
{"title":"请你拿一下牛奶到第一张桌子位置。","text":"On(Milk,Table1)"}
|
||||
{"title":"麻烦你把牛奶放到第二张桌子那个位置。","text":"On(Milk,Table2)"}
|
||||
{"title":"请你拿一下牛奶到第二张桌子位置。","text":"On(Milk,Table2)"}
|
||||
{"title":"麻烦你把牛奶放到第三张桌子那个位置。","text":"On(Milk,Table3)"}
|
||||
{"title":"请你拿一下牛奶到第三张桌子位置。","text":"On(Milk,Table3)"}
|
||||
{"title":"麻烦你把保温杯放到吧台那个位置。","text":"On(VacuumCup,Bar)"}
|
||||
{"title":"请你拿一下保温杯到吧台位置。","text":"On(VacuumCup,Bar)"}
|
||||
{"title":"麻烦你把保温杯放到茶水桌那个位置。","text":"On(VacuumCup,WaterTable)"}
|
||||
{"title":"请你拿一下保温杯到茶水桌位置。","text":"On(VacuumCup,WaterTable)"}
|
||||
{"title":"麻烦你把保温杯放到咖啡桌那个位置。","text":"On(VacuumCup,CoffeeTable)"}
|
||||
{"title":"请你拿一下保温杯到咖啡桌位置。","text":"On(VacuumCup,CoffeeTable)"}
|
||||
{"title":"麻烦你把保温杯放到另一个吧台那个位置。","text":"On(VacuumCup,Bar2)"}
|
||||
{"title":"请你拿一下保温杯到另一个吧台位置。","text":"On(VacuumCup,Bar2)"}
|
||||
{"title":"麻烦你把保温杯放到第一张桌子那个位置。","text":"On(VacuumCup,Table1)"}
|
||||
{"title":"请你拿一下保温杯到第一张桌子位置。","text":"On(VacuumCup,Table1)"}
|
||||
{"title":"麻烦你把保温杯放到第二张桌子那个位置。","text":"On(VacuumCup,Table2)"}
|
||||
{"title":"请你拿一下保温杯到第二张桌子位置。","text":"On(VacuumCup,Table2)"}
|
||||
{"title":"麻烦你把保温杯放到第三张桌子那个位置。","text":"On(VacuumCup,Table3)"}
|
||||
{"title":"请你拿一下保温杯到第三张桌子位置。","text":"On(VacuumCup,Table3)"}
|
||||
{"title":"你能把空调关闭一下吗?","text":"Is(AC,On)"}
|
||||
{"title":"你能把空调打开一下吗?","text":"Is(AC,Off)"}
|
||||
{"title":"你能把空调Temperature调高一下吗?","text":"Is(ACTemperature,On)"}
|
||||
{"title":"你能把空调Temperature调低一下吗?","text":"Is(ACTemperature,Off)"}
|
||||
{"title":"你能把大厅灯关闭一下吗?","text":"Is(HallLight,On)"}
|
||||
{"title":"你能把大厅灯打开一下吗?","text":"Is(HallLight,Off)"}
|
||||
{"title":"你能把筒灯关闭一下吗?","text":"Is(TubeLight,On)"}
|
||||
{"title":"你能把筒灯打开一下吗?","text":"Is(TubeLight,Off)"}
|
||||
{"title":"你能把窗帘关闭一下吗?","text":"Is(Curtain,On)"}
|
||||
{"title":"你能把窗帘打开一下吗?","text":"Is(Curtain,Off)"}
|
||||
{"title":"你能把椅子脏一下吗?","text":"Is(Chairs,On)"}
|
||||
{"title":"你能把椅子打扫干净一下吗?","text":"Is(Chairs,Off)"}
|
||||
{"title":"你能把地板脏一下吗?","text":"Is(Floor,On)"}
|
||||
{"title":"你能把地板打扫干净一下吗?","text":"Is(Floor,Off)"}
|
||||
{"title":"你能把第一张桌子脏一下吗?","text":"Is(Table1,On)"}
|
||||
{"title":"你能把第一张桌子打扫干净一下吗?","text":"Is(Table1,Off)"}
|
||||
{"title":"你能把盒装冰红茶抓在手里吗?","text":"Holding(Softdrink)"}
|
||||
{"title":"你能一直拿着盒装冰红茶吗?","text":"Holding(Softdrink)"}
|
||||
{"title":"你能把瓶装饮料抓在手里吗?","text":"Holding(BottledDrink)"}
|
||||
{"title":"你能一直拿着瓶装饮料吗?","text":"Holding(BottledDrink)"}
|
||||
{"title":"你能把酸奶抓在手里吗?","text":"Holding(Yogurt)"}
|
||||
{"title":"你能一直拿着酸奶吗?","text":"Holding(Yogurt)"}
|
||||
{"title":"你能把AD钙奶抓在手里吗?","text":"Holding(ADMilk)"}
|
||||
{"title":"你能一直拿着AD钙奶吗?","text":"Holding(ADMilk)"}
|
||||
{"title":"你能把牛奶味的饮料抓在手里吗?","text":"Holding(MilkDrink)"}
|
||||
{"title":"你能一直拿着牛奶味的饮料吗?","text":"Holding(MilkDrink)"}
|
||||
{"title":"你能把牛奶抓在手里吗?","text":"Holding(Milk)"}
|
||||
{"title":"你能一直拿着牛奶吗?","text":"Holding(Milk)"}
|
||||
{"title":"你能把保温杯抓在手里吗?","text":"Holding(VacuumCup)"}
|
||||
{"title":"你能一直拿着保温杯吗?","text":"Holding(VacuumCup)"}
|
||||
{"title":"你能把Nothing抓在手里吗?","text":"Holding(Nothing)"}
|
||||
{"title":"你能一直拿着Nothing吗?","text":"Holding(Nothing)"}
|
||||
{"title":"你能制作咖啡并把它端到吧台这里来吗?","text":"On(Coffee,Bar)"}
|
||||
{"title":"给我来点咖啡,并把它端到吧台这里来。","text":"On(Coffee,Bar)"}
|
||||
{"title":"你能制作咖啡并把它端到茶水桌这里来吗?","text":"On(Coffee,WaterTable)"}
|
||||
{"title":"给我来点咖啡,并把它端到茶水桌这里来。","text":"On(Coffee,WaterTable)"}
|
||||
{"title":"你能制作咖啡并把它端到咖啡桌这里来吗?","text":"On(Coffee,CoffeeTable)"}
|
||||
{"title":"给我来点咖啡,并把它端到咖啡桌这里来。","text":"On(Coffee,CoffeeTable)"}
|
||||
{"title":"你能制作咖啡并把它端到另一个吧台这里来吗?","text":"On(Coffee,Bar2)"}
|
||||
{"title":"给我来点咖啡,并把它端到另一个吧台这里来。","text":"On(Coffee,Bar2)"}
|
||||
{"title":"你能制作咖啡并把它端到第一张桌子这里来吗?","text":"On(Coffee,Table1)"}
|
||||
{"title":"给我来点咖啡,并把它端到第一张桌子这里来。","text":"On(Coffee,Table1)"}
|
||||
{"title":"你能制作咖啡并把它端到第二张桌子这里来吗?","text":"On(Coffee,Table2)"}
|
||||
{"title":"给我来点咖啡,并把它端到第二张桌子这里来。","text":"On(Coffee,Table2)"}
|
||||
{"title":"你能制作咖啡并把它端到第三张桌子这里来吗?","text":"On(Coffee,Table3)"}
|
||||
{"title":"给我来点咖啡,并把它端到第三张桌子这里来。","text":"On(Coffee,Table3)"}
|
||||
{"title":"你能制作水并把它端到吧台这里来吗?","text":"On(Water,Bar)"}
|
||||
{"title":"给我来点水,并把它端到吧台这里来。","text":"On(Water,Bar)"}
|
||||
{"title":"你能制作水并把它端到茶水桌这里来吗?","text":"On(Water,WaterTable)"}
|
||||
{"title":"给我来点水,并把它端到茶水桌这里来。","text":"On(Water,WaterTable)"}
|
||||
{"title":"你能制作水并把它端到咖啡桌这里来吗?","text":"On(Water,CoffeeTable)"}
|
||||
{"title":"给我来点水,并把它端到咖啡桌这里来。","text":"On(Water,CoffeeTable)"}
|
||||
{"title":"你能制作水并把它端到另一个吧台这里来吗?","text":"On(Water,Bar2)"}
|
||||
{"title":"给我来点水,并把它端到另一个吧台这里来。","text":"On(Water,Bar2)"}
|
||||
{"title":"你能制作水并把它端到第一张桌子这里来吗?","text":"On(Water,Table1)"}
|
||||
{"title":"给我来点水,并把它端到第一张桌子这里来。","text":"On(Water,Table1)"}
|
||||
{"title":"你能制作水并把它端到第二张桌子这里来吗?","text":"On(Water,Table2)"}
|
||||
{"title":"给我来点水,并把它端到第二张桌子这里来。","text":"On(Water,Table2)"}
|
||||
{"title":"你能制作水并把它端到第三张桌子这里来吗?","text":"On(Water,Table3)"}
|
||||
{"title":"给我来点水,并把它端到第三张桌子这里来。","text":"On(Water,Table3)"}
|
||||
{"title":"你能制作点心或者甜品并把它端到吧台这里来吗?","text":"On(Dessert,Bar)"}
|
||||
{"title":"给我来点点心或者甜品,并把它端到吧台这里来。","text":"On(Dessert,Bar)"}
|
||||
{"title":"你能制作点心或者甜品并把它端到茶水桌这里来吗?","text":"On(Dessert,WaterTable)"}
|
||||
{"title":"给我来点点心或者甜品,并把它端到茶水桌这里来。","text":"On(Dessert,WaterTable)"}
|
||||
{"title":"你能制作点心或者甜品并把它端到咖啡桌这里来吗?","text":"On(Dessert,CoffeeTable)"}
|
||||
{"title":"给我来点点心或者甜品,并把它端到咖啡桌这里来。","text":"On(Dessert,CoffeeTable)"}
|
||||
{"title":"你能制作点心或者甜品并把它端到另一个吧台这里来吗?","text":"On(Dessert,Bar2)"}
|
||||
{"title":"给我来点点心或者甜品,并把它端到另一个吧台这里来。","text":"On(Dessert,Bar2)"}
|
||||
{"title":"你能制作点心或者甜品并把它端到第一张桌子这里来吗?","text":"On(Dessert,Table1)"}
|
||||
{"title":"给我来点点心或者甜品,并把它端到第一张桌子这里来。","text":"On(Dessert,Table1)"}
|
||||
{"title":"你能制作点心或者甜品并把它端到第二张桌子这里来吗?","text":"On(Dessert,Table2)"}
|
||||
{"title":"给我来点点心或者甜品,并把它端到第二张桌子这里来。","text":"On(Dessert,Table2)"}
|
||||
{"title":"你能制作点心或者甜品并把它端到第三张桌子这里来吗?","text":"On(Dessert,Table3)"}
|
||||
{"title":"给我来点点心或者甜品,并把它端到第三张桌子这里来。","text":"On(Dessert,Table3)"}
|
|
@ -0,0 +1,454 @@
|
|||
At(Robot,Bar) 你能过来一下吗?我在吧台这里。
|
||||
At(Robot,Bar) 麻烦你去一下吧台。
|
||||
At(Robot,Bar) 你能去吧台那个位置吗?
|
||||
At(Robot,Bar2) 你能过来一下吗?我在另一侧的吧台这里。
|
||||
At(Robot,Bar2) 麻烦你去一下另一侧的吧台。
|
||||
At(Robot,Bar2) 你能去另一侧的吧台那个位置吗?
|
||||
At(Robot,WaterTable) 你能过来一下吗?我在茶水桌这里。
|
||||
At(Robot,WaterTable) 麻烦你去一下茶水桌。
|
||||
At(Robot,WaterTable) 你能去茶水桌那个位置吗?
|
||||
At(Robot,CoffeeTable) 你能过来一下吗?我在咖啡桌这里。
|
||||
At(Robot,CoffeeTable) 麻烦你去一下咖啡桌。
|
||||
At(Robot,CoffeeTable) 你能去咖啡桌那个位置吗?
|
||||
At(Robot,Table1) 你能过来一下吗?我在前门斜桌子这里。
|
||||
At(Robot,Table1) 麻烦你去一下前门斜桌子。
|
||||
At(Robot,Table1) 你能去前门斜桌子那个位置吗?
|
||||
At(Robot,Table2) 你能过来一下吗?我在大厅长桌子西侧这里。
|
||||
At(Robot,Table2) 麻烦你去一下大厅长桌子西侧。
|
||||
At(Robot,Table2) 你能去大厅长桌子西侧那个位置吗?
|
||||
At(Robot,Table3) 你能过来一下吗?我在大厅长桌子东侧这里。
|
||||
At(Robot,Table3) 麻烦你去一下大厅长桌子东侧。
|
||||
At(Robot,Table3) 你能去大厅长桌子东侧那个位置吗?
|
||||
At(Robot,BrightTable6) 你能过来一下吗?我在后门靠窗边圆桌这里。
|
||||
At(Robot,BrightTable6) 麻烦你去一下后门靠窗边圆桌。
|
||||
At(Robot,BrightTable6) 你能去后门靠窗边圆桌那个位置吗?
|
||||
On(Coffee,Bar) 麻烦你把咖啡放到吧台那个位置。
|
||||
On(Coffee,Bar) 请你拿一下咖啡到吧台位置。
|
||||
On(Coffee,Bar) 你好,我在吧台,请你拿一下咖啡到位置。
|
||||
On(Coffee,Bar2) 麻烦你把咖啡放到另一侧的吧台那个位置。
|
||||
On(Coffee,Bar2) 请你拿一下咖啡到另一侧的吧台位置。
|
||||
On(Coffee,Bar2) 你好,我在另一侧的吧台,请你拿一下咖啡到位置。
|
||||
On(Coffee,WaterTable) 麻烦你把咖啡放到茶水桌那个位置。
|
||||
On(Coffee,WaterTable) 请你拿一下咖啡到茶水桌位置。
|
||||
On(Coffee,WaterTable) 你好,我在茶水桌,请你拿一下咖啡到位置。
|
||||
On(Coffee,CoffeeTable) 麻烦你把咖啡放到咖啡桌那个位置。
|
||||
On(Coffee,CoffeeTable) 请你拿一下咖啡到咖啡桌位置。
|
||||
On(Coffee,CoffeeTable) 你好,我在咖啡桌,请你拿一下咖啡到位置。
|
||||
On(Coffee,Table1) 麻烦你把咖啡放到前门斜桌子那个位置。
|
||||
On(Coffee,Table1) 请你拿一下咖啡到前门斜桌子位置。
|
||||
On(Coffee,Table1) 你好,我在前门斜桌子,请你拿一下咖啡到位置。
|
||||
On(Coffee,Table2) 麻烦你把咖啡放到大厅长桌子西侧那个位置。
|
||||
On(Coffee,Table2) 请你拿一下咖啡到大厅长桌子西侧位置。
|
||||
On(Coffee,Table2) 你好,我在大厅长桌子西侧,请你拿一下咖啡到位置。
|
||||
On(Coffee,Table3) 麻烦你把咖啡放到大厅长桌子东侧那个位置。
|
||||
On(Coffee,Table3) 请你拿一下咖啡到大厅长桌子东侧位置。
|
||||
On(Coffee,Table3) 你好,我在大厅长桌子东侧,请你拿一下咖啡到位置。
|
||||
On(Coffee,BrightTable6) 麻烦你把咖啡放到后门靠窗边圆桌那个位置。
|
||||
On(Coffee,BrightTable6) 请你拿一下咖啡到后门靠窗边圆桌位置。
|
||||
On(Coffee,BrightTable6) 你好,我在后门靠窗边圆桌,请你拿一下咖啡到位置。
|
||||
On(Water,Bar) 麻烦你把水放到吧台那个位置。
|
||||
On(Water,Bar) 请你拿一下水到吧台位置。
|
||||
On(Water,Bar) 你好,我在吧台,请你拿一下水到位置。
|
||||
On(Water,Bar2) 麻烦你把水放到另一侧的吧台那个位置。
|
||||
On(Water,Bar2) 请你拿一下水到另一侧的吧台位置。
|
||||
On(Water,Bar2) 你好,我在另一侧的吧台,请你拿一下水到位置。
|
||||
On(Water,WaterTable) 麻烦你把水放到茶水桌那个位置。
|
||||
On(Water,WaterTable) 请你拿一下水到茶水桌位置。
|
||||
On(Water,WaterTable) 你好,我在茶水桌,请你拿一下水到位置。
|
||||
On(Water,CoffeeTable) 麻烦你把水放到咖啡桌那个位置。
|
||||
On(Water,CoffeeTable) 请你拿一下水到咖啡桌位置。
|
||||
On(Water,CoffeeTable) 你好,我在咖啡桌,请你拿一下水到位置。
|
||||
On(Water,Table1) 麻烦你把水放到前门斜桌子那个位置。
|
||||
On(Water,Table1) 请你拿一下水到前门斜桌子位置。
|
||||
On(Water,Table1) 你好,我在前门斜桌子,请你拿一下水到位置。
|
||||
On(Water,Table2) 麻烦你把水放到大厅长桌子西侧那个位置。
|
||||
On(Water,Table2) 请你拿一下水到大厅长桌子西侧位置。
|
||||
On(Water,Table2) 你好,我在大厅长桌子西侧,请你拿一下水到位置。
|
||||
On(Water,Table3) 麻烦你把水放到大厅长桌子东侧那个位置。
|
||||
On(Water,Table3) 请你拿一下水到大厅长桌子东侧位置。
|
||||
On(Water,Table3) 你好,我在大厅长桌子东侧,请你拿一下水到位置。
|
||||
On(Water,BrightTable6) 麻烦你把水放到后门靠窗边圆桌那个位置。
|
||||
On(Water,BrightTable6) 请你拿一下水到后门靠窗边圆桌位置。
|
||||
On(Water,BrightTable6) 你好,我在后门靠窗边圆桌,请你拿一下水到位置。
|
||||
On(Dessert,Bar) 麻烦你把点心放到吧台那个位置。
|
||||
On(Dessert,Bar) 请你拿一下点心到吧台位置。
|
||||
On(Dessert,Bar) 你好,我在吧台,请你拿一下点心到位置。
|
||||
On(Dessert,Bar2) 麻烦你把点心放到另一侧的吧台那个位置。
|
||||
On(Dessert,Bar2) 请你拿一下点心到另一侧的吧台位置。
|
||||
On(Dessert,Bar2) 你好,我在另一侧的吧台,请你拿一下点心到位置。
|
||||
On(Dessert,WaterTable) 麻烦你把点心放到茶水桌那个位置。
|
||||
On(Dessert,WaterTable) 请你拿一下点心到茶水桌位置。
|
||||
On(Dessert,WaterTable) 你好,我在茶水桌,请你拿一下点心到位置。
|
||||
On(Dessert,CoffeeTable) 麻烦你把点心放到咖啡桌那个位置。
|
||||
On(Dessert,CoffeeTable) 请你拿一下点心到咖啡桌位置。
|
||||
On(Dessert,CoffeeTable) 你好,我在咖啡桌,请你拿一下点心到位置。
|
||||
On(Dessert,Table1) 麻烦你把点心放到前门斜桌子那个位置。
|
||||
On(Dessert,Table1) 请你拿一下点心到前门斜桌子位置。
|
||||
On(Dessert,Table1) 你好,我在前门斜桌子,请你拿一下点心到位置。
|
||||
On(Dessert,Table2) 麻烦你把点心放到大厅长桌子西侧那个位置。
|
||||
On(Dessert,Table2) 请你拿一下点心到大厅长桌子西侧位置。
|
||||
On(Dessert,Table2) 你好,我在大厅长桌子西侧,请你拿一下点心到位置。
|
||||
On(Dessert,Table3) 麻烦你把点心放到大厅长桌子东侧那个位置。
|
||||
On(Dessert,Table3) 请你拿一下点心到大厅长桌子东侧位置。
|
||||
On(Dessert,Table3) 你好,我在大厅长桌子东侧,请你拿一下点心到位置。
|
||||
On(Dessert,BrightTable6) 麻烦你把点心放到后门靠窗边圆桌那个位置。
|
||||
On(Dessert,BrightTable6) 请你拿一下点心到后门靠窗边圆桌位置。
|
||||
On(Dessert,BrightTable6) 你好,我在后门靠窗边圆桌,请你拿一下点心到位置。
|
||||
On(Softdrink,Bar) 麻烦你把盒装冰红茶放到吧台那个位置。
|
||||
On(Softdrink,Bar) 请你拿一下盒装冰红茶到吧台位置。
|
||||
On(Softdrink,Bar) 你好,我在吧台,请你拿一下盒装冰红茶到位置。
|
||||
On(Softdrink,Bar2) 麻烦你把盒装冰红茶放到另一侧的吧台那个位置。
|
||||
On(Softdrink,Bar2) 请你拿一下盒装冰红茶到另一侧的吧台位置。
|
||||
On(Softdrink,Bar2) 你好,我在另一侧的吧台,请你拿一下盒装冰红茶到位置。
|
||||
On(Softdrink,WaterTable) 麻烦你把盒装冰红茶放到茶水桌那个位置。
|
||||
On(Softdrink,WaterTable) 请你拿一下盒装冰红茶到茶水桌位置。
|
||||
On(Softdrink,WaterTable) 你好,我在茶水桌,请你拿一下盒装冰红茶到位置。
|
||||
On(Softdrink,CoffeeTable) 麻烦你把盒装冰红茶放到咖啡桌那个位置。
|
||||
On(Softdrink,CoffeeTable) 请你拿一下盒装冰红茶到咖啡桌位置。
|
||||
On(Softdrink,CoffeeTable) 你好,我在咖啡桌,请你拿一下盒装冰红茶到位置。
|
||||
On(Softdrink,Table1) 麻烦你把盒装冰红茶放到前门斜桌子那个位置。
|
||||
On(Softdrink,Table1) 请你拿一下盒装冰红茶到前门斜桌子位置。
|
||||
On(Softdrink,Table1) 你好,我在前门斜桌子,请你拿一下盒装冰红茶到位置。
|
||||
On(Softdrink,Table2) 麻烦你把盒装冰红茶放到大厅长桌子西侧那个位置。
|
||||
On(Softdrink,Table2) 请你拿一下盒装冰红茶到大厅长桌子西侧位置。
|
||||
On(Softdrink,Table2) 你好,我在大厅长桌子西侧,请你拿一下盒装冰红茶到位置。
|
||||
On(Softdrink,Table3) 麻烦你把盒装冰红茶放到大厅长桌子东侧那个位置。
|
||||
On(Softdrink,Table3) 请你拿一下盒装冰红茶到大厅长桌子东侧位置。
|
||||
On(Softdrink,Table3) 你好,我在大厅长桌子东侧,请你拿一下盒装冰红茶到位置。
|
||||
On(Softdrink,BrightTable6) 麻烦你把盒装冰红茶放到后门靠窗边圆桌那个位置。
|
||||
On(Softdrink,BrightTable6) 请你拿一下盒装冰红茶到后门靠窗边圆桌位置。
|
||||
On(Softdrink,BrightTable6) 你好,我在后门靠窗边圆桌,请你拿一下盒装冰红茶到位置。
|
||||
On(BottledDrink,Bar) 麻烦你把瓶装饮料放到吧台那个位置。
|
||||
On(BottledDrink,Bar) 请你拿一下瓶装饮料到吧台位置。
|
||||
On(BottledDrink,Bar) 你好,我在吧台,请你拿一下瓶装饮料到位置。
|
||||
On(BottledDrink,Bar2) 麻烦你把瓶装饮料放到另一侧的吧台那个位置。
|
||||
On(BottledDrink,Bar2) 请你拿一下瓶装饮料到另一侧的吧台位置。
|
||||
On(BottledDrink,Bar2) 你好,我在另一侧的吧台,请你拿一下瓶装饮料到位置。
|
||||
On(BottledDrink,WaterTable) 麻烦你把瓶装饮料放到茶水桌那个位置。
|
||||
On(BottledDrink,WaterTable) 请你拿一下瓶装饮料到茶水桌位置。
|
||||
On(BottledDrink,WaterTable) 你好,我在茶水桌,请你拿一下瓶装饮料到位置。
|
||||
On(BottledDrink,CoffeeTable) 麻烦你把瓶装饮料放到咖啡桌那个位置。
|
||||
On(BottledDrink,CoffeeTable) 请你拿一下瓶装饮料到咖啡桌位置。
|
||||
On(BottledDrink,CoffeeTable) 你好,我在咖啡桌,请你拿一下瓶装饮料到位置。
|
||||
On(BottledDrink,Table1) 麻烦你把瓶装饮料放到前门斜桌子那个位置。
|
||||
On(BottledDrink,Table1) 请你拿一下瓶装饮料到前门斜桌子位置。
|
||||
On(BottledDrink,Table1) 你好,我在前门斜桌子,请你拿一下瓶装饮料到位置。
|
||||
On(BottledDrink,Table2) 麻烦你把瓶装饮料放到大厅长桌子西侧那个位置。
|
||||
On(BottledDrink,Table2) 请你拿一下瓶装饮料到大厅长桌子西侧位置。
|
||||
On(BottledDrink,Table2) 你好,我在大厅长桌子西侧,请你拿一下瓶装饮料到位置。
|
||||
On(BottledDrink,Table3) 麻烦你把瓶装饮料放到大厅长桌子东侧那个位置。
|
||||
On(BottledDrink,Table3) 请你拿一下瓶装饮料到大厅长桌子东侧位置。
|
||||
On(BottledDrink,Table3) 你好,我在大厅长桌子东侧,请你拿一下瓶装饮料到位置。
|
||||
On(BottledDrink,BrightTable6) 麻烦你把瓶装饮料放到后门靠窗边圆桌那个位置。
|
||||
On(BottledDrink,BrightTable6) 请你拿一下瓶装饮料到后门靠窗边圆桌位置。
|
||||
On(BottledDrink,BrightTable6) 你好,我在后门靠窗边圆桌,请你拿一下瓶装饮料到位置。
|
||||
On(Yogurt,Bar) 麻烦你把酸奶放到吧台那个位置。
|
||||
On(Yogurt,Bar) 请你拿一下酸奶到吧台位置。
|
||||
On(Yogurt,Bar) 你好,我在吧台,请你拿一下酸奶到位置。
|
||||
On(Yogurt,Bar2) 麻烦你把酸奶放到另一侧的吧台那个位置。
|
||||
On(Yogurt,Bar2) 请你拿一下酸奶到另一侧的吧台位置。
|
||||
On(Yogurt,Bar2) 你好,我在另一侧的吧台,请你拿一下酸奶到位置。
|
||||
On(Yogurt,WaterTable) 麻烦你把酸奶放到茶水桌那个位置。
|
||||
On(Yogurt,WaterTable) 请你拿一下酸奶到茶水桌位置。
|
||||
On(Yogurt,WaterTable) 你好,我在茶水桌,请你拿一下酸奶到位置。
|
||||
On(Yogurt,CoffeeTable) 麻烦你把酸奶放到咖啡桌那个位置。
|
||||
On(Yogurt,CoffeeTable) 请你拿一下酸奶到咖啡桌位置。
|
||||
On(Yogurt,CoffeeTable) 你好,我在咖啡桌,请你拿一下酸奶到位置。
|
||||
On(Yogurt,Table1) 麻烦你把酸奶放到前门斜桌子那个位置。
|
||||
On(Yogurt,Table1) 请你拿一下酸奶到前门斜桌子位置。
|
||||
On(Yogurt,Table1) 你好,我在前门斜桌子,请你拿一下酸奶到位置。
|
||||
On(Yogurt,Table2) 麻烦你把酸奶放到大厅长桌子西侧那个位置。
|
||||
On(Yogurt,Table2) 请你拿一下酸奶到大厅长桌子西侧位置。
|
||||
On(Yogurt,Table2) 你好,我在大厅长桌子西侧,请你拿一下酸奶到位置。
|
||||
On(Yogurt,Table3) 麻烦你把酸奶放到大厅长桌子东侧那个位置。
|
||||
On(Yogurt,Table3) 请你拿一下酸奶到大厅长桌子东侧位置。
|
||||
On(Yogurt,Table3) 你好,我在大厅长桌子东侧,请你拿一下酸奶到位置。
|
||||
On(Yogurt,BrightTable6) 麻烦你把酸奶放到后门靠窗边圆桌那个位置。
|
||||
On(Yogurt,BrightTable6) 请你拿一下酸奶到后门靠窗边圆桌位置。
|
||||
On(Yogurt,BrightTable6) 你好,我在后门靠窗边圆桌,请你拿一下酸奶到位置。
|
||||
On(ADMilk,Bar) 麻烦你把AD钙奶放到吧台那个位置。
|
||||
On(ADMilk,Bar) 请你拿一下AD钙奶到吧台位置。
|
||||
On(ADMilk,Bar) 你好,我在吧台,请你拿一下AD钙奶到位置。
|
||||
On(ADMilk,Bar2) 麻烦你把AD钙奶放到另一侧的吧台那个位置。
|
||||
On(ADMilk,Bar2) 请你拿一下AD钙奶到另一侧的吧台位置。
|
||||
On(ADMilk,Bar2) 你好,我在另一侧的吧台,请你拿一下AD钙奶到位置。
|
||||
On(ADMilk,WaterTable) 麻烦你把AD钙奶放到茶水桌那个位置。
|
||||
On(ADMilk,WaterTable) 请你拿一下AD钙奶到茶水桌位置。
|
||||
On(ADMilk,WaterTable) 你好,我在茶水桌,请你拿一下AD钙奶到位置。
|
||||
On(ADMilk,CoffeeTable) 麻烦你把AD钙奶放到咖啡桌那个位置。
|
||||
On(ADMilk,CoffeeTable) 请你拿一下AD钙奶到咖啡桌位置。
|
||||
On(ADMilk,CoffeeTable) 你好,我在咖啡桌,请你拿一下AD钙奶到位置。
|
||||
On(ADMilk,Table1) 麻烦你把AD钙奶放到前门斜桌子那个位置。
|
||||
On(ADMilk,Table1) 请你拿一下AD钙奶到前门斜桌子位置。
|
||||
On(ADMilk,Table1) 你好,我在前门斜桌子,请你拿一下AD钙奶到位置。
|
||||
On(ADMilk,Table2) 麻烦你把AD钙奶放到大厅长桌子西侧那个位置。
|
||||
On(ADMilk,Table2) 请你拿一下AD钙奶到大厅长桌子西侧位置。
|
||||
On(ADMilk,Table2) 你好,我在大厅长桌子西侧,请你拿一下AD钙奶到位置。
|
||||
On(ADMilk,Table3) 麻烦你把AD钙奶放到大厅长桌子东侧那个位置。
|
||||
On(ADMilk,Table3) 请你拿一下AD钙奶到大厅长桌子东侧位置。
|
||||
On(ADMilk,Table3) 你好,我在大厅长桌子东侧,请你拿一下AD钙奶到位置。
|
||||
On(ADMilk,BrightTable6) 麻烦你把AD钙奶放到后门靠窗边圆桌那个位置。
|
||||
On(ADMilk,BrightTable6) 请你拿一下AD钙奶到后门靠窗边圆桌位置。
|
||||
On(ADMilk,BrightTable6) 你好,我在后门靠窗边圆桌,请你拿一下AD钙奶到位置。
|
||||
On(MilkDrink,Bar) 麻烦你把牛奶味的饮料放到吧台那个位置。
|
||||
On(MilkDrink,Bar) 请你拿一下牛奶味的饮料到吧台位置。
|
||||
On(MilkDrink,Bar) 你好,我在吧台,请你拿一下牛奶味的饮料到位置。
|
||||
On(MilkDrink,Bar2) 麻烦你把牛奶味的饮料放到另一侧的吧台那个位置。
|
||||
On(MilkDrink,Bar2) 请你拿一下牛奶味的饮料到另一侧的吧台位置。
|
||||
On(MilkDrink,Bar2) 你好,我在另一侧的吧台,请你拿一下牛奶味的饮料到位置。
|
||||
On(MilkDrink,WaterTable) 麻烦你把牛奶味的饮料放到茶水桌那个位置。
|
||||
On(MilkDrink,WaterTable) 请你拿一下牛奶味的饮料到茶水桌位置。
|
||||
On(MilkDrink,WaterTable) 你好,我在茶水桌,请你拿一下牛奶味的饮料到位置。
|
||||
On(MilkDrink,CoffeeTable) 麻烦你把牛奶味的饮料放到咖啡桌那个位置。
|
||||
On(MilkDrink,CoffeeTable) 请你拿一下牛奶味的饮料到咖啡桌位置。
|
||||
On(MilkDrink,CoffeeTable) 你好,我在咖啡桌,请你拿一下牛奶味的饮料到位置。
|
||||
On(MilkDrink,Table1) 麻烦你把牛奶味的饮料放到前门斜桌子那个位置。
|
||||
On(MilkDrink,Table1) 请你拿一下牛奶味的饮料到前门斜桌子位置。
|
||||
On(MilkDrink,Table1) 你好,我在前门斜桌子,请你拿一下牛奶味的饮料到位置。
|
||||
On(MilkDrink,Table2) 麻烦你把牛奶味的饮料放到大厅长桌子西侧那个位置。
|
||||
On(MilkDrink,Table2) 请你拿一下牛奶味的饮料到大厅长桌子西侧位置。
|
||||
On(MilkDrink,Table2) 你好,我在大厅长桌子西侧,请你拿一下牛奶味的饮料到位置。
|
||||
On(MilkDrink,Table3) 麻烦你把牛奶味的饮料放到大厅长桌子东侧那个位置。
|
||||
On(MilkDrink,Table3) 请你拿一下牛奶味的饮料到大厅长桌子东侧位置。
|
||||
On(MilkDrink,Table3) 你好,我在大厅长桌子东侧,请你拿一下牛奶味的饮料到位置。
|
||||
On(MilkDrink,BrightTable6) 麻烦你把牛奶味的饮料放到后门靠窗边圆桌那个位置。
|
||||
On(MilkDrink,BrightTable6) 请你拿一下牛奶味的饮料到后门靠窗边圆桌位置。
|
||||
On(MilkDrink,BrightTable6) 你好,我在后门靠窗边圆桌,请你拿一下牛奶味的饮料到位置。
|
||||
On(Milk,Bar) 麻烦你把牛奶放到吧台那个位置。
|
||||
On(Milk,Bar) 请你拿一下牛奶到吧台位置。
|
||||
On(Milk,Bar) 你好,我在吧台,请你拿一下牛奶到位置。
|
||||
On(Milk,Bar2) 麻烦你把牛奶放到另一侧的吧台那个位置。
|
||||
On(Milk,Bar2) 请你拿一下牛奶到另一侧的吧台位置。
|
||||
On(Milk,Bar2) 你好,我在另一侧的吧台,请你拿一下牛奶到位置。
|
||||
On(Milk,WaterTable) 麻烦你把牛奶放到茶水桌那个位置。
|
||||
On(Milk,WaterTable) 请你拿一下牛奶到茶水桌位置。
|
||||
On(Milk,WaterTable) 你好,我在茶水桌,请你拿一下牛奶到位置。
|
||||
On(Milk,CoffeeTable) 麻烦你把牛奶放到咖啡桌那个位置。
|
||||
On(Milk,CoffeeTable) 请你拿一下牛奶到咖啡桌位置。
|
||||
On(Milk,CoffeeTable) 你好,我在咖啡桌,请你拿一下牛奶到位置。
|
||||
On(Milk,Table1) 麻烦你把牛奶放到前门斜桌子那个位置。
|
||||
On(Milk,Table1) 请你拿一下牛奶到前门斜桌子位置。
|
||||
On(Milk,Table1) 你好,我在前门斜桌子,请你拿一下牛奶到位置。
|
||||
On(Milk,Table2) 麻烦你把牛奶放到大厅长桌子西侧那个位置。
|
||||
On(Milk,Table2) 请你拿一下牛奶到大厅长桌子西侧位置。
|
||||
On(Milk,Table2) 你好,我在大厅长桌子西侧,请你拿一下牛奶到位置。
|
||||
On(Milk,Table3) 麻烦你把牛奶放到大厅长桌子东侧那个位置。
|
||||
On(Milk,Table3) 请你拿一下牛奶到大厅长桌子东侧位置。
|
||||
On(Milk,Table3) 你好,我在大厅长桌子东侧,请你拿一下牛奶到位置。
|
||||
On(Milk,BrightTable6) 麻烦你把牛奶放到后门靠窗边圆桌那个位置。
|
||||
On(Milk,BrightTable6) 请你拿一下牛奶到后门靠窗边圆桌位置。
|
||||
On(Milk,BrightTable6) 你好,我在后门靠窗边圆桌,请你拿一下牛奶到位置。
|
||||
On(VacuumCup,Bar) 麻烦你把保温杯放到吧台那个位置。
|
||||
On(VacuumCup,Bar) 请你拿一下保温杯到吧台位置。
|
||||
On(VacuumCup,Bar) 你好,我在吧台,请你拿一下保温杯到位置。
|
||||
On(VacuumCup,Bar2) 麻烦你把保温杯放到另一侧的吧台那个位置。
|
||||
On(VacuumCup,Bar2) 请你拿一下保温杯到另一侧的吧台位置。
|
||||
On(VacuumCup,Bar2) 你好,我在另一侧的吧台,请你拿一下保温杯到位置。
|
||||
On(VacuumCup,WaterTable) 麻烦你把保温杯放到茶水桌那个位置。
|
||||
On(VacuumCup,WaterTable) 请你拿一下保温杯到茶水桌位置。
|
||||
On(VacuumCup,WaterTable) 你好,我在茶水桌,请你拿一下保温杯到位置。
|
||||
On(VacuumCup,CoffeeTable) 麻烦你把保温杯放到咖啡桌那个位置。
|
||||
On(VacuumCup,CoffeeTable) 请你拿一下保温杯到咖啡桌位置。
|
||||
On(VacuumCup,CoffeeTable) 你好,我在咖啡桌,请你拿一下保温杯到位置。
|
||||
On(VacuumCup,Table1) 麻烦你把保温杯放到前门斜桌子那个位置。
|
||||
On(VacuumCup,Table1) 请你拿一下保温杯到前门斜桌子位置。
|
||||
On(VacuumCup,Table1) 你好,我在前门斜桌子,请你拿一下保温杯到位置。
|
||||
On(VacuumCup,Table2) 麻烦你把保温杯放到大厅长桌子西侧那个位置。
|
||||
On(VacuumCup,Table2) 请你拿一下保温杯到大厅长桌子西侧位置。
|
||||
On(VacuumCup,Table2) 你好,我在大厅长桌子西侧,请你拿一下保温杯到位置。
|
||||
On(VacuumCup,Table3) 麻烦你把保温杯放到大厅长桌子东侧那个位置。
|
||||
On(VacuumCup,Table3) 请你拿一下保温杯到大厅长桌子东侧位置。
|
||||
On(VacuumCup,Table3) 你好,我在大厅长桌子东侧,请你拿一下保温杯到位置。
|
||||
On(VacuumCup,BrightTable6) 麻烦你把保温杯放到后门靠窗边圆桌那个位置。
|
||||
On(VacuumCup,BrightTable6) 请你拿一下保温杯到后门靠窗边圆桌位置。
|
||||
On(VacuumCup,BrightTable6) 你好,我在后门靠窗边圆桌,请你拿一下保温杯到位置。
|
||||
On(Chips,Bar) 麻烦你把薯片放到吧台那个位置。
|
||||
On(Chips,Bar) 请你拿一下薯片到吧台位置。
|
||||
On(Chips,Bar) 你好,我在吧台,请你拿一下薯片到位置。
|
||||
On(Chips,Bar2) 麻烦你把薯片放到另一侧的吧台那个位置。
|
||||
On(Chips,Bar2) 请你拿一下薯片到另一侧的吧台位置。
|
||||
On(Chips,Bar2) 你好,我在另一侧的吧台,请你拿一下薯片到位置。
|
||||
On(Chips,WaterTable) 麻烦你把薯片放到茶水桌那个位置。
|
||||
On(Chips,WaterTable) 请你拿一下薯片到茶水桌位置。
|
||||
On(Chips,WaterTable) 你好,我在茶水桌,请你拿一下薯片到位置。
|
||||
On(Chips,CoffeeTable) 麻烦你把薯片放到咖啡桌那个位置。
|
||||
On(Chips,CoffeeTable) 请你拿一下薯片到咖啡桌位置。
|
||||
On(Chips,CoffeeTable) 你好,我在咖啡桌,请你拿一下薯片到位置。
|
||||
On(Chips,Table1) 麻烦你把薯片放到前门斜桌子那个位置。
|
||||
On(Chips,Table1) 请你拿一下薯片到前门斜桌子位置。
|
||||
On(Chips,Table1) 你好,我在前门斜桌子,请你拿一下薯片到位置。
|
||||
On(Chips,Table2) 麻烦你把薯片放到大厅长桌子西侧那个位置。
|
||||
On(Chips,Table2) 请你拿一下薯片到大厅长桌子西侧位置。
|
||||
On(Chips,Table2) 你好,我在大厅长桌子西侧,请你拿一下薯片到位置。
|
||||
On(Chips,Table3) 麻烦你把薯片放到大厅长桌子东侧那个位置。
|
||||
On(Chips,Table3) 请你拿一下薯片到大厅长桌子东侧位置。
|
||||
On(Chips,Table3) 你好,我在大厅长桌子东侧,请你拿一下薯片到位置。
|
||||
On(Chips,BrightTable6) 麻烦你把薯片放到后门靠窗边圆桌那个位置。
|
||||
On(Chips,BrightTable6) 请你拿一下薯片到后门靠窗边圆桌位置。
|
||||
On(Chips,BrightTable6) 你好,我在后门靠窗边圆桌,请你拿一下薯片到位置。
|
||||
On(NFCJuice,Bar) 麻烦你把NFC果汁放到吧台那个位置。
|
||||
On(NFCJuice,Bar) 请你拿一下NFC果汁到吧台位置。
|
||||
On(NFCJuice,Bar) 你好,我在吧台,请你拿一下NFC果汁到位置。
|
||||
On(NFCJuice,Bar2) 麻烦你把NFC果汁放到另一侧的吧台那个位置。
|
||||
On(NFCJuice,Bar2) 请你拿一下NFC果汁到另一侧的吧台位置。
|
||||
On(NFCJuice,Bar2) 你好,我在另一侧的吧台,请你拿一下NFC果汁到位置。
|
||||
On(NFCJuice,WaterTable) 麻烦你把NFC果汁放到茶水桌那个位置。
|
||||
On(NFCJuice,WaterTable) 请你拿一下NFC果汁到茶水桌位置。
|
||||
On(NFCJuice,WaterTable) 你好,我在茶水桌,请你拿一下NFC果汁到位置。
|
||||
On(NFCJuice,CoffeeTable) 麻烦你把NFC果汁放到咖啡桌那个位置。
|
||||
On(NFCJuice,CoffeeTable) 请你拿一下NFC果汁到咖啡桌位置。
|
||||
On(NFCJuice,CoffeeTable) 你好,我在咖啡桌,请你拿一下NFC果汁到位置。
|
||||
On(NFCJuice,Table1) 麻烦你把NFC果汁放到前门斜桌子那个位置。
|
||||
On(NFCJuice,Table1) 请你拿一下NFC果汁到前门斜桌子位置。
|
||||
On(NFCJuice,Table1) 你好,我在前门斜桌子,请你拿一下NFC果汁到位置。
|
||||
On(NFCJuice,Table2) 麻烦你把NFC果汁放到大厅长桌子西侧那个位置。
|
||||
On(NFCJuice,Table2) 请你拿一下NFC果汁到大厅长桌子西侧位置。
|
||||
On(NFCJuice,Table2) 你好,我在大厅长桌子西侧,请你拿一下NFC果汁到位置。
|
||||
On(NFCJuice,Table3) 麻烦你把NFC果汁放到大厅长桌子东侧那个位置。
|
||||
On(NFCJuice,Table3) 请你拿一下NFC果汁到大厅长桌子东侧位置。
|
||||
On(NFCJuice,Table3) 你好,我在大厅长桌子东侧,请你拿一下NFC果汁到位置。
|
||||
On(NFCJuice,BrightTable6) 麻烦你把NFC果汁放到后门靠窗边圆桌那个位置。
|
||||
On(NFCJuice,BrightTable6) 请你拿一下NFC果汁到后门靠窗边圆桌位置。
|
||||
On(NFCJuice,BrightTable6) 你好,我在后门靠窗边圆桌,请你拿一下NFC果汁到位置。
|
||||
On(Bernachon,Bar) 麻烦你把贝纳颂咖啡放到吧台那个位置。
|
||||
On(Bernachon,Bar) 请你拿一下贝纳颂咖啡到吧台位置。
|
||||
On(Bernachon,Bar) 你好,我在吧台,请你拿一下贝纳颂咖啡到位置。
|
||||
On(Bernachon,Bar2) 麻烦你把贝纳颂咖啡放到另一侧的吧台那个位置。
|
||||
On(Bernachon,Bar2) 请你拿一下贝纳颂咖啡到另一侧的吧台位置。
|
||||
On(Bernachon,Bar2) 你好,我在另一侧的吧台,请你拿一下贝纳颂咖啡到位置。
|
||||
On(Bernachon,WaterTable) 麻烦你把贝纳颂咖啡放到茶水桌那个位置。
|
||||
On(Bernachon,WaterTable) 请你拿一下贝纳颂咖啡到茶水桌位置。
|
||||
On(Bernachon,WaterTable) 你好,我在茶水桌,请你拿一下贝纳颂咖啡到位置。
|
||||
On(Bernachon,CoffeeTable) 麻烦你把贝纳颂咖啡放到咖啡桌那个位置。
|
||||
On(Bernachon,CoffeeTable) 请你拿一下贝纳颂咖啡到咖啡桌位置。
|
||||
On(Bernachon,CoffeeTable) 你好,我在咖啡桌,请你拿一下贝纳颂咖啡到位置。
|
||||
On(Bernachon,Table1) 麻烦你把贝纳颂咖啡放到前门斜桌子那个位置。
|
||||
On(Bernachon,Table1) 请你拿一下贝纳颂咖啡到前门斜桌子位置。
|
||||
On(Bernachon,Table1) 你好,我在前门斜桌子,请你拿一下贝纳颂咖啡到位置。
|
||||
On(Bernachon,Table2) 麻烦你把贝纳颂咖啡放到大厅长桌子西侧那个位置。
|
||||
On(Bernachon,Table2) 请你拿一下贝纳颂咖啡到大厅长桌子西侧位置。
|
||||
On(Bernachon,Table2) 你好,我在大厅长桌子西侧,请你拿一下贝纳颂咖啡到位置。
|
||||
On(Bernachon,Table3) 麻烦你把贝纳颂咖啡放到大厅长桌子东侧那个位置。
|
||||
On(Bernachon,Table3) 请你拿一下贝纳颂咖啡到大厅长桌子东侧位置。
|
||||
On(Bernachon,Table3) 你好,我在大厅长桌子东侧,请你拿一下贝纳颂咖啡到位置。
|
||||
On(Bernachon,BrightTable6) 麻烦你把贝纳颂咖啡放到后门靠窗边圆桌那个位置。
|
||||
On(Bernachon,BrightTable6) 请你拿一下贝纳颂咖啡到后门靠窗边圆桌位置。
|
||||
On(Bernachon,BrightTable6) 你好,我在后门靠窗边圆桌,请你拿一下贝纳颂咖啡到位置。
|
||||
On(SpringWater,Bar) 麻烦你把矿泉水放到吧台那个位置。
|
||||
On(SpringWater,Bar) 请你拿一下矿泉水到吧台位置。
|
||||
On(SpringWater,Bar) 你好,我在吧台,请你拿一下矿泉水到位置。
|
||||
On(SpringWater,Bar2) 麻烦你把矿泉水放到另一侧的吧台那个位置。
|
||||
On(SpringWater,Bar2) 请你拿一下矿泉水到另一侧的吧台位置。
|
||||
On(SpringWater,Bar2) 你好,我在另一侧的吧台,请你拿一下矿泉水到位置。
|
||||
On(SpringWater,WaterTable) 麻烦你把矿泉水放到茶水桌那个位置。
|
||||
On(SpringWater,WaterTable) 请你拿一下矿泉水到茶水桌位置。
|
||||
On(SpringWater,WaterTable) 你好,我在茶水桌,请你拿一下矿泉水到位置。
|
||||
On(SpringWater,CoffeeTable) 麻烦你把矿泉水放到咖啡桌那个位置。
|
||||
On(SpringWater,CoffeeTable) 请你拿一下矿泉水到咖啡桌位置。
|
||||
On(SpringWater,CoffeeTable) 你好,我在咖啡桌,请你拿一下矿泉水到位置。
|
||||
On(SpringWater,Table1) 麻烦你把矿泉水放到前门斜桌子那个位置。
|
||||
On(SpringWater,Table1) 请你拿一下矿泉水到前门斜桌子位置。
|
||||
On(SpringWater,Table1) 你好,我在前门斜桌子,请你拿一下矿泉水到位置。
|
||||
On(SpringWater,Table2) 麻烦你把矿泉水放到大厅长桌子西侧那个位置。
|
||||
On(SpringWater,Table2) 请你拿一下矿泉水到大厅长桌子西侧位置。
|
||||
On(SpringWater,Table2) 你好,我在大厅长桌子西侧,请你拿一下矿泉水到位置。
|
||||
On(SpringWater,Table3) 麻烦你把矿泉水放到大厅长桌子东侧那个位置。
|
||||
On(SpringWater,Table3) 请你拿一下矿泉水到大厅长桌子东侧位置。
|
||||
On(SpringWater,Table3) 你好,我在大厅长桌子东侧,请你拿一下矿泉水到位置。
|
||||
On(SpringWater,BrightTable6) 麻烦你把矿泉水放到后门靠窗边圆桌那个位置。
|
||||
On(SpringWater,BrightTable6) 请你拿一下矿泉水到后门靠窗边圆桌位置。
|
||||
On(SpringWater,BrightTable6) 你好,我在后门靠窗边圆桌,请你拿一下矿泉水到位置。
|
||||
Is(AC,On) 你能把空调关闭一下吗?
|
||||
Is(AC,Off) 你能把空调打开一下吗?
|
||||
Is(ACTemperature,On) 你能把空调Temperature调高一下吗?
|
||||
Is(ACTemperature,Off) 你能把空调Temperature调低一下吗?
|
||||
Is(HallLight,On) 你能把大厅灯关闭一下吗?
|
||||
Is(HallLight,Off) 你能把大厅灯打开一下吗?
|
||||
Is(TubeLight,On) 你能把筒灯关闭一下吗?
|
||||
Is(TubeLight,Off) 你能把筒灯打开一下吗?
|
||||
Is(Curtain,On) 你能把窗帘关闭一下吗?
|
||||
Is(Curtain,Off) 你能把窗帘打开一下吗?
|
||||
Is(Chairs,On) 你能把椅子脏一下吗?
|
||||
Is(Chairs,Off) 你能把椅子打扫干净一下吗?
|
||||
Is(Floor,On) 你能把地板脏一下吗?
|
||||
Is(Floor,Off) 你能把地板打扫干净一下吗?
|
||||
Is(Table1,On) 你能把前门斜桌子脏一下吗?
|
||||
Is(Table1,Off) 你能把前门斜桌子打扫干净一下吗?
|
||||
Holding(Coffee) 你能把咖啡抓在手里吗?
|
||||
Holding(Coffee) 你能一直拿着咖啡吗?
|
||||
Holding(Water) 你能把水抓在手里吗?
|
||||
Holding(Water) 你能一直拿着水吗?
|
||||
Holding(Dessert) 你能把点心抓在手里吗?
|
||||
Holding(Dessert) 你能一直拿着点心吗?
|
||||
Holding(Softdrink) 你能把盒装冰红茶抓在手里吗?
|
||||
Holding(Softdrink) 你能一直拿着盒装冰红茶吗?
|
||||
Holding(BottledDrink) 你能把瓶装饮料抓在手里吗?
|
||||
Holding(BottledDrink) 你能一直拿着瓶装饮料吗?
|
||||
Holding(Yogurt) 你能把酸奶抓在手里吗?
|
||||
Holding(Yogurt) 你能一直拿着酸奶吗?
|
||||
Holding(ADMilk) 你能把AD钙奶抓在手里吗?
|
||||
Holding(ADMilk) 你能一直拿着AD钙奶吗?
|
||||
Holding(MilkDrink) 你能把牛奶味的饮料抓在手里吗?
|
||||
Holding(MilkDrink) 你能一直拿着牛奶味的饮料吗?
|
||||
Holding(Milk) 你能把牛奶抓在手里吗?
|
||||
Holding(Milk) 你能一直拿着牛奶吗?
|
||||
Holding(VacuumCup) 你能把保温杯抓在手里吗?
|
||||
Holding(VacuumCup) 你能一直拿着保温杯吗?
|
||||
Holding(Chips) 你能把薯片抓在手里吗?
|
||||
Holding(Chips) 你能一直拿着薯片吗?
|
||||
Holding(NFCJuice) 你能把NFC果汁抓在手里吗?
|
||||
Holding(NFCJuice) 你能一直拿着NFC果汁吗?
|
||||
Holding(Bernachon) 你能把贝纳颂咖啡抓在手里吗?
|
||||
Holding(Bernachon) 你能一直拿着贝纳颂咖啡吗?
|
||||
Holding(SpringWater) 你能把矿泉水抓在手里吗?
|
||||
Holding(SpringWater) 你能一直拿着矿泉水吗?
|
||||
Holding(Nothing) 你能把Nothing抓在手里吗?
|
||||
Holding(Nothing) 你能一直拿着Nothing吗?
|
||||
On(Coffee,Bar) 你能制作咖啡并把它端到吧台这里来吗?
|
||||
On(Coffee,Bar) 给我来点咖啡,并把它端到吧台这里来。
|
||||
On(Coffee,Bar2) 你能制作咖啡并把它端到另一侧的吧台这里来吗?
|
||||
On(Coffee,Bar2) 给我来点咖啡,并把它端到另一侧的吧台这里来。
|
||||
On(Coffee,WaterTable) 你能制作咖啡并把它端到茶水桌这里来吗?
|
||||
On(Coffee,WaterTable) 给我来点咖啡,并把它端到茶水桌这里来。
|
||||
On(Coffee,CoffeeTable) 你能制作咖啡并把它端到咖啡桌这里来吗?
|
||||
On(Coffee,CoffeeTable) 给我来点咖啡,并把它端到咖啡桌这里来。
|
||||
On(Coffee,Table1) 你能制作咖啡并把它端到前门斜桌子这里来吗?
|
||||
On(Coffee,Table1) 给我来点咖啡,并把它端到前门斜桌子这里来。
|
||||
On(Coffee,Table2) 你能制作咖啡并把它端到大厅长桌子西侧这里来吗?
|
||||
On(Coffee,Table2) 给我来点咖啡,并把它端到大厅长桌子西侧这里来。
|
||||
On(Coffee,Table3) 你能制作咖啡并把它端到大厅长桌子东侧这里来吗?
|
||||
On(Coffee,Table3) 给我来点咖啡,并把它端到大厅长桌子东侧这里来。
|
||||
On(Coffee,BrightTable6) 你能制作咖啡并把它端到后门靠窗边圆桌这里来吗?
|
||||
On(Coffee,BrightTable6) 给我来点咖啡,并把它端到后门靠窗边圆桌这里来。
|
||||
On(Water,Bar) 你能制作水并把它端到吧台这里来吗?
|
||||
On(Water,Bar) 给我来点水,并把它端到吧台这里来。
|
||||
On(Water,Bar2) 你能制作水并把它端到另一侧的吧台这里来吗?
|
||||
On(Water,Bar2) 给我来点水,并把它端到另一侧的吧台这里来。
|
||||
On(Water,WaterTable) 你能制作水并把它端到茶水桌这里来吗?
|
||||
On(Water,WaterTable) 给我来点水,并把它端到茶水桌这里来。
|
||||
On(Water,CoffeeTable) 你能制作水并把它端到咖啡桌这里来吗?
|
||||
On(Water,CoffeeTable) 给我来点水,并把它端到咖啡桌这里来。
|
||||
On(Water,Table1) 你能制作水并把它端到前门斜桌子这里来吗?
|
||||
On(Water,Table1) 给我来点水,并把它端到前门斜桌子这里来。
|
||||
On(Water,Table2) 你能制作水并把它端到大厅长桌子西侧这里来吗?
|
||||
On(Water,Table2) 给我来点水,并把它端到大厅长桌子西侧这里来。
|
||||
On(Water,Table3) 你能制作水并把它端到大厅长桌子东侧这里来吗?
|
||||
On(Water,Table3) 给我来点水,并把它端到大厅长桌子东侧这里来。
|
||||
On(Water,BrightTable6) 你能制作水并把它端到后门靠窗边圆桌这里来吗?
|
||||
On(Water,BrightTable6) 给我来点水,并把它端到后门靠窗边圆桌这里来。
|
||||
On(Dessert,Bar) 你能制作点心并把它端到吧台这里来吗?
|
||||
On(Dessert,Bar) 给我来点点心,并把它端到吧台这里来。
|
||||
On(Dessert,Bar2) 你能制作点心并把它端到另一侧的吧台这里来吗?
|
||||
On(Dessert,Bar2) 给我来点点心,并把它端到另一侧的吧台这里来。
|
||||
On(Dessert,WaterTable) 你能制作点心并把它端到茶水桌这里来吗?
|
||||
On(Dessert,WaterTable) 给我来点点心,并把它端到茶水桌这里来。
|
||||
On(Dessert,CoffeeTable) 你能制作点心并把它端到咖啡桌这里来吗?
|
||||
On(Dessert,CoffeeTable) 给我来点点心,并把它端到咖啡桌这里来。
|
||||
On(Dessert,Table1) 你能制作点心并把它端到前门斜桌子这里来吗?
|
||||
On(Dessert,Table1) 给我来点点心,并把它端到前门斜桌子这里来。
|
||||
On(Dessert,Table2) 你能制作点心并把它端到大厅长桌子西侧这里来吗?
|
||||
On(Dessert,Table2) 给我来点点心,并把它端到大厅长桌子西侧这里来。
|
||||
On(Dessert,Table3) 你能制作点心并把它端到大厅长桌子东侧这里来吗?
|
||||
On(Dessert,Table3) 给我来点点心,并把它端到大厅长桌子东侧这里来。
|
||||
On(Dessert,BrightTable6) 你能制作点心并把它端到后门靠窗边圆桌这里来吗?
|
||||
On(Dessert,BrightTable6) 给我来点点心,并把它端到后门靠窗边圆桌这里来。
|
|
@ -0,0 +1,10 @@
|
|||
import os
|
||||
|
||||
with open(os.path.join('./goal_states_with_description.txt'), 'r', encoding='utf-8') as file:
|
||||
lines = file.readlines()
|
||||
|
||||
with open(os.path.join('./goal_states_with_description.jsonl'), 'w', encoding='utf-8') as file:
|
||||
|
||||
for line in lines:
|
||||
tmp = line[:-1].split('\t')
|
||||
file.write("""{"title":"%s","text":"%s"}\n""" % (tmp[1], tmp[0]))
|
|
@ -0,0 +1,61 @@
|
|||
import os
|
||||
import requests
|
||||
import urllib3
|
||||
from tqdm import tqdm
|
||||
|
||||
########################################
|
||||
# 该文件实现了与大模型的简单通信
|
||||
########################################
|
||||
|
||||
# 忽略https的安全性警告
|
||||
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
||||
|
||||
|
||||
def single_round(question, prefix=""):
|
||||
url = "https://45.125.46.134:25344/v1/chat/completions"
|
||||
headers = {"Content-Type": "application/json"}
|
||||
data = {
|
||||
"model": "RoboWaiter",
|
||||
"messages": [
|
||||
{
|
||||
"role": "system",
|
||||
# "content": "你是一个机器人服务员:RoboWaiter. 你的职责是为顾客提供对话及具身服务。"
|
||||
"content": """
|
||||
假设现在你是咖啡厅的一个顾客,请将以下你对咖啡厅服务员说的话改写成更清晰更合理的顾客表述。注意:句中的你指的是咖啡厅服务员,也不要说能帮我。
|
||||
例如:麻烦你去一下吧台。可以转述成:服务员,你能去下吧台吗?
|
||||
另一个例子:请你拿一下酸奶到吧台位置。可以转述成:服务员,拿一杯酸奶来吧台。
|
||||
|
||||
"""
|
||||
},
|
||||
{
|
||||
"role": "user",
|
||||
"content": prefix + question
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
response = requests.post(url, headers=headers, json=data, verify=False)
|
||||
|
||||
if response.status_code == 200:
|
||||
result = response.json()
|
||||
return result['choices'][0]['message']['content'].strip()
|
||||
else:
|
||||
return "大模型请求失败:", response.status_code
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
with open('./goal_states_with_description.txt', 'r', encoding='utf-8') as file:
|
||||
lines = file.readlines()
|
||||
|
||||
output_file = './expansion_out/output2.txt'
|
||||
with open(output_file, 'a', encoding='utf-8') as file:
|
||||
file.truncate(0)
|
||||
for line in tqdm(lines):
|
||||
tmp = line[:-1].split('\t')
|
||||
# file.write("""{"title":"%s","text":"%s"}\n""" % (tmp[1], tmp[0]))
|
||||
question = tmp[1]
|
||||
# print(single_round(question))
|
||||
# print(tmp[1])
|
||||
with open(output_file, 'a', encoding='utf-8') as file:
|
||||
file.write(tmp[0] + "\t" + single_round(question, prefix="现在改写一下句子:") + '\n')
|
||||
print("输出完成")
|
|
@ -0,0 +1,316 @@
|
|||
import random
|
||||
import numpy as np
|
||||
import copy
|
||||
import time
|
||||
from robowaiter.behavior_tree.obtea.BehaviorTree import Leaf,ControlBT
|
||||
from robowaiter.behavior_tree.obtea.OptimalBTExpansionAlgorithm import Action,generate_random_state,state_transition,conflict
|
||||
|
||||
|
||||
|
||||
# 本文所提出的完备规划算法
|
||||
class BTalgorithm:
|
||||
def __init__(self,verbose=False):
|
||||
self.bt = None
|
||||
self.nodes = []
|
||||
self.traversed = []
|
||||
self.conditions = []
|
||||
self.conditions_index = []
|
||||
self.verbose = verbose
|
||||
# print (self.conditions_list[0])
|
||||
|
||||
def clear(self):
|
||||
self.bt = None
|
||||
self.nodes = []
|
||||
self.traversed = []
|
||||
self.conditions = []
|
||||
self.conditions_index = []
|
||||
|
||||
# 运行规划算法,从初始状态、目标状态和可用行动,计算行为树self.bt
|
||||
def run_algorithm_selTree(self, start, goal, actions):
|
||||
# 初始行为树只包含目标条件
|
||||
bt = ControlBT(type='cond')
|
||||
g_node = Leaf(type='cond', content=goal,mincost=0)
|
||||
bt.add_child([g_node])
|
||||
|
||||
self.conditions.append(goal)
|
||||
self.nodes.append(g_node) # condition node list
|
||||
# 尝试在初始状态执行行为树
|
||||
val, obj = bt.tick(start)
|
||||
canrun = False
|
||||
if val == 'success' or val == 'running':
|
||||
canrun = True
|
||||
# 循环扩展,直到行为树能够在初始状态运行
|
||||
while not canrun:
|
||||
index = -1
|
||||
for i in range(0, len(self.nodes)):
|
||||
if self.nodes[i].content in self.traversed:
|
||||
continue
|
||||
else:
|
||||
c_node = self.nodes[i]
|
||||
index = i
|
||||
break
|
||||
if index == -1: # 树中结点扩展完毕,仍无法运行行为树,返回失败
|
||||
print('Failure')
|
||||
return False
|
||||
# 根据所选择条件结点扩展子树
|
||||
subtree = ControlBT(type='?')
|
||||
subtree.add_child([copy.deepcopy(c_node)]) # 子树首先保留所扩展结点
|
||||
c = c_node.content # 子树所扩展结点对应的条件(一个文字的set)
|
||||
|
||||
for i in range(0, len(actions)): # 选择符合条件的行动,
|
||||
# print("have action")
|
||||
if not c & ((actions[i].pre | actions[i].add) - actions[i].del_set) <= set():
|
||||
# print ("pass add")
|
||||
if (c - actions[i].del_set) == c:
|
||||
# print("pass delete")
|
||||
c_attr = (actions[i].pre | c) - actions[i].add
|
||||
valid = True
|
||||
|
||||
# 这样剪枝存在错误性
|
||||
if conflict(c_attr):
|
||||
continue
|
||||
|
||||
for j in self.traversed: # 剪枝操作
|
||||
if j <= c_attr:
|
||||
valid = False
|
||||
break
|
||||
|
||||
if valid:
|
||||
# print("pass prune")
|
||||
# 构建行动的顺序结构
|
||||
sequence_structure = ControlBT(type='>')
|
||||
c_attr_node = Leaf(type='cond', content=c_attr, mincost=0)
|
||||
a_node = Leaf(type='act', content=actions[i], mincost=0)
|
||||
sequence_structure.add_child([c_attr_node, a_node])
|
||||
# 将顺序结构添加到子树
|
||||
subtree.add_child([sequence_structure])
|
||||
|
||||
self.nodes.append(c_attr_node)
|
||||
# 将原条件结点c_node替换为扩展后子树subtree
|
||||
parent_of_c = c_node.parent
|
||||
parent_of_c.children[0] = subtree
|
||||
# 记录已扩展条件
|
||||
self.traversed.append(c)
|
||||
# 尝试在初始状态运行行为树
|
||||
val, obj = bt.tick(start)
|
||||
canrun = False
|
||||
if val == 'success' or val == 'running':
|
||||
canrun = True
|
||||
return bt
|
||||
|
||||
|
||||
|
||||
def run_algorithm(self, start, goal, actions):
|
||||
# goal_ls = goal.replace(" ", "")
|
||||
# goal_ls = goal_ls.split("|")
|
||||
self.bt = ControlBT(type='cond')
|
||||
subtree = ControlBT(type='?')
|
||||
if len(goal) > 1:
|
||||
for g in goal:
|
||||
print("goal",g)
|
||||
bt_sel_tree = self.run_algorithm_selTree(start, g, actions)
|
||||
print("bt_sel_tree.children",bt_sel_tree.children)
|
||||
# print(bt_sel_tree.children[0])
|
||||
subtree.add_child([copy.deepcopy(bt_sel_tree.children[0])])
|
||||
self.bt.add_child([subtree])
|
||||
else:
|
||||
self.bt = self.run_algorithm_selTree(start, goal[0], actions)
|
||||
return True
|
||||
|
||||
def print_solution(self):
|
||||
print(len(self.nodes))
|
||||
# for i in self.nodes:
|
||||
# if isinstance(i,Node):
|
||||
# print (i.content)
|
||||
# else:
|
||||
# print (i)
|
||||
|
||||
# 树的dfs
|
||||
def dfs_ptml(self,parnode,is_root=False):
|
||||
for child in parnode.children:
|
||||
if isinstance(child, Leaf):
|
||||
if child.type == 'cond':
|
||||
|
||||
if is_root and len(child.content) > 1:
|
||||
# 把多个 cond 串起来
|
||||
self.ptml_string += "sequence{\n"
|
||||
self.ptml_string += "cond "
|
||||
c_set_str = '\n cond '.join(map(str, child.content)) + "\n"
|
||||
self.ptml_string += c_set_str
|
||||
self.ptml_string += '}\n'
|
||||
else:
|
||||
self.ptml_string += "cond "
|
||||
c_set_str = '\n cond '.join(map(str, child.content)) + "\n"
|
||||
self.ptml_string += c_set_str
|
||||
|
||||
elif child.type == 'act':
|
||||
if '(' not in child.content.name:
|
||||
self.ptml_string += 'act ' + child.content.name + "()\n"
|
||||
else:
|
||||
self.ptml_string += 'act ' + child.content.name + "\n"
|
||||
elif isinstance(child, ControlBT):
|
||||
if child.type == '?':
|
||||
self.ptml_string += "selector{\n"
|
||||
self.dfs_ptml(parnode=child)
|
||||
elif child.type == '>':
|
||||
self.ptml_string += "sequence{\n"
|
||||
self.dfs_ptml( parnode=child)
|
||||
self.ptml_string += '}\n'
|
||||
|
||||
|
||||
def get_ptml(self):
|
||||
self.ptml_string = "selector{\n"
|
||||
self.dfs_ptml(self.bt.children[0],is_root=True)
|
||||
self.ptml_string += '}\n'
|
||||
return self.ptml_string
|
||||
|
||||
|
||||
def save_ptml_file(self,file_name):
|
||||
self.ptml_string = "selector{\n"
|
||||
self.dfs_ptml(self.bt.children[0])
|
||||
self.ptml_string += '}\n'
|
||||
with open(f'./{file_name}.ptml', 'w') as file:
|
||||
file.write(self.ptml_string)
|
||||
return self.ptml_string
|
||||
|
||||
|
||||
# 所对比的基准算法,具体扩展细节有差异
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
random.seed(1)
|
||||
# 设置生成规划问题集的超参数:文字数、解深度、迭代次数
|
||||
literals_num = 10
|
||||
depth = 10
|
||||
iters = 10
|
||||
total_tree_size = []
|
||||
total_action_num = []
|
||||
total_state_num = []
|
||||
total_steps_num = []
|
||||
# fail_count=0
|
||||
# danger_count=0
|
||||
success_count = 0
|
||||
failure_count = 0
|
||||
planning_time_total = 0.0
|
||||
# 实验1000次
|
||||
for count in range(0, 1000):
|
||||
# 生成一个规划问题,包括随机的状态和行动,以及目标状态
|
||||
states = []
|
||||
actions = []
|
||||
start = generate_random_state(literals_num)
|
||||
state = start
|
||||
states.append(state)
|
||||
# print (state)
|
||||
for i in range(0, depth):
|
||||
a = Action()
|
||||
a.generate_from_state(state, literals_num)
|
||||
if not a in actions:
|
||||
actions.append(a)
|
||||
state = state_transition(state, a)
|
||||
if state in states:
|
||||
pass
|
||||
else:
|
||||
states.append(state)
|
||||
# print(state)
|
||||
|
||||
goal = states[-1]
|
||||
state = start
|
||||
for i in range(0, iters):
|
||||
a = Action()
|
||||
a.generate_from_state(state, literals_num)
|
||||
if not a in actions:
|
||||
actions.append(a)
|
||||
state = state_transition(state, a)
|
||||
if state in states:
|
||||
pass
|
||||
else:
|
||||
states.append(state)
|
||||
state = random.sample(states, 1)[0]
|
||||
# 选择测试本文算法btalgorithm,或对比算法weakalgorithm
|
||||
algo = BTalgorithm()
|
||||
# algo = Weakalgorithm()
|
||||
start_time = time.time()
|
||||
if algo.run_algorithm(start, goal, list(actions)): # 运行算法,规划后行为树为algo.bt
|
||||
total_tree_size.append(algo.bt.count_size() - 1)
|
||||
else:
|
||||
print("error")
|
||||
end_time = time.time()
|
||||
planning_time_total += (end_time - start_time)
|
||||
|
||||
# 开始从初始状态运行行为树,测试
|
||||
state = start
|
||||
steps = 0
|
||||
val, obj = algo.bt.tick(state) # tick行为树,obj为所运行的行动
|
||||
while val != 'success' and val != 'failure': # 运行直到行为树成功或失败
|
||||
state = state_transition(state, obj)
|
||||
val, obj = algo.bt.tick(state)
|
||||
if (val == 'failure'):
|
||||
print("bt fails at step", steps)
|
||||
steps += 1
|
||||
if (steps >= 500): # 至多运行500步
|
||||
break
|
||||
if not goal <= state: # 错误解,目标条件不在执行后状态满足
|
||||
# print ("wrong solution",steps)
|
||||
failure_count += 1
|
||||
|
||||
else: # 正确解,满足目标条件
|
||||
# print ("right solution",steps)
|
||||
success_count += 1
|
||||
total_steps_num.append(steps)
|
||||
algo.clear()
|
||||
total_action_num.append(len(actions))
|
||||
total_state_num.append(len(states))
|
||||
print(success_count, failure_count) # 算法成功和失败次数
|
||||
|
||||
print(np.mean(total_tree_size), np.std(total_tree_size, ddof=1)) # 1000次测试树大小
|
||||
print(np.mean(total_steps_num), np.std(total_steps_num, ddof=1))
|
||||
print(np.mean(total_state_num)) # 1000次问题的平均状态数
|
||||
print(np.mean(total_action_num)) # 1000次问题的平均行动数
|
||||
print(planning_time_total, planning_time_total / 1000.0)
|
||||
|
||||
# print(total_state_num)
|
||||
|
||||
# casestudy begin 对应论文的case study,包含三个行动的移动机械臂场景
|
||||
|
||||
actions = []
|
||||
a = Action(name='movebtob')
|
||||
a.pre = {1, 2}
|
||||
a.add = {3}
|
||||
a.del_set = {1, 4}
|
||||
actions.append(a)
|
||||
a = Action(name='moveatob')
|
||||
a.pre = {1}
|
||||
a.add = {5, 2}
|
||||
a.del_set = {1, 6}
|
||||
actions.append(a)
|
||||
a = Action(name='moveatoa')
|
||||
a.pre = {7}
|
||||
a.add = {8, 2}
|
||||
a.del_set = {7, 6}
|
||||
actions.append(a)
|
||||
|
||||
start = {1, 7, 4, 6}
|
||||
goal = {3}
|
||||
algo = BTalgorithm()
|
||||
algo.clear()
|
||||
algo.run_algorithm(start, goal, list(actions))
|
||||
state = start
|
||||
steps = 0
|
||||
val, obj = algo.bt.tick(state)
|
||||
while val != 'success' and val != 'failure':
|
||||
state = state_transition(state, obj)
|
||||
print(obj.name)
|
||||
val, obj = algo.bt.tick(state)
|
||||
if (val == 'failure'):
|
||||
print("bt fails at step", steps)
|
||||
steps += 1
|
||||
if not goal <= state:
|
||||
print("wrong solution", steps)
|
||||
else:
|
||||
print("right solution", steps)
|
||||
# algo.bt.print_nodes()
|
||||
print(algo.bt.count_size() - 1)
|
||||
algo.clear()
|
||||
|
||||
# case study end
|
|
@ -0,0 +1,95 @@
|
|||
|
||||
#叶结点
|
||||
class Leaf:
|
||||
def __init__(self,type,content,mincost=0):
|
||||
self.type=type
|
||||
self.content=content #conditionset or action
|
||||
self.parent=None
|
||||
self.parent_index=0
|
||||
self.mincost=mincost
|
||||
|
||||
# tick 叶节点,返回返回值以及对应的条件或行动对象self.content
|
||||
def tick(self,state):
|
||||
if self.type=='cond':
|
||||
if self.content <= state:
|
||||
return 'success',self.content
|
||||
else:
|
||||
return 'failure',self.content
|
||||
if self.type=='act':
|
||||
if self.content.pre<=state:
|
||||
return 'running',self.content #action
|
||||
else:
|
||||
return 'failure',self.content
|
||||
|
||||
def __str__(self):
|
||||
print( self.content)
|
||||
return ''
|
||||
|
||||
def print_nodes(self):
|
||||
print(self.content)
|
||||
|
||||
def count_size(self):
|
||||
return 1
|
||||
|
||||
|
||||
#可能包含控制结点的行为树
|
||||
class ControlBT:
|
||||
def __init__(self,type):
|
||||
self.type=type
|
||||
self.children=[]
|
||||
self.parent=None
|
||||
self.parent_index=0
|
||||
|
||||
|
||||
def add_child(self,subtree_list):
|
||||
for subtree in subtree_list:
|
||||
self.children.append(subtree)
|
||||
subtree.parent=self
|
||||
subtree.parent_index=len(self.children)-1
|
||||
|
||||
# tick行为树,根据不同控制结点逻辑tick子结点
|
||||
def tick(self,state):
|
||||
if len(self.children) < 1:
|
||||
print("error,no child")
|
||||
if self.type =='?':#选择结点,即或结点
|
||||
for child in self.children:
|
||||
val,obj=child.tick(state)
|
||||
if val=='success':
|
||||
return val,obj
|
||||
if val=='running':
|
||||
return val,obj
|
||||
return 'failure','?fails'
|
||||
if self.type =='>':#顺序结点,即与结点
|
||||
for child in self.children:
|
||||
val,obj=child.tick(state)
|
||||
if val=='failure':
|
||||
return val,obj
|
||||
if val=='running':
|
||||
return val,obj
|
||||
return 'success', '>success'
|
||||
if self.type =='act':#行动结点
|
||||
return self.children[0].tick(state)
|
||||
if self.type =='cond':#条件结点
|
||||
return self.children[0].tick(state)
|
||||
|
||||
def getFirstChild(self):
|
||||
return self.children[0]
|
||||
|
||||
def __str__(self):
|
||||
print(self.type+'\n')
|
||||
for child in self.children:
|
||||
print (child)
|
||||
return ''
|
||||
|
||||
def print_nodes(self):
|
||||
print(self.type)
|
||||
for child in self.children:
|
||||
child.print_nodes()
|
||||
|
||||
# 递归统计树中结点数
|
||||
def count_size(self):
|
||||
result=1
|
||||
for child in self.children:
|
||||
result+= child.count_size()
|
||||
return result
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
selector{
|
||||
cond At(Table,Coffee)
|
||||
selector{
|
||||
cond Holding(Coffee), At(Robot,Table)
|
||||
act PutDown(Table,Coffee)
|
||||
}
|
||||
selector{
|
||||
cond NotHolding, At(Robot,Coffee), At(Robot,Table)
|
||||
act PickUp(Coffee)
|
||||
}
|
||||
selector{
|
||||
cond Holding(Coffee), Available(Table)
|
||||
act MoveTo(Table)
|
||||
}
|
||||
selector{
|
||||
cond Holding(VacuumCup), At(Robot,Coffee), At(Robot,Table)
|
||||
act PutDown(Table,VacuumCup)
|
||||
}
|
||||
selector{
|
||||
cond NotHolding, At(Robot,CoffeeMachine), At(Robot,Table)
|
||||
act OpCoffeeMachine
|
||||
}
|
||||
selector{
|
||||
cond NotHolding, Available(Table), At(Robot,Coffee)
|
||||
act PickUp(Coffee)
|
||||
}
|
||||
selector{
|
||||
cond Holding(VacuumCup), At(Robot,Table), At(Robot,CoffeeMachine)
|
||||
act PutDown(Table,VacuumCup)
|
||||
}
|
||||
selector{
|
||||
cond NotHolding, Available(Coffee), Available(Table)
|
||||
act MoveTo(Coffee)
|
||||
}
|
||||
selector{
|
||||
cond NotHolding, Available(Table), At(Robot,CoffeeMachine)
|
||||
act OpCoffeeMachine
|
||||
}
|
||||
selector{
|
||||
cond Holding(VacuumCup), Available(Coffee), Available(Table), At(Robot,Table)
|
||||
act PutDown(Table,VacuumCup)
|
||||
}
|
||||
selector{
|
||||
cond Available(CoffeeMachine), NotHolding, Available(Table)
|
||||
act MoveTo(CoffeeMachine)
|
||||
}
|
||||
selector{
|
||||
cond Holding(VacuumCup), Available(Coffee), Available(Table)
|
||||
act MoveTo(Table)
|
||||
}
|
||||
selector{
|
||||
cond Available(CoffeeMachine), Holding(VacuumCup), Available(Table), At(Robot,Table)
|
||||
act PutDown(Table,VacuumCup)
|
||||
}
|
||||
selector{
|
||||
cond Available(CoffeeMachine), Holding(VacuumCup), Available(Table)
|
||||
act MoveTo(Table)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,429 @@
|
|||
import copy
|
||||
import random
|
||||
from robowaiter.behavior_tree.obtea.BehaviorTree import Leaf,ControlBT
|
||||
|
||||
|
||||
|
||||
class CondActPair:
|
||||
def __init__(self, cond_leaf,act_leaf):
|
||||
self.cond_leaf = cond_leaf
|
||||
self.act_leaf = act_leaf
|
||||
|
||||
#定义行动类,行动包括前提、增加和删除影响
|
||||
class Action:
|
||||
def __init__(self,name='anonymous action',pre=set(),add=set(),del_set=set(),cost=1):
|
||||
self.pre=copy.deepcopy(pre)
|
||||
self.add=copy.deepcopy(add)
|
||||
self.del_set=copy.deepcopy(del_set)
|
||||
self.name=name
|
||||
self.cost=cost
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
# 从状态随机生成一个行动
|
||||
def generate_from_state(self,state,num):
|
||||
for i in range(0,num):
|
||||
if i in state:
|
||||
if random.random() >0.5:
|
||||
self.pre.add(i)
|
||||
if random.random() >0.5:
|
||||
self.del_set.add(i)
|
||||
continue
|
||||
if random.random() > 0.5:
|
||||
self.add.add(i)
|
||||
continue
|
||||
if random.random() >0.5:
|
||||
self.del_set.add(i)
|
||||
def print_action(self):
|
||||
print (self.pre)
|
||||
print(self.add)
|
||||
print(self.del_set)
|
||||
|
||||
#生成随机状态
|
||||
def generate_random_state(num):
|
||||
result = set()
|
||||
for i in range(0,num):
|
||||
if random.random()>0.5:
|
||||
result.add(i)
|
||||
return result
|
||||
#从状态和行动生成后继状态
|
||||
def state_transition(state,action):
|
||||
if not action.pre <= state:
|
||||
print ('error: action not applicable')
|
||||
return state
|
||||
new_state=(state | action.add) - action.del_set
|
||||
return new_state
|
||||
|
||||
|
||||
def conflict(c):
|
||||
have_at = False
|
||||
have_holding = False
|
||||
for str in c:
|
||||
if 'At' in str:
|
||||
if not have_at:
|
||||
have_at = True
|
||||
else:
|
||||
return True
|
||||
|
||||
if 'Holding' in str:
|
||||
if not have_holding:
|
||||
have_holding = True
|
||||
else:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
#本文所提出的完备规划算法
|
||||
class OptBTExpAlgorithm:
|
||||
def __init__(self,verbose=False):
|
||||
self.bt = None
|
||||
self.nodes=[]
|
||||
self.traversed=[]
|
||||
self.mounted=[]
|
||||
self.conditions=[]
|
||||
self.conditions_index=[]
|
||||
self.verbose=verbose
|
||||
self.goal=None
|
||||
self.bt_merge = True
|
||||
|
||||
def clear(self):
|
||||
self.bt = None
|
||||
self.goal = None
|
||||
self.nodes = []
|
||||
self.traversed = [] #存cond
|
||||
self.expanded = [] #存整个
|
||||
self.conditions = []
|
||||
self.conditions_index = []
|
||||
|
||||
#运行规划算法,从初始状态、目标状态和可用行动,计算行为树self.bt
|
||||
# def run_algorithm(self,goal,actions,scene):
|
||||
def run_algorithm_selTree(self, start, goal, actions):
|
||||
# self.scene = scene
|
||||
self.goal = goal
|
||||
if self.verbose:
|
||||
print("\n算法开始!")
|
||||
|
||||
|
||||
bt = ControlBT(type='cond')
|
||||
# 初始行为树只包含目标条件
|
||||
gc_node = Leaf(type='cond', content=goal,mincost=0) # 为了统一,都成对出现
|
||||
ga_node = Leaf(type='act', content=None, mincost=0)
|
||||
subtree = ControlBT(type='?')
|
||||
subtree.add_child([copy.deepcopy(gc_node)]) # 子树首先保留所扩展结
|
||||
bt.add_child([subtree])
|
||||
|
||||
# self.conditions.append(goal)
|
||||
cond_anc_pair = CondActPair(cond_leaf=gc_node,act_leaf=ga_node)
|
||||
self.nodes.append(copy.deepcopy(cond_anc_pair)) # the set of explored but unexpanded conditions
|
||||
self.traversed = [goal] # the set of expanded conditions
|
||||
|
||||
while len(self.nodes)!=0:
|
||||
|
||||
# Find the condition for the shortest cost path
|
||||
pair_node = None
|
||||
min_cost = float ('inf')
|
||||
index= -1
|
||||
for i,cond_anc_pair in enumerate(self.nodes):
|
||||
|
||||
########### 剪枝操作
|
||||
# cond_tmp = cond_anc_pair.cond_leaf.content
|
||||
# valid = True
|
||||
# for pn in self.expanded: # 剪枝操作
|
||||
# if isinstance(pn.act_leaf.content,Action):
|
||||
# if pn.act_leaf.content.name==cond_anc_pair.act_leaf.content.name and cond_tmp <= pn.cond_leaf.content:
|
||||
# valid = False
|
||||
# break
|
||||
# if not valid:
|
||||
# continue
|
||||
########### 剪枝操作
|
||||
|
||||
if cond_anc_pair.cond_leaf.mincost < min_cost:
|
||||
min_cost = cond_anc_pair.cond_leaf.mincost
|
||||
pair_node = copy.deepcopy(cond_anc_pair)
|
||||
index = i
|
||||
|
||||
if self.verbose:
|
||||
print("选择扩展条件结点:",pair_node.cond_leaf.content)
|
||||
# Update self.nodes and self.traversed
|
||||
self.nodes.pop(index) # the set of explored but unexpanded conditions. self.nodes.remove(pair_node)
|
||||
c = pair_node.cond_leaf.content # 子树所扩展结点对应的条件(一个文字的set)
|
||||
|
||||
# Mount the action node and extend BT. T = Eapand(T,c,A(c))
|
||||
if c!=goal:
|
||||
if c!=set():
|
||||
|
||||
# 挂在上去的时候判断要不要挂载
|
||||
########### 剪枝操作 发现行不通
|
||||
# valid = True
|
||||
# for pn in self.expanded: # 剪枝操作
|
||||
# if isinstance(pn.act_leaf.content,Action):
|
||||
# if pn.act_leaf.content.name==pair_node.act_leaf.content.name and c <= pn.cond_leaf.content:
|
||||
# valid = False
|
||||
# break
|
||||
# if valid:
|
||||
########### 剪枝操作
|
||||
sequence_structure = ControlBT(type='>')
|
||||
sequence_structure.add_child(
|
||||
[copy.deepcopy(pair_node.cond_leaf), copy.deepcopy(pair_node.act_leaf)])
|
||||
subtree.add_child([copy.deepcopy(sequence_structure)]) # subtree 是回不断变化的,它的父亲是self.bt
|
||||
self.expanded.append(copy.deepcopy(pair_node))
|
||||
# 增加实时条件判断,满足条件就不再扩展
|
||||
# if c <= self.scene.state["condition_set"]:
|
||||
if c <= start:
|
||||
if self.bt_merge:
|
||||
bt = copy.deepcopy(self.merge_adjacent_conditions_stack(bt))
|
||||
return bt,min_cost
|
||||
# return True
|
||||
else:
|
||||
subtree.add_child([copy.deepcopy(pair_node.act_leaf)])
|
||||
|
||||
|
||||
if self.verbose:
|
||||
print("完成扩展 a_node= %s,对应的新条件 c_attr= %s,mincost=%d" \
|
||||
% (pair_node.act_leaf.content.name, pair_node.cond_leaf.content,
|
||||
pair_node.cond_leaf.mincost))
|
||||
|
||||
if self.verbose:
|
||||
print("遍历所有动作, 寻找符合条件的动作")
|
||||
# 遍历所有动作, 寻找符合条件的动作
|
||||
current_mincost = pair_node.cond_leaf.mincost # 当前的最短路径是多少
|
||||
|
||||
for i in range(0, len(actions)):
|
||||
|
||||
if not c & ((actions[i].pre | actions[i].add) - actions[i].del_set) <= set():
|
||||
if (c - actions[i].del_set) == c:
|
||||
if self.verbose:
|
||||
print("———— 满足条件可以扩展:",actions[i].name)
|
||||
c_attr = (actions[i].pre | c) - actions[i].add
|
||||
|
||||
# 这样剪枝存在错误性
|
||||
if conflict(c_attr):
|
||||
continue
|
||||
|
||||
# 剪枝操作,现在的条件是以前扩展过的条件的超集
|
||||
valid = True
|
||||
for j in self.traversed: # 剪枝操作
|
||||
if j <= c_attr:
|
||||
valid = False
|
||||
if self.verbose:
|
||||
print("———— --被剪枝:",actions[i].name,"c_attr=",c_attr)
|
||||
break
|
||||
|
||||
if valid:
|
||||
c_attr_node = Leaf(type='cond', content=c_attr, mincost=current_mincost + actions[i].cost)
|
||||
a_attr_node = Leaf(type='act', content=actions[i], mincost=current_mincost + actions[i].cost)
|
||||
cond_anc_pair = CondActPair(cond_leaf=c_attr_node, act_leaf=a_attr_node)
|
||||
self.nodes.append(copy.deepcopy(cond_anc_pair)) # condition node list
|
||||
self.traversed.append(c_attr) # 重点 the set of expanded conditions
|
||||
# 把符合条件的动作节点都放到列表里
|
||||
if self.verbose:
|
||||
print("———— -- %s 符合条件放入列表,对应的c为 %s" % (actions[i].name,c_attr),"cost=",current_mincost + actions[i].cost)
|
||||
if self.bt_merge:
|
||||
bt = copy.deepcopy(self.merge_adjacent_conditions_stack(bt))
|
||||
if self.verbose:
|
||||
print("算法结束!\n")
|
||||
return bt,min_cost
|
||||
# return True
|
||||
|
||||
def run_algorithm(self, start, goal, actions):
|
||||
self.bt = ControlBT(type='cond')
|
||||
subtree = ControlBT(type='?')
|
||||
|
||||
subtree_with_costs_ls=[]
|
||||
|
||||
if len(goal) > 1:
|
||||
for g in goal:
|
||||
bt_sel_tree,mincost = self.run_algorithm_selTree(start, g, actions)
|
||||
subtree_with_costs_ls.append((bt_sel_tree,mincost))
|
||||
# 要排个序再一次add
|
||||
# subtree.add_child([copy.deepcopy(bt_sel_tree.children[0])])
|
||||
# self.bt.add_child([subtree])
|
||||
sorted_trees = sorted(subtree_with_costs_ls, key=lambda x: x[1])
|
||||
for tree,cost in sorted_trees:
|
||||
subtree.add_child([copy.deepcopy(tree.children[0])])
|
||||
self.bt.add_child([subtree])
|
||||
else:
|
||||
self.bt,mincost = self.run_algorithm_selTree(start, goal[0], actions)
|
||||
return True
|
||||
|
||||
def merge_adjacent_conditions_stack(self,bt_sel):
|
||||
# 只针对第一层合并,之后要考虑层层递归合并
|
||||
bt = ControlBT(type='cond')
|
||||
sbtree = ControlBT(type='?')
|
||||
# gc_node = Leaf(type='cond', content=self.goal, mincost=0) # 为了统一,都成对出现
|
||||
# sbtree.add_child([copy.deepcopy(gc_node)]) # 子树首先保留所扩展结
|
||||
bt.add_child([sbtree])
|
||||
|
||||
parnode = copy.deepcopy(bt_sel.children[0])
|
||||
stack=[]
|
||||
for child in parnode.children:
|
||||
if isinstance(child, ControlBT) and child.type == '>':
|
||||
if stack==[]:
|
||||
stack.append(child)
|
||||
continue
|
||||
# 检查合并的条件,前面一个的条件包含了后面的条件,把包含部分提取出来
|
||||
last_child = stack[-1]
|
||||
if isinstance(last_child, ControlBT) and last_child.type == '>':
|
||||
set1 = last_child.children[0].content
|
||||
set2 = child.children[0].content
|
||||
inter = set1 & set2
|
||||
if inter!=set():
|
||||
c1 = set1-set2
|
||||
c2 = set2-set1
|
||||
inter_node = Leaf(type='cond', content=inter)
|
||||
c1_node = Leaf(type='cond', content=c1)
|
||||
c2_node = Leaf(type='cond', content=c2)
|
||||
a1_node = copy.deepcopy(last_child.children[1])
|
||||
a2_node = copy.deepcopy(child.children[1])
|
||||
|
||||
|
||||
# set1<=set2,此时set2对应的动作永远不会执行
|
||||
if (c1==set() and isinstance(last_child.children[1], Leaf) and isinstance(child.children[1], Leaf) \
|
||||
and isinstance(last_child.children[1].content, Action) and isinstance(child.children[1].content, Action)):
|
||||
continue
|
||||
|
||||
# 再写一个特殊情况处理,三个结点动作last 遇到 两个结点 且动作相同
|
||||
if len(last_child.children)==3 and \
|
||||
isinstance(last_child.children[2], Leaf) and isinstance(child.children[1], Leaf) \
|
||||
and isinstance(last_child.children[2].content, Action) and isinstance( child.children[1].content, Action) \
|
||||
and last_child.children[2].content.name == child.children[1].content.name \
|
||||
and c1==set() and c2!=set():
|
||||
last_child.children[1].add_child([copy.deepcopy(c2_node)])
|
||||
continue
|
||||
elif len(last_child.children)==3:
|
||||
stack.append(child)
|
||||
continue
|
||||
|
||||
# 判断动作相不相同
|
||||
if isinstance(last_child.children[1], Leaf) and isinstance(child.children[1], Leaf) \
|
||||
and isinstance(last_child.children[1].content, Action) and isinstance(child.children[1].content, Action) \
|
||||
and last_child.children[1].content.name == child.children[1].content.name:
|
||||
|
||||
if c2==set():
|
||||
tmp_tree = ControlBT(type='>')
|
||||
tmp_tree.add_child(
|
||||
[copy.deepcopy(inter_node), copy.deepcopy(a1_node)])
|
||||
else:
|
||||
_sel = ControlBT(type='?')
|
||||
_sel.add_child([copy.deepcopy(c1_node), copy.deepcopy(c2_node)])
|
||||
tmp_tree = ControlBT(type='>')
|
||||
tmp_tree.add_child(
|
||||
[copy.deepcopy(inter_node), copy.deepcopy(_sel),copy.deepcopy(a1_node)])
|
||||
else:
|
||||
if c1 == set():
|
||||
seq1 = copy.deepcopy(last_child.children[1])
|
||||
else:
|
||||
seq1 = ControlBT(type='>')
|
||||
seq1.add_child([copy.deepcopy(c1_node), copy.deepcopy(a1_node)])
|
||||
|
||||
if c2 == set():
|
||||
seq2 = copy.deepcopy(child.children[1])
|
||||
else:
|
||||
seq2 = ControlBT(type='>')
|
||||
seq2.add_child([copy.deepcopy(c2_node), copy.deepcopy(a2_node)])
|
||||
sel = ControlBT(type='?')
|
||||
sel.add_child([copy.deepcopy(seq1), copy.deepcopy(seq2)])
|
||||
tmp_tree = ControlBT(type='>')
|
||||
tmp_tree.add_child(
|
||||
[copy.deepcopy(inter_node), copy.deepcopy(sel)])
|
||||
|
||||
stack.pop()
|
||||
stack.append(tmp_tree)
|
||||
|
||||
else:
|
||||
stack.append(child)
|
||||
else:
|
||||
stack.append(child)
|
||||
else:
|
||||
stack.append(child)
|
||||
|
||||
for tree in stack:
|
||||
sbtree.add_child([tree])
|
||||
bt_sel = copy.deepcopy(bt)
|
||||
return bt_sel
|
||||
|
||||
|
||||
|
||||
def print_solution(self):
|
||||
print("========= BT ==========") # 树的bfs遍历
|
||||
nodes_ls = []
|
||||
nodes_ls.append(self.bt)
|
||||
while len(nodes_ls) != 0:
|
||||
parnode = nodes_ls[0]
|
||||
print("Parrent:", parnode.type)
|
||||
for child in parnode.children:
|
||||
if isinstance(child, Leaf):
|
||||
print("---- Leaf:", child.content)
|
||||
elif isinstance(child, ControlBT):
|
||||
print("---- ControlBT:", child.type)
|
||||
nodes_ls.append(child)
|
||||
print()
|
||||
nodes_ls.pop(0)
|
||||
print("========= BT ==========\n")
|
||||
|
||||
# 返回所有能到达目标状态的初始状态
|
||||
def get_all_state_leafs(self):
|
||||
state_leafs=[]
|
||||
|
||||
nodes_ls = []
|
||||
nodes_ls.append(self.bt)
|
||||
while len(nodes_ls) != 0:
|
||||
parnode = nodes_ls[0]
|
||||
for child in parnode.children:
|
||||
if isinstance(child, Leaf):
|
||||
if child.type == "cond":
|
||||
state_leafs.append(child.content)
|
||||
elif isinstance(child, ControlBT):
|
||||
nodes_ls.append(child)
|
||||
nodes_ls.pop(0)
|
||||
|
||||
return state_leafs
|
||||
|
||||
|
||||
# 树的dfs
|
||||
def dfs_ptml(self,parnode,is_root=False):
|
||||
for child in parnode.children:
|
||||
if isinstance(child, Leaf):
|
||||
if child.type == 'cond':
|
||||
|
||||
if is_root and len(child.content) > 1:
|
||||
# 把多个 cond 串起来
|
||||
self.ptml_string += "sequence{\n"
|
||||
self.ptml_string += "cond "
|
||||
c_set_str = '\n cond '.join(map(str, child.content)) + "\n"
|
||||
self.ptml_string += c_set_str
|
||||
self.ptml_string += '}\n'
|
||||
else:
|
||||
self.ptml_string += "cond "
|
||||
c_set_str = '\n cond '.join(map(str, child.content)) + "\n"
|
||||
self.ptml_string += c_set_str
|
||||
|
||||
elif child.type == 'act':
|
||||
if '(' not in child.content.name:
|
||||
self.ptml_string += 'act ' + child.content.name + "()\n"
|
||||
else:
|
||||
self.ptml_string += 'act ' + child.content.name + "\n"
|
||||
elif isinstance(child, ControlBT):
|
||||
if child.type == '?':
|
||||
self.ptml_string += "selector{\n"
|
||||
self.dfs_ptml(parnode=child)
|
||||
elif child.type == '>':
|
||||
self.ptml_string += "sequence{\n"
|
||||
self.dfs_ptml( parnode=child)
|
||||
self.ptml_string += '}\n'
|
||||
|
||||
|
||||
def get_ptml(self):
|
||||
self.ptml_string = "selector{\n"
|
||||
self.dfs_ptml(self.bt.children[0],is_root=True)
|
||||
self.ptml_string += '}\n'
|
||||
return self.ptml_string
|
||||
|
||||
|
||||
def save_ptml_file(self,file_name):
|
||||
self.ptml_string = "selector{\n"
|
||||
self.dfs_ptml(self.bt.children[0])
|
||||
self.ptml_string += '}\n'
|
||||
with open(f'./{file_name}.ptml', 'w') as file:
|
||||
file.write(self.ptml_string)
|
||||
return self.ptml_string
|
After Width: | Height: | Size: 54 KiB |
|
@ -0,0 +1,125 @@
|
|||
|
||||
|
||||
## 代码说明
|
||||
|
||||
### 1. `BehaviorTree.py` 实现行为树叶子结点和非叶子结点的定义
|
||||
|
||||
- **Leaf**:表示叶节点,可以是动作(`act`)或条件(`cond`)。
|
||||
- **ControlBT**:代表可能包含控制节点的行为树。它们可以是选择器(`?`)、序列(`>`)、动作节点(`act`)或条件节点(`cond`)。
|
||||
- 上述两个类都包含 `tick` 方法。
|
||||
|
||||
### 2. `OptimalBTExpansionAlgorithm.py` 实现最优行为树扩展算法
|
||||
|
||||

|
||||
|
||||
定义行动类
|
||||
```python
|
||||
#定义行动类,行动包括前提、增加和删除影响
|
||||
class Action:
|
||||
def __init__(self,name='anonymous action',pre=set(),add=set(),del_set=set(),cost=1):
|
||||
self.pre=copy.deepcopy(pre)
|
||||
self.add=copy.deepcopy(add)
|
||||
self.del_set=copy.deepcopy(del_set)
|
||||
self.name=name
|
||||
self.cost=cost
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
```
|
||||
|
||||
调用算法
|
||||
```python
|
||||
algo = OptBTExpAlgorithm(verbose=True)
|
||||
algo.clear()
|
||||
algo.run_algorithm(start, goal, actions) # 使用算法得到行为树在 algo.bt
|
||||
algo.print_solution() # 打印行为树
|
||||
val, obj = algo.bt.tick(state) # 执行行为树
|
||||
algo.save_ptml_file("bt.ptml") # 保存行为树为 ptml 文件
|
||||
```
|
||||
|
||||
### 3. **`tools.py`** 实现打印数据、行为树测试等模块
|
||||
|
||||
使用方法
|
||||
|
||||
```python
|
||||
print_action_data_table(goal,start,actions) # 打印所有变量
|
||||
|
||||
# 行为树鲁棒性测试,随机生成规划问题
|
||||
# 设置生成规划问题集的超参数:文字数、解深度、迭代次数
|
||||
seed=1
|
||||
literals_num=10
|
||||
depth = 10
|
||||
iters= 10
|
||||
BTTest(seed=seed,literals_num=literals_num,depth=depth,iters=iters)
|
||||
```
|
||||
|
||||
### 4. `example.py` 中设计规划案例 goals, start, actions
|
||||
|
||||
```python
|
||||
def MoveBtoB ():
|
||||
actions=[]
|
||||
a = Action(name="Move(b,ab)")
|
||||
a.pre={'Free(ab)','WayClear'}
|
||||
a.add={'At(b,ab)'}
|
||||
a.del_set= {'Free(ab)','At(b,pb)'}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
a=Action(name="Move(s,ab)")
|
||||
a.pre={'Free(ab)'}
|
||||
a.add={'Free(ab)','WayClear'}
|
||||
a.del_set={'Free(ab)','At(s,ps)'}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
a=Action(name="Move(s,as)")
|
||||
a.pre={'Free(as)'}
|
||||
a.add={'At(s,ps)','WayClear'}
|
||||
a.del_set={'Free(as)','At(s,ps)'}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
start = {'Free(ab)','Free(as)','At(b,pb)','At(s,ps)'}
|
||||
goal= {'At(b,ab)'}
|
||||
return goal,start,actions
|
||||
```
|
||||
|
||||
### 5. `opt_bt_exp_main.py` 为主函数,在此演示如何调用最优行为树扩展算法得到完全扩展最优行为树
|
||||
|
||||
初始化的时候:传入 actions (包含 pre,add,del,cost).
|
||||
调用的时候,传入 goal 状态集合 (set类型),返回完全最优扩展行为树的 ptml 形式 (string类型)
|
||||
|
||||
```python
|
||||
actions=[
|
||||
Action(name='PutDown(Table,Coffee)', pre={'Holding(Coffee)','At(Robot,Table)'}, add={'At(Table,Coffee)','NotHolding'}, del_set={'Holding(Coffee)'}, cost=1)
|
||||
…………
|
||||
]
|
||||
algo = BTOptExpInterface(actions)
|
||||
|
||||
goal = {'At(Table,Coffee)'}
|
||||
ptml_string = algo.process(goal,start)
|
||||
print(ptml_string)
|
||||
|
||||
```
|
||||
两种检测方法,用于检测当前状态 `start` 能否到达目标状态 `goal`
|
||||
|
||||
```python
|
||||
# 判断初始状态能否到达目标状态
|
||||
start = {'At(Robot,Bar)', 'Holding(VacuumCup)', 'Available(Table)', 'Available(CoffeeMachine)','Available(FrontDesk)'}
|
||||
|
||||
# 方法一:算法返回所有可能的初始状态,在里面看看有没有对应的初始状态
|
||||
right_bt = algo.find_all_leaf_states_contain_start(start)
|
||||
if not right_bt:
|
||||
print("ERROR1: The current state cannot reach the goal state!")
|
||||
else:
|
||||
print("Right1: The current state can reach the goal state!")
|
||||
|
||||
# 方法二:预先跑一边行为树,看能否到达目标状态
|
||||
right_bt2 = algo.run_bt_from_start(goal,start)
|
||||
if not right_bt2:
|
||||
print("ERROR2: The current state cannot reach the goal state!")
|
||||
else:
|
||||
print("Right2: The current state can reach the goal state!")
|
||||
|
||||
```
|
||||
|
|
@ -0,0 +1,174 @@
|
|||
|
||||
from robowaiter.behavior_tree.obtea.OptimalBTExpansionAlgorithm import Action
|
||||
|
||||
|
||||
|
||||
def MakeCoffee():
|
||||
actions=[
|
||||
Action(name='Put(Table,Coffee)', pre={'Holding(Coffee)','At(Table)'}, add={'At(Table,Coffee)','NotHolding'}, del_set={'Holding(Coffee)'}, cost=1),
|
||||
Action(name='Put(Table,VacuumCup)', pre={'Holding(VacuumCup)','At(Table)'}, add={'At(Table,VacuumCup)','NotHolding'}, del_set={'Holding(VacuumCup)'}, cost=1),
|
||||
|
||||
Action(name='Grasp(Coffee)', pre={'NotHolding','At(Coffee)'}, add={'Holding(Coffee)'}, del_set={'NotHolding'}, cost=1),
|
||||
|
||||
Action(name='MoveTo(Table)', pre={'Exist(Table)'}, add={'At(Table)'}, del_set={'At(FrontDesk)','At(Coffee)','At(CoffeeMachine)'}, cost=1),
|
||||
Action(name='MoveTo(Coffee)', pre={'Exist(Coffee)'}, add={'At(Coffee)'}, del_set={'At(FrontDesk)','At(Table)','At(CoffeeMachine)'}, cost=1),
|
||||
Action(name='MoveTo(CoffeeMachine)', pre={'Exist(CoffeeMachine)'}, add={'At(CoffeeMachine)'}, del_set={'At(FrontDesk)','At(Coffee)','At(Table)'}, cost=1),
|
||||
|
||||
Action(name='OpCoffeeMachine', pre={'At(CoffeeMachine)','NotHolding'}, add={'Exist(Coffee)','At(Coffee)'}, del_set=set(), cost=1),
|
||||
]
|
||||
|
||||
start = {'At(FrontDesk)','Holding(VacuumCup)','Exist(Table)','Exist(CoffeeMachine)','Exist(FrontDesk)'}
|
||||
goal = {'At(Table,Coffee)'}
|
||||
return goal,start,actions
|
||||
|
||||
# 本例子中,将 VacuumCup 放到 FrontDesk,比 MoveTo(Table) 再 Put(Table,VacuumCup) 的 cost 要小
|
||||
def MakeCoffeeCost():
|
||||
actions=[
|
||||
Action(name='PutDown(Table,Coffee)', pre={'Holding(Coffee)','At(Robot,Table)'}, add={'At(Table,Coffee)','NotHolding'}, del_set={'Holding(Coffee)'}, cost=1),
|
||||
Action(name='PutDown(Table,VacuumCup)', pre={'Holding(VacuumCup)','At(Robot,Table)'}, add={'At(Table,VacuumCup)','NotHolding'}, del_set={'Holding(VacuumCup)'}, cost=1),
|
||||
|
||||
Action(name='PickUp(Coffee)', pre={'NotHolding','At(Robot,Coffee)'}, add={'Holding(Coffee)'}, del_set={'NotHolding'}, cost=1),
|
||||
|
||||
Action(name='MoveTo(Table)', pre={'Available(Table)'}, add={'At(Robot,Table)'}, del_set={'At(Robot,FrontDesk)','At(Robot,Coffee)','At(Robot,CoffeeMachine)'}, cost=1),
|
||||
Action(name='MoveTo(Coffee)', pre={'Available(Coffee)'}, add={'At(Robot,Coffee)'}, del_set={'At(Robot,FrontDesk)','At(Robot,Table)','At(Robot,CoffeeMachine)'}, cost=1),
|
||||
Action(name='MoveTo(CoffeeMachine)', pre={'Available(CoffeeMachine)'}, add={'At(Robot,CoffeeMachine)'}, del_set={'At(Robot,FrontDesk)','At(Robot,Coffee)','At(Robot,Table)'}, cost=1),
|
||||
|
||||
Action(name='OpCoffeeMachine', pre={'At(Robot,CoffeeMachine)','NotHolding'}, add={'Available(Coffee)','At(Robot,Coffee)'}, del_set=set(), cost=1),
|
||||
]
|
||||
|
||||
start = {'At(Robot,Bar)','Holding(VacuumCup)','Available(Table)','Available(CoffeeMachine)','Available(FrontDesk)'}
|
||||
goal = {'At(Table,Coffee)'}
|
||||
|
||||
return goal,start,actions
|
||||
|
||||
|
||||
# test
|
||||
def Test():
|
||||
actions=[
|
||||
Action(name='a1', pre={6}, add={0,2,4}, del_set={1,5}, cost=1),
|
||||
Action(name='a2', pre=set(), add={0,1}, del_set=set(), cost=1),
|
||||
Action(name='a3', pre={1,6}, add={0,2,3,5}, del_set={1,6}, cost=1),
|
||||
Action(name='a4', pre={0,2,3}, add={4,5}, del_set={0,6}, cost=1),
|
||||
Action(name='a5', pre={0,1,4}, add={2,3,6}, del_set={0}, cost=1),
|
||||
]
|
||||
|
||||
start = {1,2,6}
|
||||
goal={0,1,2,4,6}
|
||||
return goal,start,actions
|
||||
|
||||
# def Test():
|
||||
# actions=[
|
||||
# Action(name='a1', pre={2}, add={1}, del_set=set(), cost=1),
|
||||
# Action(name='a2', pre=set(), add={1}, del_set={0,2}, cost=1),
|
||||
# Action(name='a3', pre={1}, add=set(), del_set={0,2}, cost=1),
|
||||
# Action(name='a4', pre=set(), add={0}, del_set=set(), cost=1),
|
||||
# Action(name='a5', pre={1}, add={0,2}, del_set={1}, cost=1),
|
||||
# Action(name='a6', pre={1}, add=set(), del_set={0,1,2}, cost=1),
|
||||
# Action(name='a7', pre={1}, add={2}, del_set={0, 2}, cost=1),
|
||||
# ]
|
||||
#
|
||||
# start = {1,2}
|
||||
# goal={0,1}
|
||||
# return goal,start,actions
|
||||
|
||||
|
||||
# todo: 最原始的例子
|
||||
def MoveBtoB_num ():
|
||||
actions=[]
|
||||
a = Action(name='a1')
|
||||
a.pre={1,4}
|
||||
a.add={"c_goal"}
|
||||
a.del_set={1,4}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
a=Action(name='a2')
|
||||
a.pre={1,2,3}
|
||||
a.add={"c_goal"}
|
||||
a.del_set={1,2,3}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
a=Action(name='a3')
|
||||
a.pre={1,2}
|
||||
a.add={4}
|
||||
a.del_set={2}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
a=Action(name='a4')
|
||||
a.pre={"c_start"}
|
||||
a.add={1,2,3}
|
||||
a.del_set={"c_start",4}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
start = {"c_start"}
|
||||
goal={"c_goal"}
|
||||
return goal,start,actions
|
||||
|
||||
|
||||
# todo: 最原始的例子
|
||||
def MoveBtoB ():
|
||||
actions=[]
|
||||
a = Action(name="Move(b,ab)") #'movebtob'
|
||||
a.pre={'Free(ab)','WayClear'} #{1,2}
|
||||
a.add={'At(b,ab)'} #{3}
|
||||
a.del_set= {'Free(ab)','At(b,pb)'} #{1,4}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
a=Action(name="Move(s,ab)") #'moveatob'
|
||||
a.pre={'Free(ab)'} #{1}
|
||||
a.add={'Free(ab)','WayClear'} #{5,2}
|
||||
a.del_set={'Free(ab)','At(s,ps)'} #{1,6}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
a=Action(name="Move(s,as)") #'moveatoa'
|
||||
a.pre={'Free(as)'} #{7}
|
||||
a.add={'At(s,ps)','WayClear'} #{8,2}
|
||||
a.del_set={'Free(as)','At(s,ps)'} #{7,6}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
start = {'Free(ab)','Free(as)','At(b,pb)','At(s,ps)'} #{1,7,4,6}
|
||||
goal= {'At(b,ab)'} #{3}
|
||||
return goal,start,actions
|
||||
|
||||
|
||||
# 小蔡师兄论文里的例子
|
||||
def Cond2BelongsToCond3():
|
||||
actions=[]
|
||||
a = Action(name='a1')
|
||||
a.pre={1,4}
|
||||
a.add={"c_goal"}
|
||||
a.del_set={1,4}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
a=Action(name='a2')
|
||||
a.pre={1,2,3}
|
||||
a.add={"c_goal"}
|
||||
a.del_set={1,2,3}
|
||||
a.cost = 100
|
||||
actions.append(a)
|
||||
|
||||
a=Action(name='a3')
|
||||
a.pre={1,2}
|
||||
a.add={4}
|
||||
a.del_set={2}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
a=Action(name='a4')
|
||||
a.pre={"c_start"}
|
||||
a.add={1,2,3}
|
||||
a.del_set={"c_start",4}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
start = {"c_start"}
|
||||
goal={"c_goal"}
|
||||
return goal,start,actions
|
||||
|
|
@ -0,0 +1,131 @@
|
|||
|
||||
from robowaiter.behavior_tree.obtea.OptimalBTExpansionAlgorithm import Action,OptBTExpAlgorithm,state_transition # 调用最优行为树扩展算法
|
||||
from robowaiter.behavior_tree.obtea.BTExpansionAlgorithm import BTalgorithm # 调用最优行为树扩展算法
|
||||
|
||||
from robowaiter.behavior_tree.obtea.examples import *
|
||||
|
||||
|
||||
# 封装好的主接口
|
||||
class BTOptExpInterface:
|
||||
def __init__(self, action_list,scene):
|
||||
"""
|
||||
Initialize the BTOptExpansion with a list of actions.
|
||||
:param action_list: A list of actions to be used in the behavior tree.
|
||||
"""
|
||||
# self.actions = []
|
||||
# for act in action_list:
|
||||
# a = Action(name=act.name)
|
||||
# a.pre=act['pre']
|
||||
# a.add=act['add']
|
||||
# a.del_set= act['del_set']
|
||||
# a.cost = 1
|
||||
# self.actions.append(a)
|
||||
self.actions = action_list
|
||||
self.has_processed = False
|
||||
|
||||
self.scene = scene
|
||||
self.bt_algo_opt = self.scene.bt_algo_opt
|
||||
|
||||
|
||||
def process(self, goal):
|
||||
"""
|
||||
Process the input sets and return a string result.
|
||||
:param input_set: The set of goal states and the set of initial states.
|
||||
:return: A PTML string representing the outcome of the behavior tree.
|
||||
"""
|
||||
self.goal = goal
|
||||
if self.bt_algo_opt:
|
||||
self.algo = OptBTExpAlgorithm(verbose=False)
|
||||
else:
|
||||
self.algo = BTalgorithm(verbose=False)
|
||||
|
||||
self.algo.clear()
|
||||
self.algo.run_algorithm(self.scene.state["condition_set"],self.goal, self.actions) # 调用算法得到行为树保存至 algo.bt
|
||||
|
||||
|
||||
self.ptml_string = self.algo.get_ptml()
|
||||
self.has_processed = True
|
||||
# algo.print_solution() # print behavior tree
|
||||
|
||||
return self.ptml_string
|
||||
|
||||
# 方法一:查找所有初始状态是否包含当前状态
|
||||
def find_all_leaf_states_contain_start(self,start):
|
||||
if not self.has_processed:
|
||||
raise RuntimeError("The process method must be called before find_all_leaf_states_contain_start!")
|
||||
# 返回所有能到达目标状态的初始状态
|
||||
state_leafs = self.algo.get_all_state_leafs()
|
||||
for state in state_leafs:
|
||||
if start >= state:
|
||||
return True
|
||||
return False
|
||||
|
||||
# 方法二:模拟跑一遍行为树,看 start 能够通过执行一系列动作到达 goal
|
||||
def run_bt_from_start(self,goal,start):
|
||||
if not self.has_processed:
|
||||
raise RuntimeError("The process method must be called before run_bt_from_start!")
|
||||
# 检查是否能到达目标
|
||||
right_bt = True
|
||||
state = start
|
||||
steps = 0
|
||||
val, obj = self.algo.bt.tick(state)
|
||||
while val != 'success' and val != 'failure':
|
||||
state = state_transition(state, obj)
|
||||
val, obj = self.algo.bt.tick(state)
|
||||
if (val == 'failure'):
|
||||
# print("bt fails at step", steps)
|
||||
right_bt = False
|
||||
steps += 1
|
||||
if not goal <= state:
|
||||
# print("wrong solution", steps)
|
||||
right_bt = False
|
||||
else:
|
||||
pass
|
||||
# print("right solution", steps)
|
||||
return right_bt
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__' :
|
||||
|
||||
# todo: Example Cafe
|
||||
# todo: Define goal, start, actions
|
||||
actions=[
|
||||
Action(name='PutDown(Table,Coffee)', pre={'Holding(Coffee)','At(Robot,Table)'}, add={'At(Table,Coffee)','NotHolding'}, del_set={'Holding(Coffee)'}, cost=1),
|
||||
Action(name='PutDown(Table,VacuumCup)', pre={'Holding(VacuumCup)','At(Robot,Table)'}, add={'At(Table,VacuumCup)','NotHolding'}, del_set={'Holding(VacuumCup)'}, cost=1),
|
||||
|
||||
Action(name='PickUp(Coffee)', pre={'NotHolding','At(Robot,Coffee)'}, add={'Holding(Coffee)'}, del_set={'NotHolding'}, cost=1),
|
||||
|
||||
Action(name='MoveTo(Table)', pre={'Available(Table)'}, add={'At(Robot,Table)'}, del_set={'At(Robot,FrontDesk)','At(Robot,Coffee)','At(Robot,CoffeeMachine)'}, cost=1),
|
||||
Action(name='MoveTo(Coffee)', pre={'Available(Coffee)'}, add={'At(Robot,Coffee)'}, del_set={'At(Robot,FrontDesk)','At(Robot,Table)','At(Robot,CoffeeMachine)'}, cost=1),
|
||||
Action(name='MoveTo(CoffeeMachine)', pre={'Available(CoffeeMachine)'}, add={'At(Robot,CoffeeMachine)'}, del_set={'At(Robot,FrontDesk)','At(Robot,Coffee)','At(Robot,Table)'}, cost=1),
|
||||
|
||||
Action(name='OpCoffeeMachine', pre={'At(Robot,CoffeeMachine)','NotHolding'}, add={'Available(Coffee)','At(Robot,Coffee)'}, del_set=set(), cost=1),
|
||||
]
|
||||
algo = BTOptExpInterface(actions)
|
||||
|
||||
|
||||
goal = {'At(Table,Coffee)'}
|
||||
ptml_string = algo.process(goal)
|
||||
print(ptml_string)
|
||||
|
||||
file_name = "sub_task"
|
||||
with open(f'./{file_name}.ptml', 'w') as file:
|
||||
file.write(ptml_string)
|
||||
|
||||
|
||||
# 判断初始状态能否到达目标状态
|
||||
start = {'At(Robot,Bar)', 'Holding(VacuumCup)', 'Available(Table)', 'Available(CoffeeMachine)','Available(FrontDesk)'}
|
||||
# 方法一:算法返回所有可能的初始状态,在里面看看有没有对应的初始状态
|
||||
right_bt = algo.find_all_leaf_states_contain_start(start)
|
||||
if not right_bt:
|
||||
print("ERROR1: The current state cannot reach the goal state!")
|
||||
else:
|
||||
print("Right1: The current state can reach the goal state!")
|
||||
# 方法二:预先跑一边行为树,看能否到达目标状态
|
||||
right_bt2 = algo.run_bt_from_start(goal,start)
|
||||
if not right_bt2:
|
||||
print("ERROR2: The current state cannot reach the goal state!")
|
||||
else:
|
||||
print("Right2: The current state can reach the goal state!")
|
|
@ -0,0 +1,167 @@
|
|||
|
||||
|
||||
from tabulate import tabulate
|
||||
import numpy as np
|
||||
import random
|
||||
from robowaiter.behavior_tree.obtea.OptimalBTExpansionAlgorithm import Action,OptBTExpAlgorithm
|
||||
import time
|
||||
|
||||
|
||||
def print_action_data_table(goal,start,actions):
|
||||
data = []
|
||||
for a in actions:
|
||||
data.append([a.name , a.pre , a.add , a.del_set , a.cost])
|
||||
data.append(["Goal" ,goal ," " ,"Start" ,start])
|
||||
print(tabulate(data, headers=["Name", "Pre", "Add" ,"Del" ,"Cost"], tablefmt="fancy_grid")) # grid plain simple github fancy_grid
|
||||
|
||||
|
||||
# 从状态随机生成一个行动
|
||||
def generate_from_state(act,state,num):
|
||||
for i in range(0,num):
|
||||
if i in state:
|
||||
if random.random() >0.5:
|
||||
act.pre.add(i)
|
||||
if random.random() >0.5:
|
||||
act.del_set.add(i)
|
||||
continue
|
||||
if random.random() > 0.5:
|
||||
act.add.add(i)
|
||||
continue
|
||||
if random.random() >0.5:
|
||||
act.del_set.add(i)
|
||||
|
||||
def print_action(act):
|
||||
print (act.pre)
|
||||
print(act.add)
|
||||
print(act.del_set)
|
||||
|
||||
|
||||
|
||||
#行为树测试代码
|
||||
def BTTest(seed=1,literals_num=10,depth=10,iters=10,total_count=1000):
|
||||
print("============= BT Test ==============")
|
||||
random.seed(seed)
|
||||
# 设置生成规划问题集的超参数:文字数、解深度、迭代次数
|
||||
literals_num=literals_num
|
||||
depth = depth
|
||||
iters= iters
|
||||
total_tree_size = []
|
||||
total_action_num = []
|
||||
total_state_num = []
|
||||
total_steps_num=[]
|
||||
#fail_count=0
|
||||
#danger_count=0
|
||||
success_count =0
|
||||
failure_count = 0
|
||||
planning_time_total = 0.0
|
||||
# 实验1000次
|
||||
for count in range (total_count):
|
||||
|
||||
action_num = 1
|
||||
|
||||
# 生成一个规划问题,包括随机的状态和行动,以及目标状态
|
||||
states = []
|
||||
actions = []
|
||||
start = generate_random_state(literals_num)
|
||||
state = start
|
||||
states.append(state)
|
||||
#print (state)
|
||||
for i in range (0,depth):
|
||||
a = Action()
|
||||
generate_from_state(a,state,literals_num)
|
||||
if not a in actions:
|
||||
a.name = "a"+str(action_num)
|
||||
action_num+=1
|
||||
actions.append(a)
|
||||
state = state_transition(state,a)
|
||||
if state in states:
|
||||
pass
|
||||
else:
|
||||
states.append(state)
|
||||
#print(state)
|
||||
|
||||
goal = states[-1]
|
||||
state = start
|
||||
for i in range (0,iters):
|
||||
a = Action()
|
||||
generate_from_state(a,state,literals_num)
|
||||
if not a in actions:
|
||||
a.name = "a"+str(action_num)
|
||||
action_num+=1
|
||||
actions.append(a)
|
||||
state = state_transition(state,a)
|
||||
if state in states:
|
||||
pass
|
||||
else:
|
||||
states.append(state)
|
||||
state = random.sample(states,1)[0]
|
||||
|
||||
# 选择测试本文算法btalgorithm,或对比算法weakalgorithm
|
||||
algo = OptBTExpAlgorithm()
|
||||
#algo = Weakalgorithm()
|
||||
start_time = time.time()
|
||||
# print_action_data_table(goal, start, list(actions))
|
||||
if algo.run_algorithm(start, goal, actions):#运行算法,规划后行为树为algo.bt
|
||||
total_tree_size.append( algo.bt.count_size()-1)
|
||||
# algo.print_solution() # 打印行为树
|
||||
else:
|
||||
print ("error")
|
||||
end_time = time.time()
|
||||
planning_time_total += (end_time-start_time)
|
||||
|
||||
#开始从初始状态运行行为树,测试
|
||||
state=start
|
||||
steps=0
|
||||
val, obj = algo.bt.tick(state)#tick行为树,obj为所运行的行动
|
||||
while val !='success' and val !='failure':#运行直到行为树成功或失败
|
||||
state = state_transition(state,obj)
|
||||
val, obj = algo.bt.tick(state)
|
||||
if(val == 'failure'):
|
||||
print("bt fails at step",steps)
|
||||
steps+=1
|
||||
if(steps>=500):#至多运行500步
|
||||
break
|
||||
if not goal <= state:#错误解,目标条件不在执行后状态满足
|
||||
#print ("wrong solution",steps)
|
||||
failure_count+=1
|
||||
|
||||
else:#正确解,满足目标条件
|
||||
#print ("right solution",steps)
|
||||
success_count+=1
|
||||
total_steps_num.append(steps)
|
||||
algo.clear()
|
||||
total_action_num.append(len(actions))
|
||||
total_state_num.append(len(states))
|
||||
|
||||
print ("success:",success_count,"failure:",failure_count)#算法成功和失败次数
|
||||
print("Total Tree Size: mean=",np.mean(total_tree_size), "std=",np.std(total_tree_size, ddof=1))#1000次测试树大小
|
||||
print ("Total Steps Num: mean=",np.mean(total_steps_num),"std=",np.std(total_steps_num,ddof=1))
|
||||
print ("Average number of states:",np.mean(total_state_num))#1000次问题的平均状态数
|
||||
print ("Average number of actions",np.mean(total_action_num))#1000次问题的平均行动数
|
||||
print("Planning Time Total:",planning_time_total,planning_time_total/1000.0)
|
||||
print("============ End BT Test ===========")
|
||||
|
||||
# xiao cai
|
||||
# success: 1000 failure: 0
|
||||
# Total Tree Size: mean= 35.303 std= 29.71336526001515
|
||||
# Total Steps Num: mean= 1.898 std= 0.970844240101644
|
||||
# Average number of states: 20.678
|
||||
# Average number of actions 20.0
|
||||
# Planning Time Total: 0.6280641555786133 0.0006280641555786133
|
||||
|
||||
# our start
|
||||
# success: 1000 failure: 0
|
||||
# Total Tree Size: mean= 17.945 std= 12.841997192488865
|
||||
# Total Steps Num: mean= 1.785 std= 0.8120556843187752
|
||||
# Average number of states: 20.678
|
||||
# Average number of actions 20.0
|
||||
# Planning Time Total: 1.4748523235321045 0.0014748523235321046
|
||||
|
||||
# our
|
||||
# success: 1000 failure: 0
|
||||
# Total Tree Size: mean= 48.764 std= 20.503626574406358
|
||||
# Total Steps Num: mean= 1.785 std= 0.8120556843187752
|
||||
# Average number of states: 20.678
|
||||
# Average number of actions 20.0
|
||||
# Planning Time Total: 3.3271877765655518 0.0033271877765655516
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
cd ./robowaiter/behavior_tree/ptml
|
||||
antlr4 -Dlanguage=Python3 ptml.g4
|
|
@ -0,0 +1,20 @@
|
|||
grammar ptml;
|
||||
|
||||
root : tree+ EOF;
|
||||
|
||||
tree : internal_node '{' (action_sign|tree)* '}' ;
|
||||
internal_node : 'sequence' | 'selector' | 'parallel' Integer ;
|
||||
action_sign : ('act'|'cond') String '(' action_parm? ')';
|
||||
action_parm : (Integer|Float|boolean|String) (',' (Integer|Float|boolean|String))* ;
|
||||
// var_decls : var_type Names ;
|
||||
// var_type : 'int' | 'float' | 'bool' | 'string' ;
|
||||
boolean : 'True' | 'False' ;
|
||||
|
||||
String : [a-zA-Z_][a-zA-Z_0-9]* ;
|
||||
Integer : '-'?[1-9][0-9]* | '0' ;
|
||||
Float : [0-9]+'.'[0-9]* | '.'[0-9]+ ;
|
||||
|
||||
// comments
|
||||
LINE_COMMENT : '//' .*? '\r'?'\n' -> skip ;
|
||||
// useless
|
||||
WS : [ \t\u000C\r\n]+ -> skip ;
|
|
@ -0,0 +1,51 @@
|
|||
token literal names:
|
||||
null
|
||||
'{'
|
||||
'}'
|
||||
'sequence'
|
||||
'selector'
|
||||
'parallel'
|
||||
'act'
|
||||
'cond'
|
||||
'('
|
||||
')'
|
||||
','
|
||||
'True'
|
||||
'False'
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
|
||||
token symbolic names:
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
String
|
||||
Integer
|
||||
Float
|
||||
LINE_COMMENT
|
||||
WS
|
||||
|
||||
rule names:
|
||||
root
|
||||
tree
|
||||
internal_node
|
||||
action_sign
|
||||
action_parm
|
||||
boolean
|
||||
|
||||
|
||||
atn:
|
||||
[4, 1, 17, 65, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 1, 0, 4, 0, 14, 8, 0, 11, 0, 12, 0, 15, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 24, 8, 1, 10, 1, 12, 1, 27, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 35, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 41, 8, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 49, 8, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 56, 8, 4, 5, 4, 58, 8, 4, 10, 4, 12, 4, 61, 9, 4, 1, 5, 1, 5, 1, 5, 0, 0, 6, 0, 2, 4, 6, 8, 10, 0, 2, 1, 0, 6, 7, 1, 0, 11, 12, 71, 0, 13, 1, 0, 0, 0, 2, 19, 1, 0, 0, 0, 4, 34, 1, 0, 0, 0, 6, 36, 1, 0, 0, 0, 8, 48, 1, 0, 0, 0, 10, 62, 1, 0, 0, 0, 12, 14, 3, 2, 1, 0, 13, 12, 1, 0, 0, 0, 14, 15, 1, 0, 0, 0, 15, 13, 1, 0, 0, 0, 15, 16, 1, 0, 0, 0, 16, 17, 1, 0, 0, 0, 17, 18, 5, 0, 0, 1, 18, 1, 1, 0, 0, 0, 19, 20, 3, 4, 2, 0, 20, 25, 5, 1, 0, 0, 21, 24, 3, 6, 3, 0, 22, 24, 3, 2, 1, 0, 23, 21, 1, 0, 0, 0, 23, 22, 1, 0, 0, 0, 24, 27, 1, 0, 0, 0, 25, 23, 1, 0, 0, 0, 25, 26, 1, 0, 0, 0, 26, 28, 1, 0, 0, 0, 27, 25, 1, 0, 0, 0, 28, 29, 5, 2, 0, 0, 29, 3, 1, 0, 0, 0, 30, 35, 5, 3, 0, 0, 31, 35, 5, 4, 0, 0, 32, 33, 5, 5, 0, 0, 33, 35, 5, 14, 0, 0, 34, 30, 1, 0, 0, 0, 34, 31, 1, 0, 0, 0, 34, 32, 1, 0, 0, 0, 35, 5, 1, 0, 0, 0, 36, 37, 7, 0, 0, 0, 37, 38, 5, 13, 0, 0, 38, 40, 5, 8, 0, 0, 39, 41, 3, 8, 4, 0, 40, 39, 1, 0, 0, 0, 40, 41, 1, 0, 0, 0, 41, 42, 1, 0, 0, 0, 42, 43, 5, 9, 0, 0, 43, 7, 1, 0, 0, 0, 44, 49, 5, 14, 0, 0, 45, 49, 5, 15, 0, 0, 46, 49, 3, 10, 5, 0, 47, 49, 5, 13, 0, 0, 48, 44, 1, 0, 0, 0, 48, 45, 1, 0, 0, 0, 48, 46, 1, 0, 0, 0, 48, 47, 1, 0, 0, 0, 49, 59, 1, 0, 0, 0, 50, 55, 5, 10, 0, 0, 51, 56, 5, 14, 0, 0, 52, 56, 5, 15, 0, 0, 53, 56, 3, 10, 5, 0, 54, 56, 5, 13, 0, 0, 55, 51, 1, 0, 0, 0, 55, 52, 1, 0, 0, 0, 55, 53, 1, 0, 0, 0, 55, 54, 1, 0, 0, 0, 56, 58, 1, 0, 0, 0, 57, 50, 1, 0, 0, 0, 58, 61, 1, 0, 0, 0, 59, 57, 1, 0, 0, 0, 59, 60, 1, 0, 0, 0, 60, 9, 1, 0, 0, 0, 61, 59, 1, 0, 0, 0, 62, 63, 7, 1, 0, 0, 63, 11, 1, 0, 0, 0, 8, 15, 23, 25, 34, 40, 48, 55, 59]
|
|
@ -0,0 +1,29 @@
|
|||
T__0=1
|
||||
T__1=2
|
||||
T__2=3
|
||||
T__3=4
|
||||
T__4=5
|
||||
T__5=6
|
||||
T__6=7
|
||||
T__7=8
|
||||
T__8=9
|
||||
T__9=10
|
||||
T__10=11
|
||||
T__11=12
|
||||
String=13
|
||||
Integer=14
|
||||
Float=15
|
||||
LINE_COMMENT=16
|
||||
WS=17
|
||||
'{'=1
|
||||
'}'=2
|
||||
'sequence'=3
|
||||
'selector'=4
|
||||
'parallel'=5
|
||||
'act'=6
|
||||
'cond'=7
|
||||
'('=8
|
||||
')'=9
|
||||
','=10
|
||||
'True'=11
|
||||
'False'=12
|
|
@ -0,0 +1,208 @@
|
|||
import os
|
||||
import sys
|
||||
from antlr4 import *
|
||||
|
||||
if "." in __name__:
|
||||
from .ptmlTranslator import ptmlTranslator
|
||||
from .ptmlParser import ptmlParser as Parser
|
||||
from .ptmlLexer import ptmlLexer as Lexer
|
||||
|
||||
else:
|
||||
from ptmlTranslator import ptmlTranslator
|
||||
from ptmlParser import ptmlParser as Parser
|
||||
from ptmlLexer import ptmlLexer as Lexer
|
||||
|
||||
|
||||
def load(scene, ptml_path: str, behaviour_lib_path: str):
|
||||
"""_summary_
|
||||
|
||||
Args:
|
||||
ptml_path (str): _description_
|
||||
behaviour_lib_path (str): _description_
|
||||
|
||||
Raises:
|
||||
FileNotFoundError: _description_
|
||||
FileNotFoundError: _description_
|
||||
"""
|
||||
# error handle
|
||||
if not os.path.exists(ptml_path):
|
||||
raise FileNotFoundError("Given a fault ptml path: {}".format(ptml_path))
|
||||
if not os.path.exists(behaviour_lib_path):
|
||||
raise FileNotFoundError(
|
||||
"Given a fault behaviour library path: {}".format(behaviour_lib_path)
|
||||
)
|
||||
|
||||
# noting fault, go next
|
||||
ptml_path = format_trans_to_bracket(ptml_path)
|
||||
# print(ptml_path)
|
||||
input_stream = FileStream(ptml_path, encoding="utf-8")
|
||||
|
||||
lexer = Lexer(input_stream)
|
||||
stream = CommonTokenStream(lexer)
|
||||
parser = Parser(stream)
|
||||
tree = parser.root()
|
||||
|
||||
walker = ParseTreeWalker()
|
||||
|
||||
sys.path.append(os.path.join(behaviour_lib_path, "cond"))
|
||||
sys.path.append(os.path.join(behaviour_lib_path, "act"))
|
||||
|
||||
ptml = ptmlTranslator(scene, behaviour_lib_path) # listener mode
|
||||
walker.walk(ptml, tree)
|
||||
|
||||
return ptml.bt_root
|
||||
|
||||
def parse_indentation(text):
|
||||
tree = {}
|
||||
stack = [(-1, tree)] # 使用栈来跟踪节点层级和父节点
|
||||
|
||||
for line in text.splitlines():
|
||||
indent = len(line) - len(line.lstrip())
|
||||
content = line.strip()
|
||||
|
||||
if not content:
|
||||
continue # 跳过空行
|
||||
|
||||
# 找到当前行的父级
|
||||
while stack and stack[-1][0] >= indent:
|
||||
stack.pop()
|
||||
|
||||
# 确保栈不为空
|
||||
if not stack:
|
||||
raise ValueError("缩进错误")
|
||||
|
||||
# 检查当前行是否已存在于父级中
|
||||
parent = stack[-1][1]
|
||||
if content not in parent:
|
||||
parent[content] = []
|
||||
|
||||
# 添加新节点
|
||||
node = {}
|
||||
parent[content].append(node)
|
||||
stack.append((indent, node))
|
||||
|
||||
return tree
|
||||
|
||||
def format_nested_dict(d, indent=0, outermost=True):
|
||||
""" 格式化嵌套字典为特定字符串格式,如果没有子级就不添加大括号 """
|
||||
indention = " " * indent # 用空格表示缩进
|
||||
formatted_str = ""
|
||||
|
||||
if (not outermost) and d: # 添加大括号,除非是空字典
|
||||
formatted_str += "{\n"
|
||||
|
||||
for key, value_list in d.items():
|
||||
for value in value_list: # 遍历列表中的每个字典
|
||||
formatted_str += f"{indention}{' ' if (not outermost) and d else ''}{key}\n"
|
||||
|
||||
if isinstance(value, dict):
|
||||
# 如果值是字典,则递归调用
|
||||
formatted_str += format_nested_dict(value, indent + (0 if outermost else 1), False)
|
||||
else:
|
||||
# 否则,直接添加值
|
||||
formatted_str += f"{indention}{' ' * 2}{value}\n"
|
||||
|
||||
if (not outermost) and d: # 如果不是空字典,才关闭大括号
|
||||
formatted_str += indention + "}\n"
|
||||
|
||||
return formatted_str.strip()
|
||||
|
||||
def format_trans_to_bracket(file_path: str) -> str:
|
||||
"""_summary_
|
||||
|
||||
Args:
|
||||
file_path (str): _description_
|
||||
|
||||
Raises:
|
||||
FileNotFoundError: _description_
|
||||
|
||||
Returns:
|
||||
str: the path tp temp file with '{}' form.
|
||||
"""
|
||||
import autopep8
|
||||
|
||||
if not os.path.exists(file_path):
|
||||
raise FileNotFoundError("Given a fault ptml path: {}".format(file_path))
|
||||
|
||||
with open(file_path, 'r') as file:
|
||||
f = file.read().strip()
|
||||
if "{" in f:
|
||||
return file_path
|
||||
|
||||
parsed_tree = parse_indentation(f)
|
||||
|
||||
formatted_output = format_nested_dict(parsed_tree)
|
||||
|
||||
# def counter_(input: str) -> int:
|
||||
# length = 0
|
||||
# for i in range(len(input)):
|
||||
# if input[i] == ' ':
|
||||
# length += 1
|
||||
# else:
|
||||
# if length % 4 != 0:
|
||||
# raise TabError('Tab length in ptml file should be 4.')
|
||||
# return length
|
||||
#
|
||||
# with open(file_path, 'r') as file:
|
||||
# ptml_new = ''
|
||||
# ptml_tab = file.readlines()
|
||||
#
|
||||
# level = 0
|
||||
# for i in ptml_tab:
|
||||
#
|
||||
# if i.startswith('//'):
|
||||
# continue
|
||||
#
|
||||
# new_level = counter_(i) // 4
|
||||
# if new_level == level:
|
||||
# ptml_new += i
|
||||
# elif new_level > level:
|
||||
# ptml_new += '{\n' + i
|
||||
# level += 1
|
||||
# elif new_level < level:
|
||||
# ptml_new += '\n}' + i
|
||||
# level -= 1
|
||||
# for i in range(level):
|
||||
# ptml_new += '}'
|
||||
|
||||
file_name = os.path.basename(file_path).split(".")[0]
|
||||
dir_path = os.path.dirname(file_path)
|
||||
# import re
|
||||
# new_path = re.sub('\\\[a-zA-Z0-9_]*\.ptml', '/bracket_ptml.ptml', file_path)
|
||||
new_path = os.path.join(dir_path,file_name+"_bracket.ptml")
|
||||
with open(new_path, 'w') as file:
|
||||
file.write(formatted_output)
|
||||
return new_path
|
||||
|
||||
# format_trans_to_bracket('C:\\Users\\Estrella\\Desktop\\RoboWaiter\\robowaiter\\behavior_tree\\ptml\\test\\Default.ptml')
|
||||
|
||||
if __name__ == '__main__':
|
||||
# 示例文本
|
||||
text = """
|
||||
selector
|
||||
sequence
|
||||
cond Chatting()
|
||||
act DealChat()
|
||||
sequence
|
||||
cond HasSubTask()
|
||||
sequence
|
||||
act SubTaskPlaceHolder()
|
||||
sequence
|
||||
cond FocusingCustomer()
|
||||
act ServeCustomer()
|
||||
sequence
|
||||
cond NewCustomer()
|
||||
selector
|
||||
cond At(Robot,Bar)
|
||||
act MoveTo(Bar)
|
||||
act GreetCustomer()
|
||||
sequence
|
||||
cond AnomalyDetected()
|
||||
act ResolveAnomaly()
|
||||
"""
|
||||
|
||||
parsed_tree = parse_indentation(text)
|
||||
print(parsed_tree)
|
||||
|
||||
formatted_output = format_nested_dict(parsed_tree)
|
||||
print(formatted_output)
|
|
@ -0,0 +1,68 @@
|
|||
token literal names:
|
||||
null
|
||||
'{'
|
||||
'}'
|
||||
'sequence'
|
||||
'selector'
|
||||
'parallel'
|
||||
'act'
|
||||
'cond'
|
||||
'('
|
||||
')'
|
||||
','
|
||||
'True'
|
||||
'False'
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
|
||||
token symbolic names:
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
null
|
||||
String
|
||||
Integer
|
||||
Float
|
||||
LINE_COMMENT
|
||||
WS
|
||||
|
||||
rule names:
|
||||
T__0
|
||||
T__1
|
||||
T__2
|
||||
T__3
|
||||
T__4
|
||||
T__5
|
||||
T__6
|
||||
T__7
|
||||
T__8
|
||||
T__9
|
||||
T__10
|
||||
T__11
|
||||
String
|
||||
Integer
|
||||
Float
|
||||
LINE_COMMENT
|
||||
WS
|
||||
|
||||
channel names:
|
||||
DEFAULT_TOKEN_CHANNEL
|
||||
HIDDEN
|
||||
|
||||
mode names:
|
||||
DEFAULT_MODE
|
||||
|
||||
atn:
|
||||
[4, 0, 17, 155, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 1, 0, 1, 0, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 5, 12, 95, 8, 12, 10, 12, 12, 12, 98, 9, 12, 1, 13, 3, 13, 101, 8, 13, 1, 13, 1, 13, 5, 13, 105, 8, 13, 10, 13, 12, 13, 108, 9, 13, 1, 13, 3, 13, 111, 8, 13, 1, 14, 4, 14, 114, 8, 14, 11, 14, 12, 14, 115, 1, 14, 1, 14, 5, 14, 120, 8, 14, 10, 14, 12, 14, 123, 9, 14, 1, 14, 1, 14, 4, 14, 127, 8, 14, 11, 14, 12, 14, 128, 3, 14, 131, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 5, 15, 137, 8, 15, 10, 15, 12, 15, 140, 9, 15, 1, 15, 3, 15, 143, 8, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 4, 16, 150, 8, 16, 11, 16, 12, 16, 151, 1, 16, 1, 16, 1, 138, 0, 17, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 1, 0, 5, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 1, 0, 49, 57, 1, 0, 48, 57, 3, 0, 9, 10, 12, 13, 32, 32, 165, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 1, 35, 1, 0, 0, 0, 3, 37, 1, 0, 0, 0, 5, 39, 1, 0, 0, 0, 7, 48, 1, 0, 0, 0, 9, 57, 1, 0, 0, 0, 11, 66, 1, 0, 0, 0, 13, 70, 1, 0, 0, 0, 15, 75, 1, 0, 0, 0, 17, 77, 1, 0, 0, 0, 19, 79, 1, 0, 0, 0, 21, 81, 1, 0, 0, 0, 23, 86, 1, 0, 0, 0, 25, 92, 1, 0, 0, 0, 27, 110, 1, 0, 0, 0, 29, 130, 1, 0, 0, 0, 31, 132, 1, 0, 0, 0, 33, 149, 1, 0, 0, 0, 35, 36, 5, 123, 0, 0, 36, 2, 1, 0, 0, 0, 37, 38, 5, 125, 0, 0, 38, 4, 1, 0, 0, 0, 39, 40, 5, 115, 0, 0, 40, 41, 5, 101, 0, 0, 41, 42, 5, 113, 0, 0, 42, 43, 5, 117, 0, 0, 43, 44, 5, 101, 0, 0, 44, 45, 5, 110, 0, 0, 45, 46, 5, 99, 0, 0, 46, 47, 5, 101, 0, 0, 47, 6, 1, 0, 0, 0, 48, 49, 5, 115, 0, 0, 49, 50, 5, 101, 0, 0, 50, 51, 5, 108, 0, 0, 51, 52, 5, 101, 0, 0, 52, 53, 5, 99, 0, 0, 53, 54, 5, 116, 0, 0, 54, 55, 5, 111, 0, 0, 55, 56, 5, 114, 0, 0, 56, 8, 1, 0, 0, 0, 57, 58, 5, 112, 0, 0, 58, 59, 5, 97, 0, 0, 59, 60, 5, 114, 0, 0, 60, 61, 5, 97, 0, 0, 61, 62, 5, 108, 0, 0, 62, 63, 5, 108, 0, 0, 63, 64, 5, 101, 0, 0, 64, 65, 5, 108, 0, 0, 65, 10, 1, 0, 0, 0, 66, 67, 5, 97, 0, 0, 67, 68, 5, 99, 0, 0, 68, 69, 5, 116, 0, 0, 69, 12, 1, 0, 0, 0, 70, 71, 5, 99, 0, 0, 71, 72, 5, 111, 0, 0, 72, 73, 5, 110, 0, 0, 73, 74, 5, 100, 0, 0, 74, 14, 1, 0, 0, 0, 75, 76, 5, 40, 0, 0, 76, 16, 1, 0, 0, 0, 77, 78, 5, 41, 0, 0, 78, 18, 1, 0, 0, 0, 79, 80, 5, 44, 0, 0, 80, 20, 1, 0, 0, 0, 81, 82, 5, 84, 0, 0, 82, 83, 5, 114, 0, 0, 83, 84, 5, 117, 0, 0, 84, 85, 5, 101, 0, 0, 85, 22, 1, 0, 0, 0, 86, 87, 5, 70, 0, 0, 87, 88, 5, 97, 0, 0, 88, 89, 5, 108, 0, 0, 89, 90, 5, 115, 0, 0, 90, 91, 5, 101, 0, 0, 91, 24, 1, 0, 0, 0, 92, 96, 7, 0, 0, 0, 93, 95, 7, 1, 0, 0, 94, 93, 1, 0, 0, 0, 95, 98, 1, 0, 0, 0, 96, 94, 1, 0, 0, 0, 96, 97, 1, 0, 0, 0, 97, 26, 1, 0, 0, 0, 98, 96, 1, 0, 0, 0, 99, 101, 5, 45, 0, 0, 100, 99, 1, 0, 0, 0, 100, 101, 1, 0, 0, 0, 101, 102, 1, 0, 0, 0, 102, 106, 7, 2, 0, 0, 103, 105, 7, 3, 0, 0, 104, 103, 1, 0, 0, 0, 105, 108, 1, 0, 0, 0, 106, 104, 1, 0, 0, 0, 106, 107, 1, 0, 0, 0, 107, 111, 1, 0, 0, 0, 108, 106, 1, 0, 0, 0, 109, 111, 5, 48, 0, 0, 110, 100, 1, 0, 0, 0, 110, 109, 1, 0, 0, 0, 111, 28, 1, 0, 0, 0, 112, 114, 7, 3, 0, 0, 113, 112, 1, 0, 0, 0, 114, 115, 1, 0, 0, 0, 115, 113, 1, 0, 0, 0, 115, 116, 1, 0, 0, 0, 116, 117, 1, 0, 0, 0, 117, 121, 5, 46, 0, 0, 118, 120, 7, 3, 0, 0, 119, 118, 1, 0, 0, 0, 120, 123, 1, 0, 0, 0, 121, 119, 1, 0, 0, 0, 121, 122, 1, 0, 0, 0, 122, 131, 1, 0, 0, 0, 123, 121, 1, 0, 0, 0, 124, 126, 5, 46, 0, 0, 125, 127, 7, 3, 0, 0, 126, 125, 1, 0, 0, 0, 127, 128, 1, 0, 0, 0, 128, 126, 1, 0, 0, 0, 128, 129, 1, 0, 0, 0, 129, 131, 1, 0, 0, 0, 130, 113, 1, 0, 0, 0, 130, 124, 1, 0, 0, 0, 131, 30, 1, 0, 0, 0, 132, 133, 5, 47, 0, 0, 133, 134, 5, 47, 0, 0, 134, 138, 1, 0, 0, 0, 135, 137, 9, 0, 0, 0, 136, 135, 1, 0, 0, 0, 137, 140, 1, 0, 0, 0, 138, 139, 1, 0, 0, 0, 138, 136, 1, 0, 0, 0, 139, 142, 1, 0, 0, 0, 140, 138, 1, 0, 0, 0, 141, 143, 5, 13, 0, 0, 142, 141, 1, 0, 0, 0, 142, 143, 1, 0, 0, 0, 143, 144, 1, 0, 0, 0, 144, 145, 5, 10, 0, 0, 145, 146, 1, 0, 0, 0, 146, 147, 6, 15, 0, 0, 147, 32, 1, 0, 0, 0, 148, 150, 7, 4, 0, 0, 149, 148, 1, 0, 0, 0, 150, 151, 1, 0, 0, 0, 151, 149, 1, 0, 0, 0, 151, 152, 1, 0, 0, 0, 152, 153, 1, 0, 0, 0, 153, 154, 6, 16, 0, 0, 154, 34, 1, 0, 0, 0, 12, 0, 96, 100, 106, 110, 115, 121, 128, 130, 138, 142, 151, 1, 6, 0, 0]
|
|
@ -0,0 +1,118 @@
|
|||
# Generated from ptml.g4 by ANTLR 4.13.1
|
||||
from antlr4 import *
|
||||
from io import StringIO
|
||||
import sys
|
||||
if sys.version_info[1] > 5:
|
||||
from typing import TextIO
|
||||
else:
|
||||
from typing.io import TextIO
|
||||
|
||||
|
||||
def serializedATN():
|
||||
return [
|
||||
4,0,17,155,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,
|
||||
2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,
|
||||
13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,1,0,1,0,1,1,1,1,1,2,1,2,1,
|
||||
2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,
|
||||
4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,
|
||||
6,1,6,1,7,1,7,1,8,1,8,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,11,1,11,
|
||||
1,11,1,11,1,11,1,11,1,12,1,12,5,12,95,8,12,10,12,12,12,98,9,12,1,
|
||||
13,3,13,101,8,13,1,13,1,13,5,13,105,8,13,10,13,12,13,108,9,13,1,
|
||||
13,3,13,111,8,13,1,14,4,14,114,8,14,11,14,12,14,115,1,14,1,14,5,
|
||||
14,120,8,14,10,14,12,14,123,9,14,1,14,1,14,4,14,127,8,14,11,14,12,
|
||||
14,128,3,14,131,8,14,1,15,1,15,1,15,1,15,5,15,137,8,15,10,15,12,
|
||||
15,140,9,15,1,15,3,15,143,8,15,1,15,1,15,1,15,1,15,1,16,4,16,150,
|
||||
8,16,11,16,12,16,151,1,16,1,16,1,138,0,17,1,1,3,2,5,3,7,4,9,5,11,
|
||||
6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15,31,16,33,17,
|
||||
1,0,5,3,0,65,90,95,95,97,122,4,0,48,57,65,90,95,95,97,122,1,0,49,
|
||||
57,1,0,48,57,3,0,9,10,12,13,32,32,165,0,1,1,0,0,0,0,3,1,0,0,0,0,
|
||||
5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,
|
||||
1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,
|
||||
1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,1,35,
|
||||
1,0,0,0,3,37,1,0,0,0,5,39,1,0,0,0,7,48,1,0,0,0,9,57,1,0,0,0,11,66,
|
||||
1,0,0,0,13,70,1,0,0,0,15,75,1,0,0,0,17,77,1,0,0,0,19,79,1,0,0,0,
|
||||
21,81,1,0,0,0,23,86,1,0,0,0,25,92,1,0,0,0,27,110,1,0,0,0,29,130,
|
||||
1,0,0,0,31,132,1,0,0,0,33,149,1,0,0,0,35,36,5,123,0,0,36,2,1,0,0,
|
||||
0,37,38,5,125,0,0,38,4,1,0,0,0,39,40,5,115,0,0,40,41,5,101,0,0,41,
|
||||
42,5,113,0,0,42,43,5,117,0,0,43,44,5,101,0,0,44,45,5,110,0,0,45,
|
||||
46,5,99,0,0,46,47,5,101,0,0,47,6,1,0,0,0,48,49,5,115,0,0,49,50,5,
|
||||
101,0,0,50,51,5,108,0,0,51,52,5,101,0,0,52,53,5,99,0,0,53,54,5,116,
|
||||
0,0,54,55,5,111,0,0,55,56,5,114,0,0,56,8,1,0,0,0,57,58,5,112,0,0,
|
||||
58,59,5,97,0,0,59,60,5,114,0,0,60,61,5,97,0,0,61,62,5,108,0,0,62,
|
||||
63,5,108,0,0,63,64,5,101,0,0,64,65,5,108,0,0,65,10,1,0,0,0,66,67,
|
||||
5,97,0,0,67,68,5,99,0,0,68,69,5,116,0,0,69,12,1,0,0,0,70,71,5,99,
|
||||
0,0,71,72,5,111,0,0,72,73,5,110,0,0,73,74,5,100,0,0,74,14,1,0,0,
|
||||
0,75,76,5,40,0,0,76,16,1,0,0,0,77,78,5,41,0,0,78,18,1,0,0,0,79,80,
|
||||
5,44,0,0,80,20,1,0,0,0,81,82,5,84,0,0,82,83,5,114,0,0,83,84,5,117,
|
||||
0,0,84,85,5,101,0,0,85,22,1,0,0,0,86,87,5,70,0,0,87,88,5,97,0,0,
|
||||
88,89,5,108,0,0,89,90,5,115,0,0,90,91,5,101,0,0,91,24,1,0,0,0,92,
|
||||
96,7,0,0,0,93,95,7,1,0,0,94,93,1,0,0,0,95,98,1,0,0,0,96,94,1,0,0,
|
||||
0,96,97,1,0,0,0,97,26,1,0,0,0,98,96,1,0,0,0,99,101,5,45,0,0,100,
|
||||
99,1,0,0,0,100,101,1,0,0,0,101,102,1,0,0,0,102,106,7,2,0,0,103,105,
|
||||
7,3,0,0,104,103,1,0,0,0,105,108,1,0,0,0,106,104,1,0,0,0,106,107,
|
||||
1,0,0,0,107,111,1,0,0,0,108,106,1,0,0,0,109,111,5,48,0,0,110,100,
|
||||
1,0,0,0,110,109,1,0,0,0,111,28,1,0,0,0,112,114,7,3,0,0,113,112,1,
|
||||
0,0,0,114,115,1,0,0,0,115,113,1,0,0,0,115,116,1,0,0,0,116,117,1,
|
||||
0,0,0,117,121,5,46,0,0,118,120,7,3,0,0,119,118,1,0,0,0,120,123,1,
|
||||
0,0,0,121,119,1,0,0,0,121,122,1,0,0,0,122,131,1,0,0,0,123,121,1,
|
||||
0,0,0,124,126,5,46,0,0,125,127,7,3,0,0,126,125,1,0,0,0,127,128,1,
|
||||
0,0,0,128,126,1,0,0,0,128,129,1,0,0,0,129,131,1,0,0,0,130,113,1,
|
||||
0,0,0,130,124,1,0,0,0,131,30,1,0,0,0,132,133,5,47,0,0,133,134,5,
|
||||
47,0,0,134,138,1,0,0,0,135,137,9,0,0,0,136,135,1,0,0,0,137,140,1,
|
||||
0,0,0,138,139,1,0,0,0,138,136,1,0,0,0,139,142,1,0,0,0,140,138,1,
|
||||
0,0,0,141,143,5,13,0,0,142,141,1,0,0,0,142,143,1,0,0,0,143,144,1,
|
||||
0,0,0,144,145,5,10,0,0,145,146,1,0,0,0,146,147,6,15,0,0,147,32,1,
|
||||
0,0,0,148,150,7,4,0,0,149,148,1,0,0,0,150,151,1,0,0,0,151,149,1,
|
||||
0,0,0,151,152,1,0,0,0,152,153,1,0,0,0,153,154,6,16,0,0,154,34,1,
|
||||
0,0,0,12,0,96,100,106,110,115,121,128,130,138,142,151,1,6,0,0
|
||||
]
|
||||
|
||||
class ptmlLexer(Lexer):
|
||||
|
||||
atn = ATNDeserializer().deserialize(serializedATN())
|
||||
|
||||
decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ]
|
||||
|
||||
T__0 = 1
|
||||
T__1 = 2
|
||||
T__2 = 3
|
||||
T__3 = 4
|
||||
T__4 = 5
|
||||
T__5 = 6
|
||||
T__6 = 7
|
||||
T__7 = 8
|
||||
T__8 = 9
|
||||
T__9 = 10
|
||||
T__10 = 11
|
||||
T__11 = 12
|
||||
String = 13
|
||||
Integer = 14
|
||||
Float = 15
|
||||
LINE_COMMENT = 16
|
||||
WS = 17
|
||||
|
||||
channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ]
|
||||
|
||||
modeNames = [ "DEFAULT_MODE" ]
|
||||
|
||||
literalNames = [ "<INVALID>",
|
||||
"'{'", "'}'", "'sequence'", "'selector'", "'parallel'", "'act'",
|
||||
"'cond'", "'('", "')'", "','", "'True'", "'False'" ]
|
||||
|
||||
symbolicNames = [ "<INVALID>",
|
||||
"String", "Integer", "Float", "LINE_COMMENT", "WS" ]
|
||||
|
||||
ruleNames = [ "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6",
|
||||
"T__7", "T__8", "T__9", "T__10", "T__11", "String", "Integer",
|
||||
"Float", "LINE_COMMENT", "WS" ]
|
||||
|
||||
grammarFileName = "ptml.g4"
|
||||
|
||||
def __init__(self, input=None, output:TextIO = sys.stdout):
|
||||
super().__init__(input, output)
|
||||
self.checkVersion("4.13.1")
|
||||
self._interp = LexerATNSimulator(self, self.atn, self.decisionsToDFA, PredictionContextCache())
|
||||
self._actions = None
|
||||
self._predicates = None
|
||||
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
T__0=1
|
||||
T__1=2
|
||||
T__2=3
|
||||
T__3=4
|
||||
T__4=5
|
||||
T__5=6
|
||||
T__6=7
|
||||
T__7=8
|
||||
T__8=9
|
||||
T__9=10
|
||||
T__10=11
|
||||
T__11=12
|
||||
String=13
|
||||
Integer=14
|
||||
Float=15
|
||||
LINE_COMMENT=16
|
||||
WS=17
|
||||
'{'=1
|
||||
'}'=2
|
||||
'sequence'=3
|
||||
'selector'=4
|
||||
'parallel'=5
|
||||
'act'=6
|
||||
'cond'=7
|
||||
'('=8
|
||||
')'=9
|
||||
','=10
|
||||
'True'=11
|
||||
'False'=12
|
|
@ -0,0 +1,66 @@
|
|||
# Generated from ptml.g4 by ANTLR 4.13.1
|
||||
from antlr4 import *
|
||||
if "." in __name__:
|
||||
from .ptmlParser import ptmlParser
|
||||
else:
|
||||
from ptmlParser import ptmlParser
|
||||
|
||||
# This class defines a complete listener for a parse tree produced by ptmlParser.
|
||||
class ptmlListener(ParseTreeListener):
|
||||
|
||||
# Enter a parse tree produced by ptmlParser#root.
|
||||
def enterRoot(self, ctx:ptmlParser.RootContext):
|
||||
pass
|
||||
|
||||
# Exit a parse tree produced by ptmlParser#root.
|
||||
def exitRoot(self, ctx:ptmlParser.RootContext):
|
||||
pass
|
||||
|
||||
|
||||
# Enter a parse tree produced by ptmlParser#tree.
|
||||
def enterTree(self, ctx:ptmlParser.TreeContext):
|
||||
pass
|
||||
|
||||
# Exit a parse tree produced by ptmlParser#tree.
|
||||
def exitTree(self, ctx:ptmlParser.TreeContext):
|
||||
pass
|
||||
|
||||
|
||||
# Enter a parse tree produced by ptmlParser#internal_node.
|
||||
def enterInternal_node(self, ctx:ptmlParser.Internal_nodeContext):
|
||||
pass
|
||||
|
||||
# Exit a parse tree produced by ptmlParser#internal_node.
|
||||
def exitInternal_node(self, ctx:ptmlParser.Internal_nodeContext):
|
||||
pass
|
||||
|
||||
|
||||
# Enter a parse tree produced by ptmlParser#action_sign.
|
||||
def enterAction_sign(self, ctx:ptmlParser.Action_signContext):
|
||||
pass
|
||||
|
||||
# Exit a parse tree produced by ptmlParser#action_sign.
|
||||
def exitAction_sign(self, ctx:ptmlParser.Action_signContext):
|
||||
pass
|
||||
|
||||
|
||||
# Enter a parse tree produced by ptmlParser#action_parm.
|
||||
def enterAction_parm(self, ctx:ptmlParser.Action_parmContext):
|
||||
pass
|
||||
|
||||
# Exit a parse tree produced by ptmlParser#action_parm.
|
||||
def exitAction_parm(self, ctx:ptmlParser.Action_parmContext):
|
||||
pass
|
||||
|
||||
|
||||
# Enter a parse tree produced by ptmlParser#boolean.
|
||||
def enterBoolean(self, ctx:ptmlParser.BooleanContext):
|
||||
pass
|
||||
|
||||
# Exit a parse tree produced by ptmlParser#boolean.
|
||||
def exitBoolean(self, ctx:ptmlParser.BooleanContext):
|
||||
pass
|
||||
|
||||
|
||||
|
||||
del ptmlParser
|
|
@ -0,0 +1,528 @@
|
|||
# Generated from ptml.g4 by ANTLR 4.13.1
|
||||
# encoding: utf-8
|
||||
from antlr4 import *
|
||||
from io import StringIO
|
||||
import sys
|
||||
if sys.version_info[1] > 5:
|
||||
from typing import TextIO
|
||||
else:
|
||||
from typing.io import TextIO
|
||||
|
||||
def serializedATN():
|
||||
return [
|
||||
4,1,17,65,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,1,0,4,
|
||||
0,14,8,0,11,0,12,0,15,1,0,1,0,1,1,1,1,1,1,1,1,5,1,24,8,1,10,1,12,
|
||||
1,27,9,1,1,1,1,1,1,2,1,2,1,2,1,2,3,2,35,8,2,1,3,1,3,1,3,1,3,3,3,
|
||||
41,8,3,1,3,1,3,1,4,1,4,1,4,1,4,3,4,49,8,4,1,4,1,4,1,4,1,4,1,4,3,
|
||||
4,56,8,4,5,4,58,8,4,10,4,12,4,61,9,4,1,5,1,5,1,5,0,0,6,0,2,4,6,8,
|
||||
10,0,2,1,0,6,7,1,0,11,12,71,0,13,1,0,0,0,2,19,1,0,0,0,4,34,1,0,0,
|
||||
0,6,36,1,0,0,0,8,48,1,0,0,0,10,62,1,0,0,0,12,14,3,2,1,0,13,12,1,
|
||||
0,0,0,14,15,1,0,0,0,15,13,1,0,0,0,15,16,1,0,0,0,16,17,1,0,0,0,17,
|
||||
18,5,0,0,1,18,1,1,0,0,0,19,20,3,4,2,0,20,25,5,1,0,0,21,24,3,6,3,
|
||||
0,22,24,3,2,1,0,23,21,1,0,0,0,23,22,1,0,0,0,24,27,1,0,0,0,25,23,
|
||||
1,0,0,0,25,26,1,0,0,0,26,28,1,0,0,0,27,25,1,0,0,0,28,29,5,2,0,0,
|
||||
29,3,1,0,0,0,30,35,5,3,0,0,31,35,5,4,0,0,32,33,5,5,0,0,33,35,5,14,
|
||||
0,0,34,30,1,0,0,0,34,31,1,0,0,0,34,32,1,0,0,0,35,5,1,0,0,0,36,37,
|
||||
7,0,0,0,37,38,5,13,0,0,38,40,5,8,0,0,39,41,3,8,4,0,40,39,1,0,0,0,
|
||||
40,41,1,0,0,0,41,42,1,0,0,0,42,43,5,9,0,0,43,7,1,0,0,0,44,49,5,14,
|
||||
0,0,45,49,5,15,0,0,46,49,3,10,5,0,47,49,5,13,0,0,48,44,1,0,0,0,48,
|
||||
45,1,0,0,0,48,46,1,0,0,0,48,47,1,0,0,0,49,59,1,0,0,0,50,55,5,10,
|
||||
0,0,51,56,5,14,0,0,52,56,5,15,0,0,53,56,3,10,5,0,54,56,5,13,0,0,
|
||||
55,51,1,0,0,0,55,52,1,0,0,0,55,53,1,0,0,0,55,54,1,0,0,0,56,58,1,
|
||||
0,0,0,57,50,1,0,0,0,58,61,1,0,0,0,59,57,1,0,0,0,59,60,1,0,0,0,60,
|
||||
9,1,0,0,0,61,59,1,0,0,0,62,63,7,1,0,0,63,11,1,0,0,0,8,15,23,25,34,
|
||||
40,48,55,59
|
||||
]
|
||||
|
||||
class ptmlParser ( Parser ):
|
||||
|
||||
grammarFileName = "ptml.g4"
|
||||
|
||||
atn = ATNDeserializer().deserialize(serializedATN())
|
||||
|
||||
decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ]
|
||||
|
||||
sharedContextCache = PredictionContextCache()
|
||||
|
||||
literalNames = [ "<INVALID>", "'{'", "'}'", "'sequence'", "'selector'",
|
||||
"'parallel'", "'act'", "'cond'", "'('", "')'", "','",
|
||||
"'True'", "'False'" ]
|
||||
|
||||
symbolicNames = [ "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
|
||||
"<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
|
||||
"<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
|
||||
"<INVALID>", "String", "Integer", "Float", "LINE_COMMENT",
|
||||
"WS" ]
|
||||
|
||||
RULE_root = 0
|
||||
RULE_tree = 1
|
||||
RULE_internal_node = 2
|
||||
RULE_action_sign = 3
|
||||
RULE_action_parm = 4
|
||||
RULE_boolean = 5
|
||||
|
||||
ruleNames = [ "root", "tree", "internal_node", "action_sign", "action_parm",
|
||||
"boolean" ]
|
||||
|
||||
EOF = Token.EOF
|
||||
T__0=1
|
||||
T__1=2
|
||||
T__2=3
|
||||
T__3=4
|
||||
T__4=5
|
||||
T__5=6
|
||||
T__6=7
|
||||
T__7=8
|
||||
T__8=9
|
||||
T__9=10
|
||||
T__10=11
|
||||
T__11=12
|
||||
String=13
|
||||
Integer=14
|
||||
Float=15
|
||||
LINE_COMMENT=16
|
||||
WS=17
|
||||
|
||||
def __init__(self, input:TokenStream, output:TextIO = sys.stdout):
|
||||
super().__init__(input, output)
|
||||
self.checkVersion("4.13.1")
|
||||
self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache)
|
||||
self._predicates = None
|
||||
|
||||
|
||||
|
||||
|
||||
class RootContext(ParserRuleContext):
|
||||
__slots__ = 'parser'
|
||||
|
||||
def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
|
||||
super().__init__(parent, invokingState)
|
||||
self.parser = parser
|
||||
|
||||
def EOF(self):
|
||||
return self.getToken(ptmlParser.EOF, 0)
|
||||
|
||||
def tree(self, i:int=None):
|
||||
if i is None:
|
||||
return self.getTypedRuleContexts(ptmlParser.TreeContext)
|
||||
else:
|
||||
return self.getTypedRuleContext(ptmlParser.TreeContext,i)
|
||||
|
||||
|
||||
def getRuleIndex(self):
|
||||
return ptmlParser.RULE_root
|
||||
|
||||
def enterRule(self, listener:ParseTreeListener):
|
||||
if hasattr( listener, "enterRoot" ):
|
||||
listener.enterRoot(self)
|
||||
|
||||
def exitRule(self, listener:ParseTreeListener):
|
||||
if hasattr( listener, "exitRoot" ):
|
||||
listener.exitRoot(self)
|
||||
|
||||
|
||||
|
||||
|
||||
def root(self):
|
||||
|
||||
localctx = ptmlParser.RootContext(self, self._ctx, self.state)
|
||||
self.enterRule(localctx, 0, self.RULE_root)
|
||||
self._la = 0 # Token type
|
||||
try:
|
||||
self.enterOuterAlt(localctx, 1)
|
||||
self.state = 13
|
||||
self._errHandler.sync(self)
|
||||
_la = self._input.LA(1)
|
||||
while True:
|
||||
self.state = 12
|
||||
self.tree()
|
||||
self.state = 15
|
||||
self._errHandler.sync(self)
|
||||
_la = self._input.LA(1)
|
||||
if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & 56) != 0)):
|
||||
break
|
||||
|
||||
self.state = 17
|
||||
self.match(ptmlParser.EOF)
|
||||
except RecognitionException as re:
|
||||
localctx.exception = re
|
||||
self._errHandler.reportError(self, re)
|
||||
self._errHandler.recover(self, re)
|
||||
finally:
|
||||
self.exitRule()
|
||||
return localctx
|
||||
|
||||
|
||||
class TreeContext(ParserRuleContext):
|
||||
__slots__ = 'parser'
|
||||
|
||||
def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
|
||||
super().__init__(parent, invokingState)
|
||||
self.parser = parser
|
||||
|
||||
def internal_node(self):
|
||||
return self.getTypedRuleContext(ptmlParser.Internal_nodeContext,0)
|
||||
|
||||
|
||||
def action_sign(self, i:int=None):
|
||||
if i is None:
|
||||
return self.getTypedRuleContexts(ptmlParser.Action_signContext)
|
||||
else:
|
||||
return self.getTypedRuleContext(ptmlParser.Action_signContext,i)
|
||||
|
||||
|
||||
def tree(self, i:int=None):
|
||||
if i is None:
|
||||
return self.getTypedRuleContexts(ptmlParser.TreeContext)
|
||||
else:
|
||||
return self.getTypedRuleContext(ptmlParser.TreeContext,i)
|
||||
|
||||
|
||||
def getRuleIndex(self):
|
||||
return ptmlParser.RULE_tree
|
||||
|
||||
def enterRule(self, listener:ParseTreeListener):
|
||||
if hasattr( listener, "enterTree" ):
|
||||
listener.enterTree(self)
|
||||
|
||||
def exitRule(self, listener:ParseTreeListener):
|
||||
if hasattr( listener, "exitTree" ):
|
||||
listener.exitTree(self)
|
||||
|
||||
|
||||
|
||||
|
||||
def tree(self):
|
||||
|
||||
localctx = ptmlParser.TreeContext(self, self._ctx, self.state)
|
||||
self.enterRule(localctx, 2, self.RULE_tree)
|
||||
self._la = 0 # Token type
|
||||
try:
|
||||
self.enterOuterAlt(localctx, 1)
|
||||
self.state = 19
|
||||
self.internal_node()
|
||||
self.state = 20
|
||||
self.match(ptmlParser.T__0)
|
||||
self.state = 25
|
||||
self._errHandler.sync(self)
|
||||
_la = self._input.LA(1)
|
||||
while (((_la) & ~0x3f) == 0 and ((1 << _la) & 248) != 0):
|
||||
self.state = 23
|
||||
self._errHandler.sync(self)
|
||||
token = self._input.LA(1)
|
||||
if token in [6, 7]:
|
||||
self.state = 21
|
||||
self.action_sign()
|
||||
pass
|
||||
elif token in [3, 4, 5]:
|
||||
self.state = 22
|
||||
self.tree()
|
||||
pass
|
||||
else:
|
||||
raise NoViableAltException(self)
|
||||
|
||||
self.state = 27
|
||||
self._errHandler.sync(self)
|
||||
_la = self._input.LA(1)
|
||||
|
||||
self.state = 28
|
||||
self.match(ptmlParser.T__1)
|
||||
except RecognitionException as re:
|
||||
localctx.exception = re
|
||||
self._errHandler.reportError(self, re)
|
||||
self._errHandler.recover(self, re)
|
||||
finally:
|
||||
self.exitRule()
|
||||
return localctx
|
||||
|
||||
|
||||
class Internal_nodeContext(ParserRuleContext):
|
||||
__slots__ = 'parser'
|
||||
|
||||
def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
|
||||
super().__init__(parent, invokingState)
|
||||
self.parser = parser
|
||||
|
||||
def Integer(self):
|
||||
return self.getToken(ptmlParser.Integer, 0)
|
||||
|
||||
def getRuleIndex(self):
|
||||
return ptmlParser.RULE_internal_node
|
||||
|
||||
def enterRule(self, listener:ParseTreeListener):
|
||||
if hasattr( listener, "enterInternal_node" ):
|
||||
listener.enterInternal_node(self)
|
||||
|
||||
def exitRule(self, listener:ParseTreeListener):
|
||||
if hasattr( listener, "exitInternal_node" ):
|
||||
listener.exitInternal_node(self)
|
||||
|
||||
|
||||
|
||||
|
||||
def internal_node(self):
|
||||
|
||||
localctx = ptmlParser.Internal_nodeContext(self, self._ctx, self.state)
|
||||
self.enterRule(localctx, 4, self.RULE_internal_node)
|
||||
try:
|
||||
self.state = 34
|
||||
self._errHandler.sync(self)
|
||||
token = self._input.LA(1)
|
||||
if token in [3]:
|
||||
self.enterOuterAlt(localctx, 1)
|
||||
self.state = 30
|
||||
self.match(ptmlParser.T__2)
|
||||
pass
|
||||
elif token in [4]:
|
||||
self.enterOuterAlt(localctx, 2)
|
||||
self.state = 31
|
||||
self.match(ptmlParser.T__3)
|
||||
pass
|
||||
elif token in [5]:
|
||||
self.enterOuterAlt(localctx, 3)
|
||||
self.state = 32
|
||||
self.match(ptmlParser.T__4)
|
||||
self.state = 33
|
||||
self.match(ptmlParser.Integer)
|
||||
pass
|
||||
else:
|
||||
raise NoViableAltException(self)
|
||||
|
||||
except RecognitionException as re:
|
||||
localctx.exception = re
|
||||
self._errHandler.reportError(self, re)
|
||||
self._errHandler.recover(self, re)
|
||||
finally:
|
||||
self.exitRule()
|
||||
return localctx
|
||||
|
||||
|
||||
class Action_signContext(ParserRuleContext):
|
||||
__slots__ = 'parser'
|
||||
|
||||
def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
|
||||
super().__init__(parent, invokingState)
|
||||
self.parser = parser
|
||||
|
||||
def String(self):
|
||||
return self.getToken(ptmlParser.String, 0)
|
||||
|
||||
def action_parm(self):
|
||||
return self.getTypedRuleContext(ptmlParser.Action_parmContext,0)
|
||||
|
||||
|
||||
def getRuleIndex(self):
|
||||
return ptmlParser.RULE_action_sign
|
||||
|
||||
def enterRule(self, listener:ParseTreeListener):
|
||||
if hasattr( listener, "enterAction_sign" ):
|
||||
listener.enterAction_sign(self)
|
||||
|
||||
def exitRule(self, listener:ParseTreeListener):
|
||||
if hasattr( listener, "exitAction_sign" ):
|
||||
listener.exitAction_sign(self)
|
||||
|
||||
|
||||
|
||||
|
||||
def action_sign(self):
|
||||
|
||||
localctx = ptmlParser.Action_signContext(self, self._ctx, self.state)
|
||||
self.enterRule(localctx, 6, self.RULE_action_sign)
|
||||
self._la = 0 # Token type
|
||||
try:
|
||||
self.enterOuterAlt(localctx, 1)
|
||||
self.state = 36
|
||||
_la = self._input.LA(1)
|
||||
if not(_la==6 or _la==7):
|
||||
self._errHandler.recoverInline(self)
|
||||
else:
|
||||
self._errHandler.reportMatch(self)
|
||||
self.consume()
|
||||
self.state = 37
|
||||
self.match(ptmlParser.String)
|
||||
self.state = 38
|
||||
self.match(ptmlParser.T__7)
|
||||
self.state = 40
|
||||
self._errHandler.sync(self)
|
||||
_la = self._input.LA(1)
|
||||
if (((_la) & ~0x3f) == 0 and ((1 << _la) & 63488) != 0):
|
||||
self.state = 39
|
||||
self.action_parm()
|
||||
|
||||
|
||||
self.state = 42
|
||||
self.match(ptmlParser.T__8)
|
||||
except RecognitionException as re:
|
||||
localctx.exception = re
|
||||
self._errHandler.reportError(self, re)
|
||||
self._errHandler.recover(self, re)
|
||||
finally:
|
||||
self.exitRule()
|
||||
return localctx
|
||||
|
||||
|
||||
class Action_parmContext(ParserRuleContext):
|
||||
__slots__ = 'parser'
|
||||
|
||||
def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
|
||||
super().__init__(parent, invokingState)
|
||||
self.parser = parser
|
||||
|
||||
def Integer(self, i:int=None):
|
||||
if i is None:
|
||||
return self.getTokens(ptmlParser.Integer)
|
||||
else:
|
||||
return self.getToken(ptmlParser.Integer, i)
|
||||
|
||||
def Float(self, i:int=None):
|
||||
if i is None:
|
||||
return self.getTokens(ptmlParser.Float)
|
||||
else:
|
||||
return self.getToken(ptmlParser.Float, i)
|
||||
|
||||
def boolean(self, i:int=None):
|
||||
if i is None:
|
||||
return self.getTypedRuleContexts(ptmlParser.BooleanContext)
|
||||
else:
|
||||
return self.getTypedRuleContext(ptmlParser.BooleanContext,i)
|
||||
|
||||
|
||||
def String(self, i:int=None):
|
||||
if i is None:
|
||||
return self.getTokens(ptmlParser.String)
|
||||
else:
|
||||
return self.getToken(ptmlParser.String, i)
|
||||
|
||||
def getRuleIndex(self):
|
||||
return ptmlParser.RULE_action_parm
|
||||
|
||||
def enterRule(self, listener:ParseTreeListener):
|
||||
if hasattr( listener, "enterAction_parm" ):
|
||||
listener.enterAction_parm(self)
|
||||
|
||||
def exitRule(self, listener:ParseTreeListener):
|
||||
if hasattr( listener, "exitAction_parm" ):
|
||||
listener.exitAction_parm(self)
|
||||
|
||||
|
||||
|
||||
|
||||
def action_parm(self):
|
||||
|
||||
localctx = ptmlParser.Action_parmContext(self, self._ctx, self.state)
|
||||
self.enterRule(localctx, 8, self.RULE_action_parm)
|
||||
self._la = 0 # Token type
|
||||
try:
|
||||
self.enterOuterAlt(localctx, 1)
|
||||
self.state = 48
|
||||
self._errHandler.sync(self)
|
||||
token = self._input.LA(1)
|
||||
if token in [14]:
|
||||
self.state = 44
|
||||
self.match(ptmlParser.Integer)
|
||||
pass
|
||||
elif token in [15]:
|
||||
self.state = 45
|
||||
self.match(ptmlParser.Float)
|
||||
pass
|
||||
elif token in [11, 12]:
|
||||
self.state = 46
|
||||
self.boolean()
|
||||
pass
|
||||
elif token in [13]:
|
||||
self.state = 47
|
||||
self.match(ptmlParser.String)
|
||||
pass
|
||||
else:
|
||||
raise NoViableAltException(self)
|
||||
|
||||
self.state = 59
|
||||
self._errHandler.sync(self)
|
||||
_la = self._input.LA(1)
|
||||
while _la==10:
|
||||
self.state = 50
|
||||
self.match(ptmlParser.T__9)
|
||||
self.state = 55
|
||||
self._errHandler.sync(self)
|
||||
token = self._input.LA(1)
|
||||
if token in [14]:
|
||||
self.state = 51
|
||||
self.match(ptmlParser.Integer)
|
||||
pass
|
||||
elif token in [15]:
|
||||
self.state = 52
|
||||
self.match(ptmlParser.Float)
|
||||
pass
|
||||
elif token in [11, 12]:
|
||||
self.state = 53
|
||||
self.boolean()
|
||||
pass
|
||||
elif token in [13]:
|
||||
self.state = 54
|
||||
self.match(ptmlParser.String)
|
||||
pass
|
||||
else:
|
||||
raise NoViableAltException(self)
|
||||
|
||||
self.state = 61
|
||||
self._errHandler.sync(self)
|
||||
_la = self._input.LA(1)
|
||||
|
||||
except RecognitionException as re:
|
||||
localctx.exception = re
|
||||
self._errHandler.reportError(self, re)
|
||||
self._errHandler.recover(self, re)
|
||||
finally:
|
||||
self.exitRule()
|
||||
return localctx
|
||||
|
||||
|
||||
class BooleanContext(ParserRuleContext):
|
||||
__slots__ = 'parser'
|
||||
|
||||
def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
|
||||
super().__init__(parent, invokingState)
|
||||
self.parser = parser
|
||||
|
||||
|
||||
def getRuleIndex(self):
|
||||
return ptmlParser.RULE_boolean
|
||||
|
||||
def enterRule(self, listener:ParseTreeListener):
|
||||
if hasattr( listener, "enterBoolean" ):
|
||||
listener.enterBoolean(self)
|
||||
|
||||
def exitRule(self, listener:ParseTreeListener):
|
||||
if hasattr( listener, "exitBoolean" ):
|
||||
listener.exitBoolean(self)
|
||||
|
||||
|
||||
|
||||
|
||||
def boolean(self):
|
||||
|
||||
localctx = ptmlParser.BooleanContext(self, self._ctx, self.state)
|
||||
self.enterRule(localctx, 10, self.RULE_boolean)
|
||||
self._la = 0 # Token type
|
||||
try:
|
||||
self.enterOuterAlt(localctx, 1)
|
||||
self.state = 62
|
||||
_la = self._input.LA(1)
|
||||
if not(_la==11 or _la==12):
|
||||
self._errHandler.recoverInline(self)
|
||||
else:
|
||||
self._errHandler.reportMatch(self)
|
||||
self.consume()
|
||||
except RecognitionException as re:
|
||||
localctx.exception = re
|
||||
self._errHandler.reportError(self, re)
|
||||
self._errHandler.recover(self, re)
|
||||
finally:
|
||||
self.exitRule()
|
||||
return localctx
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,119 @@
|
|||
import shortuuid
|
||||
import py_trees as ptree
|
||||
from EXP.behavior_lib._base import Selector, Sequence
|
||||
from antlr4 import *
|
||||
|
||||
if "." in __name__:
|
||||
from .ptmlListener import ptmlListener
|
||||
from .ptmlParser import ptmlParser
|
||||
else:
|
||||
from ptmlListener import ptmlListener
|
||||
from ptmlParser import ptmlParser
|
||||
|
||||
short_uuid = lambda: shortuuid.ShortUUID().random(length=8)
|
||||
|
||||
|
||||
class ptmlTranslator(ptmlListener):
|
||||
"""Translate the ptml language to BT.
|
||||
|
||||
Args:
|
||||
ptmlListener (_type_): _description_
|
||||
"""
|
||||
|
||||
def __init__(self, scene, behaviour_lib_path) -> None:
|
||||
super().__init__()
|
||||
self.bt_root = None
|
||||
self.stack = []
|
||||
self.scene = scene
|
||||
self.behaviour_lib_path = behaviour_lib_path
|
||||
|
||||
# Enter a parse tree produced by ptmlParser#root.
|
||||
def enterRoot(self, ctx: ptmlParser.RootContext):
|
||||
pass
|
||||
|
||||
# Exit a parse tree produced by ptmlParser#root.
|
||||
def exitRoot(self, ctx: ptmlParser.RootContext):
|
||||
pass
|
||||
|
||||
# Enter a parse tree produced by ptmlParser#tree.
|
||||
def enterTree(self, ctx: ptmlParser.TreeContext):
|
||||
type = str(ctx.internal_node().children[0])
|
||||
|
||||
if type== "sequence":
|
||||
node = Sequence(name="Sequence", memory=False)
|
||||
elif type=="selector":
|
||||
node = Selector(name="Selector", memory=False)
|
||||
elif type== "parallel":
|
||||
tag = "parallel_" + short_uuid()
|
||||
# threshold = int(ctx.children[1])
|
||||
# default policy, success on all
|
||||
node = ptree.composites.Parallel(
|
||||
name=tag, policy=ptree.common.ParallelPolicy.SuccessOnAll
|
||||
)
|
||||
else:
|
||||
raise TypeError("Unknown Composite Type: {}".format(type))
|
||||
|
||||
self.stack.append(node)
|
||||
|
||||
# Exit a parse tree produced by ptmlParser#tree.
|
||||
def exitTree(self, ctx: ptmlParser.TreeContext):
|
||||
if len(self.stack) >= 2:
|
||||
child = self.stack.pop()
|
||||
self.stack[-1].add_child(child)
|
||||
else:
|
||||
self.bt_root = self.stack[0]
|
||||
|
||||
# Enter a parse tree produced by ptmlParser#internal_node.
|
||||
def enterInternal_node(self, ctx: ptmlParser.Internal_nodeContext):
|
||||
pass
|
||||
|
||||
# Exit a parse tree produced by ptmlParser#internal_node.
|
||||
def exitInternal_node(self, ctx: ptmlParser.Internal_nodeContext):
|
||||
pass
|
||||
|
||||
# Enter a parse tree produced by ptmlParser#action_sign.
|
||||
def enterAction_sign(self, ctx: ptmlParser.Action_signContext):
|
||||
# cond / act
|
||||
node_type = str(ctx.children[0])
|
||||
name = str(ctx.String())
|
||||
|
||||
# if have params
|
||||
args = []
|
||||
if len(ctx.children) > 4:
|
||||
params = ctx.action_parm()
|
||||
for i in params.children:
|
||||
if isinstance(i, ptmlParser.BooleanContext):
|
||||
args.append(str(i.children[0]))
|
||||
elif str(i) == ',':
|
||||
args.append(',')
|
||||
else:
|
||||
args.append(f"'{i}'")
|
||||
args = "".join(args)
|
||||
|
||||
exec(f"from {name} import {name}")
|
||||
# tag = "cond_" + short_uuid() if node_type == "cond" else "task_" + short_uuid()
|
||||
|
||||
node = eval(f"{name}({args})")
|
||||
node.set_scene(self.scene)
|
||||
# connect
|
||||
self.stack[-1].add_child(node)
|
||||
|
||||
# Exit a parse tree produced by ptmlParser#action_sign.
|
||||
def exitAction_sign(self, ctx: ptmlParser.Action_signContext):
|
||||
pass
|
||||
|
||||
# Enter a parse tree produced by ptmlParser#action_parm.
|
||||
def enterAction_parm(self, ctx: ptmlParser.Action_parmContext):
|
||||
pass
|
||||
|
||||
# Exit a parse tree produced by ptmlParser#action_parm.
|
||||
def exitAction_parm(self, ctx: ptmlParser.Action_parmContext):
|
||||
pass
|
||||
|
||||
# Enter a parse tree produced by ptmlParser#boolean.
|
||||
def enterBoolean(self, ctx: ptmlParser.BooleanContext):
|
||||
pass
|
||||
|
||||
# Exit a parse tree produced by ptmlParser#boolean.
|
||||
def exitBoolean(self, ctx: ptmlParser.BooleanContext):
|
||||
pass
|
|
@ -0,0 +1,35 @@
|
|||
//sequence:
|
||||
// act action1()
|
||||
// act action2(2, 2.3, True)
|
||||
//
|
||||
// parallel 2:
|
||||
// act action3(int a, float b)
|
||||
// act action4()
|
||||
|
||||
sequence{
|
||||
selector{
|
||||
cond CoffeeCupFound()
|
||||
act FindCoffeeCup()
|
||||
sequence{
|
||||
cond SeqTest()
|
||||
act Move(1.2, 2, 2.3, True)
|
||||
act Grasp()
|
||||
parallel 3 {
|
||||
cond Isact()
|
||||
act Testact()
|
||||
}
|
||||
}
|
||||
}
|
||||
selector{
|
||||
cond CoffeeCupGrasped()
|
||||
act GraspCoffeeCup()
|
||||
}
|
||||
selector{
|
||||
cond DestinationAReached()
|
||||
act ReachDestinationA()
|
||||
}
|
||||
selector{
|
||||
cond CoffeeCupPlaced()
|
||||
act PlaceCoffeeCup()
|
||||
}
|
||||
}
|
|
@ -0,0 +1,12 @@
|
|||
selector
|
||||
selector
|
||||
cond HasMap()
|
||||
act ExploreEnv()
|
||||
sequence
|
||||
cond Chatting()
|
||||
act DealChat()
|
||||
sequence
|
||||
cond HasSubTask()
|
||||
sequence
|
||||
cond At(Robot,Table)
|
||||
// cond At(Robot,Table)
|
|
@ -0,0 +1,7 @@
|
|||
selector{
|
||||
sequence{
|
||||
cond Chatting()
|
||||
act DealChat()
|
||||
}
|
||||
act At(Coffee,Table)
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
selector
|
||||
{
|
||||
selector
|
||||
{
|
||||
cond HasMap()
|
||||
act ExploreEnv()
|
||||
|
||||
} sequence
|
||||
{
|
||||
cond Chatting()
|
||||
act DealChat()
|
||||
|
||||
} sequence
|
||||
{
|
||||
cond HasSubTask()
|
||||
sequence
|
||||
{
|
||||
cond At(Robot,Table)
|
||||
|
||||
} // cond At(Robot,Table)}}
|
|
@ -0,0 +1,25 @@
|
|||
# from robowaiter.scene.scene import Scene
|
||||
# from robowaiter.behavior_tree.ptml.ptmlCompiler import load
|
||||
|
||||
import os
|
||||
from robowaiter import Robot, task_map
|
||||
from robowaiter.utils.bt.draw import render_dot_tree
|
||||
|
||||
if __name__ == '__main__':
|
||||
TASK_NAME = 'OT'
|
||||
|
||||
# create robot
|
||||
project_path = "../../../"
|
||||
ptml_path = os.path.join(project_path, 'behavior_tree/ptml/test/Default.ptml')
|
||||
behavior_lib_path = os.path.join(project_path, 'behavior_lib')
|
||||
|
||||
robot = Robot(ptml_path, behavior_lib_path)
|
||||
|
||||
# create task
|
||||
task = task_map[TASK_NAME](robot)
|
||||
|
||||
render_dot_tree(robot.bt.root,name="test")
|
||||
# build and tick
|
||||
# scene.BT = ptree.trees.BehaviourTree(scene.BT)
|
||||
# todo: tick this bt
|
||||
print(robot.bt)
|
|
@ -0,0 +1,29 @@
|
|||
digraph pastafarianism {
|
||||
ordering=out;
|
||||
graph [fontname="times-roman"];
|
||||
node [fontname="times-roman"];
|
||||
edge [fontname="times-roman"];
|
||||
"34d1cf8a-42d6-49de-a458-0c7d3bffc436" [fillcolor=cyan, fontcolor=black, fontsize=20, height=0.01, label="?", shape=diamond, style=filled, width=0.01];
|
||||
"33446211-2d5c-4e1d-bdb5-5ded443a713c" [fillcolor=cyan, fontcolor=black, fontsize=20, height=0.01, label="?", shape=diamond, style=filled, width=0.01];
|
||||
"34d1cf8a-42d6-49de-a458-0c7d3bffc436" -> "33446211-2d5c-4e1d-bdb5-5ded443a713c";
|
||||
"96622c49-e2f6-4de9-9284-0c5eabbdd741" [fillcolor=yellow, fontcolor=black, fontsize=20, label=HasMap, shape=ellipse, style=filled];
|
||||
"33446211-2d5c-4e1d-bdb5-5ded443a713c" -> "96622c49-e2f6-4de9-9284-0c5eabbdd741";
|
||||
"dc007c72-0338-4616-bac2-bc39c81d2b77" [fillcolor=lawngreen, fontcolor=black, fontsize=20, label=ExploreEnv, shape=box, style=filled];
|
||||
"33446211-2d5c-4e1d-bdb5-5ded443a713c" -> "dc007c72-0338-4616-bac2-bc39c81d2b77";
|
||||
"6fe9e522-557f-473a-a582-2f0d17d1a4f1" [fillcolor=orange, fontcolor=black, fontsize=20, height=0.01, label=">", shape=octagon, style=filled, width=0.01];
|
||||
"34d1cf8a-42d6-49de-a458-0c7d3bffc436" -> "6fe9e522-557f-473a-a582-2f0d17d1a4f1";
|
||||
"cf3e4033-88b1-41bb-a638-26cc06e7a3dd" [fillcolor=yellow, fontcolor=black, fontsize=20, label=Chatting, shape=ellipse, style=filled];
|
||||
"6fe9e522-557f-473a-a582-2f0d17d1a4f1" -> "cf3e4033-88b1-41bb-a638-26cc06e7a3dd";
|
||||
"d2e8364e-dd83-4abb-8234-8466ff0c0483" [fillcolor=lawngreen, fontcolor=black, fontsize=20, label=DealChat, shape=box, style=filled];
|
||||
"6fe9e522-557f-473a-a582-2f0d17d1a4f1" -> "d2e8364e-dd83-4abb-8234-8466ff0c0483";
|
||||
"d78eaf31-cc9d-484d-b564-dbd5912378fa" [fillcolor=orange, fontcolor=black, fontsize=20, height=0.01, label=">", shape=octagon, style=filled, width=0.01];
|
||||
"34d1cf8a-42d6-49de-a458-0c7d3bffc436" -> "d78eaf31-cc9d-484d-b564-dbd5912378fa";
|
||||
"85284b02-fc8e-4418-8d6b-7a154d2004f6" [fillcolor=yellow, fontcolor=black, fontsize=20, label=HasSubTask, shape=ellipse, style=filled];
|
||||
"d78eaf31-cc9d-484d-b564-dbd5912378fa" -> "85284b02-fc8e-4418-8d6b-7a154d2004f6";
|
||||
"eb1bba56-55b1-4a71-8b31-0381812f588a" [fillcolor=orange, fontcolor=black, fontsize=20, height=0.01, label=">", shape=octagon, style=filled, width=0.01];
|
||||
"d78eaf31-cc9d-484d-b564-dbd5912378fa" -> "eb1bba56-55b1-4a71-8b31-0381812f588a";
|
||||
"20b57b46-d59d-4b04-a4ed-eff12e6adc91" [fillcolor=yellow, fontcolor=black, fontsize=20, label="At(Robot,Table)", shape=ellipse, style=filled];
|
||||
"eb1bba56-55b1-4a71-8b31-0381812f588a" -> "20b57b46-d59d-4b04-a4ed-eff12e6adc91";
|
||||
"3d7f6aa9-62b5-4852-ab3e-ac0199cc46a8" [fillcolor=yellow, fontcolor=black, fontsize=20, label="At(Robot,Table)", shape=ellipse, style=filled];
|
||||
"d78eaf31-cc9d-484d-b564-dbd5912378fa" -> "3d7f6aa9-62b5-4852-ab3e-ac0199cc46a8";
|
||||
}
|
After Width: | Height: | Size: 52 KiB |
|
@ -0,0 +1,151 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Generated by graphviz version 9.0.0 (20230911.1827)
|
||||
-->
|
||||
<!-- Title: pastafarianism Pages: 1 -->
|
||||
<svg width="986pt" height="333pt"
|
||||
viewBox="0.00 0.00 986.41 333.03" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 329.03)">
|
||||
<title>pastafarianism</title>
|
||||
<polygon fill="white" stroke="none" points="-4,4 -4,-329.03 982.41,-329.03 982.41,4 -4,4"/>
|
||||
<!-- 34d1cf8a-42d6-49de-a458-0c7d3bffc436 -->
|
||||
<g id="node1" class="node">
|
||||
<title>34d1cf8a-42d6-49de-a458-0c7d3bffc436</title>
|
||||
<polygon fill="cyan" stroke="black" points="390.57,-325.03 365.57,-293.78 390.57,-262.53 415.57,-293.78 390.57,-325.03"/>
|
||||
<text text-anchor="middle" x="390.57" y="-286.4" font-family="Times New Roman,serif" font-size="20.00">?</text>
|
||||
</g>
|
||||
<!-- 33446211-2d5c-4e1d-bdb5-5ded443a713c -->
|
||||
<g id="node2" class="node">
|
||||
<title>33446211-2d5c-4e1d-bdb5-5ded443a713c</title>
|
||||
<polygon fill="cyan" stroke="black" points="193.57,-226.53 168.57,-195.28 193.57,-164.03 218.57,-195.28 193.57,-226.53"/>
|
||||
<text text-anchor="middle" x="193.57" y="-187.9" font-family="Times New Roman,serif" font-size="20.00">?</text>
|
||||
</g>
|
||||
<!-- 34d1cf8a-42d6-49de-a458-0c7d3bffc436->33446211-2d5c-4e1d-bdb5-5ded443a713c -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>34d1cf8a-42d6-49de-a458-0c7d3bffc436->33446211-2d5c-4e1d-bdb5-5ded443a713c</title>
|
||||
<path fill="none" stroke="black" d="M372.74,-284.05C338.31,-267.18 262.46,-230.02 221.35,-209.89"/>
|
||||
<polygon fill="black" stroke="black" points="223.1,-206.85 212.58,-205.59 220.02,-213.13 223.1,-206.85"/>
|
||||
</g>
|
||||
<!-- 6fe9e522-557f-473a-a582-2f0d17d1a4f1 -->
|
||||
<g id="node5" class="node">
|
||||
<title>6fe9e522-557f-473a-a582-2f0d17d1a4f1</title>
|
||||
<polygon fill="orange" stroke="black" points="411.43,-185.37 411.43,-205.19 399.21,-219.2 381.93,-219.2 369.72,-205.19 369.72,-185.37 381.93,-171.36 399.21,-171.36 411.43,-185.37"/>
|
||||
<text text-anchor="middle" x="390.57" y="-187.9" font-family="Times New Roman,serif" font-size="20.00">></text>
|
||||
</g>
|
||||
<!-- 34d1cf8a-42d6-49de-a458-0c7d3bffc436->6fe9e522-557f-473a-a582-2f0d17d1a4f1 -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>34d1cf8a-42d6-49de-a458-0c7d3bffc436->6fe9e522-557f-473a-a582-2f0d17d1a4f1</title>
|
||||
<path fill="none" stroke="black" d="M390.57,-261.98C390.57,-252.07 390.57,-241.02 390.57,-230.86"/>
|
||||
<polygon fill="black" stroke="black" points="394.07,-230.97 390.57,-220.97 387.07,-230.97 394.07,-230.97"/>
|
||||
</g>
|
||||
<!-- d78eaf31-cc9d-484d-b564-dbd5912378fa -->
|
||||
<g id="node8" class="node">
|
||||
<title>d78eaf31-cc9d-484d-b564-dbd5912378fa</title>
|
||||
<polygon fill="orange" stroke="black" points="683.43,-185.37 683.43,-205.19 671.21,-219.2 653.93,-219.2 641.72,-205.19 641.72,-185.37 653.93,-171.36 671.21,-171.36 683.43,-185.37"/>
|
||||
<text text-anchor="middle" x="662.57" y="-187.9" font-family="Times New Roman,serif" font-size="20.00">></text>
|
||||
</g>
|
||||
<!-- 34d1cf8a-42d6-49de-a458-0c7d3bffc436->d78eaf31-cc9d-484d-b564-dbd5912378fa -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>34d1cf8a-42d6-49de-a458-0c7d3bffc436->d78eaf31-cc9d-484d-b564-dbd5912378fa</title>
|
||||
<path fill="none" stroke="black" d="M409.7,-285.99C455.84,-269.62 573.65,-227.83 630.68,-207.59"/>
|
||||
<polygon fill="black" stroke="black" points="631.56,-211 639.81,-204.35 629.22,-204.4 631.56,-211"/>
|
||||
</g>
|
||||
<!-- 96622c49-e2f6-4de9-9284-0c5eabbdd741 -->
|
||||
<g id="node3" class="node">
|
||||
<title>96622c49-e2f6-4de9-9284-0c5eabbdd741</title>
|
||||
<ellipse fill="yellow" stroke="black" cx="59.57" cy="-104.11" rx="59.57" ry="22.1"/>
|
||||
<text text-anchor="middle" x="59.57" y="-96.74" font-family="Times New Roman,serif" font-size="20.00">HasMap</text>
|
||||
</g>
|
||||
<!-- 33446211-2d5c-4e1d-bdb5-5ded443a713c->96622c49-e2f6-4de9-9284-0c5eabbdd741 -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>33446211-2d5c-4e1d-bdb5-5ded443a713c->96622c49-e2f6-4de9-9284-0c5eabbdd741</title>
|
||||
<path fill="none" stroke="black" d="M177.41,-183.52C157.7,-170.41 123.74,-147.81 97.32,-130.23"/>
|
||||
<polygon fill="black" stroke="black" points="99.5,-127.47 89.23,-124.85 95.62,-133.3 99.5,-127.47"/>
|
||||
</g>
|
||||
<!-- dc007c72-0338-4616-bac2-bc39c81d2b77 -->
|
||||
<g id="node4" class="node">
|
||||
<title>dc007c72-0338-4616-bac2-bc39c81d2b77</title>
|
||||
<polygon fill="lawngreen" stroke="black" points="250.32,-122.11 136.82,-122.11 136.82,-86.11 250.32,-86.11 250.32,-122.11"/>
|
||||
<text text-anchor="middle" x="193.57" y="-96.74" font-family="Times New Roman,serif" font-size="20.00">ExploreEnv</text>
|
||||
</g>
|
||||
<!-- 33446211-2d5c-4e1d-bdb5-5ded443a713c->dc007c72-0338-4616-bac2-bc39c81d2b77 -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>33446211-2d5c-4e1d-bdb5-5ded443a713c->dc007c72-0338-4616-bac2-bc39c81d2b77</title>
|
||||
<path fill="none" stroke="black" d="M193.57,-163.34C193.57,-153.72 193.57,-143.17 193.57,-133.71"/>
|
||||
<polygon fill="black" stroke="black" points="197.07,-134 193.57,-124 190.07,-134 197.07,-134"/>
|
||||
</g>
|
||||
<!-- cf3e4033-88b1-41bb-a638-26cc06e7a3dd -->
|
||||
<g id="node6" class="node">
|
||||
<title>cf3e4033-88b1-41bb-a638-26cc06e7a3dd</title>
|
||||
<ellipse fill="yellow" stroke="black" cx="328.57" cy="-104.11" rx="60.63" ry="22.1"/>
|
||||
<text text-anchor="middle" x="328.57" y="-96.74" font-family="Times New Roman,serif" font-size="20.00">Chatting</text>
|
||||
</g>
|
||||
<!-- 6fe9e522-557f-473a-a582-2f0d17d1a4f1->cf3e4033-88b1-41bb-a638-26cc06e7a3dd -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>6fe9e522-557f-473a-a582-2f0d17d1a4f1->cf3e4033-88b1-41bb-a638-26cc06e7a3dd</title>
|
||||
<path fill="none" stroke="black" d="M377.73,-175.8C369.56,-164.06 358.81,-148.6 349.44,-135.12"/>
|
||||
<polygon fill="black" stroke="black" points="352.37,-133.2 343.78,-126.99 346.62,-137.2 352.37,-133.2"/>
|
||||
</g>
|
||||
<!-- d2e8364e-dd83-4abb-8234-8466ff0c0483 -->
|
||||
<g id="node7" class="node">
|
||||
<title>d2e8364e-dd83-4abb-8234-8466ff0c0483</title>
|
||||
<polygon fill="lawngreen" stroke="black" points="500.2,-122.11 406.95,-122.11 406.95,-86.11 500.2,-86.11 500.2,-122.11"/>
|
||||
<text text-anchor="middle" x="453.57" y="-96.74" font-family="Times New Roman,serif" font-size="20.00">DealChat</text>
|
||||
</g>
|
||||
<!-- 6fe9e522-557f-473a-a582-2f0d17d1a4f1->d2e8364e-dd83-4abb-8234-8466ff0c0483 -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>6fe9e522-557f-473a-a582-2f0d17d1a4f1->d2e8364e-dd83-4abb-8234-8466ff0c0483</title>
|
||||
<path fill="none" stroke="black" d="M403.63,-175.8C412.65,-163.04 424.78,-145.86 434.83,-131.64"/>
|
||||
<polygon fill="black" stroke="black" points="437.61,-133.78 440.52,-123.59 431.89,-129.74 437.61,-133.78"/>
|
||||
</g>
|
||||
<!-- 85284b02-fc8e-4418-8d6b-7a154d2004f6 -->
|
||||
<g id="node9" class="node">
|
||||
<title>85284b02-fc8e-4418-8d6b-7a154d2004f6</title>
|
||||
<ellipse fill="yellow" stroke="black" cx="601.57" cy="-104.11" rx="82.91" ry="22.1"/>
|
||||
<text text-anchor="middle" x="601.57" y="-96.74" font-family="Times New Roman,serif" font-size="20.00">HasSubTask</text>
|
||||
</g>
|
||||
<!-- d78eaf31-cc9d-484d-b564-dbd5912378fa->85284b02-fc8e-4418-8d6b-7a154d2004f6 -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>d78eaf31-cc9d-484d-b564-dbd5912378fa->85284b02-fc8e-4418-8d6b-7a154d2004f6</title>
|
||||
<path fill="none" stroke="black" d="M649.93,-175.8C641.96,-164.15 631.47,-148.81 622.3,-135.4"/>
|
||||
<polygon fill="black" stroke="black" points="625.3,-133.59 616.76,-127.31 619.52,-137.54 625.3,-133.59"/>
|
||||
</g>
|
||||
<!-- eb1bba56-55b1-4a71-8b31-0381812f588a -->
|
||||
<g id="node10" class="node">
|
||||
<title>eb1bba56-55b1-4a71-8b31-0381812f588a</title>
|
||||
<polygon fill="orange" stroke="black" points="744.43,-94.2 744.43,-114.02 732.21,-128.03 714.93,-128.03 702.72,-114.02 702.72,-94.2 714.93,-80.19 732.21,-80.19 744.43,-94.2"/>
|
||||
<text text-anchor="middle" x="723.57" y="-96.74" font-family="Times New Roman,serif" font-size="20.00">></text>
|
||||
</g>
|
||||
<!-- d78eaf31-cc9d-484d-b564-dbd5912378fa->eb1bba56-55b1-4a71-8b31-0381812f588a -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>d78eaf31-cc9d-484d-b564-dbd5912378fa->eb1bba56-55b1-4a71-8b31-0381812f588a</title>
|
||||
<path fill="none" stroke="black" d="M675.21,-175.8C683.66,-163.45 694.94,-146.97 704.47,-133.03"/>
|
||||
<polygon fill="black" stroke="black" points="707.13,-135.35 709.89,-125.12 701.35,-131.4 707.13,-135.35"/>
|
||||
</g>
|
||||
<!-- 3d7f6aa9-62b5-4852-ab3e-ac0199cc46a8 -->
|
||||
<g id="node12" class="node">
|
||||
<title>3d7f6aa9-62b5-4852-ab3e-ac0199cc46a8</title>
|
||||
<ellipse fill="yellow" stroke="black" cx="870.57" cy="-104.11" rx="107.83" ry="22.1"/>
|
||||
<text text-anchor="middle" x="870.57" y="-96.74" font-family="Times New Roman,serif" font-size="20.00">At(Robot,Table)</text>
|
||||
</g>
|
||||
<!-- d78eaf31-cc9d-484d-b564-dbd5912378fa->3d7f6aa9-62b5-4852-ab3e-ac0199cc46a8 -->
|
||||
<g id="edge11" class="edge">
|
||||
<title>d78eaf31-cc9d-484d-b564-dbd5912378fa->3d7f6aa9-62b5-4852-ab3e-ac0199cc46a8</title>
|
||||
<path fill="none" stroke="black" d="M683.66,-185.24C714.19,-172.15 771.78,-147.46 815,-128.93"/>
|
||||
<polygon fill="black" stroke="black" points="816.17,-132.24 823.99,-125.08 813.42,-125.81 816.17,-132.24"/>
|
||||
</g>
|
||||
<!-- 20b57b46-d59d-4b04-a4ed-eff12e6adc91 -->
|
||||
<g id="node11" class="node">
|
||||
<title>20b57b46-d59d-4b04-a4ed-eff12e6adc91</title>
|
||||
<ellipse fill="yellow" stroke="black" cx="723.57" cy="-22.1" rx="107.83" ry="22.1"/>
|
||||
<text text-anchor="middle" x="723.57" y="-14.72" font-family="Times New Roman,serif" font-size="20.00">At(Robot,Table)</text>
|
||||
</g>
|
||||
<!-- eb1bba56-55b1-4a71-8b31-0381812f588a->20b57b46-d59d-4b04-a4ed-eff12e6adc91 -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>eb1bba56-55b1-4a71-8b31-0381812f588a->20b57b46-d59d-4b04-a4ed-eff12e6adc91</title>
|
||||
<path fill="none" stroke="black" d="M723.57,-79.97C723.57,-72.46 723.57,-63.99 723.57,-55.92"/>
|
||||
<polygon fill="black" stroke="black" points="727.07,-56.06 723.57,-46.06 720.07,-56.06 727.07,-56.06"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 11 KiB |
|
@ -0,0 +1,50 @@
|
|||
On_VacuumCup_WaterTable
|
||||
On_Water_Table1
|
||||
On_Yogurt_Table2
|
||||
Is_AC_On
|
||||
On_BottledDrink_Table3
|
||||
On_Dessert_Bar
|
||||
On_Chips_Table3
|
||||
Is_TubeLight_On
|
||||
Is_Curtain_Off
|
||||
Is_Table1_Clean
|
||||
On_Bernachon_BrightTable6
|
||||
On_MilkDrink_Bar2
|
||||
Is_AC_Off
|
||||
Is_HallLight_On
|
||||
On_NFCJuice_Table2
|
||||
On_SpringWater_Table1
|
||||
Is_Floor_Clean
|
||||
Is_Chairs_Clean
|
||||
Is_ACTemperature_Down
|
||||
On_ADMilk_CoffeeTable
|
||||
On_Milk_Bar
|
||||
Is_Curtain_On
|
||||
Is_TubeLight_Off
|
||||
On_Softdrink_Table3
|
||||
Is_Chairs_Clean
|
||||
On_Dessert_Bar
|
||||
Is_HallLight_Off
|
||||
Is_ACTemperature_Up
|
||||
On_Chips_BrightTable6
|
||||
On_Water_Bar2
|
||||
On_Coffee_Table3
|
||||
Is_AC_On
|
||||
Is_ACTemperature_Down
|
||||
On_Yogurt_Table2
|
||||
On_VacuumCup_Bar
|
||||
Is_TubeLight_Off
|
||||
On_NFCJuice_WaterTable
|
||||
On_SpringWater_Table3
|
||||
Is_Floor_Clean
|
||||
Is_Chairs_Clean
|
||||
On_Coffee_Table2
|
||||
Is_ACTemperature_Up
|
||||
Exist_Water
|
||||
Is_ACTemperature_Down
|
||||
Is_Floor_Clean
|
||||
On_Bernachon_Bar
|
||||
On_MilkDrink_Table2
|
||||
Is_AC_Off
|
||||
On_VacuumCup_CoffeeTable
|
||||
Is_TubeLight_On
|
|
@ -0,0 +1,220 @@
|
|||
|
||||
|
||||
from utils.bt.load import load_behavior_tree_lib
|
||||
from OptimalBTExpansionAlgorithm import Action,OptBTExpAlgorithm
|
||||
import random
|
||||
import copy
|
||||
from tabulate import tabulate
|
||||
import numpy as np
|
||||
|
||||
from sympy import symbols, Not, Or, And, to_dnf
|
||||
from OptimalBTExpansionAlgorithm import Action,OptBTExpAlgorithm
|
||||
from BTExpansionAlgorithm import BTExpAlgorithm # 调用最优行为树扩展算法
|
||||
import time
|
||||
|
||||
|
||||
# todo: 行为树鲁棒性测试,随机生成规划问题
|
||||
# # 设置生成规划问题集的超参数:文字数、解深度、迭代次数
|
||||
seed =1
|
||||
# BTTest(bt_algo_opt=True ,seed=seed)
|
||||
# print("\n")
|
||||
# BTTest(bt_algo_opt=False ,seed=seed )
|
||||
|
||||
def collect_action_nodes():
|
||||
action_list = []
|
||||
behavior_dict = load_behavior_tree_lib()
|
||||
for cls in behavior_dict["act"].values():
|
||||
if cls.can_be_expanded:
|
||||
print(f"可扩展动作:{cls.__name__}, 存在{len(cls.valid_args)}个有效论域组合")
|
||||
if cls.num_args == 0:
|
||||
for num in range(2):
|
||||
cost = random.randint(1, 100)
|
||||
info = cls.get_info()
|
||||
info.pop('cost', None)
|
||||
action_list.append(Action(name=cls.get_ins_name()+str(num),cost=cost, **info))
|
||||
if cls.num_args == 1:
|
||||
for num in range(2):
|
||||
for arg in cls.valid_args:
|
||||
cost = random.randint(1, 100)
|
||||
info = cls.get_info(arg)
|
||||
info.pop('cost', None)
|
||||
action_list.append(Action(name=cls.get_ins_name(arg)+str(num),cost=cost, **info))
|
||||
if cls.num_args > 1:
|
||||
for num in range(2):
|
||||
for args in cls.valid_args:
|
||||
cost = random.randint(1, 100)
|
||||
info = cls.get_info(*args)
|
||||
info.pop('cost', None)
|
||||
action_list.append(Action(name=cls.get_ins_name(*args)+str(num),cost=cost, **info))
|
||||
return action_list
|
||||
action_list = collect_action_nodes()
|
||||
|
||||
start_robowaiter = {'At(Robot,Bar)', 'Is(AC,Off)',
|
||||
'Exist(Yogurt)', 'Exist(BottledDrink)', 'Exist(Softdrink)', 'Exist(ADMilk)',
|
||||
'On(Yogurt,Bar)','On(BottledDrink,Bar)','On(ADMilk,Bar)','On(Chips,Bar)',
|
||||
'Exist(Milk)', 'On(Softdrink,Table1)', 'On(Softdrink,Table3)',
|
||||
'Exist(Chips)', 'Exist(NFCJuice)', 'Exist(Bernachon)', 'Exist(ADMilk)', 'Exist(SpringWater)', 'Exist(MilkDrink)',
|
||||
'Exist(ADMilk)','On(ADMilk,Bar)','On(Bernachon,Bar)','On(SpringWater,Bar2)','On(MilkDrink,Bar)',
|
||||
'Holding(Nothing)',
|
||||
'Exist(VacuumCup)', 'On(VacuumCup,Table2)',
|
||||
'Is(HallLight,Off)', 'Is(TubeLight,On)', 'Is(Curtain,On)',
|
||||
'Is(Table1,Dirty)', 'Is(Floor,Dirty)', 'Is(Chairs,Dirty)'}
|
||||
|
||||
def print_action_data_table(goal,start,actions):
|
||||
data = []
|
||||
for a in actions:
|
||||
data.append([a.name ,a.pre ,a.add ,a.del_set ,a.cost])
|
||||
data.append(["Goal" ,goal ," " ,"Start" ,start])
|
||||
print(tabulate(data, headers=["Name", "Pre", "Add" ,"Del" ,"Cost"], tablefmt="fancy_grid")) # grid plain simple github fancy_grid
|
||||
|
||||
def state_transition(state,action):
|
||||
if not action.pre <= state:
|
||||
print ('error: action not applicable')
|
||||
return state
|
||||
new_state=(state | action.add) - action.del_set
|
||||
return new_state
|
||||
|
||||
|
||||
|
||||
total_tree_size = []
|
||||
total_action_num = []
|
||||
total_state_num = []
|
||||
total_steps_num=[]
|
||||
total_cost=[]
|
||||
total_tick=[]
|
||||
success_count =0
|
||||
failure_count = 0
|
||||
planning_time_total = 0.0
|
||||
|
||||
error = False
|
||||
|
||||
goal_states = []
|
||||
# Open the file and read the lines
|
||||
with open('easy.txt', 'r') as file:
|
||||
for line in file:
|
||||
# Strip newline characters and any leading/trailing whitespace
|
||||
clean_line = line.strip()
|
||||
# Add the cleaned line to the list
|
||||
goal_states.append(clean_line)
|
||||
# Now goal_states list contains all the lines from easy.txt
|
||||
print(goal_states)
|
||||
|
||||
|
||||
def goal_transfer_str(goal):
|
||||
goal_dnf = str(to_dnf(goal, simplify=True))
|
||||
# print(goal_dnf)
|
||||
goal_set = []
|
||||
if ('|' in goal or '&' in goal or 'Not' in goal) or not '(' in goal:
|
||||
goal_ls = goal_dnf.split("|")
|
||||
for g in goal_ls:
|
||||
g_set = set()
|
||||
g = g.replace(" ", "").replace("(", "").replace(")", "")
|
||||
g = g.split("&")
|
||||
for literal in g:
|
||||
if '_' in literal:
|
||||
first_part, rest = literal.split('_', 1)
|
||||
literal = first_part + '(' + rest
|
||||
# 添加 ')' 到末尾
|
||||
literal += ')'
|
||||
# 替换剩余的 '_' 为 ','
|
||||
literal = literal.replace('_', ',')
|
||||
g_set.add(literal)
|
||||
goal_set.append(g_set)
|
||||
|
||||
else:
|
||||
g_set = set()
|
||||
w = goal.split(")")
|
||||
g_set.add(w[0] + ")")
|
||||
if len(w) > 1:
|
||||
for x in w[1:]:
|
||||
if x != "":
|
||||
g_set.add(x[1:] + ")")
|
||||
goal_set.append(g_set)
|
||||
return goal_set
|
||||
|
||||
# 实验1000次
|
||||
for count,goal_str in enumerate(goal_states):
|
||||
|
||||
# if count>=2:
|
||||
# break
|
||||
|
||||
goal = copy.deepcopy(goal_transfer_str(goal_str))
|
||||
print("count:",count,"goal:",goal)
|
||||
|
||||
|
||||
# 生成一个规划问题,包括随机的状态和行动,以及目标状态
|
||||
states = []
|
||||
actions = copy.deepcopy(action_list)
|
||||
start = copy.deepcopy(start_robowaiter)
|
||||
state = copy.deepcopy(start)
|
||||
states.append(state)
|
||||
|
||||
# algo = OptBTExpAlgorithm(verbose=False)
|
||||
algo = BTExpAlgorithm(verbose=False)
|
||||
algo.clear()
|
||||
|
||||
#algo = Weakalgorithm()
|
||||
start_time = time.time()
|
||||
# if count == 11 : #874:
|
||||
# print_action_data_table(goal, start, list(actions))
|
||||
print_action_data_table(goal, start, list(actions))
|
||||
if algo.run_algorithm(start, goal, actions):#运行算法,规划后行为树为algo.bt
|
||||
total_tree_size.append( algo.bt.count_size()-1)
|
||||
# if count==11:
|
||||
# algo.print_solution()
|
||||
algo.print_solution() # 打印行为树
|
||||
else:
|
||||
print ("error")
|
||||
end_time = time.time()
|
||||
planning_time_total += (end_time-start_time)
|
||||
|
||||
#开始从初始状态运行行为树,测试
|
||||
state=start
|
||||
steps=0
|
||||
current_cost = 0
|
||||
current_tick_time=0
|
||||
val, obj, cost, tick_time = algo.bt.cost_tick(state,0,0)#tick行为树,obj为所运行的行动
|
||||
|
||||
current_tick_time+=tick_time
|
||||
current_cost += cost
|
||||
while val !='success' and val !='failure':#运行直到行为树成功或失败
|
||||
state = state_transition(state,obj)
|
||||
val, obj,cost, tick_time = algo.bt.cost_tick(state,0,0)
|
||||
current_cost += cost
|
||||
current_tick_time += tick_time
|
||||
if(val == 'failure'):
|
||||
print("bt fails at step",steps)
|
||||
error = True
|
||||
break
|
||||
steps+=1
|
||||
if(steps>=500):#至多运行500步
|
||||
break
|
||||
if not goal[0] <= state:#错误解,目标条件不在执行后状态满足
|
||||
#print ("wrong solution",steps)
|
||||
failure_count+=1
|
||||
error = True
|
||||
else:#正确解,满足目标条件
|
||||
#print ("right solution",steps)
|
||||
success_count+=1
|
||||
total_steps_num.append(steps)
|
||||
if error:
|
||||
print_action_data_table(goal, start, list(actions))
|
||||
algo.print_solution()
|
||||
break
|
||||
|
||||
|
||||
algo.clear()
|
||||
total_action_num.append(len(actions))
|
||||
total_state_num.append(len(states))
|
||||
total_cost.append(current_cost)
|
||||
total_tick.append(current_tick_time)
|
||||
|
||||
print("success:",success_count,"failure:",failure_count)#算法成功和失败次数
|
||||
print("Total Tree Size: mean=",np.mean(total_tree_size), "std=",np.std(total_tree_size, ddof=1))#1000次测试树大小
|
||||
print("Total Steps Num: mean=",np.mean(total_steps_num),"std=",np.std(total_steps_num,ddof=1))
|
||||
print("Average Number of States:",np.mean(total_state_num))#1000次问题的平均状态数
|
||||
print("Average Number of Actions",np.mean(total_action_num))#1000次问题的平均行动数
|
||||
print("Planning Time Total:",planning_time_total,planning_time_total/1000.0)
|
||||
print("Average Number of Ticks", np.mean(total_tick),"std=",np.std(total_tick,ddof=1))
|
||||
print("Average Cost of Execution:", np.mean(total_cost),"std=",np.std(total_cost,ddof=1))
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
|
||||
from EXP.exp_tools import collect_action_nodes,get_start,BTTest,goal_transfer_str
|
||||
import copy
|
||||
import random
|
||||
seed = 1
|
||||
random.seed(seed)
|
||||
|
||||
action_list = collect_action_nodes(random)
|
||||
for act in action_list:
|
||||
print(act.name,act.cost)
|
||||
|
||||
start_robowaiter = get_start()
|
||||
|
||||
|
||||
goal_states = []
|
||||
with open('easy.txt', 'r') as file:
|
||||
for line in file:
|
||||
clean_line = line.strip()
|
||||
goal_states.append(clean_line)
|
||||
print(goal_states)
|
||||
|
||||
# goal_set_ls=[]
|
||||
# for count, goal_str in enumerate(goal_states):
|
||||
# goal = copy.deepcopy(goal_transfer_str(goal_str))
|
||||
# goal_set_ls.append(goal)
|
||||
# print(goal_set_ls)
|
||||
|
||||
# goal_states={"On_Dessert_Bar"}
|
||||
# goal_states={"On_MilkDrink_Bar2"}
|
||||
# goal_states={"Is_TubeLight_On"}
|
||||
# goal_states = goal_set_ls
|
||||
# goal_states = {'On(VacuumCup,WaterTable)'}
|
||||
# goal_states = {'At(Robot,WaterTable)'}
|
||||
# goal_states = {'Is(Table1,Clean)'}
|
||||
|
||||
# todo: 行为树鲁棒性测试,随机生成规划问题
|
||||
# # 设置生成规划问题集的超参数:文字数、解深度、迭代次数
|
||||
|
||||
BTTest(bt_algo_opt=True, goal_states=goal_states,action_list=action_list,start_robowaiter=start_robowaiter)
|
||||
print("\n")
|
||||
# 对比
|
||||
BTTest(bt_algo_opt=False, goal_states=goal_states,action_list=action_list,start_robowaiter=start_robowaiter)
|
|
@ -0,0 +1,264 @@
|
|||
|
||||
|
||||
|
||||
from utils.bt.load import load_behavior_tree_lib
|
||||
from OptimalBTExpansionAlgorithm import Action,OptBTExpAlgorithm
|
||||
|
||||
import copy
|
||||
from tabulate import tabulate
|
||||
import numpy as np
|
||||
import os
|
||||
|
||||
from sympy import symbols, Not, Or, And, to_dnf
|
||||
from OptimalBTExpansionAlgorithm import Action,OptBTExpAlgorithm
|
||||
from BTExpansionAlgorithm import BTExpAlgorithm # 调用最优行为树扩展算法
|
||||
import time
|
||||
from utils.bt.draw import render_dot_tree
|
||||
from utils.bt.load import load_bt_from_ptml
|
||||
root_path = os.path.abspath(
|
||||
os.path.join(__file__, "../../..")
|
||||
)
|
||||
def goal_transfer_str(goal):
|
||||
goal_dnf = str(to_dnf(goal, simplify=True))
|
||||
# print(goal_dnf)
|
||||
goal_set = []
|
||||
if ('|' in goal or '&' in goal or 'Not' in goal) or not '(' in goal:
|
||||
goal_ls = goal_dnf.split("|")
|
||||
for g in goal_ls:
|
||||
g_set = set()
|
||||
g = g.replace(" ", "").replace("(", "").replace(")", "")
|
||||
g = g.split("&")
|
||||
for literal in g:
|
||||
if '_' in literal:
|
||||
first_part, rest = literal.split('_', 1)
|
||||
literal = first_part + '(' + rest
|
||||
# 添加 ')' 到末尾
|
||||
literal += ')'
|
||||
# 替换剩余的 '_' 为 ','
|
||||
literal = literal.replace('_', ',')
|
||||
g_set.add(literal)
|
||||
goal_set.append(g_set)
|
||||
|
||||
else:
|
||||
g_set = set()
|
||||
w = goal.split(")")
|
||||
g_set.add(w[0] + ")")
|
||||
if len(w) > 1:
|
||||
for x in w[1:]:
|
||||
if x != "":
|
||||
g_set.add(x[1:] + ")")
|
||||
goal_set.append(g_set)
|
||||
return goal_set
|
||||
|
||||
def collect_action_nodes(random):
|
||||
multiple_num=2
|
||||
action_list = []
|
||||
behavior_dict = load_behavior_tree_lib()
|
||||
|
||||
for cls in behavior_dict["act"].values():
|
||||
if cls.can_be_expanded:
|
||||
print(f"可扩展动作:{cls.__name__}, 存在{len(cls.valid_args)}个有效论域组合")
|
||||
if cls.num_args == 0:
|
||||
for num in range(multiple_num):
|
||||
info = cls.get_info()
|
||||
action_list.append(Action(name=cls.get_ins_name() + str(num), **info))
|
||||
if cls.num_args == 1:
|
||||
for num in range(multiple_num):
|
||||
for arg in cls.valid_args:
|
||||
info = cls.get_info(arg)
|
||||
action_list.append(Action(name=cls.get_ins_name(arg) + str(num), **info))
|
||||
if cls.num_args > 1:
|
||||
for num in range(multiple_num):
|
||||
for args in cls.valid_args:
|
||||
info = cls.get_info(*args)
|
||||
action_list.append(Action(name=cls.get_ins_name(*args) + str(num),**info))
|
||||
|
||||
action_list = sorted(action_list, key=lambda x: x.name)
|
||||
for i in range(len(action_list)):
|
||||
cost = random.randint(1, 100)
|
||||
action_list[i].cost=cost
|
||||
return action_list
|
||||
|
||||
def collect_action_nodes_old(random):
|
||||
action_list = []
|
||||
behavior_dict = load_behavior_tree_lib()
|
||||
behavior_ls = list()
|
||||
# behavior_ls.sort()
|
||||
|
||||
behavior_ls = [cls for cls in behavior_ls]
|
||||
behavior_ls = sorted(behavior_ls, key=lambda x: x.__class__.__name__)
|
||||
|
||||
for cls in behavior_ls:
|
||||
if cls.can_be_expanded:
|
||||
print(f"可扩展动作:{cls.__name__}, 存在{len(cls.valid_args)}个有效论域组合")
|
||||
if cls.num_args == 0:
|
||||
for num in range(2):
|
||||
cost = random.randint(1, 100)
|
||||
info = cls.get_info()
|
||||
info.pop('cost', None)
|
||||
action_list.append(Action(name=cls.get_ins_name()+str(num),cost=cost, **info))
|
||||
if cls.num_args == 1:
|
||||
for num in range(2):
|
||||
for arg in cls.valid_args:
|
||||
cost = random.randint(1, 100)
|
||||
info = cls.get_info(arg)
|
||||
info.pop('cost', None)
|
||||
action_list.append(Action(name=cls.get_ins_name(arg)+str(num),cost=cost, **info))
|
||||
if cls.num_args > 1:
|
||||
for num in range(2):
|
||||
for args in cls.valid_args:
|
||||
cost = random.randint(1, 100)
|
||||
info = cls.get_info(*args)
|
||||
info.pop('cost', None)
|
||||
action_list.append(Action(name=cls.get_ins_name(*args)+str(num),cost=cost, **info))
|
||||
return action_list
|
||||
|
||||
|
||||
def get_start():
|
||||
start_robowaiter = {'At(Robot,Bar)', 'Is(AC,Off)',
|
||||
'Exist(Yogurt)', 'Exist(BottledDrink)', 'Exist(Softdrink)', 'Exist(ADMilk)',
|
||||
'On(Yogurt,Bar)','On(BottledDrink,Bar)','On(ADMilk,Bar)','On(Chips,Bar)',
|
||||
'Exist(Milk)', 'On(Softdrink,Table1)', 'On(Softdrink,Table3)',
|
||||
'Exist(Chips)', 'Exist(NFCJuice)', 'Exist(Bernachon)', 'Exist(ADMilk)', 'Exist(SpringWater)', 'Exist(MilkDrink)',
|
||||
'Exist(ADMilk)','On(ADMilk,Bar)','On(Bernachon,Bar)','On(SpringWater,Bar2)','On(MilkDrink,Bar)',
|
||||
'Holding(Nothing)',
|
||||
'Exist(VacuumCup)', 'On(VacuumCup,Table2)',
|
||||
'Is(HallLight,Off)', 'Is(TubeLight,On)', 'Is(Curtain,On)',
|
||||
'Is(Table1,Dirty)', 'Is(Floor,Dirty)', 'Is(Chairs,Dirty)'}
|
||||
return start_robowaiter
|
||||
|
||||
|
||||
def print_action_data_table(goal,start,actions):
|
||||
data = []
|
||||
for a in actions:
|
||||
data.append([a.name ,a.pre ,a.add ,a.del_set ,a.cost])
|
||||
data.append(["Goal" ,goal ," " ,"Start" ,start])
|
||||
print(tabulate(data, headers=["Name", "Pre", "Add" ,"Del" ,"Cost"], tablefmt="fancy_grid")) # grid plain simple github fancy_grid
|
||||
|
||||
|
||||
def state_transition(state,action):
|
||||
if not action.pre <= state:
|
||||
print ('error: action not applicable')
|
||||
return state
|
||||
new_state=(state | action.add) - action.del_set
|
||||
return new_state
|
||||
|
||||
|
||||
def BTTest(bt_algo_opt,goal_states,action_list,start_robowaiter):
|
||||
|
||||
if bt_algo_opt:
|
||||
print("============= OptBT Test ==============")
|
||||
else:
|
||||
print("============= XiaoCai BT Test ==============")
|
||||
|
||||
total_tree_size = []
|
||||
total_action_num = []
|
||||
total_state_num = []
|
||||
total_steps_num = []
|
||||
total_cost = []
|
||||
total_tick = []
|
||||
success_count = 0
|
||||
failure_count = 0
|
||||
planning_time_total = 0.0
|
||||
states=[] ####???
|
||||
actions = copy.deepcopy(action_list)
|
||||
start = copy.deepcopy(start_robowaiter)
|
||||
|
||||
error=False
|
||||
|
||||
for count, goal_str in enumerate(goal_states):
|
||||
|
||||
goal = copy.deepcopy(goal_transfer_str(goal_str))
|
||||
print("count:", count, "goal:", goal)
|
||||
|
||||
|
||||
if bt_algo_opt:
|
||||
# if count==874:
|
||||
# algo = OptBTExpAlgorithm(verbose=False)
|
||||
# else:
|
||||
algo = OptBTExpAlgorithm(verbose=False)
|
||||
else:
|
||||
algo = BTExpAlgorithm(verbose=False)
|
||||
algo.clear()
|
||||
|
||||
# algo = Weakalgorithm()
|
||||
start_time = time.time()
|
||||
# if count == 11 : #874:
|
||||
# print_action_data_table(goal, start, list(actions))
|
||||
# print_action_data_table(goal, start, list(actions))
|
||||
if algo.run_algorithm(start, goal, actions): # 运行算法,规划后行为树为algo.bt
|
||||
total_tree_size.append(algo.bt.count_size() - 1)
|
||||
# if count==10:
|
||||
# algo.print_solution()
|
||||
# algo.print_solution() # 打印行为树
|
||||
|
||||
# 画出行为树
|
||||
# if count == 11:
|
||||
# ptml_string = algo.get_ptml_many_act()
|
||||
# file_name = "sub_task"
|
||||
# file_path = f'./{file_name}.ptml'
|
||||
# with open(file_path, 'w') as file:
|
||||
# file.write(ptml_string)
|
||||
# ptml_path = os.path.join(root_path, 'BTExpansionCode/EXP/sub_task.ptml')
|
||||
# behavior_lib_path = os.path.join(root_path, 'BTExpansionCode/EXP/behavior_lib')
|
||||
# bt = load_bt_from_ptml(None, ptml_path, behavior_lib_path)
|
||||
# if bt_algo_opt:
|
||||
# render_dot_tree(bt.root, target_directory="", name="expanded_bt_obt", png_only=False)
|
||||
# else:
|
||||
# render_dot_tree(bt.root, target_directory="", name="expanded_bt_xiaocai", png_only=False)
|
||||
|
||||
else:
|
||||
print("error")
|
||||
end_time = time.time()
|
||||
planning_time_total += (end_time - start_time)
|
||||
|
||||
# 开始从初始状态运行行为树,测试
|
||||
state = start
|
||||
steps = 0
|
||||
current_cost = 0
|
||||
current_tick_time = 0
|
||||
val, obj, cost, tick_time = algo.bt.cost_tick(state, 0, 0) # tick行为树,obj为所运行的行动
|
||||
|
||||
current_tick_time += tick_time
|
||||
current_cost += cost
|
||||
while val != 'success' and val != 'failure': # 运行直到行为树成功或失败
|
||||
state = state_transition(state, obj)
|
||||
val, obj, cost, tick_time = algo.bt.cost_tick(state, 0, 0)
|
||||
current_cost += cost
|
||||
current_tick_time += tick_time
|
||||
if (val == 'failure'):
|
||||
print("bt fails at step", steps)
|
||||
error = True
|
||||
break
|
||||
steps += 1
|
||||
if (steps >= 500): # 至多运行500步
|
||||
break
|
||||
if not goal[0] <= state: # 错误解,目标条件不在执行后状态满足
|
||||
# print ("wrong solution",steps)
|
||||
failure_count += 1
|
||||
error = True
|
||||
else: # 正确解,满足目标条件
|
||||
# print ("right solution",steps)
|
||||
success_count += 1
|
||||
total_steps_num.append(steps)
|
||||
if error:
|
||||
print_action_data_table(goal, start, list(actions))
|
||||
algo.print_solution()
|
||||
break
|
||||
|
||||
algo.clear()
|
||||
total_action_num.append(len(actions))
|
||||
total_state_num.append(len(states))
|
||||
total_cost.append(current_cost)
|
||||
total_tick.append(current_tick_time)
|
||||
|
||||
print("success:", success_count, "failure:", failure_count) # 算法成功和失败次数
|
||||
print("Total Tree Size: mean=", np.mean(total_tree_size), "std=", np.std(total_tree_size, ddof=1)) # 1000次测试树大小
|
||||
print("Total Steps Num: mean=", np.mean(total_steps_num), "std=", np.std(total_steps_num, ddof=1))
|
||||
print("Average Number of States:", np.mean(total_state_num)) # 1000次问题的平均状态数
|
||||
print("Average Number of Actions", np.mean(total_action_num)) # 1000次问题的平均行动数
|
||||
print("Planning Time Total:", planning_time_total, planning_time_total / 1000.0)
|
||||
print("Average Number of Ticks", np.mean(total_tick), "std=", np.std(total_tick, ddof=1))
|
||||
print("Average Cost of Execution:", np.mean(total_cost), "std=", np.std(total_cost, ddof=1))
|
||||
|
||||
|
After Width: | Height: | Size: 3.0 MiB |
After Width: | Height: | Size: 1.6 MiB |
After Width: | Height: | Size: 343 KiB |
After Width: | Height: | Size: 2.5 MiB |
|
@ -0,0 +1,195 @@
|
|||
|
||||
from OptimalBTExpansionAlgorithm_single_goal import Action
|
||||
|
||||
|
||||
# 本例子中,将 VacuumCup 放到 FrontDesk,比 MoveTo(Table) 再 Put(Table,VacuumCup) 的 cost 要小
|
||||
def SoftdrinkCost():
|
||||
actions=[
|
||||
Action(name='PutDown(Softdrink,WaterTable)', pre={'Holding(Softdrink)','At(Robot,WaterTable)'}, add={'Holding(Nothing)','On(Softdrink,WaterTable)'}, del_set={'Holding(Softdrink)'}, cost=3),
|
||||
Action(name='PickUp(Softdrink)', pre={'At(Robot,Softdrink)','Holding(Nothing)'}, add={'Holding(Softdrink)'}, del_set={'Holding(Nothing)'}, cost=2),
|
||||
Action(name='MoveTo(WaterTable)', pre=set(), add={'At(Robot,WaterTable)'}, del_set={'At(Robot,Softdrink)','At(Robot,Bar)','At(Robot,Coffee)'}, cost=5),
|
||||
Action(name='MoveTo(Softdrink)', pre={'Exist(Softdrink)'}, add={'At(Robot,Softdrink)'}, del_set={'At(Robot,WaterTable)','At(Robot,Bar)','At(Robot,Coffee)'}, cost=5),
|
||||
Action(name='PutDown(Coffee,WaterTable)', pre={'Holding(Coffee)'}, add={'Holding(Nothing)'},del_set={'Holding(Softdrink)', 'Holding(Coffee)'}, cost=10),
|
||||
|
||||
Action(name='PutDown(Anything,Anywhere)', pre=set(), add={'Holding(Nothing)'},del_set={'Holding(Softdrink)', 'Holding(Coffee)'}, cost=0),
|
||||
|
||||
]
|
||||
|
||||
start = {'At(Robot,Bar)','Holding(Coffee)','Exist(Softdrink)'}
|
||||
goal = {'On(Softdrink,WaterTable)'}
|
||||
|
||||
return goal,start,actions
|
||||
|
||||
|
||||
|
||||
def MakeCoffee():
|
||||
actions=[
|
||||
Action(name='Put(Table,Coffee)', pre={'Holding(Coffee)','At(Table)'}, add={'At(Table,Coffee)','NotHolding'}, del_set={'Holding(Coffee)'}, cost=1),
|
||||
Action(name='Put(Table,VacuumCup)', pre={'Holding(VacuumCup)','At(Table)'}, add={'At(Table,VacuumCup)','NotHolding'}, del_set={'Holding(VacuumCup)'}, cost=1),
|
||||
|
||||
Action(name='Grasp(Coffee)', pre={'NotHolding','At(Coffee)'}, add={'Holding(Coffee)'}, del_set={'NotHolding'}, cost=1),
|
||||
|
||||
Action(name='MoveTo(Table)', pre={'Exist(Table)'}, add={'At(Table)'}, del_set={'At(FrontDesk)','At(Coffee)','At(CoffeeMachine)'}, cost=1),
|
||||
Action(name='MoveTo(Coffee)', pre={'Exist(Coffee)'}, add={'At(Coffee)'}, del_set={'At(FrontDesk)','At(Table)','At(CoffeeMachine)'}, cost=1),
|
||||
Action(name='MoveTo(CoffeeMachine)', pre={'Exist(CoffeeMachine)'}, add={'At(CoffeeMachine)'}, del_set={'At(FrontDesk)','At(Coffee)','At(Table)'}, cost=1),
|
||||
|
||||
Action(name='OpCoffeeMachine', pre={'At(CoffeeMachine)','NotHolding'}, add={'Exist(Coffee)','At(Coffee)'}, del_set=set(), cost=1),
|
||||
]
|
||||
|
||||
start = {'At(FrontDesk)','Holding(VacuumCup)','Exist(Table)','Exist(CoffeeMachine)','Exist(FrontDesk)'}
|
||||
goal = {'At(Table,Coffee)'}
|
||||
return goal,start,actions
|
||||
|
||||
# 本例子中,将 VacuumCup 放到 FrontDesk,比 MoveTo(Table) 再 Put(Table,VacuumCup) 的 cost 要小
|
||||
def MakeCoffeeCost():
|
||||
actions=[
|
||||
Action(name='PutDown(Table,Coffee)', pre={'Holding(Coffee)','At(Robot,Table)'}, add={'At(Table,Coffee)','NotHolding'}, del_set={'Holding(Coffee)'}, cost=1),
|
||||
Action(name='PutDown(Table,VacuumCup)', pre={'Holding(VacuumCup)','At(Robot,Table)'}, add={'At(Table,VacuumCup)','NotHolding'}, del_set={'Holding(VacuumCup)'}, cost=1),
|
||||
|
||||
Action(name='PickUp(Coffee)', pre={'NotHolding','At(Robot,Coffee)'}, add={'Holding(Coffee)'}, del_set={'NotHolding'}, cost=1),
|
||||
|
||||
Action(name='MoveTo(Table)', pre={'Available(Table)'}, add={'At(Robot,Table)'}, del_set={'At(Robot,FrontDesk)','At(Robot,Coffee)','At(Robot,CoffeeMachine)'}, cost=1),
|
||||
Action(name='MoveTo(Coffee)', pre={'Available(Coffee)'}, add={'At(Robot,Coffee)'}, del_set={'At(Robot,FrontDesk)','At(Robot,Table)','At(Robot,CoffeeMachine)'}, cost=1),
|
||||
Action(name='MoveTo(CoffeeMachine)', pre={'Available(CoffeeMachine)'}, add={'At(Robot,CoffeeMachine)'}, del_set={'At(Robot,FrontDesk)','At(Robot,Coffee)','At(Robot,Table)'}, cost=1),
|
||||
|
||||
Action(name='OpCoffeeMachine', pre={'At(Robot,CoffeeMachine)','NotHolding'}, add={'Available(Coffee)','At(Robot,Coffee)'}, del_set=set(), cost=1),
|
||||
]
|
||||
|
||||
start = {'At(Robot,Bar)','Holding(VacuumCup)','Available(Table)','Available(CoffeeMachine)','Available(FrontDesk)'}
|
||||
goal = {'At(Table,Coffee)'}
|
||||
|
||||
return goal,start,actions
|
||||
|
||||
|
||||
|
||||
|
||||
# test
|
||||
def Test():
|
||||
actions=[
|
||||
Action(name='a1', pre={6}, add={0,2,4}, del_set={1,5}, cost=1),
|
||||
Action(name='a2', pre=set(), add={0,1}, del_set=set(), cost=1),
|
||||
Action(name='a3', pre={1,6}, add={0,2,3,5}, del_set={1,6}, cost=1),
|
||||
Action(name='a4', pre={0,2,3}, add={4,5}, del_set={0,6}, cost=1),
|
||||
Action(name='a5', pre={0,1,4}, add={2,3,6}, del_set={0}, cost=1),
|
||||
]
|
||||
|
||||
start = {1,2,6}
|
||||
goal={0,1,2,4,6}
|
||||
return goal,start,actions
|
||||
|
||||
# def Test():
|
||||
# actions=[
|
||||
# Action(name='a1', pre={2}, add={1}, del_set=set(), cost=1),
|
||||
# Action(name='a2', pre=set(), add={1}, del_set={0,2}, cost=1),
|
||||
# Action(name='a3', pre={1}, add=set(), del_set={0,2}, cost=1),
|
||||
# Action(name='a4', pre=set(), add={0}, del_set=set(), cost=1),
|
||||
# Action(name='a5', pre={1}, add={0,2}, del_set={1}, cost=1),
|
||||
# Action(name='a6', pre={1}, add=set(), del_set={0,1,2}, cost=1),
|
||||
# Action(name='a7', pre={1}, add={2}, del_set={0, 2}, cost=1),
|
||||
# ]
|
||||
#
|
||||
# start = {1,2}
|
||||
# goal={0,1}
|
||||
# return goal,start,actions
|
||||
|
||||
|
||||
# todo: 最原始的例子
|
||||
def MoveBtoB_num ():
|
||||
actions=[]
|
||||
a = Action(name='a1')
|
||||
a.pre={1,4}
|
||||
a.add={"c_goal"}
|
||||
a.del_set={1,4}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
a=Action(name='a2')
|
||||
a.pre={1,2,3}
|
||||
a.add={"c_goal"}
|
||||
a.del_set={1,2,3}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
a=Action(name='a3')
|
||||
a.pre={1,2}
|
||||
a.add={4}
|
||||
a.del_set={2}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
a=Action(name='a4')
|
||||
a.pre={"c_start"}
|
||||
a.add={1,2,3}
|
||||
a.del_set={"c_start",4}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
start = {"c_start"}
|
||||
goal={"c_goal"}
|
||||
return goal,start,actions
|
||||
|
||||
|
||||
# todo: 最原始的例子
|
||||
def MoveBtoB ():
|
||||
actions=[]
|
||||
a = Action(name="Move(b,ab)") #'movebtob'
|
||||
a.pre={'Free(ab)','WayClear'} #{1,2}
|
||||
a.add={'At(b,ab)'} #{3}
|
||||
a.del_set= {'Free(ab)','At(b,pb)'} #{1,4}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
a=Action(name="Move(s,ab)") #'moveatob'
|
||||
a.pre={'Free(ab)'} #{1}
|
||||
a.add={'Free(ab)','WayClear'} #{5,2}
|
||||
a.del_set={'Free(ab)','At(s,ps)'} #{1,6}
|
||||
a.cost = 2
|
||||
actions.append(a)
|
||||
|
||||
a=Action(name="Move(s,as)") #'moveatoa'
|
||||
a.pre={'Free(as)'} #{7}
|
||||
a.add={'At(s,ps)','WayClear'} #{8,2}
|
||||
a.del_set={'Free(as)','At(s,ps)'} #{7,6}
|
||||
a.cost = 3
|
||||
actions.append(a)
|
||||
|
||||
start = {'Free(ab)','Free(as)','At(b,pb)','At(s,ps)'} #{1,7,4,6}
|
||||
goal= {'At(b,ab)'} #{3}
|
||||
return goal,start,actions
|
||||
|
||||
|
||||
# 小蔡师兄论文里的例子
|
||||
def Cond2BelongsToCond3():
|
||||
actions=[]
|
||||
a = Action(name='a1')
|
||||
a.pre={1,4}
|
||||
a.add={"c_goal"}
|
||||
a.del_set={1,4}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
a=Action(name='a2')
|
||||
a.pre={1,2,3}
|
||||
a.add={"c_goal"}
|
||||
a.del_set={1,2,3}
|
||||
a.cost = 1 #100
|
||||
actions.append(a)
|
||||
|
||||
a=Action(name='a3')
|
||||
a.pre={1,2}
|
||||
a.add={4}
|
||||
a.del_set={2}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
a=Action(name='a4')
|
||||
a.pre={"c_start"}
|
||||
a.add={1,2,3}
|
||||
a.del_set={"c_start",4}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
start = {"c_start"}
|
||||
goal={"c_goal"}
|
||||
return goal,start,actions
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
selector{
|
||||
cond At(Table,Coffee)
|
||||
sequence{
|
||||
cond At(Robot,Table)
|
||||
cond Holding(Coffee)
|
||||
act PutDown(Table,Coffee)
|
||||
}
|
||||
sequence{
|
||||
cond Available(Table)
|
||||
cond Holding(Coffee)
|
||||
act MoveTo(Table)
|
||||
}
|
||||
sequence{
|
||||
cond At(Robot,Coffee)
|
||||
cond Available(Table)
|
||||
cond NotHolding
|
||||
act PickUp(Coffee)
|
||||
}
|
||||
sequence{
|
||||
cond Available(Coffee)
|
||||
cond Available(Table)
|
||||
cond NotHolding
|
||||
act MoveTo(Coffee)
|
||||
}
|
||||
sequence{
|
||||
cond Holding(VacuumCup)
|
||||
cond At(Robot,Table)
|
||||
cond Available(Table)
|
||||
cond Available(Coffee)
|
||||
act PutDown(Table,VacuumCup)
|
||||
}
|
||||
sequence{
|
||||
cond At(Robot,CoffeeMachine)
|
||||
cond Available(Table)
|
||||
cond NotHolding
|
||||
act OpCoffeeMachine()
|
||||
}
|
||||
sequence{
|
||||
cond Holding(VacuumCup)
|
||||
cond Available(Table)
|
||||
cond Available(Coffee)
|
||||
act MoveTo(Table)
|
||||
}
|
||||
sequence{
|
||||
cond Available(CoffeeMachine)
|
||||
cond Available(Table)
|
||||
cond NotHolding
|
||||
act MoveTo(CoffeeMachine)
|
||||
}
|
||||
sequence{
|
||||
cond Holding(VacuumCup)
|
||||
cond At(Robot,Table)
|
||||
cond Available(Table)
|
||||
cond Available(CoffeeMachine)
|
||||
act PutDown(Table,VacuumCup)
|
||||
}
|
||||
sequence{
|
||||
cond Holding(VacuumCup)
|
||||
cond Available(Table)
|
||||
cond Available(CoffeeMachine)
|
||||
act MoveTo(Table)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,706 @@
|
|||
import copy
|
||||
import random
|
||||
from BehaviorTree import Leaf,ControlBT
|
||||
import re
|
||||
|
||||
|
||||
class CondActPair:
|
||||
def __init__(self, cond_leaf,act_leaf):
|
||||
self.cond_leaf = cond_leaf
|
||||
self.act_leaf = act_leaf
|
||||
|
||||
#定义行动类,行动包括前提、增加和删除影响
|
||||
class Action:
|
||||
def __init__(self,name='anonymous action',pre=set(),add=set(),del_set=set(),cost=1):
|
||||
self.pre=copy.deepcopy(pre)
|
||||
self.add=copy.deepcopy(add)
|
||||
self.del_set=copy.deepcopy(del_set)
|
||||
self.name=name
|
||||
self.cost=cost
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
# 从状态随机生成一个行动
|
||||
def generate_from_state(self,state,num):
|
||||
for i in range(0,num):
|
||||
if i in state:
|
||||
if random.random() >0.5:
|
||||
self.pre.add(i)
|
||||
if random.random() >0.5:
|
||||
self.del_set.add(i)
|
||||
continue
|
||||
if random.random() > 0.5:
|
||||
self.add.add(i)
|
||||
continue
|
||||
if random.random() >0.5:
|
||||
self.del_set.add(i)
|
||||
def print_action(self):
|
||||
print (self.pre)
|
||||
print(self.add)
|
||||
print(self.del_set)
|
||||
|
||||
#生成随机状态
|
||||
def generate_random_state(num):
|
||||
result = set()
|
||||
for i in range(0,num):
|
||||
if random.random()>0.5:
|
||||
result.add(i)
|
||||
return result
|
||||
#从状态和行动生成后继状态
|
||||
def state_transition(state,action):
|
||||
if not action.pre <= state:
|
||||
print ('error: action not applicable')
|
||||
return state
|
||||
new_state=(state | action.add) - action.del_set
|
||||
return new_state
|
||||
|
||||
|
||||
def conflict(c):
|
||||
have_at = False
|
||||
for str in c:
|
||||
if 'At' in str:
|
||||
if not have_at:
|
||||
have_at = True
|
||||
else:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
#本文所提出的完备规划算法
|
||||
class OptBTExpAlgorithm:
|
||||
def __init__(self,verbose=False):
|
||||
self.bt = None
|
||||
self.nodes=[]
|
||||
self.traversed=[]
|
||||
self.mounted=[]
|
||||
self.conditions=[]
|
||||
self.conditions_index=[]
|
||||
self.verbose=verbose
|
||||
self.goal=None
|
||||
self.bt_merge = True
|
||||
|
||||
def clear(self):
|
||||
self.bt = None
|
||||
self.nodes = []
|
||||
self.traversed = [] #存cond
|
||||
self.expanded = [] #存整个
|
||||
self.conditions = []
|
||||
self.conditions_index = []
|
||||
|
||||
#运行规划算法,从初始状态、目标状态和可用行动,计算行为树self.bt
|
||||
# def run_algorithm(self,goal,actions,scene):
|
||||
def run_algorithm_selTree(self, start, goal, actions):
|
||||
# self.scene = scene
|
||||
|
||||
self.goal = goal
|
||||
|
||||
if self.verbose:
|
||||
print("\n算法开始!")
|
||||
|
||||
|
||||
bt = ControlBT(type='cond')
|
||||
# 初始行为树只包含目标条件
|
||||
gc_node = Leaf(type='cond', content=goal, mincost=0) # 为了统一,都成对出现
|
||||
ga_node = Leaf(type='act', content=None, mincost=0)
|
||||
subtree = ControlBT(type='?')
|
||||
subtree.add_child([copy.deepcopy(gc_node)]) # 子树首先保留所扩展结
|
||||
bt.add_child([subtree])
|
||||
|
||||
# self.conditions.append(goal)
|
||||
cond_anc_pair = CondActPair(cond_leaf=gc_node,act_leaf=ga_node)
|
||||
self.nodes.append(copy.deepcopy(cond_anc_pair)) # the set of explored but unexpanded conditions
|
||||
self.traversed = [goal] # the set of expanded conditions
|
||||
|
||||
while len(self.nodes)!=0:
|
||||
|
||||
# Find the condition for the shortest cost path
|
||||
pair_node = None
|
||||
min_cost = float ('inf')
|
||||
index= -1
|
||||
for i,cond_anc_pair in enumerate(self.nodes):
|
||||
|
||||
########### 剪枝操作
|
||||
# cond_tmp = cond_anc_pair.cond_leaf.content
|
||||
# valid = True
|
||||
# for pn in self.expanded: # 剪枝操作
|
||||
# if isinstance(pn.act_leaf.content,Action):
|
||||
# if pn.act_leaf.content.name==cond_anc_pair.act_leaf.content.name and cond_tmp <= pn.cond_leaf.content:
|
||||
# valid = False
|
||||
# break
|
||||
# if not valid:
|
||||
# continue
|
||||
########### 剪枝操作
|
||||
|
||||
if cond_anc_pair.cond_leaf.mincost < min_cost:
|
||||
min_cost = cond_anc_pair.cond_leaf.mincost
|
||||
pair_node = copy.deepcopy(cond_anc_pair)
|
||||
index = i
|
||||
|
||||
if self.verbose:
|
||||
print("选择扩展条件结点:",pair_node.cond_leaf.content)
|
||||
# Update self.nodes and self.traversed
|
||||
self.nodes.pop(index) # the set of explored but unexpanded conditions. self.nodes.remove(pair_node)
|
||||
c = pair_node.cond_leaf.content # 子树所扩展结点对应的条件(一个文字的set)
|
||||
|
||||
# Mount the action node and extend BT. T = Eapand(T,c,A(c))
|
||||
if c!=goal:
|
||||
if c!=set():
|
||||
|
||||
# 挂在上去的时候判断要不要挂载
|
||||
########### 剪枝操作 发现行不通
|
||||
# valid = True
|
||||
# for pn in self.expanded: # 剪枝操作
|
||||
# if isinstance(pn.act_leaf.content,Action):
|
||||
# if pn.act_leaf.content.name==pair_node.act_leaf.content.name and c <= pn.cond_leaf.content:
|
||||
# valid = False
|
||||
# break
|
||||
# if valid:
|
||||
########### 剪枝操作
|
||||
sequence_structure = ControlBT(type='>')
|
||||
sequence_structure.add_child(
|
||||
[copy.deepcopy(pair_node.cond_leaf), copy.deepcopy(pair_node.act_leaf)])
|
||||
subtree.add_child([copy.deepcopy(sequence_structure)]) # subtree 是回不断变化的,它的父亲是self.bt
|
||||
self.expanded.append(copy.deepcopy(pair_node))
|
||||
# 增加实时条件判断,满足条件就不再扩展
|
||||
# if c <= self.scene.state["condition_set"]:
|
||||
# if c <= start:
|
||||
# # 要不要继续扩展完全
|
||||
# # self.merge_adjacent_conditions_stack()
|
||||
# # self.merge_adjacent_conditions_stack_old()
|
||||
# # self.merge_adjacent_conditions()
|
||||
# return True
|
||||
|
||||
if c <= start:
|
||||
if self.bt_merge:
|
||||
bt = self.merge_adjacent_conditions_stack(bt)
|
||||
return bt,min_cost
|
||||
else:
|
||||
subtree.add_child([copy.deepcopy(pair_node.act_leaf)])
|
||||
|
||||
|
||||
if self.verbose:
|
||||
print("完成扩展 a_node= %s,对应的新条件 c_attr= %s,mincost=%d" \
|
||||
% (cond_anc_pair.act_leaf.content.name, cond_anc_pair.cond_leaf.content,
|
||||
cond_anc_pair.cond_leaf.mincost))
|
||||
|
||||
if self.verbose:
|
||||
print("遍历所有动作, 寻找符合条件的动作")
|
||||
# 遍历所有动作, 寻找符合条件的动作
|
||||
current_mincost = pair_node.cond_leaf.mincost # 当前的最短路径是多少
|
||||
|
||||
traversed_current=[]
|
||||
|
||||
for i in range(0, len(actions)):
|
||||
|
||||
# if "MoveTo(WaterTable)" in actions[i].name:
|
||||
# print(actions[i].name,"cost=",actions[i].cost)
|
||||
|
||||
|
||||
if not c & ((actions[i].pre | actions[i].add) - actions[i].del_set) <= set() :
|
||||
if (c - actions[i].del_set) == c:
|
||||
if self.verbose:
|
||||
print("———— 满足条件可以扩展")
|
||||
c_attr = (actions[i].pre | c) - actions[i].add
|
||||
|
||||
# 这样剪枝存在错误性
|
||||
# if conflict(c_attr):
|
||||
# continue
|
||||
|
||||
# 剪枝操作,现在的条件是以前扩展过的条件的超集
|
||||
valid = True
|
||||
for j in self.traversed: # 剪枝操作
|
||||
if j <= c_attr:
|
||||
valid = False
|
||||
if self.verbose:
|
||||
print("———— --被剪枝")
|
||||
break
|
||||
|
||||
if valid:
|
||||
c_attr_node = Leaf(type='cond', content=c_attr, mincost=current_mincost + actions[i].cost)
|
||||
a_attr_node = Leaf(type='act', content=actions[i], mincost=current_mincost + actions[i].cost)
|
||||
cond_anc_pair = CondActPair(cond_leaf=c_attr_node, act_leaf=a_attr_node)
|
||||
self.nodes.append(copy.deepcopy(cond_anc_pair)) # condition node list
|
||||
traversed_current.append(c_attr)
|
||||
# self.traversed.append(c_attr) # 重点 the set of expanded conditions
|
||||
# 把符合条件的动作节点都放到列表里
|
||||
if self.verbose:
|
||||
print("———— -- %s 符合条件放入列表,对应的c为 %s" % (actions[i].name,c_attr))
|
||||
self.traversed.extend(traversed_current)
|
||||
if self.bt_merge:
|
||||
bt = self.merge_adjacent_conditions_stack(bt)
|
||||
if self.verbose:
|
||||
print("算法结束!\n")
|
||||
return bt,min_cost
|
||||
|
||||
|
||||
def run_algorithm(self, start, goal, actions):
|
||||
self.bt = ControlBT(type='cond')
|
||||
subtree = ControlBT(type='?')
|
||||
|
||||
subtree_with_costs_ls=[]
|
||||
|
||||
if len(goal) > 1:
|
||||
for g in goal:
|
||||
bt_sel_tree,mincost = self.run_algorithm_selTree(start, g, actions)
|
||||
subtree_with_costs_ls.append((bt_sel_tree,mincost))
|
||||
# 要排个序再一次add
|
||||
# subtree.add_child([copy.deepcopy(bt_sel_tree.children[0])])
|
||||
# self.bt.add_child([subtree])
|
||||
sorted_trees = sorted(subtree_with_costs_ls, key=lambda x: x[1])
|
||||
for tree,cost in sorted_trees:
|
||||
subtree.add_child([copy.deepcopy(tree.children[0])])
|
||||
self.bt.add_child([subtree])
|
||||
else:
|
||||
self.bt,mincost = self.run_algorithm_selTree(start, goal[0], actions)
|
||||
return True
|
||||
|
||||
def run_algorithm_test(self, start, goal, actions):
|
||||
self.bt,mincost = self.run_algorithm_selTree(start, goal, actions)
|
||||
return True
|
||||
|
||||
|
||||
def merge_adjacent_conditions_stack(self,bt_sel):
|
||||
# 只针对第一层合并,之后要考虑层层递归合并
|
||||
bt = ControlBT(type='cond')
|
||||
sbtree = ControlBT(type='?')
|
||||
# gc_node = Leaf(type='cond', content=self.goal, mincost=0) # 为了统一,都成对出现
|
||||
# sbtree.add_child([copy.deepcopy(gc_node)]) # 子树首先保留所扩展结
|
||||
bt.add_child([sbtree])
|
||||
|
||||
parnode = bt_sel.children[0]
|
||||
stack=[]
|
||||
for child in parnode.children:
|
||||
if isinstance(child, ControlBT) and child.type == '>':
|
||||
if stack==[]:
|
||||
stack.append(child)
|
||||
continue
|
||||
# 检查合并的条件,前面一个的条件包含了后面的条件,把包含部分提取出来
|
||||
last_child = stack[-1]
|
||||
if isinstance(last_child, ControlBT) and last_child.type == '>':
|
||||
set1 = last_child.children[0].content
|
||||
set2 = child.children[0].content
|
||||
inter = set1 & set2
|
||||
if inter!=set():
|
||||
c1 = set1-set2
|
||||
c2 = set2-set1
|
||||
inter_node = Leaf(type='cond', content=inter)
|
||||
c1_node = Leaf(type='cond', content=c1)
|
||||
c2_node = Leaf(type='cond', content=c2)
|
||||
a1_node = last_child.children[1]
|
||||
a2_node = child.children[1]
|
||||
|
||||
|
||||
# set1<=set2,此时set2对应的动作永远不会执行
|
||||
if (c1==set() and isinstance(last_child.children[1], Leaf) and isinstance(child.children[1], Leaf) \
|
||||
and isinstance(last_child.children[1].content, Action) and isinstance(child.children[1].content, Action)):
|
||||
continue
|
||||
|
||||
# 再写一个特殊情况处理,三个结点动作last 遇到 两个结点 且动作相同
|
||||
if len(last_child.children)==3 and \
|
||||
isinstance(last_child.children[2], Leaf) and isinstance(child.children[1], Leaf) \
|
||||
and isinstance(last_child.children[2].content, Action) and isinstance( child.children[1].content, Action) \
|
||||
and last_child.children[2].content.name == child.children[1].content.name \
|
||||
and c1==set() and c2!=set():
|
||||
last_child.children[1].add_child([c2_node])
|
||||
continue
|
||||
elif len(last_child.children)==3:
|
||||
stack.append(child)
|
||||
continue
|
||||
|
||||
# 判断动作相不相同
|
||||
if isinstance(last_child.children[1], Leaf) and isinstance(child.children[1], Leaf) \
|
||||
and isinstance(last_child.children[1].content, Action) and isinstance(child.children[1].content, Action) \
|
||||
and last_child.children[1].content.name == child.children[1].content.name:
|
||||
|
||||
if c2==set():
|
||||
tmp_tree = ControlBT(type='>')
|
||||
tmp_tree.add_child(
|
||||
[inter_node, a1_node])
|
||||
else:
|
||||
_sel = ControlBT(type='?')
|
||||
_sel.add_child([c1_node, c2_node])
|
||||
tmp_tree = ControlBT(type='>')
|
||||
tmp_tree.add_child(
|
||||
[inter_node, _sel,a1_node])
|
||||
else:
|
||||
if c1 == set():
|
||||
seq1 = last_child.children[1]
|
||||
else:
|
||||
seq1 = ControlBT(type='>')
|
||||
seq1.add_child([c1_node, a1_node])
|
||||
|
||||
if c2 == set():
|
||||
seq2 = child.children[1]
|
||||
else:
|
||||
seq2 = ControlBT(type='>')
|
||||
seq2.add_child([c2_node, a2_node])
|
||||
sel = ControlBT(type='?')
|
||||
sel.add_child([seq1, seq2])
|
||||
tmp_tree = ControlBT(type='>')
|
||||
tmp_tree.add_child(
|
||||
[inter_node,sel])
|
||||
|
||||
stack.pop()
|
||||
stack.append(tmp_tree)
|
||||
|
||||
else:
|
||||
stack.append(child)
|
||||
else:
|
||||
stack.append(child)
|
||||
else:
|
||||
stack.append(child)
|
||||
|
||||
for tree in stack:
|
||||
sbtree.add_child([tree])
|
||||
bt_sel = bt
|
||||
return bt_sel
|
||||
|
||||
|
||||
def merge_adjacent_conditions_stack_correct_2023(self):
|
||||
# 只针对第一层合并,之后要考虑层层递归合并
|
||||
bt = ControlBT(type='cond')
|
||||
sbtree = ControlBT(type='?')
|
||||
# gc_node = Leaf(type='cond', content=self.goal, mincost=0) # 为了统一,都成对出现
|
||||
# sbtree.add_child([copy.deepcopy(gc_node)]) # 子树首先保留所扩展结
|
||||
bt.add_child([sbtree])
|
||||
|
||||
parnode = copy.deepcopy(self.bt.children[0])
|
||||
stack=[]
|
||||
for child in parnode.children:
|
||||
if isinstance(child, ControlBT) and child.type == '>':
|
||||
if stack==[]:
|
||||
stack.append(child)
|
||||
continue
|
||||
# 检查合并的条件,前面一个的条件包含了后面的条件,把包含部分提取出来
|
||||
last_child = stack[-1]
|
||||
if isinstance(last_child, ControlBT) and last_child.type == '>':
|
||||
|
||||
set1 = last_child.children[0].content
|
||||
set2 = child.children[0].content
|
||||
|
||||
# 如果后面的动作和前面的一样,删掉前面的
|
||||
# 应该是两棵子树完全相同的情况,先暂时只判断动作
|
||||
if set1>=set2 or set1<=set2:
|
||||
if isinstance(last_child.children[1], Leaf) and isinstance(child.children[1], Leaf):
|
||||
if last_child.children[1].content.name == child.children[1].content.name:
|
||||
stack.pop()
|
||||
stack.append(child)
|
||||
continue
|
||||
|
||||
inter = set1 & set2
|
||||
if inter!=set():
|
||||
c1 = set1-set2
|
||||
c2 = set2-set1
|
||||
|
||||
if c1!=set():
|
||||
seq1 = ControlBT(type='>')
|
||||
c1_node = Leaf(type='cond', content=c1)
|
||||
a1 = copy.deepcopy(last_child.children[1])
|
||||
seq1.add_child(
|
||||
[copy.deepcopy(c1_node), copy.deepcopy(a1)])
|
||||
else:
|
||||
seq1 = copy.deepcopy(last_child.children[1])
|
||||
|
||||
if c2!=set():
|
||||
seq2 = ControlBT(type='>')
|
||||
c2_node = Leaf(type='cond', content=c2)
|
||||
a2 = copy.deepcopy(child.children[1])
|
||||
seq2.add_child(
|
||||
[copy.deepcopy(c2_node), copy.deepcopy(a2)])
|
||||
else:
|
||||
seq2 = copy.deepcopy(child.children[1])
|
||||
|
||||
|
||||
# 如果动作还是一样的
|
||||
# if isinstance(last_child.children[1], Leaf) and isinstance(child.children[1], Leaf) \
|
||||
# and isinstance(last_child.children[1].content, Action) and isinstance(child.children[1].content, Action)\
|
||||
# and last_child.children[1].content.name == child.children[1].content.name: # a1=a2
|
||||
# # 第三次优化合并
|
||||
# # 将来这些地方都写成递归的
|
||||
#
|
||||
# if c1!=set() and c2!=set():
|
||||
# _sel = ControlBT(type='?')
|
||||
# c1_node = Leaf(type='cond', content=c1)
|
||||
# c2_node = Leaf(type='cond', content=c2)
|
||||
# _sel.add_child([copy.deepcopy(c1_node), copy.deepcopy(c2_node)])
|
||||
# tmp_tree = ControlBT(type='>')
|
||||
# inter_c = Leaf(type='cond', content=inter)
|
||||
# tmp_tree.add_child(
|
||||
# [copy.deepcopy(inter_c), copy.deepcopy(_sel),copy.deepcopy(last_child.children[1])])
|
||||
# elif c1!=set() and c2==set():
|
||||
# tmp_tree = ControlBT(type='>')
|
||||
# # inter_c = Leaf(type='cond', content=inter)
|
||||
# # c1_node = Leaf(type='cond', content=c1)
|
||||
# # a1 = copy.deepcopy(last_child.children[1])
|
||||
# tmp_tree.add_child(
|
||||
# [copy.deepcopy(last_child.children[0]), copy.deepcopy(last_child.children[1])])
|
||||
# else:
|
||||
# tmp_tree = ControlBT(type='>')
|
||||
# inter_c = Leaf(type='cond', content=inter)
|
||||
# a1 = copy.deepcopy(last_child.children[1])
|
||||
# tmp_tree.add_child(
|
||||
# [copy.deepcopy(inter_c), copy.deepcopy(a1)])
|
||||
# # 下面这个是以前写错的
|
||||
# # sel.add_child([copy.deepcopy(c1), copy.deepcopy(c2),copy.deepcopy(last_child.children[1])])
|
||||
# else:
|
||||
sel = ControlBT(type='?')
|
||||
sel.add_child([copy.deepcopy(seq1), copy.deepcopy(seq2)])
|
||||
tmp_tree = ControlBT(type='>')
|
||||
inter_c = Leaf(type='cond', content=inter)
|
||||
tmp_tree.add_child(
|
||||
[copy.deepcopy(inter_c), copy.deepcopy(sel)])
|
||||
|
||||
stack.pop()
|
||||
stack.append(tmp_tree)
|
||||
else:
|
||||
stack.append(child)
|
||||
else:
|
||||
stack.append(child)
|
||||
else:
|
||||
stack.append(child)
|
||||
|
||||
for tree in stack:
|
||||
sbtree.add_child([tree])
|
||||
self.bt = copy.deepcopy(bt)
|
||||
|
||||
def merge_adjacent_conditions_stack_old(self):
|
||||
# 递归合并
|
||||
bt = ControlBT(type='cond')
|
||||
sbtree = ControlBT(type='?')
|
||||
gc_node = Leaf(type='cond', content=self.goal, mincost=0) # 为了统一,都成对出现
|
||||
sbtree.add_child([copy.deepcopy(gc_node)]) # 子树首先保留所扩展结
|
||||
bt.add_child([sbtree])
|
||||
|
||||
parnode = copy.deepcopy(self.bt.children[0])
|
||||
|
||||
stack=[]
|
||||
|
||||
for child in parnode.children:
|
||||
|
||||
if isinstance(child, ControlBT) and child.type == '>':
|
||||
|
||||
if stack==[]:
|
||||
stack.append(child)
|
||||
continue
|
||||
|
||||
# 检查合并的条件,前面一个的条件包含了后面的条件,把包含部分提取出来
|
||||
last_child = stack[-1]
|
||||
|
||||
if isinstance(last_child, ControlBT) and last_child.type == '>':
|
||||
|
||||
set1 = last_child.children[0].content
|
||||
set2 = child.children[0].content
|
||||
|
||||
if set1>=set2:
|
||||
inter = set1 & set2
|
||||
dif = set1 - set2
|
||||
|
||||
tmp_sub_seq = ControlBT(type='>')
|
||||
c2 = Leaf(type='cond', content=dif)
|
||||
a1 = copy.deepcopy(last_child.children[1])
|
||||
tmp_sub_seq.add_child(
|
||||
[copy.deepcopy(c2), copy.deepcopy(a1)])
|
||||
|
||||
tmp_sub_tree_sel = ControlBT(type='?')
|
||||
a2 = copy.deepcopy(child.children[1])
|
||||
tmp_sub_tree_sel.add_child(
|
||||
[copy.deepcopy(tmp_sub_seq), copy.deepcopy(a2)])
|
||||
|
||||
tmp_tree = ControlBT(type='>')
|
||||
c1 = Leaf(type='cond', content=inter)
|
||||
tmp_tree.add_child(
|
||||
[copy.deepcopy(c1), copy.deepcopy(tmp_sub_tree_sel)])
|
||||
|
||||
stack.pop()
|
||||
stack.append(tmp_tree)
|
||||
else:
|
||||
stack.append(child)
|
||||
else:
|
||||
stack.append(child)
|
||||
else:
|
||||
stack.append(child)
|
||||
|
||||
for tree in stack:
|
||||
sbtree.add_child([tree])
|
||||
self.bt = copy.deepcopy(bt)
|
||||
|
||||
|
||||
def merge_adjacent_conditions(self):
|
||||
# bt合并====================================================
|
||||
bt = ControlBT(type='cond')
|
||||
sbtree = ControlBT(type='?')
|
||||
# gc_node = Leaf(type='cond', content=self.goal, mincost=0) # 为了统一,都成对出现
|
||||
# sbtree.add_child([copy.deepcopy(gc_node)]) # 子树首先保留所扩展结
|
||||
bt.add_child([sbtree])
|
||||
|
||||
parnode = copy.deepcopy(self.bt.children[0])
|
||||
skip_next = False
|
||||
for i in range(len(parnode.children) - 1):
|
||||
current_child = parnode.children[i]
|
||||
next_child = parnode.children[i + 1]
|
||||
|
||||
if isinstance(current_child, ControlBT) and isinstance(next_child, ControlBT) and current_child.type == '>' and next_child.type == '>':
|
||||
|
||||
if not skip_next:
|
||||
# 检查合并的条件,前面一个的条件包含了后面的条件,把包含部分提取出来
|
||||
set1 = current_child.children[0].content
|
||||
set2 = next_child.children[0].content
|
||||
if set1>=set2:
|
||||
inter = set1 & set2
|
||||
dif = set1 - set2
|
||||
|
||||
|
||||
tmp_sub_seq = ControlBT(type='>')
|
||||
c2 = Leaf(type='cond', content=dif)
|
||||
a1 = Leaf(type='act', content=current_child.children[1].content)
|
||||
tmp_sub_seq.add_child(
|
||||
[copy.deepcopy(c2), copy.deepcopy(a1)])
|
||||
|
||||
tmp_sub_tree_sel = ControlBT(type='?')
|
||||
a2 = Leaf(type='act', content=next_child.children[1].content)
|
||||
tmp_sub_tree_sel.add_child(
|
||||
[copy.deepcopy(tmp_sub_seq), copy.deepcopy(a2)])
|
||||
|
||||
tmp_tree = ControlBT(type='>')
|
||||
c1 = Leaf(type='cond', content=inter)
|
||||
tmp_tree.add_child(
|
||||
[copy.deepcopy(c1), copy.deepcopy(tmp_sub_tree_sel)])
|
||||
|
||||
sbtree.add_child([tmp_tree])
|
||||
skip_next = True
|
||||
|
||||
elif skip_next:
|
||||
sbtree.add_child([current_child])
|
||||
else:
|
||||
# 否咋要放进去
|
||||
sbtree.add_child([current_child])
|
||||
|
||||
# 还有最后一个孩子还没放进去
|
||||
sbtree.add_child([next_child])
|
||||
|
||||
self.bt = copy.deepcopy(bt)
|
||||
# bt合并====================================================
|
||||
|
||||
|
||||
def print_solution(self):
|
||||
print("========= BT ==========") # 树的bfs遍历
|
||||
nodes_ls = []
|
||||
nodes_ls.append(self.bt)
|
||||
while len(nodes_ls) != 0:
|
||||
parnode = nodes_ls[0]
|
||||
print("Parrent:", parnode.type)
|
||||
for child in parnode.children:
|
||||
if isinstance(child, Leaf):
|
||||
print("---- Leaf:", child.content)
|
||||
elif isinstance(child, ControlBT):
|
||||
print("---- ControlBT:", child.type)
|
||||
nodes_ls.append(child)
|
||||
print()
|
||||
nodes_ls.pop(0)
|
||||
print("========= BT ==========\n")
|
||||
|
||||
# 返回所有能到达目标状态的初始状态
|
||||
def get_all_state_leafs(self):
|
||||
state_leafs=[]
|
||||
|
||||
nodes_ls = []
|
||||
nodes_ls.append(self.bt)
|
||||
while len(nodes_ls) != 0:
|
||||
parnode = nodes_ls[0]
|
||||
for child in parnode.children:
|
||||
if isinstance(child, Leaf):
|
||||
if child.type == "cond":
|
||||
state_leafs.append(child.content)
|
||||
elif isinstance(child, ControlBT):
|
||||
nodes_ls.append(child)
|
||||
nodes_ls.pop(0)
|
||||
|
||||
return state_leafs
|
||||
|
||||
|
||||
# 树的dfs
|
||||
def dfs_ptml(self,parnode,is_root=False):
|
||||
for child in parnode.children:
|
||||
if isinstance(child, Leaf):
|
||||
if child.type == 'cond':
|
||||
|
||||
if is_root and len(child.content) > 1:
|
||||
# 把多个 cond 串起来
|
||||
self.ptml_string += "sequence{\n"
|
||||
self.ptml_string += "cond "
|
||||
c_set_str = '\n cond '.join(map(str, child.content)) + "\n"
|
||||
self.ptml_string += c_set_str
|
||||
self.ptml_string += '}\n'
|
||||
else:
|
||||
self.ptml_string += "cond "
|
||||
c_set_str = '\n cond '.join(map(str, child.content)) + "\n"
|
||||
self.ptml_string += c_set_str
|
||||
|
||||
elif child.type == 'act':
|
||||
if '(' not in child.content.name:
|
||||
self.ptml_string += 'act ' + child.content.name + "()\n"
|
||||
else:
|
||||
self.ptml_string += 'act ' + child.content.name + "\n"
|
||||
elif isinstance(child, ControlBT):
|
||||
if child.type == '?':
|
||||
self.ptml_string += "selector{\n"
|
||||
self.dfs_ptml(parnode=child)
|
||||
elif child.type == '>':
|
||||
self.ptml_string += "sequence{\n"
|
||||
self.dfs_ptml( parnode=child)
|
||||
self.ptml_string += '}\n'
|
||||
|
||||
|
||||
def get_ptml(self):
|
||||
self.ptml_string = "selector{\n"
|
||||
self.dfs_ptml(self.bt.children[0],is_root=True)
|
||||
self.ptml_string += '}\n'
|
||||
return self.ptml_string
|
||||
|
||||
def dfs_ptml_many_act(self, parnode, is_root=False):
|
||||
for child in parnode.children:
|
||||
if isinstance(child, Leaf):
|
||||
if child.type == 'cond':
|
||||
|
||||
if is_root and len(child.content) > 1:
|
||||
# 把多个 cond 串起来
|
||||
self.ptml_string += "sequence{\n"
|
||||
self.ptml_string += "cond "
|
||||
c_set_str = '\n cond '.join(map(str, child.content)) + "\n"
|
||||
self.ptml_string += c_set_str
|
||||
self.ptml_string += '}\n'
|
||||
else:
|
||||
self.ptml_string += "cond "
|
||||
c_set_str = '\n cond '.join(map(str, child.content)) + "\n"
|
||||
self.ptml_string += c_set_str
|
||||
|
||||
elif child.type == 'act':
|
||||
|
||||
child.content.name = re.sub(r'\d+', '', child.content.name)
|
||||
|
||||
if '(' not in child.content.name:
|
||||
self.ptml_string += 'act ' + child.content.name + "()\n"
|
||||
else:
|
||||
self.ptml_string += 'act ' + child.content.name + "\n"
|
||||
elif isinstance(child, ControlBT):
|
||||
if child.type == '?':
|
||||
self.ptml_string += "selector{\n"
|
||||
self.dfs_ptml_many_act(parnode=child)
|
||||
elif child.type == '>':
|
||||
self.ptml_string += "sequence{\n"
|
||||
self.dfs_ptml_many_act(parnode=child)
|
||||
self.ptml_string += '}\n'
|
||||
|
||||
def get_ptml_many_act(self):
|
||||
self.ptml_string = "selector{\n"
|
||||
self.dfs_ptml_many_act(self.bt.children[0],is_root=True)
|
||||
self.ptml_string += '}\n'
|
||||
return self.ptml_string
|
||||
|
||||
def save_ptml_file(self,file_name):
|
||||
self.ptml_string = "selector{\n"
|
||||
self.dfs_ptml(self.bt.children[0])
|
||||
self.ptml_string += '}\n'
|
||||
with open(f'./{file_name}.ptml', 'w') as file:
|
||||
file.write(self.ptml_string)
|
||||
return self.ptml_string
|
|
@ -0,0 +1,630 @@
|
|||
import copy
|
||||
import random
|
||||
from BehaviorTree import Leaf,ControlBT
|
||||
|
||||
|
||||
|
||||
class CondActPair:
|
||||
def __init__(self, cond_leaf,act_leaf):
|
||||
self.cond_leaf = cond_leaf
|
||||
self.act_leaf = act_leaf
|
||||
|
||||
#定义行动类,行动包括前提、增加和删除影响
|
||||
class Action:
|
||||
def __init__(self,name='anonymous action',pre=set(),add=set(),del_set=set(),cost=1):
|
||||
self.pre=copy.deepcopy(pre)
|
||||
self.add=copy.deepcopy(add)
|
||||
self.del_set=copy.deepcopy(del_set)
|
||||
self.name=name
|
||||
self.cost=cost
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
# 从状态随机生成一个行动
|
||||
def generate_from_state(self,state,num):
|
||||
for i in range(0,num):
|
||||
if i in state:
|
||||
if random.random() >0.5:
|
||||
self.pre.add(i)
|
||||
if random.random() >0.5:
|
||||
self.del_set.add(i)
|
||||
continue
|
||||
if random.random() > 0.5:
|
||||
self.add.add(i)
|
||||
continue
|
||||
if random.random() >0.5:
|
||||
self.del_set.add(i)
|
||||
def print_action(self):
|
||||
print (self.pre)
|
||||
print(self.add)
|
||||
print(self.del_set)
|
||||
|
||||
#生成随机状态
|
||||
def generate_random_state(num):
|
||||
result = set()
|
||||
for i in range(0,num):
|
||||
if random.random()>0.5:
|
||||
result.add(i)
|
||||
return result
|
||||
#从状态和行动生成后继状态
|
||||
def state_transition(state,action):
|
||||
if not action.pre <= state:
|
||||
print ('error: action not applicable')
|
||||
return state
|
||||
new_state=(state | action.add) - action.del_set
|
||||
return new_state
|
||||
|
||||
|
||||
def conflict(c):
|
||||
have_at = False
|
||||
for str in c:
|
||||
if 'At' in str:
|
||||
if not have_at:
|
||||
have_at = True
|
||||
else:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
#本文所提出的完备规划算法
|
||||
class OptBTExpAlgorithm:
|
||||
def __init__(self,verbose=False):
|
||||
self.bt = None
|
||||
self.nodes=[]
|
||||
self.traversed=[]
|
||||
self.mounted=[]
|
||||
self.conditions=[]
|
||||
self.conditions_index=[]
|
||||
self.verbose=verbose
|
||||
self.goal=None
|
||||
|
||||
def clear(self):
|
||||
self.bt = None
|
||||
self.nodes = []
|
||||
self.traversed = [] #存cond
|
||||
self.expanded = [] #存整个
|
||||
self.conditions = []
|
||||
self.conditions_index = []
|
||||
|
||||
#运行规划算法,从初始状态、目标状态和可用行动,计算行为树self.bt
|
||||
# def run_algorithm(self,goal,actions,scene):
|
||||
def run_algorithm(self, start, goal, actions):
|
||||
# self.scene = scene
|
||||
|
||||
self.goal = goal
|
||||
|
||||
if self.verbose:
|
||||
print("\n算法开始!")
|
||||
|
||||
|
||||
self.bt = ControlBT(type='cond')
|
||||
# 初始行为树只包含目标条件
|
||||
gc_node = Leaf(type='cond', content=goal, mincost=0) # 为了统一,都成对出现
|
||||
ga_node = Leaf(type='act', content=None, mincost=0)
|
||||
subtree = ControlBT(type='?')
|
||||
subtree.add_child([copy.deepcopy(gc_node)]) # 子树首先保留所扩展结
|
||||
self.bt.add_child([subtree])
|
||||
|
||||
# self.conditions.append(goal)
|
||||
cond_anc_pair = CondActPair(cond_leaf=gc_node,act_leaf=ga_node)
|
||||
self.nodes.append(copy.deepcopy(cond_anc_pair)) # the set of explored but unexpanded conditions
|
||||
self.traversed = [goal] # the set of expanded conditions
|
||||
|
||||
while len(self.nodes)!=0:
|
||||
|
||||
# Find the condition for the shortest cost path
|
||||
pair_node = None
|
||||
min_cost = float ('inf')
|
||||
index= -1
|
||||
for i,cond_anc_pair in enumerate(self.nodes):
|
||||
|
||||
########### 剪枝操作
|
||||
# cond_tmp = cond_anc_pair.cond_leaf.content
|
||||
# valid = True
|
||||
# for pn in self.expanded: # 剪枝操作
|
||||
# if isinstance(pn.act_leaf.content,Action):
|
||||
# if pn.act_leaf.content.name==cond_anc_pair.act_leaf.content.name and cond_tmp <= pn.cond_leaf.content:
|
||||
# valid = False
|
||||
# break
|
||||
# if not valid:
|
||||
# continue
|
||||
########### 剪枝操作
|
||||
|
||||
if cond_anc_pair.cond_leaf.mincost < min_cost:
|
||||
min_cost = cond_anc_pair.cond_leaf.mincost
|
||||
pair_node = copy.deepcopy(cond_anc_pair)
|
||||
index = i
|
||||
|
||||
if self.verbose:
|
||||
print("选择扩展条件结点:",pair_node.cond_leaf.content)
|
||||
# Update self.nodes and self.traversed
|
||||
self.nodes.pop(index) # the set of explored but unexpanded conditions. self.nodes.remove(pair_node)
|
||||
c = pair_node.cond_leaf.content # 子树所扩展结点对应的条件(一个文字的set)
|
||||
|
||||
# Mount the action node and extend BT. T = Eapand(T,c,A(c))
|
||||
if c!=goal:
|
||||
if c!=set():
|
||||
|
||||
# 挂在上去的时候判断要不要挂载
|
||||
########### 剪枝操作 发现行不通
|
||||
# valid = True
|
||||
# for pn in self.expanded: # 剪枝操作
|
||||
# if isinstance(pn.act_leaf.content,Action):
|
||||
# if pn.act_leaf.content.name==pair_node.act_leaf.content.name and c <= pn.cond_leaf.content:
|
||||
# valid = False
|
||||
# break
|
||||
# if valid:
|
||||
########### 剪枝操作
|
||||
sequence_structure = ControlBT(type='>')
|
||||
sequence_structure.add_child(
|
||||
[copy.deepcopy(pair_node.cond_leaf), copy.deepcopy(pair_node.act_leaf)])
|
||||
subtree.add_child([copy.deepcopy(sequence_structure)]) # subtree 是回不断变化的,它的父亲是self.bt
|
||||
self.expanded.append(copy.deepcopy(pair_node))
|
||||
# 增加实时条件判断,满足条件就不再扩展
|
||||
# if c <= self.scene.state["condition_set"]:
|
||||
if c <= start:
|
||||
|
||||
# 要不要继续扩展完全
|
||||
|
||||
# self.merge_adjacent_conditions_stack()
|
||||
# self.merge_adjacent_conditions_stack_old()
|
||||
# self.merge_adjacent_conditions()
|
||||
return True
|
||||
else:
|
||||
subtree.add_child([copy.deepcopy(pair_node.act_leaf)])
|
||||
|
||||
|
||||
if self.verbose:
|
||||
print("完成扩展 a_node= %s,对应的新条件 c_attr= %s,mincost=%d" \
|
||||
% (cond_anc_pair.act_leaf.content.name, cond_anc_pair.cond_leaf.content,
|
||||
cond_anc_pair.cond_leaf.mincost))
|
||||
|
||||
if self.verbose:
|
||||
print("遍历所有动作, 寻找符合条件的动作")
|
||||
# 遍历所有动作, 寻找符合条件的动作
|
||||
current_mincost = pair_node.cond_leaf.mincost # 当前的最短路径是多少
|
||||
|
||||
for i in range(0, len(actions)):
|
||||
|
||||
if not c & ((actions[i].pre | actions[i].add) - actions[i].del_set) <= set() :
|
||||
if (c - actions[i].del_set) == c:
|
||||
if self.verbose:
|
||||
print("———— 满足条件可以扩展")
|
||||
c_attr = (actions[i].pre | c) - actions[i].add
|
||||
|
||||
# 这样剪枝存在错误性
|
||||
# if conflict(c_attr):
|
||||
# continue
|
||||
|
||||
# 剪枝操作,现在的条件是以前扩展过的条件的超集
|
||||
valid = True
|
||||
for j in self.traversed: # 剪枝操作
|
||||
if j <= c_attr:
|
||||
valid = False
|
||||
if self.verbose:
|
||||
print("———— --被剪枝")
|
||||
break
|
||||
|
||||
if valid:
|
||||
c_attr_node = Leaf(type='cond', content=c_attr, mincost=current_mincost + actions[i].cost)
|
||||
a_attr_node = Leaf(type='act', content=actions[i], mincost=current_mincost + actions[i].cost)
|
||||
cond_anc_pair = CondActPair(cond_leaf=c_attr_node, act_leaf=a_attr_node)
|
||||
self.nodes.append(copy.deepcopy(cond_anc_pair)) # condition node list
|
||||
self.traversed.append(c_attr) # 重点 the set of expanded conditions
|
||||
# 把符合条件的动作节点都放到列表里
|
||||
if self.verbose:
|
||||
print("———— -- %s 符合条件放入列表,对应的c为 %s" % (actions[i].name,c_attr))
|
||||
|
||||
# self.merge_adjacent_conditions_stack()
|
||||
# self.merge_adjacent_conditions_stack_old()
|
||||
# self.merge_adjacent_conditions()
|
||||
if self.verbose:
|
||||
print("算法结束!\n")
|
||||
return True
|
||||
|
||||
def merge_adjacent_conditions_stack(self):
|
||||
# 只针对第一层合并,之后要考虑层层递归合并
|
||||
bt = ControlBT(type='cond')
|
||||
sbtree = ControlBT(type='?')
|
||||
# gc_node = Leaf(type='cond', content=self.goal, mincost=0) # 为了统一,都成对出现
|
||||
# sbtree.add_child([copy.deepcopy(gc_node)]) # 子树首先保留所扩展结
|
||||
bt.add_child([sbtree])
|
||||
|
||||
parnode = copy.deepcopy(self.bt.children[0])
|
||||
stack=[]
|
||||
for child in parnode.children:
|
||||
if isinstance(child, ControlBT) and child.type == '>':
|
||||
if stack==[]:
|
||||
stack.append(child)
|
||||
continue
|
||||
# 检查合并的条件,前面一个的条件包含了后面的条件,把包含部分提取出来
|
||||
last_child = stack[-1]
|
||||
if isinstance(last_child, ControlBT) and last_child.type == '>':
|
||||
set1 = last_child.children[0].content
|
||||
set2 = child.children[0].content
|
||||
inter = set1 & set2
|
||||
if inter!=set():
|
||||
c1 = set1-set2
|
||||
c2 = set2-set1
|
||||
inter_node = Leaf(type='cond', content=inter)
|
||||
c1_node = Leaf(type='cond', content=c1)
|
||||
c2_node = Leaf(type='cond', content=c2)
|
||||
a1_node = copy.deepcopy(last_child.children[1])
|
||||
a2_node = copy.deepcopy(child.children[1])
|
||||
|
||||
|
||||
# set1<=set2,此时set2对应的动作永远不会执行
|
||||
if (c1==set() and isinstance(last_child.children[1], Leaf) and isinstance(child.children[1], Leaf) \
|
||||
and isinstance(last_child.children[1].content, Action) and isinstance(child.children[1].content, Action)):
|
||||
continue
|
||||
|
||||
# 再写一个特殊情况处理,三个结点动作last 遇到 两个结点 且动作相同
|
||||
if len(last_child.children)==3 and \
|
||||
isinstance(last_child.children[2], Leaf) and isinstance(child.children[1], Leaf) \
|
||||
and isinstance(last_child.children[2].content, Action) and isinstance( child.children[1].content, Action) \
|
||||
and last_child.children[2].content.name == child.children[1].content.name \
|
||||
and c1==set() and c2!=set():
|
||||
last_child.children[1].add_child([copy.deepcopy(c2_node)])
|
||||
continue
|
||||
elif len(last_child.children)==3:
|
||||
stack.append(child)
|
||||
continue
|
||||
|
||||
# 判断动作相不相同
|
||||
if isinstance(last_child.children[1], Leaf) and isinstance(child.children[1], Leaf) \
|
||||
and isinstance(last_child.children[1].content, Action) and isinstance(child.children[1].content, Action) \
|
||||
and last_child.children[1].content.name == child.children[1].content.name:
|
||||
|
||||
if c2==set():
|
||||
tmp_tree = ControlBT(type='>')
|
||||
tmp_tree.add_child(
|
||||
[copy.deepcopy(inter_node), copy.deepcopy(a1_node)])
|
||||
else:
|
||||
_sel = ControlBT(type='?')
|
||||
_sel.add_child([copy.deepcopy(c1_node), copy.deepcopy(c2_node)])
|
||||
tmp_tree = ControlBT(type='>')
|
||||
tmp_tree.add_child(
|
||||
[copy.deepcopy(inter_node), copy.deepcopy(_sel),copy.deepcopy(a1_node)])
|
||||
else:
|
||||
if c1 == set():
|
||||
seq1 = copy.deepcopy(last_child.children[1])
|
||||
else:
|
||||
seq1 = ControlBT(type='>')
|
||||
seq1.add_child([copy.deepcopy(c1_node), copy.deepcopy(a1_node)])
|
||||
|
||||
if c2 == set():
|
||||
seq2 = copy.deepcopy(child.children[1])
|
||||
else:
|
||||
seq2 = ControlBT(type='>')
|
||||
seq2.add_child([copy.deepcopy(c2_node), copy.deepcopy(a2_node)])
|
||||
sel = ControlBT(type='?')
|
||||
sel.add_child([copy.deepcopy(seq1), copy.deepcopy(seq2)])
|
||||
tmp_tree = ControlBT(type='>')
|
||||
tmp_tree.add_child(
|
||||
[copy.deepcopy(inter_node), copy.deepcopy(sel)])
|
||||
|
||||
stack.pop()
|
||||
stack.append(tmp_tree)
|
||||
|
||||
else:
|
||||
stack.append(child)
|
||||
else:
|
||||
stack.append(child)
|
||||
else:
|
||||
stack.append(child)
|
||||
|
||||
for tree in stack:
|
||||
sbtree.add_child([tree])
|
||||
self.bt = copy.deepcopy(bt)
|
||||
|
||||
|
||||
|
||||
def merge_adjacent_conditions_stack_correct_2023(self):
|
||||
# 只针对第一层合并,之后要考虑层层递归合并
|
||||
bt = ControlBT(type='cond')
|
||||
sbtree = ControlBT(type='?')
|
||||
# gc_node = Leaf(type='cond', content=self.goal, mincost=0) # 为了统一,都成对出现
|
||||
# sbtree.add_child([copy.deepcopy(gc_node)]) # 子树首先保留所扩展结
|
||||
bt.add_child([sbtree])
|
||||
|
||||
parnode = copy.deepcopy(self.bt.children[0])
|
||||
stack=[]
|
||||
for child in parnode.children:
|
||||
if isinstance(child, ControlBT) and child.type == '>':
|
||||
if stack==[]:
|
||||
stack.append(child)
|
||||
continue
|
||||
# 检查合并的条件,前面一个的条件包含了后面的条件,把包含部分提取出来
|
||||
last_child = stack[-1]
|
||||
if isinstance(last_child, ControlBT) and last_child.type == '>':
|
||||
|
||||
set1 = last_child.children[0].content
|
||||
set2 = child.children[0].content
|
||||
|
||||
# 如果后面的动作和前面的一样,删掉前面的
|
||||
# 应该是两棵子树完全相同的情况,先暂时只判断动作
|
||||
if set1>=set2 or set1<=set2:
|
||||
if isinstance(last_child.children[1], Leaf) and isinstance(child.children[1], Leaf):
|
||||
if last_child.children[1].content.name == child.children[1].content.name:
|
||||
stack.pop()
|
||||
stack.append(child)
|
||||
continue
|
||||
|
||||
inter = set1 & set2
|
||||
if inter!=set():
|
||||
c1 = set1-set2
|
||||
c2 = set2-set1
|
||||
|
||||
if c1!=set():
|
||||
seq1 = ControlBT(type='>')
|
||||
c1_node = Leaf(type='cond', content=c1)
|
||||
a1 = copy.deepcopy(last_child.children[1])
|
||||
seq1.add_child(
|
||||
[copy.deepcopy(c1_node), copy.deepcopy(a1)])
|
||||
else:
|
||||
seq1 = copy.deepcopy(last_child.children[1])
|
||||
|
||||
if c2!=set():
|
||||
seq2 = ControlBT(type='>')
|
||||
c2_node = Leaf(type='cond', content=c2)
|
||||
a2 = copy.deepcopy(child.children[1])
|
||||
seq2.add_child(
|
||||
[copy.deepcopy(c2_node), copy.deepcopy(a2)])
|
||||
else:
|
||||
seq2 = copy.deepcopy(child.children[1])
|
||||
|
||||
|
||||
# 如果动作还是一样的
|
||||
# if isinstance(last_child.children[1], Leaf) and isinstance(child.children[1], Leaf) \
|
||||
# and isinstance(last_child.children[1].content, Action) and isinstance(child.children[1].content, Action)\
|
||||
# and last_child.children[1].content.name == child.children[1].content.name: # a1=a2
|
||||
# # 第三次优化合并
|
||||
# # 将来这些地方都写成递归的
|
||||
#
|
||||
# if c1!=set() and c2!=set():
|
||||
# _sel = ControlBT(type='?')
|
||||
# c1_node = Leaf(type='cond', content=c1)
|
||||
# c2_node = Leaf(type='cond', content=c2)
|
||||
# _sel.add_child([copy.deepcopy(c1_node), copy.deepcopy(c2_node)])
|
||||
# tmp_tree = ControlBT(type='>')
|
||||
# inter_c = Leaf(type='cond', content=inter)
|
||||
# tmp_tree.add_child(
|
||||
# [copy.deepcopy(inter_c), copy.deepcopy(_sel),copy.deepcopy(last_child.children[1])])
|
||||
# elif c1!=set() and c2==set():
|
||||
# tmp_tree = ControlBT(type='>')
|
||||
# # inter_c = Leaf(type='cond', content=inter)
|
||||
# # c1_node = Leaf(type='cond', content=c1)
|
||||
# # a1 = copy.deepcopy(last_child.children[1])
|
||||
# tmp_tree.add_child(
|
||||
# [copy.deepcopy(last_child.children[0]), copy.deepcopy(last_child.children[1])])
|
||||
# else:
|
||||
# tmp_tree = ControlBT(type='>')
|
||||
# inter_c = Leaf(type='cond', content=inter)
|
||||
# a1 = copy.deepcopy(last_child.children[1])
|
||||
# tmp_tree.add_child(
|
||||
# [copy.deepcopy(inter_c), copy.deepcopy(a1)])
|
||||
# # 下面这个是以前写错的
|
||||
# # sel.add_child([copy.deepcopy(c1), copy.deepcopy(c2),copy.deepcopy(last_child.children[1])])
|
||||
# else:
|
||||
sel = ControlBT(type='?')
|
||||
sel.add_child([copy.deepcopy(seq1), copy.deepcopy(seq2)])
|
||||
tmp_tree = ControlBT(type='>')
|
||||
inter_c = Leaf(type='cond', content=inter)
|
||||
tmp_tree.add_child(
|
||||
[copy.deepcopy(inter_c), copy.deepcopy(sel)])
|
||||
|
||||
stack.pop()
|
||||
stack.append(tmp_tree)
|
||||
else:
|
||||
stack.append(child)
|
||||
else:
|
||||
stack.append(child)
|
||||
else:
|
||||
stack.append(child)
|
||||
|
||||
for tree in stack:
|
||||
sbtree.add_child([tree])
|
||||
self.bt = copy.deepcopy(bt)
|
||||
|
||||
def merge_adjacent_conditions_stack_old(self):
|
||||
# 递归合并
|
||||
bt = ControlBT(type='cond')
|
||||
sbtree = ControlBT(type='?')
|
||||
gc_node = Leaf(type='cond', content=self.goal, mincost=0) # 为了统一,都成对出现
|
||||
sbtree.add_child([copy.deepcopy(gc_node)]) # 子树首先保留所扩展结
|
||||
bt.add_child([sbtree])
|
||||
|
||||
parnode = copy.deepcopy(self.bt.children[0])
|
||||
|
||||
stack=[]
|
||||
|
||||
for child in parnode.children:
|
||||
|
||||
if isinstance(child, ControlBT) and child.type == '>':
|
||||
|
||||
if stack==[]:
|
||||
stack.append(child)
|
||||
continue
|
||||
|
||||
# 检查合并的条件,前面一个的条件包含了后面的条件,把包含部分提取出来
|
||||
last_child = stack[-1]
|
||||
|
||||
if isinstance(last_child, ControlBT) and last_child.type == '>':
|
||||
|
||||
set1 = last_child.children[0].content
|
||||
set2 = child.children[0].content
|
||||
|
||||
if set1>=set2:
|
||||
inter = set1 & set2
|
||||
dif = set1 - set2
|
||||
|
||||
tmp_sub_seq = ControlBT(type='>')
|
||||
c2 = Leaf(type='cond', content=dif)
|
||||
a1 = copy.deepcopy(last_child.children[1])
|
||||
tmp_sub_seq.add_child(
|
||||
[copy.deepcopy(c2), copy.deepcopy(a1)])
|
||||
|
||||
tmp_sub_tree_sel = ControlBT(type='?')
|
||||
a2 = copy.deepcopy(child.children[1])
|
||||
tmp_sub_tree_sel.add_child(
|
||||
[copy.deepcopy(tmp_sub_seq), copy.deepcopy(a2)])
|
||||
|
||||
tmp_tree = ControlBT(type='>')
|
||||
c1 = Leaf(type='cond', content=inter)
|
||||
tmp_tree.add_child(
|
||||
[copy.deepcopy(c1), copy.deepcopy(tmp_sub_tree_sel)])
|
||||
|
||||
stack.pop()
|
||||
stack.append(tmp_tree)
|
||||
else:
|
||||
stack.append(child)
|
||||
else:
|
||||
stack.append(child)
|
||||
else:
|
||||
stack.append(child)
|
||||
|
||||
for tree in stack:
|
||||
sbtree.add_child([tree])
|
||||
self.bt = copy.deepcopy(bt)
|
||||
|
||||
|
||||
def merge_adjacent_conditions(self):
|
||||
# bt合并====================================================
|
||||
bt = ControlBT(type='cond')
|
||||
sbtree = ControlBT(type='?')
|
||||
# gc_node = Leaf(type='cond', content=self.goal, mincost=0) # 为了统一,都成对出现
|
||||
# sbtree.add_child([copy.deepcopy(gc_node)]) # 子树首先保留所扩展结
|
||||
bt.add_child([sbtree])
|
||||
|
||||
parnode = copy.deepcopy(self.bt.children[0])
|
||||
skip_next = False
|
||||
for i in range(len(parnode.children) - 1):
|
||||
current_child = parnode.children[i]
|
||||
next_child = parnode.children[i + 1]
|
||||
|
||||
if isinstance(current_child, ControlBT) and isinstance(next_child, ControlBT) and current_child.type == '>' and next_child.type == '>':
|
||||
|
||||
if not skip_next:
|
||||
# 检查合并的条件,前面一个的条件包含了后面的条件,把包含部分提取出来
|
||||
set1 = current_child.children[0].content
|
||||
set2 = next_child.children[0].content
|
||||
if set1>=set2:
|
||||
inter = set1 & set2
|
||||
dif = set1 - set2
|
||||
|
||||
|
||||
tmp_sub_seq = ControlBT(type='>')
|
||||
c2 = Leaf(type='cond', content=dif)
|
||||
a1 = Leaf(type='act', content=current_child.children[1].content)
|
||||
tmp_sub_seq.add_child(
|
||||
[copy.deepcopy(c2), copy.deepcopy(a1)])
|
||||
|
||||
tmp_sub_tree_sel = ControlBT(type='?')
|
||||
a2 = Leaf(type='act', content=next_child.children[1].content)
|
||||
tmp_sub_tree_sel.add_child(
|
||||
[copy.deepcopy(tmp_sub_seq), copy.deepcopy(a2)])
|
||||
|
||||
tmp_tree = ControlBT(type='>')
|
||||
c1 = Leaf(type='cond', content=inter)
|
||||
tmp_tree.add_child(
|
||||
[copy.deepcopy(c1), copy.deepcopy(tmp_sub_tree_sel)])
|
||||
|
||||
sbtree.add_child([tmp_tree])
|
||||
skip_next = True
|
||||
|
||||
elif skip_next:
|
||||
sbtree.add_child([current_child])
|
||||
else:
|
||||
# 否咋要放进去
|
||||
sbtree.add_child([current_child])
|
||||
|
||||
# 还有最后一个孩子还没放进去
|
||||
sbtree.add_child([next_child])
|
||||
|
||||
self.bt = copy.deepcopy(bt)
|
||||
# bt合并====================================================
|
||||
|
||||
|
||||
def print_solution(self):
|
||||
print("========= BT ==========") # 树的bfs遍历
|
||||
nodes_ls = []
|
||||
nodes_ls.append(self.bt)
|
||||
while len(nodes_ls) != 0:
|
||||
parnode = nodes_ls[0]
|
||||
print("Parrent:", parnode.type)
|
||||
for child in parnode.children:
|
||||
if isinstance(child, Leaf):
|
||||
print("---- Leaf:", child.content)
|
||||
elif isinstance(child, ControlBT):
|
||||
print("---- ControlBT:", child.type)
|
||||
nodes_ls.append(child)
|
||||
print()
|
||||
nodes_ls.pop(0)
|
||||
print("========= BT ==========\n")
|
||||
|
||||
# 返回所有能到达目标状态的初始状态
|
||||
def get_all_state_leafs(self):
|
||||
state_leafs=[]
|
||||
|
||||
nodes_ls = []
|
||||
nodes_ls.append(self.bt)
|
||||
while len(nodes_ls) != 0:
|
||||
parnode = nodes_ls[0]
|
||||
for child in parnode.children:
|
||||
if isinstance(child, Leaf):
|
||||
if child.type == "cond":
|
||||
state_leafs.append(child.content)
|
||||
elif isinstance(child, ControlBT):
|
||||
nodes_ls.append(child)
|
||||
nodes_ls.pop(0)
|
||||
|
||||
return state_leafs
|
||||
|
||||
|
||||
# 树的dfs
|
||||
def dfs_ptml(self,parnode,is_root=False):
|
||||
for child in parnode.children:
|
||||
if isinstance(child, Leaf):
|
||||
if child.type == 'cond':
|
||||
|
||||
if is_root and len(child.content) > 1:
|
||||
# 把多个 cond 串起来
|
||||
self.ptml_string += "sequence{\n"
|
||||
self.ptml_string += "cond "
|
||||
c_set_str = '\n cond '.join(map(str, child.content)) + "\n"
|
||||
self.ptml_string += c_set_str
|
||||
self.ptml_string += '}\n'
|
||||
else:
|
||||
self.ptml_string += "cond "
|
||||
c_set_str = '\n cond '.join(map(str, child.content)) + "\n"
|
||||
self.ptml_string += c_set_str
|
||||
|
||||
elif child.type == 'act':
|
||||
if '(' not in child.content.name:
|
||||
self.ptml_string += 'act ' + child.content.name + "()\n"
|
||||
else:
|
||||
self.ptml_string += 'act ' + child.content.name + "\n"
|
||||
elif isinstance(child, ControlBT):
|
||||
if child.type == '?':
|
||||
self.ptml_string += "selector{\n"
|
||||
self.dfs_ptml(parnode=child)
|
||||
elif child.type == '>':
|
||||
self.ptml_string += "sequence{\n"
|
||||
self.dfs_ptml( parnode=child)
|
||||
self.ptml_string += '}\n'
|
||||
|
||||
|
||||
def get_ptml(self):
|
||||
self.ptml_string = "selector{\n"
|
||||
self.dfs_ptml(self.bt.children[0],is_root=True)
|
||||
self.ptml_string += '}\n'
|
||||
return self.ptml_string
|
||||
|
||||
|
||||
def save_ptml_file(self,file_name):
|
||||
self.ptml_string = "selector{\n"
|
||||
self.dfs_ptml(self.bt.children[0])
|
||||
self.ptml_string += '}\n'
|
||||
with open(f'./{file_name}.ptml', 'w') as file:
|
||||
file.write(self.ptml_string)
|
||||
return self.ptml_string
|
After Width: | Height: | Size: 54 KiB |
|
@ -0,0 +1,72 @@
|
|||
|
||||
|
||||
## 代码说明
|
||||
|
||||
### 1. `BehaviorTree.py` 实现行为树叶子结点和非叶子结点的定义
|
||||
|
||||
- **Leaf **:表示叶节点,可以是动作(`act`)或条件(`cond`)。
|
||||
- **ControlBT**:代表可能包含控制节点的行为树。它们可以是选择器(`?`)、序列(`>`)、动作节点(`act`)或条件节点(`cond`)。
|
||||
- 上述两个类都包含 `tick` 方法。
|
||||
|
||||
### 2. `BTExpansionAlgorithm.py` 实现最优行为树扩展算法
|
||||
|
||||

|
||||
|
||||
使用方法
|
||||
|
||||
```
|
||||
algo = BTalgorithm(verbose=True)
|
||||
algo.clear()
|
||||
algo.run_algorithm(start, goal, actions) # 使用算法得到行为树在 algo.bt
|
||||
algo.print_solution() # 打印行为树
|
||||
val, obj = algo.bt.tick(state) # 执行行为树
|
||||
```
|
||||
|
||||
### 3. **`tools.py`** 实现打印数据、行为树测试等模块
|
||||
|
||||
使用方法
|
||||
|
||||
```python
|
||||
print_action_data_table(goal,start,actions) # 打印所有变量
|
||||
|
||||
# 行为树鲁棒性测试,随机生成规划问题
|
||||
# 设置生成规划问题集的超参数:文字数、解深度、迭代次数
|
||||
seed=1
|
||||
literals_num=10
|
||||
depth = 10
|
||||
iters= 10
|
||||
BTTest(seed=seed,literals_num=literals_num,depth=depth,iters=iters)
|
||||
```
|
||||
|
||||
### 4. `Example.py` 中设计规划案例 goals, start,actions
|
||||
|
||||
```python
|
||||
def MoveBtoB ():
|
||||
actions=[]
|
||||
a = Action(name="Move(b,ab)")
|
||||
a.pre={'Free(ab)','WayClear'}
|
||||
a.add={'At(b,ab)'}
|
||||
a.del_set= {'Free(ab)','At(b,pb)'}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
a=Action(name="Move(s,ab)")
|
||||
a.pre={'Free(ab)'}
|
||||
a.add={'Free(ab)','WayClear'}
|
||||
a.del_set={'Free(ab)','At(s,ps)'}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
a=Action(name="Move(s,as)")
|
||||
a.pre={'Free(as)'}
|
||||
a.add={'At(s,ps)','WayClear'}
|
||||
a.del_set={'Free(as)','At(s,ps)'}
|
||||
a.cost = 1
|
||||
actions.append(a)
|
||||
|
||||
start = {'Free(ab)','Free(as)','At(b,pb)','At(s,ps)'}
|
||||
goal= {'At(b,ab)'}
|
||||
return goal,start,actions
|
||||
```
|
||||
|
||||
### 5. `main.py` 为主函数,实现 规划生成、行为树生成、行为树执行、行为树测试 的整个流程
|
|
@ -0,0 +1,43 @@
|
|||
selector{
|
||||
cond On(Softdrink,WaterTable)
|
||||
sequence{
|
||||
cond At(Robot,WaterTable)
|
||||
cond Holding(Softdrink)
|
||||
act PutDown(Softdrink,WaterTable)
|
||||
}
|
||||
sequence{
|
||||
cond At(Robot,WaterTable)
|
||||
cond At(Robot,Softdrink)
|
||||
selector{
|
||||
sequence{
|
||||
cond Holding(Nothing)
|
||||
act PickUp(Softdrink)
|
||||
}
|
||||
act PutDown(Anything,Anywhere)
|
||||
}
|
||||
}
|
||||
sequence{
|
||||
cond Holding(Softdrink)
|
||||
act MoveTo(WaterTable)
|
||||
}
|
||||
sequence{
|
||||
cond At(Robot,Softdrink)
|
||||
selector{
|
||||
sequence{
|
||||
cond Holding(Nothing)
|
||||
act PickUp(Softdrink)
|
||||
}
|
||||
act PutDown(Anything,Anywhere)
|
||||
}
|
||||
}
|
||||
sequence{
|
||||
cond Exist(Softdrink)
|
||||
selector{
|
||||
sequence{
|
||||
cond Holding(Nothing)
|
||||
act MoveTo(Softdrink)
|
||||
}
|
||||
act MoveTo(Softdrink)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,165 @@
|
|||
{At(Robot,Bar)}
|
||||
{At(Robot,Bar2)}
|
||||
{At(Robot,WaterTable)}
|
||||
{At(Robot,CoffeeTable)}
|
||||
{At(Robot,Table1)}
|
||||
{At(Robot,Table2)}
|
||||
{At(Robot,Table3)}
|
||||
{At(Robot,BrightTable6)}
|
||||
{On(Coffee,Bar)}
|
||||
{On(Coffee,Bar2)}
|
||||
{On(Coffee,WaterTable)}
|
||||
{On(Coffee,CoffeeTable)}
|
||||
{On(Coffee,Table1)}
|
||||
{On(Coffee,Table2)}
|
||||
{On(Coffee,Table3)}
|
||||
{On(Coffee,BrightTable6)}
|
||||
{On(Water,Bar)}
|
||||
{On(Water,Bar2)}
|
||||
{On(Water,WaterTable)}
|
||||
{On(Water,CoffeeTable)}
|
||||
{On(Water,Table1)}
|
||||
{On(Water,Table2)}
|
||||
{On(Water,Table3)}
|
||||
{On(Water,BrightTable6)}
|
||||
{On(Dessert,Bar)}
|
||||
{On(Dessert,Bar2)}
|
||||
{On(Dessert,WaterTable)}
|
||||
{On(Dessert,CoffeeTable)}
|
||||
{On(Dessert,Table1)}
|
||||
{On(Dessert,Table2)}
|
||||
{On(Dessert,Table3)}
|
||||
{On(Dessert,BrightTable6)}
|
||||
{On(Softdrink,Bar)}
|
||||
{On(Softdrink,Bar2)}
|
||||
{On(Softdrink,WaterTable)}
|
||||
{On(Softdrink,CoffeeTable)}
|
||||
{On(Softdrink,Table1)}
|
||||
{On(Softdrink,Table2)}
|
||||
{On(Softdrink,Table3)}
|
||||
{On(Softdrink,BrightTable6)}
|
||||
{On(BottledDrink,Bar)}
|
||||
{On(BottledDrink,Bar2)}
|
||||
{On(BottledDrink,WaterTable)}
|
||||
{On(BottledDrink,CoffeeTable)}
|
||||
{On(BottledDrink,Table1)}
|
||||
{On(BottledDrink,Table2)}
|
||||
{On(BottledDrink,Table3)}
|
||||
{On(BottledDrink,BrightTable6)}
|
||||
{On(Yogurt,Bar)}
|
||||
{On(Yogurt,Bar2)}
|
||||
{On(Yogurt,WaterTable)}
|
||||
{On(Yogurt,CoffeeTable)}
|
||||
{On(Yogurt,Table1)}
|
||||
{On(Yogurt,Table2)}
|
||||
{On(Yogurt,Table3)}
|
||||
{On(Yogurt,BrightTable6)}
|
||||
{On(ADMilk,Bar)}
|
||||
{On(ADMilk,Bar2)}
|
||||
{On(ADMilk,WaterTable)}
|
||||
{On(ADMilk,CoffeeTable)}
|
||||
{On(ADMilk,Table1)}
|
||||
{On(ADMilk,Table2)}
|
||||
{On(ADMilk,Table3)}
|
||||
{On(ADMilk,BrightTable6)}
|
||||
{On(MilkDrink,Bar)}
|
||||
{On(MilkDrink,Bar2)}
|
||||
{On(MilkDrink,WaterTable)}
|
||||
{On(MilkDrink,CoffeeTable)}
|
||||
{On(MilkDrink,Table1)}
|
||||
{On(MilkDrink,Table2)}
|
||||
{On(MilkDrink,Table3)}
|
||||
{On(MilkDrink,BrightTable6)}
|
||||
{On(Milk,Bar)}
|
||||
{On(Milk,Bar2)}
|
||||
{On(Milk,WaterTable)}
|
||||
{On(Milk,CoffeeTable)}
|
||||
{On(Milk,Table1)}
|
||||
{On(Milk,Table2)}
|
||||
{On(Milk,Table3)}
|
||||
{On(Milk,BrightTable6)}
|
||||
{On(VacuumCup,Bar)}
|
||||
{On(VacuumCup,Bar2)}
|
||||
{On(VacuumCup,WaterTable)}
|
||||
{On(VacuumCup,CoffeeTable)}
|
||||
{On(VacuumCup,Table1)}
|
||||
{On(VacuumCup,Table2)}
|
||||
{On(VacuumCup,Table3)}
|
||||
{On(VacuumCup,BrightTable6)}
|
||||
{On(Chips,Bar)}
|
||||
{On(Chips,Bar2)}
|
||||
{On(Chips,WaterTable)}
|
||||
{On(Chips,CoffeeTable)}
|
||||
{On(Chips,Table1)}
|
||||
{On(Chips,Table2)}
|
||||
{On(Chips,Table3)}
|
||||
{On(Chips,BrightTable6)}
|
||||
{On(NFCJuice,Bar)}
|
||||
{On(NFCJuice,Bar2)}
|
||||
{On(NFCJuice,WaterTable)}
|
||||
{On(NFCJuice,CoffeeTable)}
|
||||
{On(NFCJuice,Table1)}
|
||||
{On(NFCJuice,Table2)}
|
||||
{On(NFCJuice,Table3)}
|
||||
{On(NFCJuice,BrightTable6)}
|
||||
{On(Bernachon,Bar)}
|
||||
{On(Bernachon,Bar2)}
|
||||
{On(Bernachon,WaterTable)}
|
||||
{On(Bernachon,CoffeeTable)}
|
||||
{On(Bernachon,Table1)}
|
||||
{On(Bernachon,Table2)}
|
||||
{On(Bernachon,Table3)}
|
||||
{On(Bernachon,BrightTable6)}
|
||||
{On(SpringWater,Bar)}
|
||||
{On(SpringWater,Bar2)}
|
||||
{On(SpringWater,WaterTable)}
|
||||
{On(SpringWater,CoffeeTable)}
|
||||
{On(SpringWater,Table1)}
|
||||
{On(SpringWater,Table2)}
|
||||
{On(SpringWater,Table3)}
|
||||
{On(SpringWater,BrightTable6)}
|
||||
{Is(AC,Off)}
|
||||
{Is(AC,On)}
|
||||
{Is(ACTemperature,Up)}
|
||||
{Is(ACTemperature,Down)}
|
||||
{Is(HallLight,Off)}
|
||||
{Is(HallLight,On)}
|
||||
{Is(TubeLight,Off)}
|
||||
{Is(TubeLight,On)}
|
||||
{Is(Curtain,Off)}
|
||||
{Is(Curtain,On)}
|
||||
{Is(Chairs,Dirty)}
|
||||
{Is(Chairs,Clean)}
|
||||
{Is(Floor,Dirty)}
|
||||
{Is(Floor,Clean)}
|
||||
{Is(Table1,Dirty)}
|
||||
{Is(Table1,Clean)}
|
||||
{Holding(Coffee)}
|
||||
{Holding(Water)}
|
||||
{Holding(Dessert)}
|
||||
{Holding(Softdrink)}
|
||||
{Holding(BottledDrink)}
|
||||
{Holding(Yogurt)}
|
||||
{Holding(ADMilk)}
|
||||
{Holding(MilkDrink)}
|
||||
{Holding(Milk)}
|
||||
{Holding(VacuumCup)}
|
||||
{Holding(Chips)}
|
||||
{Holding(NFCJuice)}
|
||||
{Holding(Bernachon)}
|
||||
{Holding(SpringWater)}
|
||||
{Holding(Nothing)}
|
||||
{Exist(Coffee)}
|
||||
{Exist(Water)}
|
||||
{Exist(Dessert)}
|
||||
{Exist(Softdrink)}
|
||||
{Exist(BottledDrink)}
|
||||
{Exist(Yogurt)}
|
||||
{Exist(ADMilk)}
|
||||
{Exist(MilkDrink)}
|
||||
{Exist(Milk)}
|
||||
{Exist(VacuumCup)}
|
||||
{Exist(Chips)}
|
||||
{Exist(NFCJuice)}
|
||||
{Exist(Bernachon)}
|
||||
{Exist(SpringWater)}
|
|
@ -0,0 +1,172 @@
|
|||
import random
|
||||
import numpy as np
|
||||
import copy
|
||||
import time
|
||||
from BehaviorTree import Leaf,ControlBT # 行为结点类:叶子结点和非叶子节点
|
||||
from OptimalBTExpansionAlgorithm_single_goal import Action,OptBTExpAlgorithm # 调用最优行为树扩展算法
|
||||
from BTExpansionAlgorithm import BTExpAlgorithm
|
||||
from OptimalBTExpansionAlgorithm_single_goal import generate_random_state,state_transition
|
||||
from tools import print_action_data_table,BTTest,BTTest_act_start_goal,get_act_start_goal
|
||||
from Examples import MoveBtoB_num,MoveBtoB,Cond2BelongsToCond3 # 导入三个例子
|
||||
from Examples import *
|
||||
# from utils.bt.draw import render_dot_tree
|
||||
# from utils.bt.load import load_bt_from_ptml,find_node_by_name,print_tree_from_root
|
||||
import os
|
||||
output_path = os.path.join(os.path.dirname(__file__), "outputs")
|
||||
|
||||
if __name__ == '__main__' :
|
||||
|
||||
# todo: Example Cafe
|
||||
# todo: Define goal, start, actions
|
||||
# actions=[]
|
||||
# a = Action(name="Move(b,ab)")
|
||||
# a.pre={'Free(ab)','WayClear'}
|
||||
# a.add={'At(b,ab)'} #{3}
|
||||
# a.del_set= {'Free(ab)','At(b,pb)'}
|
||||
# a.cost = 1
|
||||
# actions.append(a)
|
||||
# ……………………
|
||||
# start = {'Free(ab)','Free(as)','At(b,pb)','At(s,ps)'}
|
||||
# goal= {'At(b,ab)'}
|
||||
|
||||
# Put(P,O) pre={'Holding(O)','At(Robot,P)'}, add={'At(P,O)','NotHolding'}, del_set={'Holding(O)'}
|
||||
# Grasp(O) pre={'NotHolding','At(Robot,O)'}, add={'Holding(O)'}, del_set={'NotHolding'}
|
||||
# MoveTo(P) pre={'Available(P)'}, add={'At(Robot,P)'}, del_set={'At(……)'}
|
||||
|
||||
# actions=[
|
||||
# Action(name='PutDown(Table,Coffee)', pre={'Holding(Coffee)','At(Robot,Table)'}, add={'At(Table,Coffee)','NotHolding'}, del_set={'Holding(Coffee)'}, cost=1),
|
||||
# Action(name='PutDown(Table,VacuumCup)', pre={'Holding(VacuumCup)','At(Robot,Table)'}, add={'At(Table,VacuumCup)','NotHolding'}, del_set={'Holding(VacuumCup)'}, cost=1),
|
||||
#
|
||||
# Action(name='PickUp(Coffee)', pre={'NotHolding','At(Robot,Coffee)'}, add={'Holding(Coffee)'}, del_set={'NotHolding'}, cost=2),
|
||||
#
|
||||
# Action(name='MoveTo(Table)', pre={'Available(Table)'}, add={'At(Robot,Table)'}, del_set={'At(Robot,FrontDesk)','At(Robot,Coffee)','At(Robot,CoffeeMachine)'}, cost=5),
|
||||
# Action(name='MoveTo(Coffee)', pre={'Available(Coffee)'}, add={'At(Robot,Coffee)'}, del_set={'At(Robot,FrontDesk)','At(Robot,Table)','At(Robot,CoffeeMachine)'}, cost=6),
|
||||
# Action(name='MoveTo(CoffeeMachine)', pre={'Available(CoffeeMachine)'}, add={'At(Robot,CoffeeMachine)'}, del_set={'At(Robot,FrontDesk)','At(Robot,Coffee)','At(Robot,Table)'}, cost=7),
|
||||
#
|
||||
# Action(name='OpCoffeeMachine', pre={'At(Robot,CoffeeMachine)','NotHolding'}, add={'Available(Coffee)','At(Robot,Coffee)'}, del_set=set(), cost=10),
|
||||
# ]
|
||||
#
|
||||
# start = {'At(Robot,Bar)','Holding(VacuumCup)','Available(Table)','Available(CoffeeMachine)','Available(FrontDesk)'}
|
||||
# goal = {'At(Table,Coffee)'}
|
||||
#
|
||||
ptml_file_name = "SoftdrinkCost" #MakeCoffee
|
||||
|
||||
|
||||
# 从已定义好的例子中直接导入
|
||||
goal, start, actions = Cond2BelongsToCond3() # Examples里的例子: MoveBtoB_num,MoveBtoB,Cond2BelongsToCond3,SoftdrinkCost
|
||||
# goal, start, actions = Test()
|
||||
# goal, start, actions = MakeCoffeeCost()
|
||||
# print_action_data_table(goal,start,actions) # 打印所有变量
|
||||
|
||||
'''
|
||||
# todo: 运行算法得到行为树为 algo.bt
|
||||
algo = OptBTExpAlgorithm(verbose=True)
|
||||
algo.clear()
|
||||
algo.run_algorithm(start, goal, actions)
|
||||
# algo.print_solution() # 打印行为树
|
||||
# todo: 输出 MakeCoffee.ptml
|
||||
print("=========== PTML ============")
|
||||
ptml_string = algo.save_ptml_file(ptml_file_name)
|
||||
print(ptml_string)
|
||||
print("========= End PTML ==========\n")
|
||||
|
||||
|
||||
|
||||
# todo: 执行行为树查看结果
|
||||
print("=========== Run BT ============")
|
||||
state = start
|
||||
steps = 0
|
||||
val, obj = algo.bt.tick(state)
|
||||
while val != 'success' and val != 'failure':
|
||||
state = state_transition(state, obj)
|
||||
print (obj.name)
|
||||
val, obj = algo.bt.tick(state)
|
||||
if (val == 'failure'):
|
||||
print("bt fails at step", steps)
|
||||
steps += 1
|
||||
if not goal <= state:
|
||||
print ("wrong solution",steps)
|
||||
else:
|
||||
print ("right solution",steps)
|
||||
#algo.bt.print_nodes()
|
||||
print ("The number of nodes in BT:",algo.bt.count_size()-1)
|
||||
algo.clear()
|
||||
print("============ End Run BT ===========\n")
|
||||
'''
|
||||
|
||||
'''
|
||||
# 新增测试 cost
|
||||
algo = OptBTExpAlgorithm(verbose=False)
|
||||
algo.clear()
|
||||
algo.run_algorithm(start, goal, actions)
|
||||
# algo.print_solution() # 打印行为树
|
||||
print("=========== Run OptBT ============")
|
||||
state = start
|
||||
steps = 0
|
||||
cost_tatol = 0
|
||||
val, obj,cost,ticks = algo.bt.cost_tick(state,0,0)
|
||||
cost_tatol+=cost
|
||||
while val != 'success' and val != 'failure':
|
||||
state = state_transition(state, obj)
|
||||
print (obj.name)
|
||||
val, obj,cost,ticks = algo.bt.cost_tick(state,0,ticks)
|
||||
cost_tatol += cost
|
||||
if (val == 'failure'):
|
||||
print("bt fails at step", steps)
|
||||
steps += 1
|
||||
if not goal <= state:
|
||||
print ("wrong solution steps",steps)
|
||||
else:
|
||||
print ("right solution steps",steps)
|
||||
algo.clear()
|
||||
print("OptBT cost:", cost_tatol)
|
||||
print("OptBT ticks:", ticks)
|
||||
print("============ End Run OptBT ===========\n")
|
||||
|
||||
|
||||
algo2 = BTExpAlgorithm(verbose=False)
|
||||
algo2.clear()
|
||||
algo2.run_algorithm(start, goal, actions)
|
||||
# algo2.print_solution() # 打印行为树
|
||||
print("=========== Run XiaoCaiBT ============")
|
||||
state = start
|
||||
steps = 0
|
||||
cost_tatol2 = 0
|
||||
val, obj,cost,ticks = algo2.bt.cost_tick(state,0,0)
|
||||
cost_tatol2+=cost
|
||||
while val != 'success' and val != 'failure':
|
||||
state = state_transition(state, obj)
|
||||
print (obj.name)
|
||||
val, obj,cost,ticks = algo2.bt.cost_tick(state,0,ticks)
|
||||
cost_tatol2 += cost
|
||||
if (val == 'failure'):
|
||||
print("bt fails at step", steps)
|
||||
steps += 1
|
||||
if not goal <= state:
|
||||
print ("wrong solution steps",steps)
|
||||
else:
|
||||
print ("right solution steps",steps)
|
||||
algo2.clear()
|
||||
print("XiaoCaiBT cost:", cost_tatol2)
|
||||
print("XiaoCaiBT ticks:", ticks)
|
||||
print("============ End Run XiaoCaiBT ===========\n")
|
||||
'''
|
||||
|
||||
|
||||
# todo: 行为树鲁棒性测试,随机生成规划问题
|
||||
# # 设置生成规划问题集的超参数:文字数、解深度、迭代次数
|
||||
seed=1
|
||||
literals_num= 10
|
||||
depth = 10
|
||||
iters= 10
|
||||
|
||||
|
||||
act_list, start_list, goal_list = get_act_start_goal(seed=seed,literals_num=literals_num,depth=depth,iters=iters,total_count=1)
|
||||
BTTest_act_start_goal(bt_algo_opt=True,act_list=act_list, start_list=start_list, goal_list=goal_list)
|
||||
print("\n")
|
||||
BTTest_act_start_goal(bt_algo_opt=False, act_list=act_list, start_list=start_list, goal_list=goal_list)
|
||||
|
||||
# BTTest(bt_algo_opt=True,seed=seed,literals_num=literals_num,depth=depth,iters=iters)
|
||||
# print("\n")
|
||||
# 对比
|
||||
# BTTest(bt_algo_opt=False,seed=seed,literals_num=literals_num,depth=depth,iters=iters)
|
|
@ -0,0 +1,35 @@
|
|||
import py_trees as ptree
|
||||
from typing import Any
|
||||
from robowaiter.behavior_lib._base.Act import Act
|
||||
from robowaiter.behavior_lib._base.Behavior import Status
|
||||
|
||||
class FreeHands(Act):
|
||||
can_be_expanded = True
|
||||
num_args = 0
|
||||
valid_args = set()
|
||||
|
||||
def __init__(self, *args):
|
||||
super().__init__(*args)
|
||||
|
||||
|
||||
@classmethod
|
||||
def get_info(cls):
|
||||
info = {}
|
||||
# info["pre"]= set()
|
||||
info["pre"] ={f'Holding(Nothing)'}
|
||||
info['add'] = {f'Holding(Nothing)'}
|
||||
info['del_set'] = {f'Holding({obj})' for obj in cls.all_object}
|
||||
info['cost'] = 0
|
||||
return info
|
||||
|
||||
def _update(self) -> ptree.common.Status:
|
||||
|
||||
|
||||
if self.scene.show_ui:
|
||||
self.scene.get_obstacle_point(self.scene.db, self.status, map_ratio=self.scene.map_ratio,update_info_count=1)
|
||||
|
||||
self.scene.state["condition_set"] |= (self.info["add"])
|
||||
self.scene.state["condition_set"] -= self.info["del_set"]
|
||||
|
||||
|
||||
return Status.RUNNING
|
|
@ -0,0 +1,38 @@
|
|||
|
||||
# goal = "AND[NOT[On(Yogurt,Table1)],[(On(Coffee,Table1))OR(On(ADMilk,Table1))]]"
|
||||
from sympy.parsing.sympy_parser import parse_expr
|
||||
from sympy import symbols, Not, Or, And, to_dnf
|
||||
# 定义逻辑变量
|
||||
# YogurtOnTable1 = symbols('On(Yogurt,Table1)')
|
||||
# CoffeeOnTable1 = symbols('On(Coffee,Table1)')
|
||||
# ADMilkOnTable1 = symbols('On(ADMilk,Table1)')
|
||||
|
||||
On_Yogurt_Table1, On_Coffee_Table1, On_ADMilk_Table1 = symbols('On_Yogurt_Table1 On_Coffee_Table1 On_ADMilk_Table1')
|
||||
# YogurtOnTable1, CoffeeOnTable1, ADMilkOnTable1 = symbols('YogurtOnTable1 CoffeeOnTable1 ADMilkOnTable1')
|
||||
# YogurtOnTable1 = symbols('On[Yogurt,Table1]')
|
||||
# CoffeeOnTable1 = symbols('On(Coffee,Table1)')
|
||||
# ADMilkOnTable1 = symbols('On(ADMilk,Table1)')
|
||||
|
||||
# 构造原始表达式
|
||||
# expression = (And(Not(YogurtOnTable1), Or(CoffeeOnTable1, ADMilkOnTable1)))
|
||||
# 定义字符串形式的逻辑表达式
|
||||
# goal = "Not(On[Yogurt,Table1]) & (On]Coffee,Table1) | On(ADMilk,Table1))"
|
||||
# expr_str = "Not(YogurtOnTable1) & (CoffeeOnTable1 | ADMilkOnTable1)"
|
||||
|
||||
# expr_str = "Not(On(Yogurt,Table1)) & (On(Coffee,Table1) | On(ADMilk,Table1))"
|
||||
expr_str = "Not(On_Yogurt_Table1) & (On_Coffee_Table1 | On_ADMilk_Table1 & At_Robot_Bar)"
|
||||
# expr_str = "Not(YogurtOnTable1) & (CoffeeOnTable1 | ADMilkOnTable1 & Not(YogurtOnTable1) )"
|
||||
|
||||
# 将字符串解析为 SymPy 表达式
|
||||
expr = parse_expr(expr_str, local_dict={
|
||||
'On(Yogurt,Table1)': On_Yogurt_Table1,
|
||||
'On(Coffee,Table1)': On_Coffee_Table1,
|
||||
'On(ADMilk,Table1)': On_ADMilk_Table1
|
||||
})
|
||||
|
||||
|
||||
dnf_expr = to_dnf(expr, simplify=True)
|
||||
print(dnf_expr)
|
||||
# 转换为析取范式
|
||||
# dnf_expression = to_dnf(expression, simplify=True)
|
||||
# print(dnf_expression)
|
|
@ -0,0 +1,32 @@
|
|||
from pyparsing import infixNotation, opAssoc, Keyword, Word, alphas, ParserElement
|
||||
|
||||
# 启用忽略大小写的关键字
|
||||
ParserElement.enablePackrat()
|
||||
|
||||
# 定义基础元素
|
||||
variable = Word(alphas)
|
||||
predicate = variable + '(' + variable + ',' + variable + ')'
|
||||
|
||||
# 定义逻辑运算符
|
||||
and_ = Keyword("And")
|
||||
or_ = Keyword("Or")
|
||||
not_ = Keyword("Not")
|
||||
|
||||
# 由于你的表达式使用 "&" 和 "|"
|
||||
and_sym = Word("&", exact=1)
|
||||
or_sym = Word("|", exact=1)
|
||||
|
||||
# 定义逻辑表达式的语法
|
||||
expr = infixNotation(predicate,
|
||||
[
|
||||
(not_, 1, opAssoc.RIGHT),
|
||||
(and_sym, 2, opAssoc.LEFT, and_),
|
||||
(or_sym, 2, opAssoc.LEFT, or_),
|
||||
])
|
||||
|
||||
# 解析示例表达式
|
||||
goal = "Not(On(Yogurt,Table1)) & (On(Coffee,Table1) | On(ADMilk,Table1)) & At(Robot,Bar)"
|
||||
parsed_expr = expr.parseString(goal)
|
||||
|
||||
# 打印解析结果
|
||||
print(parsed_expr.asList())
|