From a5978ff37a5e2141588745ac03aebba897d0ada6 Mon Sep 17 00:00:00 2001 From: Caiyishuai <39987654+Caiyishuai@users.noreply.github.com> Date: Tue, 12 Dec 2023 20:13:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=A1=8C=E4=B8=BA=E6=A0=91?= =?UTF-8?q?=E5=AF=B9=E6=AF=94=E5=92=8C=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robowaiter/behavior_lib/_base/Behavior.py | 13 +- robowaiter/behavior_lib/act/FreeHands.py | 3 +- .../obtea/BTExpansionAlgorithm.py | 297 ++++++++++++++++++ .../obtea/OptimalBTExpansionAlgorithm.py | 33 +- .../behavior_tree/obtea/opt_bt_exp_main.py | 13 +- robowaiter/llm_client/data/fix_questions.txt | 13 +- robowaiter/robot/robot.py | 3 +- robowaiter/scene/outputs/expanded_bt.dot | 37 +++ robowaiter/scene/outputs/expanded_bt.png | Bin 0 -> 85562 bytes robowaiter/scene/outputs/expanded_bt.svg | 199 ++++++++++++ robowaiter/scene/scene.py | 14 +- tasks_no_ui/BtTest/Open_tasks.py | 48 +++ 12 files changed, 643 insertions(+), 30 deletions(-) create mode 100644 robowaiter/behavior_tree/obtea/BTExpansionAlgorithm.py create mode 100644 robowaiter/scene/outputs/expanded_bt.dot create mode 100644 robowaiter/scene/outputs/expanded_bt.png create mode 100644 robowaiter/scene/outputs/expanded_bt.svg create mode 100644 tasks_no_ui/BtTest/Open_tasks.py diff --git a/robowaiter/behavior_lib/_base/Behavior.py b/robowaiter/behavior_lib/_base/Behavior.py index 5bfcff3..1feed88 100644 --- a/robowaiter/behavior_lib/_base/Behavior.py +++ b/robowaiter/behavior_lib/_base/Behavior.py @@ -15,24 +15,17 @@ class Bahavior(ptree.behaviour.Behaviour): 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'} - all_object = { 'Coffee', 'Water', 'Dessert', 'Softdrink', 'BottledDrink', 'Yogurt', 'ADMilk', 'MilkDrink', 'Milk','VacuumCup', 'Chips', 'NFCJuice', 'Bernachon', 'ADMilk', 'SpringWater'} - - # BrightTable5 = Table4 tables_for_guiding = {"QuietTable1","QuietTable2", "BrightTable1","BrightTable2","BrightTable3","BrightTable4","BrightTable5","BrightTable6" 'CoffeeTable','WaterTable','Table1', 'Table2', 'Table3'} - # all_place = {'Bar', 'WaterTable', 'CoffeeTable'} - # all_object = {'Coffee', 'Water', 'Dessert', 'Softdrink', 'Yogurt'} - # all_object = {'Coffee', 'Water'} - # all_object = set() - # all_place=set() + # tables_for_placement = {'Bar', 'WaterTable', 'CoffeeTable'} + # all_object = {'Coffee', 'Water', 'Dessert', 'Softdrink', 'Yogurt'} + num_of_obj_on_place={ 'Bar': 0, # (247.0, 520.0, 100.0) diff --git a/robowaiter/behavior_lib/act/FreeHands.py b/robowaiter/behavior_lib/act/FreeHands.py index c391bc3..f3e6ca7 100644 --- a/robowaiter/behavior_lib/act/FreeHands.py +++ b/robowaiter/behavior_lib/act/FreeHands.py @@ -15,7 +15,8 @@ class FreeHands(Act): @classmethod def get_info(cls): info = {} - info["pre"]= set() + # info["pre"]= set() + info["pre"] ={f'Holding(Nothing)'} info['add'] = {f'Holding(Nothing)'} info['del_set'] = {f'Holding({obj})' for obj in cls.all_object} info['cost'] = 0 diff --git a/robowaiter/behavior_tree/obtea/BTExpansionAlgorithm.py b/robowaiter/behavior_tree/obtea/BTExpansionAlgorithm.py new file mode 100644 index 0000000..e340eda --- /dev/null +++ b/robowaiter/behavior_tree/obtea/BTExpansionAlgorithm.py @@ -0,0 +1,297 @@ +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(self, start, goal, actions): + # 初始行为树只包含目标条件 + self.bt = ControlBT(type='cond') + g_node = Leaf(type='cond', content=goal,mincost=0) + 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, 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 = self.bt.tick(start) + canrun = False + if val == 'success' or val == 'running': + canrun = True + 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 diff --git a/robowaiter/behavior_tree/obtea/OptimalBTExpansionAlgorithm.py b/robowaiter/behavior_tree/obtea/OptimalBTExpansionAlgorithm.py index f23a6d6..b883fcd 100644 --- a/robowaiter/behavior_tree/obtea/OptimalBTExpansionAlgorithm.py +++ b/robowaiter/behavior_tree/obtea/OptimalBTExpansionAlgorithm.py @@ -20,6 +20,24 @@ class Action: 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): @@ -68,9 +86,9 @@ class OptBTExpAlgorithm: self.conditions_index = [] #运行规划算法,从初始状态、目标状态和可用行动,计算行为树self.bt - def run_algorithm(self,goal,actions,scene): - - self.scene = scene + # def run_algorithm(self,goal,actions,scene): + def run_algorithm(self, start, goal, actions): + # self.scene = scene if self.verbose: print("\n算法开始!") @@ -113,7 +131,6 @@ class OptBTExpAlgorithm: min_cost = cond_anc_pair.cond_leaf.mincost pair_node = copy.deepcopy(cond_anc_pair) index = i - break if self.verbose: print("选择扩展条件结点:",pair_node.cond_leaf.content) @@ -141,7 +158,8 @@ class OptBTExpAlgorithm: 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 <= self.scene.state["condition_set"]: + if c <= start: return True else: subtree.add_child([copy.deepcopy(pair_node.act_leaf)]) @@ -158,6 +176,11 @@ class OptBTExpAlgorithm: current_mincost = pair_node.cond_leaf.mincost # 当前的最短路径是多少 for i in range(0, len(actions)): + + + if actions[i].name == 'FreeHands()': + kk=1 + if not c & ((actions[i].pre | actions[i].add) - actions[i].del_set) <= set(): if (c - actions[i].del_set) == c: if self.verbose: diff --git a/robowaiter/behavior_tree/obtea/opt_bt_exp_main.py b/robowaiter/behavior_tree/obtea/opt_bt_exp_main.py index 9a7829f..112d144 100644 --- a/robowaiter/behavior_tree/obtea/opt_bt_exp_main.py +++ b/robowaiter/behavior_tree/obtea/opt_bt_exp_main.py @@ -1,5 +1,6 @@ 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 * @@ -23,6 +24,8 @@ class BTOptExpInterface: self.has_processed = False self.scene = scene + self.bt_algo_opt = self.scene.bt_algo_opt + def process(self, goal): """ @@ -31,9 +34,15 @@ class BTOptExpInterface: :return: A PTML string representing the outcome of the behavior tree. """ self.goal = goal - self.algo = OptBTExpAlgorithm(verbose=False) + if self.bt_algo_opt: + self.algo = OptBTExpAlgorithm(verbose=False) + else: + self.algo = BTalgorithm(verbose=False) + self.algo.clear() - self.algo.run_algorithm(self.goal, self.actions,self.scene) # 调用算法得到行为树保存至 algo.bt + 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 diff --git a/robowaiter/llm_client/data/fix_questions.txt b/robowaiter/llm_client/data/fix_questions.txt index 701f909..077a7b1 100644 --- a/robowaiter/llm_client/data/fix_questions.txt +++ b/robowaiter/llm_client/data/fix_questions.txt @@ -222,12 +222,6 @@ get_object_info 好的,我明白了,那么我们推荐您到大厅的桌子,那里的空间比较宽敞,环境也比较明亮,适合带着孩子一起用餐。 -冰红茶 -好的 -create_sub_task -{"goal":"On(Yogurt,WaterTable)"} - - 水杯 好的 create_sub_task @@ -258,4 +252,9 @@ create_sub_task 点心 好的 create_sub_task -{"goal":"On(Dessert,Bar)"} \ No newline at end of file +{"goal":"On(Dessert,Bar)"} + +打开空调并降低空调温度 +好的,没问题 +create_sub_task +{"goal":"Is(ACTemperature,Down)"} \ No newline at end of file diff --git a/robowaiter/robot/robot.py b/robowaiter/robot/robot.py index f9ed11d..7d85300 100644 --- a/robowaiter/robot/robot.py +++ b/robowaiter/robot/robot.py @@ -19,7 +19,7 @@ root_path = get_root_path() ptml_path = os.path.join(root_path, 'robowaiter/robot/Default.ptml') behavior_lib_path = os.path.join(root_path, 'robowaiter/behavior_lib') - +from robowaiter.utils.bt.draw import render_dot_tree class Robot(object): scene = None @@ -79,6 +79,7 @@ class Robot(object): file.write(ptml_string) sub_task_bt = load_bt_from_ptml(self.scene, file_path,self.behavior_lib_path) + render_dot_tree(sub_task_bt.root, target_directory=self.scene.output_path, name="expanded_bt", png_only=False) # 加入删除子树的节点 seq = Sequence(name="Sequence", memory=False) diff --git a/robowaiter/scene/outputs/expanded_bt.dot b/robowaiter/scene/outputs/expanded_bt.dot new file mode 100644 index 0000000..dc21bbf --- /dev/null +++ b/robowaiter/scene/outputs/expanded_bt.dot @@ -0,0 +1,37 @@ +digraph pastafarianism { +ordering=out; +graph [fontname="times-roman"]; +node [fontname="times-roman"]; +edge [fontname="times-roman"]; +"87355232-8ad6-484e-b363-38536e737846" [fillcolor=cyan, fontcolor=black, fontsize=20, height=0.01, label=Selector, shape=diamond, style=filled, width=0.01]; +"3f017683-7aa3-40d3-b2be-cc32784313a1" [fillcolor=yellow, fontcolor=black, fontsize=20, label="Is(ACTemperature,Down)", shape=ellipse, style=filled]; +"87355232-8ad6-484e-b363-38536e737846" -> "3f017683-7aa3-40d3-b2be-cc32784313a1"; +"b900e9cb-c0a8-4e8d-8a9b-d871012abefb" [fillcolor=orange, fontcolor=black, fontsize=20, height=0.01, label=Sequence, shape=octagon, style=filled, width=0.01]; +"87355232-8ad6-484e-b363-38536e737846" -> "b900e9cb-c0a8-4e8d-8a9b-d871012abefb"; +"10ef3ff4-7acb-4991-9e63-6e489c3ef22d" [fillcolor=yellow, fontcolor=black, fontsize=20, label="Holding(Nothing)", shape=ellipse, style=filled]; +"b900e9cb-c0a8-4e8d-8a9b-d871012abefb" -> "10ef3ff4-7acb-4991-9e63-6e489c3ef22d"; +"a3869371-404d-4085-932b-232e188fb133" [fillcolor=yellow, fontcolor=black, fontsize=20, label="Is(AC,On)", shape=ellipse, style=filled]; +"b900e9cb-c0a8-4e8d-8a9b-d871012abefb" -> "a3869371-404d-4085-932b-232e188fb133"; +"3a5cbe8f-7672-4a34-91d1-87502aed457c" [fillcolor=lawngreen, fontcolor=black, fontsize=20, label="Turn(ACTemperature,Down)", shape=box, style=filled]; +"b900e9cb-c0a8-4e8d-8a9b-d871012abefb" -> "3a5cbe8f-7672-4a34-91d1-87502aed457c"; +"b64db1a4-d79f-47b4-99db-f184b38d1361" [fillcolor=orange, fontcolor=black, fontsize=20, height=0.01, label=Sequence, shape=octagon, style=filled, width=0.01]; +"87355232-8ad6-484e-b363-38536e737846" -> "b64db1a4-d79f-47b4-99db-f184b38d1361"; +"c6eca6dd-9fca-4bd3-b054-9b43fe02613a" [fillcolor=yellow, fontcolor=black, fontsize=20, label="Is(AC,On)", shape=ellipse, style=filled]; +"b64db1a4-d79f-47b4-99db-f184b38d1361" -> "c6eca6dd-9fca-4bd3-b054-9b43fe02613a"; +"df04f6f4-d471-4519-ab9e-5d5bd8dfbd4c" [fillcolor=lawngreen, fontcolor=black, fontsize=20, label="FreeHands()", shape=box, style=filled]; +"b64db1a4-d79f-47b4-99db-f184b38d1361" -> "df04f6f4-d471-4519-ab9e-5d5bd8dfbd4c"; +"8108bcba-dbeb-4784-8f1f-eb9ede4ffb0e" [fillcolor=orange, fontcolor=black, fontsize=20, height=0.01, label=Sequence, shape=octagon, style=filled, width=0.01]; +"87355232-8ad6-484e-b363-38536e737846" -> "8108bcba-dbeb-4784-8f1f-eb9ede4ffb0e"; +"82a23405-c3c6-47dc-bf7b-0636e3efe52c" [fillcolor=yellow, fontcolor=black, fontsize=20, label="Holding(Nothing)", shape=ellipse, style=filled]; +"8108bcba-dbeb-4784-8f1f-eb9ede4ffb0e" -> "82a23405-c3c6-47dc-bf7b-0636e3efe52c"; +"010d42ee-18b3-4a0e-9be1-eab67afaca60" [fillcolor=yellow, fontcolor=black, fontsize=20, label="Is(AC,Off)", shape=ellipse, style=filled]; +"8108bcba-dbeb-4784-8f1f-eb9ede4ffb0e" -> "010d42ee-18b3-4a0e-9be1-eab67afaca60"; +"90cdf2ff-98b0-4454-803b-feee5f5475bf" [fillcolor=lawngreen, fontcolor=black, fontsize=20, label="Turn(AC,On)", shape=box, style=filled]; +"8108bcba-dbeb-4784-8f1f-eb9ede4ffb0e" -> "90cdf2ff-98b0-4454-803b-feee5f5475bf"; +"e65ce322-edaa-4677-ab68-4795e57648da" [fillcolor=orange, fontcolor=black, fontsize=20, height=0.01, label=Sequence, shape=octagon, style=filled, width=0.01]; +"87355232-8ad6-484e-b363-38536e737846" -> "e65ce322-edaa-4677-ab68-4795e57648da"; +"7d0c1403-c5d9-4bcd-a0db-f3e527a3be93" [fillcolor=yellow, fontcolor=black, fontsize=20, label="Is(AC,Off)", shape=ellipse, style=filled]; +"e65ce322-edaa-4677-ab68-4795e57648da" -> "7d0c1403-c5d9-4bcd-a0db-f3e527a3be93"; +"931d4ea6-c661-4ea8-9016-2d4e17d30b19" [fillcolor=lawngreen, fontcolor=black, fontsize=20, label="FreeHands()", shape=box, style=filled]; +"e65ce322-edaa-4677-ab68-4795e57648da" -> "931d4ea6-c661-4ea8-9016-2d4e17d30b19"; +} diff --git a/robowaiter/scene/outputs/expanded_bt.png b/robowaiter/scene/outputs/expanded_bt.png new file mode 100644 index 0000000000000000000000000000000000000000..256e26c26d13db4e548704cd926c02ac61c3c0a0 GIT binary patch literal 85562 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 Jq1d!D`ER3f_Y434 literal 0 HcmV?d00001 diff --git a/robowaiter/scene/outputs/expanded_bt.svg b/robowaiter/scene/outputs/expanded_bt.svg new file mode 100644 index 0000000..8242020 --- /dev/null +++ b/robowaiter/scene/outputs/expanded_bt.svg @@ -0,0 +1,199 @@ + + + + + + +pastafarianism + + + +87355232-8ad6-484e-b363-38536e737846 + +Selector + + + +3f017683-7aa3-40d3-b2be-cc32784313a1 + +Is(ACTemperature,Down) + + + +87355232-8ad6-484e-b363-38536e737846->3f017683-7aa3-40d3-b2be-cc32784313a1 + + + + + +b900e9cb-c0a8-4e8d-8a9b-d871012abefb + +Sequence + + + +87355232-8ad6-484e-b363-38536e737846->b900e9cb-c0a8-4e8d-8a9b-d871012abefb + + + + + +b64db1a4-d79f-47b4-99db-f184b38d1361 + +Sequence + + + +87355232-8ad6-484e-b363-38536e737846->b64db1a4-d79f-47b4-99db-f184b38d1361 + + + + + +8108bcba-dbeb-4784-8f1f-eb9ede4ffb0e + +Sequence + + + +87355232-8ad6-484e-b363-38536e737846->8108bcba-dbeb-4784-8f1f-eb9ede4ffb0e + + + + + +e65ce322-edaa-4677-ab68-4795e57648da + +Sequence + + + +87355232-8ad6-484e-b363-38536e737846->e65ce322-edaa-4677-ab68-4795e57648da + + + + + +10ef3ff4-7acb-4991-9e63-6e489c3ef22d + +Holding(Nothing) + + + +b900e9cb-c0a8-4e8d-8a9b-d871012abefb->10ef3ff4-7acb-4991-9e63-6e489c3ef22d + + + + + +a3869371-404d-4085-932b-232e188fb133 + +Is(AC,On) + + + +b900e9cb-c0a8-4e8d-8a9b-d871012abefb->a3869371-404d-4085-932b-232e188fb133 + + + + + +3a5cbe8f-7672-4a34-91d1-87502aed457c + +Turn(ACTemperature,Down) + + + +b900e9cb-c0a8-4e8d-8a9b-d871012abefb->3a5cbe8f-7672-4a34-91d1-87502aed457c + + + + + +c6eca6dd-9fca-4bd3-b054-9b43fe02613a + +Is(AC,On) + + + +b64db1a4-d79f-47b4-99db-f184b38d1361->c6eca6dd-9fca-4bd3-b054-9b43fe02613a + + + + + +df04f6f4-d471-4519-ab9e-5d5bd8dfbd4c + +FreeHands() + + + +b64db1a4-d79f-47b4-99db-f184b38d1361->df04f6f4-d471-4519-ab9e-5d5bd8dfbd4c + + + + + +82a23405-c3c6-47dc-bf7b-0636e3efe52c + +Holding(Nothing) + + + +8108bcba-dbeb-4784-8f1f-eb9ede4ffb0e->82a23405-c3c6-47dc-bf7b-0636e3efe52c + + + + + +010d42ee-18b3-4a0e-9be1-eab67afaca60 + +Is(AC,Off) + + + +8108bcba-dbeb-4784-8f1f-eb9ede4ffb0e->010d42ee-18b3-4a0e-9be1-eab67afaca60 + + + + + +90cdf2ff-98b0-4454-803b-feee5f5475bf + +Turn(AC,On) + + + +8108bcba-dbeb-4784-8f1f-eb9ede4ffb0e->90cdf2ff-98b0-4454-803b-feee5f5475bf + + + + + +7d0c1403-c5d9-4bcd-a0db-f3e527a3be93 + +Is(AC,Off) + + + +e65ce322-edaa-4677-ab68-4795e57648da->7d0c1403-c5d9-4bcd-a0db-f3e527a3be93 + + + + + +931d4ea6-c661-4ea8-9016-2d4e17d30b19 + +FreeHands() + + + +e65ce322-edaa-4677-ab68-4795e57648da->931d4ea6-c661-4ea8-9016-2d4e17d30b19 + + + + + diff --git a/robowaiter/scene/scene.py b/robowaiter/scene/scene.py index f3af272..da6c5b2 100644 --- a/robowaiter/scene/scene.py +++ b/robowaiter/scene/scene.py @@ -215,12 +215,14 @@ class Scene: "sub_goal_list": [], # 子目标列表 "status": None, # 仿真器中的观测信息,见下方详细解释 "condition_set": {'At(Robot,Bar)', 'Is(AC,Off)', - 'Holding(Nothing)', 'Exist(Yogurt)', 'Exist(BottledDrink)', - 'Exist(Softdrink)', + 'Exist(Yogurt)', 'Exist(BottledDrink)','Exist(Softdrink)', # 'On(Yogurt,Bar)','On(BottledDrink,Bar)', # 'Exist(Softdrink)', 'On(Softdrink,Table1)', 'Exist(Chips)', 'Exist(NFCJuice)', 'Exist(Bernachon)', 'Exist(ADMilk)', 'Exist(SpringWater)', - + + # 'Holding(Nothing)', + 'Holding(Coffee)', + 'Exist(VacuumCup)', 'On(VacuumCup,Table2)', 'Is(HallLight,Off)', 'Is(TubeLight,On)', 'Is(Curtain,On)', 'Is(Table1,Dirty)', 'Is(Floor,Dirty)', 'Is(Chairs,Dirty)'}, @@ -264,7 +266,7 @@ class Scene: # 是否展示UI self.show_ui = False # 图像分割 - self.take_picture = True + self.take_picture = False self.map_ratio = 5 self.map_map = np.zeros((math.ceil(950 / self.map_ratio), math.ceil(1850 / self.map_ratio))) self.db = DBSCAN(eps=self.map_ratio, min_samples=int(self.map_ratio / 2)) @@ -272,6 +274,8 @@ class Scene: self.is_nav_walk = False + self.bt_algo_opt = True + file_name = os.path.join(root_path,'robowaiter/algos/navigator/map_5.pkl') if os.path.exists(file_name): with open(file_name, 'rb') as file: @@ -451,6 +455,7 @@ class Scene: print(f'event: {t}, {func.__name__}') self.signal_event_list.pop(0) self.last_event_time = self.time + print("==== *args ======:",*args) func(*args) def deal_event(self): @@ -474,6 +479,7 @@ class Scene: def set_goal(self, goal): g = eval("{'" + goal + "'}") + print("====== g =======:",g) def set_sub_task(): self.state['chat_list'].append(("Goal", g)) diff --git a/tasks_no_ui/BtTest/Open_tasks.py b/tasks_no_ui/BtTest/Open_tasks.py new file mode 100644 index 0000000..4b5bdb2 --- /dev/null +++ b/tasks_no_ui/BtTest/Open_tasks.py @@ -0,0 +1,48 @@ +""" +人提出请求,机器人完成任务 +1. 做咖啡(固定动画):接收到做咖啡指令、走到咖啡机、拿杯子、操作咖啡机、取杯子、送到客人桌子上 +2. 倒水 +3. 夹点心 + +具体描述:设计一套点单规则(如菜单包含咖啡、水、点心等),按照规则拟造随机的订单。在收到订单后,通过大模型让机器人输出合理的备餐计划,并尝试在模拟环境中按照这个规划实现任务。 + +""" +import time + +# todo: 接收点单信息,大模型生成任务规划 + +from robowaiter.scene.scene import Scene + +class SceneOT(Scene): + + def __init__(self, robot): + super().__init__(robot) + # 在这里加入场景中发生的事件 + # self.event_list = [ + # # (3, self.set_goal("On(VacuumCup,Bar)")) + # (3, self.set_goal("On(Yogurt,Bar)")) + # ] + self.signal_event_list =[ + # (3, self.set_goal,("On(Yogurt,Bar)",)), + # (3, self.customer_say, ("System", "把盒装冰红茶放到水桌")), + (3, self.customer_say, ("System", "打开空调并降低空调温度")), + ] + + def _reset(self): + scene = self.add_walkers([[0, 0], [250, 1200], [-55, 750], [70, -200]]) + pass + + def _run(self): + pass + + +if __name__ == '__main__': + import os + from robowaiter.robot.robot import Robot + + robot = Robot() + + # create task + task = SceneOT(robot) + task.reset() + task.run()