From 90ce854cdc5662d21993da295b03b7777ff7157d Mon Sep 17 00:00:00 2001 From: Netceor <45135347+Netceor@users.noreply.github.com> Date: Sun, 19 Nov 2023 14:21:58 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robowaiter/behavior_lib/act/DealChat.py | 79 +++++++++++++++++++------ robowaiter/llm_client/find_obj_utils.py | 5 +- robowaiter/scene/scene.py | 19 ++++++ 3 files changed, 82 insertions(+), 21 deletions(-) diff --git a/robowaiter/behavior_lib/act/DealChat.py b/robowaiter/behavior_lib/act/DealChat.py index e66ed1c..1efed4c 100644 --- a/robowaiter/behavior_lib/act/DealChat.py +++ b/robowaiter/behavior_lib/act/DealChat.py @@ -1,21 +1,24 @@ import py_trees as ptree from robowaiter.behavior_lib._base.Act import Act -from robowaiter.llm_client.multi_rounds import ask_llm,new_history +from robowaiter.llm_client.multi_rounds import ask_llm, new_history +import random + +import spacy + +nlp = spacy.load('en_core_web_lg') + class DealChat(Act): def __init__(self): super().__init__() self.chat_history = "" self.function_success = False - self.func_map = { - "create_sub_task": self.create_sub_task, - "get_object_info": self.get_object_info - } + self.func_map = {"create_sub_task": self.create_sub_task, "get_object_info": self.get_object_info, "find_location": self.find_location} def _update(self) -> ptree.common.Status: # if self.scene.status? - name,sentence = self.scene.state['chat_list'].pop(0) + name, sentence = self.scene.state['chat_list'].pop(0) if name == "Goal": self.create_sub_task(goal=sentence) @@ -26,26 +29,22 @@ class DealChat(Act): history = self.scene.state["chat_history"][name] self.scene.state["attention"]["customer"] = name - self.scene.state["serve_state"] = { - "last_chat_time": self.scene.time, - } + self.scene.state["serve_state"] = {"last_chat_time": self.scene.time, } - function_call, response = ask_llm(sentence,history,func_map=self.func_map) + function_call, response = ask_llm(sentence, history, func_map=self.func_map) - - self.scene.chat_bubble(response) # 机器人输出对话 + self.scene.chat_bubble(response) # 机器人输出对话 return ptree.common.Status.RUNNING - - def create_sub_task(self,**args): + def create_sub_task(self, **args): try: goal = args['goal'] w = goal.split(")") goal_set = set() goal_set.add(w[0] + ")") - if len(w)>1: + if len(w) > 1: for x in w[1:]: if x != "": goal_set.add(x[1:] + ")") @@ -55,8 +54,7 @@ class DealChat(Act): self.scene.robot.expand_sub_task_tree(goal_set) - - def get_object_info(self,**args): + def get_object_info(self, **args): try: obj = args['obj'] @@ -66,7 +64,52 @@ class DealChat(Act): print("参数解析错误") near_object = "None" + + # 场景中现有物品 + cur_things = set() + for item in self.status.objects: + cur_things.add(item.name) + # obj与现有物品进行相似度匹配 + query_token = nlp(obj) + for w in self.all_loc_en: + word_token = nlp(w) + similarity = query_token.similarity(word_token) + if similarity > max_similarity: + max_similarity = similarity + similar_word = w + print("max_similarity:",max_similarity,"similar_word:",similar_word) + + if similar_word: # 存在同义词说明场景中存在该物品 + near_object = random.choices(list(cur_things), k=5) # 返回场景中的5个物品 + if obj == "洗手间": near_object = "大门" - return near_object \ No newline at end of file + return near_object + + def find_location(self, **args): + try: + location = args['obj'] + self.function_success = True + except: + obj = None + print("参数解析错误") + + near_location = None + # 用户咨询的地点 + query_token = nlp(location) + max_similarity = 0 + similar_word = None + # 到自己维护的地点列表中找同义词 + for w in self.all_loc_en: + word_token = nlp(w) + similarity = query_token.similarity(word_token) + if similarity > max_similarity: + max_similarity = similarity + similar_word = w + print("similarity:", max_similarity, "similar_word:", similar_word) + # 存在同义词说明客户咨询的地点有效 + if similar_word: + mp = list(self.loc_map_en[similar_word]) + near_location = random.choice(mp) + return near_location diff --git a/robowaiter/llm_client/find_obj_utils.py b/robowaiter/llm_client/find_obj_utils.py index 98f965d..fe134ac 100644 --- a/robowaiter/llm_client/find_obj_utils.py +++ b/robowaiter/llm_client/find_obj_utils.py @@ -30,9 +30,8 @@ all_obj = ['马克杯', '香蕉', '牙膏', '面包', '软饮料', '酸奶', 'AD all_loc = ['吧台', '餐桌', '沙发', '灶台', '大门', '灯开关', '空调开关', '橱柜', '卫生间', '窗户', '音响', '休闲区', '工作台', '服务台', '收银台', '墙角', '蛋糕柜', '充电处', '冰箱', '书架'] -all_loc_en = ['bar', 'Table', 'sofa', 'stove', 'Gate', 'light switch', 'airconditioner switch', 'cabinet', 'bathroom', 'window', - 'audio', 'lounge area', 'workstation', 'service counter', 'cashier counter', 'corner', - 'cake display', 'ChargingStations', 'refrigerator', 'bookshelf'] +all_loc_en = ['bar', 'Table', 'sofa', 'stove', 'Gate', 'light switch', 'airconditioner switch', 'cabinet', 'bathroom', 'window','audio', 'lounge area', + 'workstation', 'service counter', 'cashier counter', 'corner','cake display', 'ChargingStations', 'refrigerator', 'bookshelf'] loc_map_en = {'bar': {'工作台', '服务台', '收银台', '蛋糕柜'}, 'Table': {'大门', '休闲区', '墙角'}, diff --git a/robowaiter/scene/scene.py b/robowaiter/scene/scene.py index a36ded3..c0c1c39 100644 --- a/robowaiter/scene/scene.py +++ b/robowaiter/scene/scene.py @@ -124,6 +124,25 @@ class Scene: with open(self.filename, 'rb') as file: self.map_file = pickle.load(file) + # tool register + self.all_loc_en = ['bar', 'Table', 'sofa', 'stove', 'Gate', 'light switch', 'airconditioner switch', 'cabinet', 'bathroom', 'window', 'audio', + 'lounge area', 'workstation', 'service counter', 'cashier counter', 'corner', 'cake display', 'ChargingStations', + 'refrigerator', 'bookshelf'] + + self.loc_map_en = {'bar': {'工作台', '服务台', '收银台', '蛋糕柜'}, 'Table': {'大门', '休闲区', '墙角'}, + 'sofa': {'餐桌', '窗户', '音响', '休闲区', '墙角', '书架'}, + 'stove': {'吧台', '橱柜', '工作台', '服务台', '收银台', '蛋糕柜', '冰箱'}, + 'Gate': {'吧台', '灯开关', '空调开关', '卫生间', '墙角'}, 'light switch': {'大门', '空调开关', '卫生间', '墙角'}, + 'airconditioner switch': {'大门', '灯开关', '卫生间', '墙角'}, + 'cabinet': {'灶台', '吧台', '工作台', '服务台', '收银台', '蛋糕柜', '充电处', '冰箱'}, 'bathroom': {'大门', '墙角'}, + 'window': {'餐桌', '沙发', '休闲区'}, 'audio': {'餐桌', '沙发', '休闲区', '墙角', '书架'}, + 'lounge area': {'沙发', '餐桌', '墙角', '书架', '音响'}, 'workstation': {'吧台', '服务台', '收银台'}, + 'service counter': {'吧台', '工作台', '收银台'}, 'cashier counter': {'吧台', '工作台', '服务台'}, + 'corner': {'卫生间', '沙发', '灯开关', '空调开关', '音响', '休闲区', '书架'}, + 'cake display': {'吧台', '橱柜', '服务台', '收银台', '冰箱'}, + 'ChargingStations': {'吧台', '餐桌', '沙发', '休闲区', '工作台', '服务台', '收银台', '墙角', '书架'}, + 'refrigerator': {'吧台', '服务台', '蛋糕柜'}, 'bookshelf': {'餐桌', '沙发', '窗户', '休闲区', '墙角'}} + def reset(self): # 基类reset,默认执行仿真器初始化操作 From 3e48f5a39c67eb14da62c95a219fd2d781bdb9de Mon Sep 17 00:00:00 2001 From: Netceor <45135347+Netceor@users.noreply.github.com> Date: Sun, 19 Nov 2023 14:24:36 +0800 Subject: [PATCH 2/5] Update DealChat.py --- robowaiter/behavior_lib/act/DealChat.py | 123 ++++++++++++------------ 1 file changed, 61 insertions(+), 62 deletions(-) diff --git a/robowaiter/behavior_lib/act/DealChat.py b/robowaiter/behavior_lib/act/DealChat.py index f39cb75..02ff157 100644 --- a/robowaiter/behavior_lib/act/DealChat.py +++ b/robowaiter/behavior_lib/act/DealChat.py @@ -4,9 +4,8 @@ from robowaiter.behavior_lib._base.Act import Act from robowaiter.llm_client.multi_rounds import ask_llm, new_history import random -import spacy - -nlp = spacy.load('en_core_web_lg') +# import spacy +# nlp = spacy.load('en_core_web_lg') class DealChat(Act): @@ -63,65 +62,65 @@ class DealChat(Act): self.scene.robot.expand_sub_task_tree(goal_set) - def get_object_info(self,**args): - try: - obj = args['obj'] - - self.function_success = True - except: - obj = None - print("参数解析错误") - - near_object = "None" - - # 场景中现有物品 - cur_things = set() - for item in self.status.objects: - cur_things.add(item.name) - # obj与现有物品进行相似度匹配 - query_token = nlp(obj) - for w in self.all_loc_en: - word_token = nlp(w) - similarity = query_token.similarity(word_token) - if similarity > max_similarity: - max_similarity = similarity - similar_word = w - print("max_similarity:",max_similarity,"similar_word:",similar_word) - - if similar_word: # 存在同义词说明场景中存在该物品 - near_object = random.choices(list(cur_things), k=5) # 返回场景中的5个物品 - - if obj == "洗手间": - near_object = "大门" - - return near_object - - def find_location(self, **args): - try: - location = args['obj'] - self.function_success = True - except: - obj = None - print("参数解析错误") - - near_location = None - # 用户咨询的地点 - query_token = nlp(location) - max_similarity = 0 - similar_word = None - # 到自己维护的地点列表中找同义词 - for w in self.all_loc_en: - word_token = nlp(w) - similarity = query_token.similarity(word_token) - if similarity > max_similarity: - max_similarity = similarity - similar_word = w - print("similarity:", max_similarity, "similar_word:", similar_word) - # 存在同义词说明客户咨询的地点有效 - if similar_word: - mp = list(self.loc_map_en[similar_word]) - near_location = random.choice(mp) - return near_location + # def get_object_info(self,**args): + # try: + # obj = args['obj'] + # + # self.function_success = True + # except: + # obj = None + # print("参数解析错误") + # + # near_object = "None" + # + # # 场景中现有物品 + # cur_things = set() + # for item in self.status.objects: + # cur_things.add(item.name) + # # obj与现有物品进行相似度匹配 + # query_token = nlp(obj) + # for w in self.all_loc_en: + # word_token = nlp(w) + # similarity = query_token.similarity(word_token) + # if similarity > max_similarity: + # max_similarity = similarity + # similar_word = w + # print("max_similarity:",max_similarity,"similar_word:",similar_word) + # + # if similar_word: # 存在同义词说明场景中存在该物品 + # near_object = random.choices(list(cur_things), k=5) # 返回场景中的5个物品 + # + # if obj == "洗手间": + # near_object = "大门" + # + # return near_object + # + # def find_location(self, **args): + # try: + # location = args['obj'] + # self.function_success = True + # except: + # obj = None + # print("参数解析错误") + # + # near_location = None + # # 用户咨询的地点 + # query_token = nlp(location) + # max_similarity = 0 + # similar_word = None + # # 到自己维护的地点列表中找同义词 + # for w in self.all_loc_en: + # word_token = nlp(w) + # similarity = query_token.similarity(word_token) + # if similarity > max_similarity: + # max_similarity = similarity + # similar_word = w + # print("similarity:", max_similarity, "similar_word:", similar_word) + # # 存在同义词说明客户咨询的地点有效 + # if similar_word: + # mp = list(self.loc_map_en[similar_word]) + # near_location = random.choice(mp) + # return near_location def stop_serve(self,**args): From de79f4c448f6ee7e8edcc77f6243941bbe83827a Mon Sep 17 00:00:00 2001 From: ChenXL97 <908926798@qq.com> Date: Sun, 19 Nov 2023 14:44:22 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=85=B7=E8=BA=AB?= =?UTF-8?q?=E5=9C=BA=E6=99=AF=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robowaiter/behavior_lib/act/DealChat.py | 21 ++-- robowaiter/behavior_lib/act/DealChatNLP.py | 135 +++++++++++++++++++++ robowaiter/llm_client/multi_rounds.py | 2 +- robowaiter/scene/tasks/GQA/GQA.py | 2 +- 4 files changed, 150 insertions(+), 10 deletions(-) create mode 100644 robowaiter/behavior_lib/act/DealChatNLP.py diff --git a/robowaiter/behavior_lib/act/DealChat.py b/robowaiter/behavior_lib/act/DealChat.py index 02ff157..4907517 100644 --- a/robowaiter/behavior_lib/act/DealChat.py +++ b/robowaiter/behavior_lib/act/DealChat.py @@ -4,6 +4,7 @@ from robowaiter.behavior_lib._base.Act import Act from robowaiter.llm_client.multi_rounds import ask_llm, new_history import random + # import spacy # nlp = spacy.load('en_core_web_lg') @@ -15,9 +16,9 @@ class DealChat(Act): self.function_success = False self.func_map = { "create_sub_task": self.create_sub_task, - "get_object_info": self.get_object_info, "stop_serve": self.stop_serve, - "find_location": self.find_location + # "get_object_info": self.get_object_info, + # "find_location": self.find_location } def _update(self) -> ptree.common.Status: @@ -73,25 +74,29 @@ class DealChat(Act): # # near_object = "None" # + # max_similarity = 0.02 + # similar_word = None + # # # 场景中现有物品 # cur_things = set() - # for item in self.status.objects: + # for item in self.scene.status.objects: # cur_things.add(item.name) # # obj与现有物品进行相似度匹配 # query_token = nlp(obj) - # for w in self.all_loc_en: + # for w in cur_things: # word_token = nlp(w) # similarity = query_token.similarity(word_token) # if similarity > max_similarity: # max_similarity = similarity # similar_word = w - # print("max_similarity:",max_similarity,"similar_word:",similar_word) + # if similar_word: + # print("max_similarity:",max_similarity,"similar_word:",similar_word) # # if similar_word: # 存在同义词说明场景中存在该物品 # near_object = random.choices(list(cur_things), k=5) # 返回场景中的5个物品 # # if obj == "洗手间": - # near_object = "大门" + # near_object = "Door" # # return near_object # @@ -109,7 +114,7 @@ class DealChat(Act): # max_similarity = 0 # similar_word = None # # 到自己维护的地点列表中找同义词 - # for w in self.all_loc_en: + # for w in self.scene.all_loc_en: # word_token = nlp(w) # similarity = query_token.similarity(word_token) # if similarity > max_similarity: @@ -118,7 +123,7 @@ class DealChat(Act): # print("similarity:", max_similarity, "similar_word:", similar_word) # # 存在同义词说明客户咨询的地点有效 # if similar_word: - # mp = list(self.loc_map_en[similar_word]) + # mp = list(self.scene.loc_map_en[similar_word]) # near_location = random.choice(mp) # return near_location diff --git a/robowaiter/behavior_lib/act/DealChatNLP.py b/robowaiter/behavior_lib/act/DealChatNLP.py new file mode 100644 index 0000000..e516f89 --- /dev/null +++ b/robowaiter/behavior_lib/act/DealChatNLP.py @@ -0,0 +1,135 @@ +import py_trees as ptree +from robowaiter.behavior_lib._base.Act import Act + +from robowaiter.llm_client.multi_rounds import ask_llm, new_history +import random + + +import spacy +nlp = spacy.load('en_core_web_lg') + + +class DealChat(Act): + def __init__(self): + super().__init__() + self.chat_history = "" + self.function_success = False + self.func_map = { + "create_sub_task": self.create_sub_task, + "stop_serve": self.stop_serve, + "get_object_info": self.get_object_info, + "find_location": self.find_location + } + + def _update(self) -> ptree.common.Status: + # if self.scene.status? + name, sentence = self.scene.state['chat_list'].pop(0) + + if name == "Goal": + self.create_sub_task(goal=sentence) + return ptree.common.Status.RUNNING + + if name not in self.scene.state["chat_history"]: + self.scene.state["chat_history"][name] = new_history() + + history = self.scene.state["chat_history"][name] + self.scene.state["attention"]["customer"] = name + self.scene.state["serve_state"] = { + "last_chat_time": self.scene.time, + } + + function_call, response = ask_llm(sentence,history,func_map=self.func_map) + + + self.scene.chat_bubble(response) # 机器人输出对话 + + return ptree.common.Status.RUNNING + + + def create_sub_task(self, **args): + try: + goal = args['goal'] + + w = goal.split(")") + goal_set = set() + goal_set.add(w[0] + ")") + if len(w) > 1: + for x in w[1:]: + if x != "": + goal_set.add(x[1:] + ")") + self.function_success = True + except: + print("参数解析错误") + + self.scene.robot.expand_sub_task_tree(goal_set) + + def get_object_info(self,**args): + try: + obj = args['obj'] + + self.function_success = True + except: + obj = None + print("参数解析错误") + + near_object = "None" + + max_similarity = 0.02 + similar_word = None + + # 场景中现有物品 + cur_things = set() + for item in self.scene.status.objects: + cur_things.add(item.name) + # obj与现有物品进行相似度匹配 + query_token = nlp(obj) + for w in cur_things: + word_token = nlp(w) + similarity = query_token.similarity(word_token) + if similarity > max_similarity: + max_similarity = similarity + similar_word = w + if similar_word: + print("max_similarity:",max_similarity,"similar_word:",similar_word) + + if similar_word: # 存在同义词说明场景中存在该物品 + near_object = random.choices(list(cur_things), k=5) # 返回场景中的5个物品 + + if obj == "洗手间": + near_object = "Door" + + return near_object + + def find_location(self, **args): + try: + location = args['obj'] + self.function_success = True + except: + obj = None + print("参数解析错误") + + near_location = None + # 用户咨询的地点 + query_token = nlp(location) + max_similarity = 0 + similar_word = None + # 到自己维护的地点列表中找同义词 + for w in self.scene.all_loc_en: + word_token = nlp(w) + similarity = query_token.similarity(word_token) + if similarity > max_similarity: + max_similarity = similarity + similar_word = w + print("similarity:", max_similarity, "similar_word:", similar_word) + # 存在同义词说明客户咨询的地点有效 + if similar_word: + mp = list(self.scene.loc_map_en[similar_word]) + near_location = random.choice(mp) + return near_location + + def stop_serve(self,**args): + + + return "好的" + + diff --git a/robowaiter/llm_client/multi_rounds.py b/robowaiter/llm_client/multi_rounds.py index 81ca2d8..b0a539b 100644 --- a/robowaiter/llm_client/multi_rounds.py +++ b/robowaiter/llm_client/multi_rounds.py @@ -154,7 +154,7 @@ def ask_llm(question,history, func_map=None, retry=3): "你是机器人服务员,请把以下句子换一种表述方式对顾客说,但是意思不变,尽量简短:\n") else: reply = fix_questions_dict[question]["answer"] - result = single_round(f"你是机器人服务员,顾客想知道{question}, 你的具身场景查询返回的是{result},请把按照以下句子对顾客说,{reply}, 尽量简短。\n") + result = single_round(f"你是机器人服务员,顾客想知道{question}, 你的具身场景查询返回的是{result},把返回的英文名词翻译成中文,请把按照以下句子对顾客说,{reply}, 尽量简短。\n") message = {'role': 'assistant', 'content': result, 'name': None, 'function_call': None} diff --git a/robowaiter/scene/tasks/GQA/GQA.py b/robowaiter/scene/tasks/GQA/GQA.py index 54b9063..cdd6e01 100644 --- a/robowaiter/scene/tasks/GQA/GQA.py +++ b/robowaiter/scene/tasks/GQA/GQA.py @@ -16,7 +16,7 @@ class SceneGQA(Scene): super().__init__(robot) # 在这里加入场景中发生的事件, (事件发生的时间,事件函数) self.new_event_list = [ - (3, self.customer_say, ("System","请问洗手间在哪里?")) + (3, self.customer_say, ("System","哪里有蛋糕")) ] def _reset(self): From d44b0389b86aab8ee4f9b26e7ce8ad3156d53941 Mon Sep 17 00:00:00 2001 From: ChenXL97 <908926798@qq.com> Date: Sun, 19 Nov 2023 14:46:31 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E6=96=B9=E4=BE=BFNLP=E7=9A=84=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robowaiter/robot/DefaultNLP.ptml | 32 ++++++++++++++++++ robowaiter/scene/tasks/GQA/GQA_NLP.py | 47 +++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 robowaiter/robot/DefaultNLP.ptml create mode 100644 robowaiter/scene/tasks/GQA/GQA_NLP.py diff --git a/robowaiter/robot/DefaultNLP.ptml b/robowaiter/robot/DefaultNLP.ptml new file mode 100644 index 0000000..64870a4 --- /dev/null +++ b/robowaiter/robot/DefaultNLP.ptml @@ -0,0 +1,32 @@ +selector +{ + sequence + { + cond CustomerChatting() + act DealChatNLP() + } + sequence + { + cond HasSubTask() + sequence + { + act SubTaskPlaceHolder() + } + } + sequence + { + cond FocusingCustomer() + act ServeCustomer() + } + sequence + { + cond NewCustomerComing() + selector + { + cond At(Robot,Bar) + act MoveTo(Bar) + } + act GreetCustomer() + } + +} \ No newline at end of file diff --git a/robowaiter/scene/tasks/GQA/GQA_NLP.py b/robowaiter/scene/tasks/GQA/GQA_NLP.py new file mode 100644 index 0000000..9cb6b7e --- /dev/null +++ b/robowaiter/scene/tasks/GQA/GQA_NLP.py @@ -0,0 +1,47 @@ +""" +具身多轮对话 GQA +点餐(order)的对话,咖啡厅服务员可以为客人(NPC)完成点餐基本对话 +场景对话(GQA)结合场景:询问卫生间、附近娱乐场所(数据来源自主定义) +开始条件:顾客NPC发出点餐指令 +结束条件:顾客NPC发出指令,表示不再需要服务 +""" + +# todo: 使用大模型进行对话,获得指令信息,适时结束对话 +# order = {...} + +from robowaiter.scene.scene import Scene + +class SceneGQA(Scene): + def __init__(self, robot): + super().__init__(robot) + # 在这里加入场景中发生的事件, (事件发生的时间,事件函数) + self.new_event_list = [ + (3, self.customer_say, ("System","哪里有蛋糕")) + ] + + def _reset(self): + # self.clean_walker() + # self.add_walkers([[50, 500,90]]) + pass + + # self.walker_bubble("洗手间在哪里") + # self.control_walker([self.walker_control_generator(0, False, 100, 755, 1900, 180)]) + + + def _run(self): + pass + + +if __name__ == '__main__': + import os + from robowaiter.robot.robot import Robot + from robowaiter.utils.basic import get_root_path + root_path = get_root_path() + ptml_path = os.path.join(root_path, 'robowaiter/robot/DefaultNLP.ptml') + + robot = Robot(ptml_path=ptml_path) + + # create task + task = SceneGQA(robot) + task.reset() + task.run() From 576e312fecea3d445426b1af8337593e441e0bba Mon Sep 17 00:00:00 2001 From: ChenXL97 <908926798@qq.com> Date: Sun, 19 Nov 2023 16:35:37 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=94=BB=E8=A1=8C?= =?UTF-8?q?=E4=B8=BA=E6=A0=91=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- robowaiter/algos/navigator/__init__.py | 3 - robowaiter/algos/navigator/navigate.py | 2 +- robowaiter/behavior_lib/_base/Behavior.py | 7 +- robowaiter/behavior_lib/_base/Selector.py | 1 + robowaiter/behavior_lib/_base/Sequence.py | 1 + robowaiter/behavior_tree/ptml/ptmlCompiler.py | 9 +- robowaiter/robot/robot.py | 2 +- robowaiter/utils/bt/draw.py | 8 +- robowaiter/utils/draw_bt/Default.ptml | 17 ++ robowaiter/utils/draw_bt/Default_bracket.ptml | 28 +++ robowaiter/utils/draw_bt/__init__.py | 0 robowaiter/utils/draw_bt/draw_bt.py | 21 ++ robowaiter/utils/draw_bt/test.dot | 39 ++++ robowaiter/utils/draw_bt/test.png | Bin 0 -> 99843 bytes robowaiter/utils/draw_bt/test.svg | 211 ++++++++++++++++++ 15 files changed, 334 insertions(+), 15 deletions(-) create mode 100644 robowaiter/utils/draw_bt/Default.ptml create mode 100644 robowaiter/utils/draw_bt/Default_bracket.ptml create mode 100644 robowaiter/utils/draw_bt/__init__.py create mode 100644 robowaiter/utils/draw_bt/draw_bt.py create mode 100644 robowaiter/utils/draw_bt/test.dot create mode 100644 robowaiter/utils/draw_bt/test.png create mode 100644 robowaiter/utils/draw_bt/test.svg diff --git a/robowaiter/algos/navigator/__init__.py b/robowaiter/algos/navigator/__init__.py index 2802065..e69de29 100644 --- a/robowaiter/algos/navigator/__init__.py +++ b/robowaiter/algos/navigator/__init__.py @@ -1,3 +0,0 @@ -from . import navigate -from . import dstar_lite - diff --git a/robowaiter/algos/navigator/navigate.py b/robowaiter/algos/navigator/navigate.py index a9d37b4..b4b2c71 100644 --- a/robowaiter/algos/navigator/navigate.py +++ b/robowaiter/algos/navigator/navigate.py @@ -7,7 +7,6 @@ import pickle import matplotlib.pyplot as plt import numpy as np -from robowaiter.scene import scene from robowaiter.algos.navigator.dstar_lite import DStarLite, euclidean_distance @@ -94,6 +93,7 @@ class Navigator: if __name__ == '__main__': # 根据map计算并保存cost_map + from robowaiter.scene import scene file_name = 'map_4.pkl' if os.path.exists(file_name): diff --git a/robowaiter/behavior_lib/_base/Behavior.py b/robowaiter/behavior_lib/_base/Behavior.py index 635a22c..66245e9 100644 --- a/robowaiter/behavior_lib/_base/Behavior.py +++ b/robowaiter/behavior_lib/_base/Behavior.py @@ -81,9 +81,10 @@ class Bahavior(ptree.behaviour.Behaviour): # let behavior node interact with the scene - def set_scene(self, scene): - self.scene = scene - self.robot = scene.robot + 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) diff --git a/robowaiter/behavior_lib/_base/Selector.py b/robowaiter/behavior_lib/_base/Selector.py index 1c84639..1b61ed0 100644 --- a/robowaiter/behavior_lib/_base/Selector.py +++ b/robowaiter/behavior_lib/_base/Selector.py @@ -3,6 +3,7 @@ from typing import Any class Selector(ptree.composites.Selector): print_name = "Selector" + ins_name = "Selector" type = "Selector" def __init__(self,*args,**kwargs): diff --git a/robowaiter/behavior_lib/_base/Sequence.py b/robowaiter/behavior_lib/_base/Sequence.py index 702a0d9..bd1b75c 100644 --- a/robowaiter/behavior_lib/_base/Sequence.py +++ b/robowaiter/behavior_lib/_base/Sequence.py @@ -3,6 +3,7 @@ from typing import Any class Sequence(ptree.composites.Sequence): print_name = "Sequence" + ins_name = "Selector" type = "Sequence" def __init__(self,*args,**kwargs): diff --git a/robowaiter/behavior_tree/ptml/ptmlCompiler.py b/robowaiter/behavior_tree/ptml/ptmlCompiler.py index 0be7cd5..ef21765 100644 --- a/robowaiter/behavior_tree/ptml/ptmlCompiler.py +++ b/robowaiter/behavior_tree/ptml/ptmlCompiler.py @@ -107,9 +107,12 @@ def format_trans_to_bracket(file_path: str) -> str: for i in range(level): ptml_new += '}' - import re - new_path = re.sub('\\\[a-zA-Z0-9_]*\.ptml', '/bracket_ptml.ptml', file_path) - with open(new_path, 'w+') as file: + 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(ptml_new) return new_path diff --git a/robowaiter/robot/robot.py b/robowaiter/robot/robot.py index f6e1909..a364d1c 100644 --- a/robowaiter/robot/robot.py +++ b/robowaiter/robot/robot.py @@ -35,7 +35,7 @@ class Robot(object): self.action_list = None - def set_scene(self,scene): + def set_scene(self,scene=None): self.scene = scene diff --git a/robowaiter/utils/bt/draw.py b/robowaiter/utils/bt/draw.py index f983e3a..8139bee 100644 --- a/robowaiter/utils/bt/draw.py +++ b/robowaiter/utils/bt/draw.py @@ -111,10 +111,10 @@ def dot_tree( if with_qualified_names: node_label += f"\n({utilities.get_fully_qualified_name(behaviour)})" ''' - if node_name == "Sequence": - node_name = ">" - if node_name == "Selector": - node_name = "?" + # if node_name == "Sequence": + # node_name = ">" + # if node_name == "Selector": + # node_name = "?" return node_name fontsize = 20 diff --git a/robowaiter/utils/draw_bt/Default.ptml b/robowaiter/utils/draw_bt/Default.ptml new file mode 100644 index 0000000..03745e6 --- /dev/null +++ b/robowaiter/utils/draw_bt/Default.ptml @@ -0,0 +1,17 @@ +selector + sequence + cond CustomerChatting() + act DealChat() + sequence + cond HasSubTask() + sequence + act SubTaskPlaceHolder() + sequence + cond FocusingCustomer() + act ServeCustomer() + sequence + cond NewCustomerComing() + selector + cond At(Robot,Bar) + act MoveTo(Bar) + act GreetCustomer() diff --git a/robowaiter/utils/draw_bt/Default_bracket.ptml b/robowaiter/utils/draw_bt/Default_bracket.ptml new file mode 100644 index 0000000..e18182b --- /dev/null +++ b/robowaiter/utils/draw_bt/Default_bracket.ptml @@ -0,0 +1,28 @@ +selector +{ + sequence +{ + cond CustomerChatting() + act DealChat() + +} sequence +{ + cond HasSubTask() + sequence +{ + act SubTaskPlaceHolder() + +} sequence + cond FocusingCustomer() + act ServeCustomer() + +} sequence +{ + cond NewCustomerComing() + selector +{ + cond At(Robot,Bar) + act MoveTo(Bar) + +} act GreetCustomer() +}} \ No newline at end of file diff --git a/robowaiter/utils/draw_bt/__init__.py b/robowaiter/utils/draw_bt/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/robowaiter/utils/draw_bt/draw_bt.py b/robowaiter/utils/draw_bt/draw_bt.py new file mode 100644 index 0000000..4cbb292 --- /dev/null +++ b/robowaiter/utils/draw_bt/draw_bt.py @@ -0,0 +1,21 @@ +# from robowaiter.scene.scene import Scene +# from robowaiter.behavior_tree.ptml.ptmlCompiler import load + +import os +from robowaiter.robot.robot import Robot +from robowaiter.utils.bt.draw import render_dot_tree +from robowaiter.utils.basic import get_root_path +from robowaiter.utils.bt.load import load_bt_from_ptml + +if __name__ == '__main__': + + # create robot + root_path = get_root_path() + ptml_path = os.path.join(root_path, 'robowaiter/utils/draw_bt/Default.ptml') + behavior_lib_path = os.path.join(root_path, 'robowaiter/behavior_lib') + bt = load_bt_from_ptml(None, ptml_path, behavior_lib_path) + + + + render_dot_tree(bt.root,name="test") + # build and tick diff --git a/robowaiter/utils/draw_bt/test.dot b/robowaiter/utils/draw_bt/test.dot new file mode 100644 index 0000000..bd79eac --- /dev/null +++ b/robowaiter/utils/draw_bt/test.dot @@ -0,0 +1,39 @@ +digraph pastafarianism { +ordering=out; +graph [fontname="times-roman"]; +node [fontname="times-roman"]; +edge [fontname="times-roman"]; +"a3ac082f-ad46-4cc9-86b4-3e76c3c564d3" [fillcolor=cyan, fontcolor=black, fontsize=20, height=0.01, label=Selector, shape=diamond, style=filled, width=0.01]; +"717a1290-56bc-41e1-9b4b-e6df93d40e64" [fillcolor=orange, fontcolor=black, fontsize=20, height=0.01, label=Sequence, shape=octagon, style=filled, width=0.01]; +"a3ac082f-ad46-4cc9-86b4-3e76c3c564d3" -> "717a1290-56bc-41e1-9b4b-e6df93d40e64"; +"b3236b13-d5f2-4643-ae7c-6f27bd4ab6f2" [fillcolor=yellow, fontcolor=black, fontsize=20, label="CustomerChatting()", shape=ellipse, style=filled]; +"717a1290-56bc-41e1-9b4b-e6df93d40e64" -> "b3236b13-d5f2-4643-ae7c-6f27bd4ab6f2"; +"28015225-b7a4-4f38-b26f-4dbe5eea4154" [fillcolor=lawngreen, fontcolor=black, fontsize=20, label="DealChat()", shape=box, style=filled]; +"717a1290-56bc-41e1-9b4b-e6df93d40e64" -> "28015225-b7a4-4f38-b26f-4dbe5eea4154"; +"ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e" [fillcolor=orange, fontcolor=black, fontsize=20, height=0.01, label=Sequence, shape=octagon, style=filled, width=0.01]; +"a3ac082f-ad46-4cc9-86b4-3e76c3c564d3" -> "ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e"; +"2f77f976-499c-4601-9d8c-86dd80d66dfa" [fillcolor=yellow, fontcolor=black, fontsize=20, label="HasSubTask()", shape=ellipse, style=filled]; +"ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e" -> "2f77f976-499c-4601-9d8c-86dd80d66dfa"; +"2428792c-3896-443d-8744-f5e286644fad" [fillcolor=orange, fontcolor=black, fontsize=20, height=0.01, label=Sequence, shape=octagon, style=filled, width=0.01]; +"ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e" -> "2428792c-3896-443d-8744-f5e286644fad"; +"4bb7a9c3-521b-408f-b403-1fd25d54b192" [fillcolor=lawngreen, fontcolor=black, fontsize=20, label="SubTaskPlaceHolder()", shape=box, style=filled]; +"2428792c-3896-443d-8744-f5e286644fad" -> "4bb7a9c3-521b-408f-b403-1fd25d54b192"; +"64b2362a-d99e-4e99-8772-ad1419e53a2e" [fillcolor=orange, fontcolor=black, fontsize=20, height=0.01, label=Sequence, shape=octagon, style=filled, width=0.01]; +"ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e" -> "64b2362a-d99e-4e99-8772-ad1419e53a2e"; +"fd7124ba-c9d1-4fde-8063-e8337d335121" [fillcolor=yellow, fontcolor=black, fontsize=20, label="FocusingCustomer()", shape=ellipse, style=filled]; +"64b2362a-d99e-4e99-8772-ad1419e53a2e" -> "fd7124ba-c9d1-4fde-8063-e8337d335121"; +"169ebec9-3645-4fbb-a533-5186a8e5967b" [fillcolor=lawngreen, fontcolor=black, fontsize=20, label="ServeCustomer()", shape=box, style=filled]; +"64b2362a-d99e-4e99-8772-ad1419e53a2e" -> "169ebec9-3645-4fbb-a533-5186a8e5967b"; +"bea12066-ecbd-49b0-8934-efcb2c38b5f5" [fillcolor=orange, fontcolor=black, fontsize=20, height=0.01, label=Sequence, shape=octagon, style=filled, width=0.01]; +"ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e" -> "bea12066-ecbd-49b0-8934-efcb2c38b5f5"; +"a847a0cc-c5af-4757-aa8c-8baef72788dc" [fillcolor=yellow, fontcolor=black, fontsize=20, label="NewCustomerComing()", shape=ellipse, style=filled]; +"bea12066-ecbd-49b0-8934-efcb2c38b5f5" -> "a847a0cc-c5af-4757-aa8c-8baef72788dc"; +"99354f05-1716-46b2-9151-d88eac0a5b27" [fillcolor=cyan, fontcolor=black, fontsize=20, height=0.01, label=Selector, shape=diamond, style=filled, width=0.01]; +"bea12066-ecbd-49b0-8934-efcb2c38b5f5" -> "99354f05-1716-46b2-9151-d88eac0a5b27"; +"19de10a3-7554-43a3-b892-34cb2e32ab9a" [fillcolor=yellow, fontcolor=black, fontsize=20, label="At(Robot,Bar)", shape=ellipse, style=filled]; +"99354f05-1716-46b2-9151-d88eac0a5b27" -> "19de10a3-7554-43a3-b892-34cb2e32ab9a"; +"4286d652-c4ef-4522-a7f1-b5c865dcc4c9" [fillcolor=lawngreen, fontcolor=black, fontsize=20, label="MoveTo(Bar)", shape=box, style=filled]; +"99354f05-1716-46b2-9151-d88eac0a5b27" -> "4286d652-c4ef-4522-a7f1-b5c865dcc4c9"; +"a3766a34-5152-4f82-8fba-8bf1f6b3830b" [fillcolor=lawngreen, fontcolor=black, fontsize=20, label="GreetCustomer()", shape=box, style=filled]; +"bea12066-ecbd-49b0-8934-efcb2c38b5f5" -> "a3766a34-5152-4f82-8fba-8bf1f6b3830b"; +} diff --git a/robowaiter/utils/draw_bt/test.png b/robowaiter/utils/draw_bt/test.png new file mode 100644 index 0000000000000000000000000000000000000000..773238dbed479137c4bcb1d36b420be44e68a010 GIT binary patch literal 99843 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%0AQkQ&s* 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

x%+V^Fy+OBb0i88{iS@DL-TJ8npfhLQS^O4ODr+ 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 E0mIncAOHXW literal 0 HcmV?d00001 diff --git a/robowaiter/utils/draw_bt/test.svg b/robowaiter/utils/draw_bt/test.svg new file mode 100644 index 0000000..2ed2acf --- /dev/null +++ b/robowaiter/utils/draw_bt/test.svg @@ -0,0 +1,211 @@ + + + + + + +pastafarianism + + + +a3ac082f-ad46-4cc9-86b4-3e76c3c564d3 + +Selector + + + +717a1290-56bc-41e1-9b4b-e6df93d40e64 + +Sequence + + + +a3ac082f-ad46-4cc9-86b4-3e76c3c564d3->717a1290-56bc-41e1-9b4b-e6df93d40e64 + + + + + +ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e + +Sequence + + + +a3ac082f-ad46-4cc9-86b4-3e76c3c564d3->ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e + + + + + +b3236b13-d5f2-4643-ae7c-6f27bd4ab6f2 + +CustomerChatting() + + + +717a1290-56bc-41e1-9b4b-e6df93d40e64->b3236b13-d5f2-4643-ae7c-6f27bd4ab6f2 + + + + + +28015225-b7a4-4f38-b26f-4dbe5eea4154 + +DealChat() + + + +717a1290-56bc-41e1-9b4b-e6df93d40e64->28015225-b7a4-4f38-b26f-4dbe5eea4154 + + + + + +2f77f976-499c-4601-9d8c-86dd80d66dfa + +HasSubTask() + + + +ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e->2f77f976-499c-4601-9d8c-86dd80d66dfa + + + + + +2428792c-3896-443d-8744-f5e286644fad + +Sequence + + + +ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e->2428792c-3896-443d-8744-f5e286644fad + + + + + +64b2362a-d99e-4e99-8772-ad1419e53a2e + +Sequence + + + +ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e->64b2362a-d99e-4e99-8772-ad1419e53a2e + + + + + +bea12066-ecbd-49b0-8934-efcb2c38b5f5 + +Sequence + + + +ff83c742-a2ba-4aa5-8b3a-39ecd7c03b0e->bea12066-ecbd-49b0-8934-efcb2c38b5f5 + + + + + +4bb7a9c3-521b-408f-b403-1fd25d54b192 + +SubTaskPlaceHolder() + + + +2428792c-3896-443d-8744-f5e286644fad->4bb7a9c3-521b-408f-b403-1fd25d54b192 + + + + + +fd7124ba-c9d1-4fde-8063-e8337d335121 + +FocusingCustomer() + + + +64b2362a-d99e-4e99-8772-ad1419e53a2e->fd7124ba-c9d1-4fde-8063-e8337d335121 + + + + + +169ebec9-3645-4fbb-a533-5186a8e5967b + +ServeCustomer() + + + +64b2362a-d99e-4e99-8772-ad1419e53a2e->169ebec9-3645-4fbb-a533-5186a8e5967b + + + + + +a847a0cc-c5af-4757-aa8c-8baef72788dc + +NewCustomerComing() + + + +bea12066-ecbd-49b0-8934-efcb2c38b5f5->a847a0cc-c5af-4757-aa8c-8baef72788dc + + + + + +99354f05-1716-46b2-9151-d88eac0a5b27 + +Selector + + + +bea12066-ecbd-49b0-8934-efcb2c38b5f5->99354f05-1716-46b2-9151-d88eac0a5b27 + + + + + +a3766a34-5152-4f82-8fba-8bf1f6b3830b + +GreetCustomer() + + + +bea12066-ecbd-49b0-8934-efcb2c38b5f5->a3766a34-5152-4f82-8fba-8bf1f6b3830b + + + + + +19de10a3-7554-43a3-b892-34cb2e32ab9a + +At(Robot,Bar) + + + +99354f05-1716-46b2-9151-d88eac0a5b27->19de10a3-7554-43a3-b892-34cb2e32ab9a + + + + + +4286d652-c4ef-4522-a7f1-b5c865dcc4c9 + +MoveTo(Bar) + + + +99354f05-1716-46b2-9151-d88eac0a5b27->4286d652-c4ef-4522-a7f1-b5c865dcc4c9 + + + + +