修复serve逻辑

This commit is contained in:
ChenXL97 2023-11-19 17:42:56 +08:00
parent 44cf57f544
commit 5b9526b5d0
9 changed files with 95 additions and 60 deletions

View File

@ -17,8 +17,8 @@ class DealChat(Act):
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
"get_object_info": self.get_object_info,
"find_location": self.find_location
}
def _update(self) -> ptree.common.Status:
@ -64,17 +64,22 @@ 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"
#
def get_object_info(self,**args):
try:
obj = args['obj']
self.function_success = True
except:
obj = None
print("参数解析错误")
d = {"保温杯": "二号桌子"}
if obj in d.keys():
result = d[obj]
else:
result = "None"
return result
# max_similarity = 0.02
# similar_word = None
#
@ -101,32 +106,37 @@ class DealChat(Act):
#
# 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 find_location(self, **args):
try:
location = args['obj']
self.function_success = True
except:
obj = None
print("参数解析错误")
d = {"保温杯": "二号桌子"}
if location in d.keys():
result = d[obj]
else:
result = "None"
return result
# 用户咨询的地点
# 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):
customer = self.scene.state["attention"]["customer"]

View File

@ -9,7 +9,13 @@ class DelSubTree(Act):
super().__init__(*args)
def _update(self) -> ptree.common.Status:
self.scene.state["attention"] = {}
# self.scene.state["attention"] = {}
if "customer" in self.scene.state["attention"]:
customer = self.scene.state["attention"]["customer"]
serve_state = self.scene.state["serve_state"][customer]
serve_state['last_chat_time'] = self.scene.time
sub_task_tree = self.parent
self.scene.sub_task_seq.children.remove(sub_task_tree)

View File

@ -21,10 +21,19 @@ class ServeCustomer(Act):
# self.chat_bubble
customer = self.scene.state["attention"]["customer"]
if customer not in self.scene.state["serve_state"]:
self.scene.state["serve_state"][customer] = {
"last_chat_time": self.scene.time,
"served": False
}
serve_state = self.scene.state["serve_state"][customer]
if self.scene.time - serve_state['last_chat_time'] > 3:
serve_state['served'] = True
del self.scene.state["attention"]["customer"]
goal = Act.place_xyz_dic['Bar']
self.scene.walk_to(goal[0] - 5, goal[1], 180, 180, 0)
# goal = Act.place_xyz_dic['Bar']
# self.scene.walk_to(goal[0]-5,goal[1], 180, 180, 0)

View File

@ -20,6 +20,9 @@ class CustomerChatting(Cond):
if name == attention_customer:
return ptree.common.Status.SUCCESS
else:
# self.scene.chat_bubble("请稍等一下") # 机器人输出对话
# self.scene.wait_history.add(sentence)
return ptree.common.Status.FAILURE
else:
self.scene.state["attention"]["customer"] = name

View File

@ -22,7 +22,7 @@ class NewCustomerComing(Cond):
for walker in scene.walkers:
x, y, yaw = walker.pose.X, walker.pose.Y, walker.pose.Yaw
# 到达一定区域就打招呼
if y >= 510 and y <= 530 and x >= 50 and x <= 70 and yaw>=-10 and yaw <=10: #450-620
if y >= 450 and y <= 620 and x >= 40 and x <= 100 and yaw>=-10 and yaw <=10: #450-620
# close_to_bar = True
queue_list.append((x,y,walker.name))

View File

@ -46,7 +46,7 @@ create_sub_task
我昨天保温杯好像落在你们咖啡厅了,你看到了吗?
是的我有印象保温杯在大厅的2号桌子上。
get_object_info
{"obj":"2号桌子"}
{"obj":"保温杯"}
给我来份午餐套餐。

View File

@ -75,7 +75,8 @@ class Scene:
"greeted_customers":set(),
"attention":{},
"serve_state":{},
"chat_history":{}
"chat_history":{},
"wait_history":set()
}
"""
status:
@ -106,6 +107,7 @@ class Scene:
self.robot = robot
self.robot_changed = False
self.last_event_time = 0
# 1-7 正常执行, 8-10 控灯操作移动到6, 11-12窗帘操作不需要移动,
self.op_dialog = ["","制作咖啡","倒水","夹点心","拖地","擦桌子","开筒灯","搬椅子", # 1-7
@ -200,13 +202,15 @@ class Scene:
if t < 0: #一直等待机器人行动,直到机器人无行动
if self.robot_changed:
return
if t > 0:
time.sleep(t)
if (t >= 0) and (self.time - self.last_event_time < t):
return
print(f'event: {t}, {func.__name__}')
self.signal_event_list.pop(0)
self.last_event_time = self.time
func(*args)
def deal_event(self):
if len(self.event_list)>0:
next_event = self.event_list[0]

View File

@ -25,11 +25,11 @@ class SceneVLM(Scene):
self.signal_event_list = [
# 场景1带小女孩找阳光下的空位
# (3, self.add_walker, (5, 230, 1200)),
# (1, self.control_walker, (0, False, 200, 60, 520, 0)),
# (9, self.customer_say, (0, "早上好呀,我想找个能晒太阳的地方。")),
# (-1, self.customer_say, (0,"可以带我过去嘛?")),
# (0, self.control_walker, (0, False, 50, 140, 1200, 180)), # 小女孩站在了 BrightTable1 旁边就餐啦
(3, self.add_walker, (5, 230, 1200)),
(1, self.control_walker, (0, False, 200, 60, 520, 0)),
(9, self.customer_say, (0, "早上好呀,我想找个能晒太阳的地方。")),
(-1, self.customer_say, (0,"可以带我过去嘛?")),
(0, self.control_walker, (0, False, 50, 140, 1200, 180)), # 小女孩站在了 BrightTable1 旁边就餐啦
# 场景2有个胖胖男人点单交流并要咖啡帮他送去角落的桌子
# (3, self.add_walker, (5, 230, 1200)), # 小女孩

View File

@ -28,18 +28,21 @@ class SceneOT(Scene):
# self.add_walkers([[0, 880], [250, 1200]])
# 展示顾客前8个id是小孩后面都是大人
for i in range(4):
for i in range(20):
self.add_walker(i,50,300 + i * 50)
name1 = self.walker_index2mem(1)
name2 = self.walker_index2mem(3)
self.remove_walker(0,2)
index1 = self.state["customer_mem"][name1]
index2 = self.state["customer_mem"][name2]
self.walker_bubble(name1,f"我是第{index1}")
self.walker_bubble(name2,f"我是第{index2}")
for w in self.status.walkers:
print(w.name)
# name1 = self.walker_index2mem(1)
# name2 = self.walker_index2mem(3)
#
# self.remove_walker(0,2)
#
# index1 = self.state["customer_mem"][name1]
# index2 = self.state["customer_mem"][name2]
#
# self.walker_bubble(name1,f"我是第{index1}个")
# self.walker_bubble(name2,f"我是第{index2}个")
def _run(self):
pass