Merge remote-tracking branch 'origin/main'

# Conflicts:
#	robowaiter/utils/draw_bt/Default.ptml
#	robowaiter/utils/draw_bt/Default_bracket.ptml
#	robowaiter/utils/draw_bt/test.dot
#	robowaiter/utils/draw_bt/test.png
#	robowaiter/utils/draw_bt/test.svg
This commit is contained in:
wuziji 2024-01-09 20:49:04 +08:00
commit 7187855703
241 changed files with 169629 additions and 507 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,2 @@

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -0,0 +1,3 @@
from EXP.behavior_lib._base.Sequence import Sequence
from EXP.behavior_lib._base.Selector import Selector

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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_args = [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

View File

@ -0,0 +1,2 @@
# from robowaiter.behavior_tree.behavior_tree import BehaviorTree

View File

@ -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桌子上。

View File

@ -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) 当然可以我可以帮你制作水然后把水端到酒吧2Bar 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) 当然可以我会做一些美味的甜点然后带到酒吧2Bar 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) 好的,我给你准备了一些甜点,现在就端到你面前的桌子上。

View File

@ -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) 请问你能把酸奶拿到另一个吧台位置吗?

File diff suppressed because it is too large Load Diff

View File

@ -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())

View File

@ -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)"}

View File

@ -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) 给我来点点心或者甜品,并把它端到第三张桌子这里来。

View File

@ -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]))

View File

@ -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("输出完成")

View File

@ -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桌子上。

View File

@ -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) 当然可以我可以帮你制作水然后把水端到酒吧2Bar 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) 当然可以我会做一些美味的甜点然后带到酒吧2Bar 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) 好的,我给你准备了一些甜点,现在就端到你面前的桌子上。

View File

@ -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) 请问你能把酸奶拿到另一个吧台位置吗?

View File

@ -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-gramsg=0采用CBOW---skip-gram慢、对罕见字有利vs CBOW
# hs=1,# hs=1,采用hierarchica·softmaxhs=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)

File diff suppressed because it is too large Load Diff

View File

@ -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())

View File

@ -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)}

View File

@ -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)"}

View File

@ -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) 给我来点点心,并把它端到后门靠窗边圆桌这里来。

View File

@ -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]))

View File

@ -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("输出完成")

View File

@ -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

View File

@ -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

View File

@ -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)
}
}

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

View File

@ -0,0 +1,125 @@
## 代码说明
### 1. `BehaviorTree.py` 实现行为树叶子结点和非叶子结点的定义
- **Leaf**:表示叶节点,可以是动作(`act`)或条件(`cond`)。
- **ControlBT**:代表可能包含控制节点的行为树。它们可以是选择器(`?`)、序列(`>`)、动作节点(`act`)或条件节点(`cond`)。
- 上述两个类都包含 `tick` 方法。
### 2. `OptimalBTExpansionAlgorithm.py` 实现最优行为树扩展算法
![image-20231103191141047](README.assets/image-20231103191141047.png)
定义行动类
```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!")
```

View File

@ -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

View File

@ -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!")

View File

@ -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

View File

@ -0,0 +1,2 @@
cd ./robowaiter/behavior_tree/ptml
antlr4 -Dlanguage=Python3 ptml.g4

View File

@ -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 ;

View File

@ -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]

View File

@ -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

View File

@ -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)

View File

@ -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]

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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()
}
}

View File

@ -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)

View File

@ -0,0 +1,7 @@
selector{
sequence{
cond Chatting()
act DealChat()
}
act At(Coffee,Table)
}

View File

@ -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)}}

View File

@ -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)

View File

@ -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";
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

View File

@ -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&#45;42d6&#45;49de&#45;a458&#45;0c7d3bffc436 -->
<g id="node1" class="node">
<title>34d1cf8a&#45;42d6&#45;49de&#45;a458&#45;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&#45;2d5c&#45;4e1d&#45;bdb5&#45;5ded443a713c -->
<g id="node2" class="node">
<title>33446211&#45;2d5c&#45;4e1d&#45;bdb5&#45;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&#45;42d6&#45;49de&#45;a458&#45;0c7d3bffc436&#45;&gt;33446211&#45;2d5c&#45;4e1d&#45;bdb5&#45;5ded443a713c -->
<g id="edge1" class="edge">
<title>34d1cf8a&#45;42d6&#45;49de&#45;a458&#45;0c7d3bffc436&#45;&gt;33446211&#45;2d5c&#45;4e1d&#45;bdb5&#45;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&#45;557f&#45;473a&#45;a582&#45;2f0d17d1a4f1 -->
<g id="node5" class="node">
<title>6fe9e522&#45;557f&#45;473a&#45;a582&#45;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">&gt;</text>
</g>
<!-- 34d1cf8a&#45;42d6&#45;49de&#45;a458&#45;0c7d3bffc436&#45;&gt;6fe9e522&#45;557f&#45;473a&#45;a582&#45;2f0d17d1a4f1 -->
<g id="edge4" class="edge">
<title>34d1cf8a&#45;42d6&#45;49de&#45;a458&#45;0c7d3bffc436&#45;&gt;6fe9e522&#45;557f&#45;473a&#45;a582&#45;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&#45;cc9d&#45;484d&#45;b564&#45;dbd5912378fa -->
<g id="node8" class="node">
<title>d78eaf31&#45;cc9d&#45;484d&#45;b564&#45;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">&gt;</text>
</g>
<!-- 34d1cf8a&#45;42d6&#45;49de&#45;a458&#45;0c7d3bffc436&#45;&gt;d78eaf31&#45;cc9d&#45;484d&#45;b564&#45;dbd5912378fa -->
<g id="edge7" class="edge">
<title>34d1cf8a&#45;42d6&#45;49de&#45;a458&#45;0c7d3bffc436&#45;&gt;d78eaf31&#45;cc9d&#45;484d&#45;b564&#45;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&#45;e2f6&#45;4de9&#45;9284&#45;0c5eabbdd741 -->
<g id="node3" class="node">
<title>96622c49&#45;e2f6&#45;4de9&#45;9284&#45;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&#45;2d5c&#45;4e1d&#45;bdb5&#45;5ded443a713c&#45;&gt;96622c49&#45;e2f6&#45;4de9&#45;9284&#45;0c5eabbdd741 -->
<g id="edge2" class="edge">
<title>33446211&#45;2d5c&#45;4e1d&#45;bdb5&#45;5ded443a713c&#45;&gt;96622c49&#45;e2f6&#45;4de9&#45;9284&#45;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&#45;0338&#45;4616&#45;bac2&#45;bc39c81d2b77 -->
<g id="node4" class="node">
<title>dc007c72&#45;0338&#45;4616&#45;bac2&#45;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&#45;2d5c&#45;4e1d&#45;bdb5&#45;5ded443a713c&#45;&gt;dc007c72&#45;0338&#45;4616&#45;bac2&#45;bc39c81d2b77 -->
<g id="edge3" class="edge">
<title>33446211&#45;2d5c&#45;4e1d&#45;bdb5&#45;5ded443a713c&#45;&gt;dc007c72&#45;0338&#45;4616&#45;bac2&#45;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&#45;88b1&#45;41bb&#45;a638&#45;26cc06e7a3dd -->
<g id="node6" class="node">
<title>cf3e4033&#45;88b1&#45;41bb&#45;a638&#45;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&#45;557f&#45;473a&#45;a582&#45;2f0d17d1a4f1&#45;&gt;cf3e4033&#45;88b1&#45;41bb&#45;a638&#45;26cc06e7a3dd -->
<g id="edge5" class="edge">
<title>6fe9e522&#45;557f&#45;473a&#45;a582&#45;2f0d17d1a4f1&#45;&gt;cf3e4033&#45;88b1&#45;41bb&#45;a638&#45;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&#45;dd83&#45;4abb&#45;8234&#45;8466ff0c0483 -->
<g id="node7" class="node">
<title>d2e8364e&#45;dd83&#45;4abb&#45;8234&#45;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&#45;557f&#45;473a&#45;a582&#45;2f0d17d1a4f1&#45;&gt;d2e8364e&#45;dd83&#45;4abb&#45;8234&#45;8466ff0c0483 -->
<g id="edge6" class="edge">
<title>6fe9e522&#45;557f&#45;473a&#45;a582&#45;2f0d17d1a4f1&#45;&gt;d2e8364e&#45;dd83&#45;4abb&#45;8234&#45;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&#45;fc8e&#45;4418&#45;8d6b&#45;7a154d2004f6 -->
<g id="node9" class="node">
<title>85284b02&#45;fc8e&#45;4418&#45;8d6b&#45;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&#45;cc9d&#45;484d&#45;b564&#45;dbd5912378fa&#45;&gt;85284b02&#45;fc8e&#45;4418&#45;8d6b&#45;7a154d2004f6 -->
<g id="edge8" class="edge">
<title>d78eaf31&#45;cc9d&#45;484d&#45;b564&#45;dbd5912378fa&#45;&gt;85284b02&#45;fc8e&#45;4418&#45;8d6b&#45;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&#45;55b1&#45;4a71&#45;8b31&#45;0381812f588a -->
<g id="node10" class="node">
<title>eb1bba56&#45;55b1&#45;4a71&#45;8b31&#45;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">&gt;</text>
</g>
<!-- d78eaf31&#45;cc9d&#45;484d&#45;b564&#45;dbd5912378fa&#45;&gt;eb1bba56&#45;55b1&#45;4a71&#45;8b31&#45;0381812f588a -->
<g id="edge9" class="edge">
<title>d78eaf31&#45;cc9d&#45;484d&#45;b564&#45;dbd5912378fa&#45;&gt;eb1bba56&#45;55b1&#45;4a71&#45;8b31&#45;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&#45;62b5&#45;4852&#45;ab3e&#45;ac0199cc46a8 -->
<g id="node12" class="node">
<title>3d7f6aa9&#45;62b5&#45;4852&#45;ab3e&#45;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&#45;cc9d&#45;484d&#45;b564&#45;dbd5912378fa&#45;&gt;3d7f6aa9&#45;62b5&#45;4852&#45;ab3e&#45;ac0199cc46a8 -->
<g id="edge11" class="edge">
<title>d78eaf31&#45;cc9d&#45;484d&#45;b564&#45;dbd5912378fa&#45;&gt;3d7f6aa9&#45;62b5&#45;4852&#45;ab3e&#45;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&#45;d59d&#45;4b04&#45;a4ed&#45;eff12e6adc91 -->
<g id="node11" class="node">
<title>20b57b46&#45;d59d&#45;4b04&#45;a4ed&#45;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&#45;55b1&#45;4a71&#45;8b31&#45;0381812f588a&#45;&gt;20b57b46&#45;d59d&#45;4b04&#45;a4ed&#45;eff12e6adc91 -->
<g id="edge10" class="edge">
<title>eb1bba56&#45;55b1&#45;4a71&#45;8b31&#45;0381812f588a&#45;&gt;20b57b46&#45;d59d&#45;4b04&#45;a4ed&#45;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

View File

@ -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

View File

@ -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))

View File

@ -0,0 +1,45 @@
from EXP.exp_tools import collect_action_nodes,get_start,BTTest,goal_transfer_str,collect_cond_nodes
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()
# 计算state总数
num = collect_cond_nodes()
print("states num: ",num)
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)

View File

@ -0,0 +1,276 @@
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 collect_cond_nodes():
action_list = []
behavior_dict = load_behavior_tree_lib()
num=0
for cls in behavior_dict["cond"].values():
if cls.can_be_expanded:
print(f"可扩展条件:{cls.__name__}, 存在{len(cls.valid_args)}个有效论域组合")
num+=len(cls.valid_args)
return num
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))

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 MiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 1.6 MiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 2.5 MiB

View File

@ -0,0 +1,2 @@

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -0,0 +1,3 @@
from EXP.behavior_lib._base.Sequence import Sequence
from EXP.behavior_lib._base.Selector import Selector

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

Some files were not shown because too many files have changed in this diff Show More