Merge branch 'main' of github.com:HPCL-EI/RoboWaiter

This commit is contained in:
ChenXL97 2023-11-14 08:53:15 +08:00
commit e5a9f4e583
14 changed files with 295 additions and 70 deletions

View File

@ -3,9 +3,21 @@ from robowaiter.behavior_lib._base.Behavior import Bahavior
class Act(Bahavior):
print_name_prefix = "act "
type = 'Act'
all_place = {'Bar', 'Bar2', 'WaterTable', 'CoffeeTable', 'Table1', 'Table2', 'Table3'}
all_object = {'Coffee', 'Water', 'Dessert', 'Softdrink', 'BottledDrink', 'Yogurt', 'ADMilk', 'MilkDrink', 'Milk',
'VacuumCup'}
place_xyz_dic={
'Bar': (247.0, 520.0, 100.0),
'Bar2': (240.0, 40.0, 70.0),
'WaterTable':(-70.0, 500.0, 107),
'CoffeeTable':(247.0, 520.0, 100.0), # 位置需要更改!!!
'Table1': (247.0, 520.0, 100.0),# 位置需要更改!!!
'Table2': (-55.0, 0.0, 107),
'Table3':(-55.0, 150.0, 107)
}
def __init__(self,*args):
super().__init__(*args)
self.info = self.get_info(*args)
@classmethod
def get_info(self,*arg):

View File

@ -35,6 +35,7 @@ class Bahavior(ptree.behaviour.Behaviour):
# self.valid_arg_list.append((x.strip for x in line.split(",")))
self.args = args
super().__init__(self.name)
def _update(self) -> ptree.common.Status:

View File

@ -0,0 +1,47 @@
import py_trees as ptree
from typing import Any
from robowaiter.behavior_lib._base.Act import Act
from robowaiter.behavior_lib._base.Behavior import Status
class 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)'}
if arg == "Table1":
info["add"]= {f'Is(Table1,Clean)'}
info["del"] = {f'Is(Table1,Dirty)'}
elif arg == "Floor":
info["add"] = {f'Is(Floor,Clean)'}
info["del"] = {f'Is(Floor,Dirty)'}
elif arg == "Chairs":
info["add"] = {f'Is(Chairs,Clean)'}
info["del"] = {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"].union(self.info["add"])
self.scene.state["condition_set"] -= self.info["del"]
return Status.RUNNING

View File

@ -7,26 +7,39 @@ class Make(Act):
can_be_expanded = True
num_args = 1
valid_args = (
"Coffee",
"Coffee","Water","Dessert"
)
def __init__(self, *args):
super().__init__(*args)
self.target_obj = self.args[0]
self.op_type = 1
if self.target_obj=="Coffee":
self.op_type = 1
elif self.target_obj=="Water":
self.op_type = 2
elif self.target_obj=="Dessert":
self.op_type = 3
@classmethod
def get_info(cls,arg):
info = None
info = {}
info["pre"]= {f'Holding(Nothing)'}
info['del'] = set()
if arg == "Coffee":
info = {
"add": {f'On(Coffee,Table)'},
}
info["add"]= {f'On(Coffee,CoffeeTable)'}
elif arg == "Water":
info["add"] = {f'On(Water,WaterTable)'}
elif arg == "Dessert":
info["add"] = {f'On(Dessert,Bar)'}
return info
def _update(self) -> ptree.common.Status:
op_type = 1
self.scene.move_task_area(op_type)
self.scene.op_task_execute(op_type)
self.scene.state["condition_set"].add(self.add)
self.scene.move_task_area(self.op_type)
self.scene.op_task_execute(self.op_type)
self.scene.state["condition_set"].union(self.info["add"])
self.scene.state["condition_set"] -= self.info["del"]
return Status.RUNNING

View File

@ -1,23 +0,0 @@
import py_trees as ptree
from typing import Any
from robowaiter.behavior_lib._base.Act import Act
from robowaiter.behavior_lib._base.Behavior import Status
class MakeCoffee(Act):
def __init__(self, *args):
super().__init__(*args)
@property
def cond_sets(self):
pre = {"At(Robot,CoffeeMachine)","NotHolding"}
add = {"At(Coffee,Bar)"}
de = {}
return pre,add,de
def _update(self) -> ptree.common.Status:
op_type = 1
self.scene.move_task_area(op_type)
self.scene.op_task_execute(op_type)
self.scene.state["condition_set"].add(self.add)
return Status.RUNNING

View File

@ -5,10 +5,8 @@ from robowaiter.algos.navigate.navigate import Navigator
class MoveTo(Act):
can_be_expanded = True
num_args = 1
valid_args = (
"Bar",
"Table",
)
valid_args = Act.all_object | Act.all_place
valid_args.add('Customer')
def __init__(self, target_place):
super().__init__(target_place)
@ -17,9 +15,9 @@ class MoveTo(Act):
@classmethod
def get_info(self,arg):
info = {
"add": {f'At(Robot,{arg})'},
}
info = {}
info["add"] = {f'At(Robot,{arg})'}
info["del"] = {f'At(Robot,{place})' for place in self.valid_args if place != arg}
return info

View File

@ -0,0 +1,34 @@
import py_trees as ptree
from typing import Any
from robowaiter.behavior_lib._base.Act import Act
from robowaiter.behavior_lib._base.Behavior import Status
class PickUp(Act):
can_be_expanded = True
num_args = 1
def __init__(self, *args):
super().__init__(*args)
self.target_obj = self.args[0]
@classmethod
def get_info(self,arg):
info = {}
info["pre"] = {f'At(Robot,{arg})','Holding(Nothing)'}
info["add"] = {f'Holding({arg})'}
info["del"] = {f'Holding(Nothing)'}
return info
def _update(self) -> ptree.common.Status:
# self.scene.test_move()
op_type=16
obj_id = 0
# 遍历场景里的所有物品,根据名字匹配位置最近的 obj-id
self.scene.op_task_execute(op_type, obj_id=obj_id)
self.scene.state["condition_set"].union(self.info["add"])
self.scene.state["condition_set"] -= self.info["del"]
return Status.RUNNING

View File

@ -1,23 +0,0 @@
import py_trees as ptree
from typing import Any
from robowaiter.behavior_lib._base.Act import Act
from robowaiter.behavior_lib._base.Behavior import Status
class PourWater(Act):
def __init__(self, *args):
super().__init__(*args)
@property
def cond_sets(self):
self.pre = {"At(Robot,WaterTable)","NotHolding"}
self.add = {"On(Water,WaterTable)"}
self.de = {}
return self.pre,self.add,self.de
def _update(self) -> ptree.common.Status:
op_type = 2
self.scene.move_task_area(op_type)
self.scene.op_task_execute(op_type)
self.scene.state["condition_set"].update(self.add)
return Status.RUNNING

View File

@ -0,0 +1,35 @@
import py_trees as ptree
from typing import Any
from robowaiter.behavior_lib._base.Act import Act
from robowaiter.behavior_lib._base.Behavior import Status
class PutDown(Act):
can_be_expanded = True
num_args = 1
def __init__(self, *args):
super().__init__(*args)
self.target_obj = self.args[0]
self.target_place = self.args[1]
@classmethod
def get_info(self,arg):
info = {}
info["pre"] = {f'Holding({arg[0]})',f'At(Robot,{arg[1]})'}
info["add"] = {f'Holding(Nothing)',f'At({arg[0]},{arg[1]})'}
info["del"] = {f'Holding(Nothing)'}
return info
def _update(self) -> ptree.common.Status:
# self.scene.test_move()
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]
self.scene.op_task_execute(op_type, release_pos=release_pos)
self.scene.state["condition_set"].union(self.info["add"])
self.scene.state["condition_set"] -= self.info["del"]
return Status.RUNNING

View File

@ -0,0 +1,64 @@
import py_trees as ptree
from typing import Any
from robowaiter.behavior_lib._base.Act import Act
from robowaiter.behavior_lib._base.Behavior import Status
class Clean(Act):
can_be_expanded = True
num_args = 1
valid_args = [('AC','ACTemperature','TubeLight','HallLight','Curtain'),
('Off','On','Up','Down','Clean','Dirty')]
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 = 11
elif self.op == 'Off':
self.op_type = 12
@classmethod
def get_info(cls,arg):
info = {}
# 明天写
# info["pre"]= {f'Holding(Nothing)'}
# if arg == "Table1":
# info["add"]= {f'Is(Table1,Clean)'}
# info["del"] = {f'Is(Table1,Dirty)'}
# elif arg == "Floor":
# info["add"] = {f'Is(Floor,Clean)'}
# info["del"] = {f'Is(Floor,Dirty)'}
# elif arg == "Chairs":
# info["add"] = {f'Is(Chairs,Clean)'}
# info["del"] = {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"].union(self.info["add"])
self.scene.state["condition_set"] -= self.info["del"]
return Status.RUNNING

View File

@ -0,0 +1,66 @@
# the empty string '' represents robot holds nothing
Object = ['Coffee', 'Water', 'Dessert', 'Softdrink', 'BottledDrink', 'Yogurt', 'ADMilk', 'MilkDrink', 'Milk',
'VacuumCup', '']
Place = ['Bar', 'WaterTable', 'CoffeeTable', 'Bar2', 'Table1', 'Table2', 'Table3']
Entity = ['Robot', 'Customer']
Operable = ['AC', 'ACTemperature', 'HallLight', 'TubeLight', 'Curtain']
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 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
generate_goal_states(30, 6, 6)

View File

@ -417,10 +417,11 @@ class Scene:
return True
def gen_obj(self,h=100):
# 4;冰红(盒) 5;酸奶 7:保温杯 9;冰红(瓶) 13:代语词典
# 4;冰红(盒) 5;酸奶 7:保温杯 9;冰红(瓶) 13:代语词典 14:cake 61:甜牛奶
type= 9 #9
scene = stub.Observe(GrabSim_pb2.SceneID(value=self.sceneID))
ginger_loc = [scene.location.X, scene.location.Y, scene.location.Z]
obj_list = [GrabSim_pb2.ObjectList.Object(x=ginger_loc[0] - 50, y=ginger_loc[1] - 40, z = h, roll=0, pitch=0, yaw=0, type=9)]
obj_list = [GrabSim_pb2.ObjectList.Object(x=ginger_loc[0] - 50, y=ginger_loc[1] - 40, z = h, roll=0, pitch=0, yaw=0, type=type)]
scene = stub.AddObjects(GrabSim_pb2.ObjectList(objects=obj_list, scene=self.sceneID))
time.sleep(1.0)

View File

@ -11,14 +11,14 @@ class SceneVLM(Scene):
super().__init__(robot)
# 在这里加入场景中发生的事件, (事件发生的时间,事件函数)
self.event_list = [
# (5, self.create_chat_event("测试VLM做一杯咖啡")),
(5, self.create_chat_event("测试VLM倒一杯水")),
(5, self.create_chat_event("测试VLM做一杯咖啡")),
# (5, self.create_chat_event("测试VLM倒一杯水")),
]
def _reset(self):
pass
def _run(self, op_type=2):
def _run(self, op_type=7):
# 共17个操作
# "制作咖啡","倒水","夹点心","拖地","擦桌子","开筒灯","搬椅子", # 1-7
# "关筒灯","开大厅灯","关大厅灯","关闭窗帘","打开窗帘", # 8-12
@ -30,8 +30,8 @@ class SceneVLM(Scene):
# self.gen_obj()
# self.op_task_execute(op_type, obj_id=0)
# # 原始吧台处:[247.0, 520.0, 100.0], 空调开关旁吧台:[240.0, 40.0, 70.0], 水杯桌:[-70.0, 500.0, 107]
# # 桌子1:[-55.0, 0.0, 107],桌子1:[-55.0, 150.0, 107]
# elif op_type == 17: self.op_task_execute(op_type, release_pos=[-55.0, 150.0, 107])
# # 桌子1:[-55.0, 0.0, 107],桌子2:[-55.0, 150.0, 107]
# elif op_type == 17: self.op_task_execute(op_type, release_pos=[247.0, 520.0, 100.0])#[-55.0, 150.0, 107]
# else:
# self.move_task_area(op_type)
# self.op_task_execute(op_type)