Skip to content

Commit 49a9870

Browse files
Merge branch 'master' into azure_ssh
2 parents 7728f9d + 51b4100 commit 49a9870

File tree

15 files changed

+699
-223
lines changed

15 files changed

+699
-223
lines changed

challenge_gpsr/src/gpsr.py

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -224,15 +224,9 @@ def main():
224224
skip = rospy.get_param('~skip', False)
225225
restart = rospy.get_param('~restart', False)
226226
robot_name = rospy.get_param('~robot_name')
227-
no_of_tasks = rospy.get_param('~number_of_tasks', 0)
227+
no_of_tasks = rospy.get_param('~number_of_tasks', 999)
228228
test = rospy.get_param('~test_mode', False)
229-
eegpsr = rospy.get_param('~eegpsr', False)
230-
time_limit = rospy.get_param('~time_limit', 0)
231-
if no_of_tasks == 0:
232-
no_of_tasks = 999
233-
234-
if time_limit == 0:
235-
time_limit = 999
229+
time_limit = rospy.get_param('~time_limit', 999)
236230

237231
rospy.loginfo("[GPSR] Parameters:")
238232
rospy.loginfo("[GPSR] robot_name = {}".format(robot_name))
@@ -246,14 +240,9 @@ def main():
246240
rospy.loginfo("[GPSR] running in test mode")
247241
rospy.loginfo("[GPSR] time_limit = {}".format(time_limit))
248242

249-
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
250243

251244
robot = get_robot(robot_name)
252-
253-
if eegpsr:
254-
knowledge = load_knowledge('challenge_eegpsr')
255-
else:
256-
knowledge = load_knowledge('challenge_gpsr')
245+
knowledge = load_knowledge('challenge_gpsr')
257246

258247
conversation_engine = ConversationEngineWithHmi(robot, knowledge.grammar, knowledge.grammar_target, knowledge)
259248
conversation_engine.test = test

challenge_serve_breakfast/images/spoon.jpg

100755100644
23.4 KB
Loading

challenge_serve_breakfast/src/challenge_serve_breakfast/navigate_to_and_pick_item.py

Lines changed: 47 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,15 @@
88
import rospkg
99
import rospy
1010

11-
from challenge_serve_breakfast.tuning import REQUIRED_ITEMS, JOINTS_HANDOVER, PICK_ROTATION
11+
from challenge_serve_breakfast.tuning import REQUIRED_ITEMS, JOINTS_HANDOVER
1212
from robot_skills import get_robot
13+
from robot_skills.arm.arms import GripperTypes
14+
# ROS
15+
from pykdl_ros import VectorStamped
16+
from robot_smach_states.human_interaction import Say
17+
from robot_smach_states.manipulation.active_grasp_detector import ActiveGraspDetector
1318
from robot_smach_states.navigation import NavigateToSymbolic
14-
from robot_smach_states.util.designators import EdEntityDesignator
19+
from robot_smach_states.util.designators import EdEntityDesignator, ArmDesignator
1520
from smach import StateMachine, cb_interface, CBState
1621

1722
item_img_dict = {
@@ -28,10 +33,11 @@ def __init__(self, robot):
2833
# noinspection PyProtectedMember
2934
arm = robot.get_arm()._arm
3035
picked_items = []
36+
armdes = ArmDesignator(robot, {"required_gripper_types": [GripperTypes.GRASPING]})
3137

3238
def send_joint_goal(position_array, wait_for_motion_done=True):
3339
# noinspection PyProtectedMember
34-
arm._send_joint_trajectory([position_array], timeout=rospy.Duration(0))
40+
arm._send_joint_trajectory([position_array], timeout=0.0)
3541
if wait_for_motion_done:
3642
arm.wait_for_motion_done()
3743

@@ -52,10 +58,17 @@ def show_image(package_name, path_to_image_in_package):
5258

5359
@cb_interface(outcomes=["done"])
5460
def _rotate(_):
55-
arm.gripper.send_goal("close", timeout=0.)
56-
robot.head.look_up()
57-
vyaw = 0.5
58-
robot.base.force_drive(0, 0, vyaw, PICK_ROTATION / vyaw)
61+
arm.gripper.send_goal("close", timeout=0.0)
62+
63+
# Look to the operator
64+
robot.head.look_at_point(VectorStamped.from_xyz(0.2, -0.2, 1.75, stamp=rospy.Time.now(),
65+
frame_id=robot.base_link_frame))
66+
robot.head.wait_for_motion_done()
67+
return "done"
68+
69+
@cb_interface(outcomes=["done"])
70+
def _handover_pose(user_data):
71+
send_joint_goal(JOINTS_HANDOVER, wait_for_motion_done=False)
5972
return "done"
6073

6174
@cb_interface(outcomes=["succeeded", "failed"], output_keys=["item_picked"])
@@ -67,29 +80,46 @@ def _ask_user(user_data):
6780

6881
item_name = leftover_items[0]
6982

70-
send_joint_goal(JOINTS_HANDOVER, wait_for_motion_done=False)
71-
72-
picked_items.append(item_name)
73-
7483
robot.speech.speak("Please put the {} in my gripper, like this".format(item_name), block=False)
7584
show_image("challenge_serve_breakfast", item_img_dict[item_name])
7685

7786
send_gripper_goal("open")
78-
rospy.sleep(10.0)
79-
robot.speech.speak("Thanks for that!", block=False)
87+
rospy.sleep(7.0)
8088
send_gripper_goal("close", max_torque=0.6)
8189
robot.head.reset()
8290

8391
# Set output data
8492
user_data["item_picked"] = item_name
93+
return "succeeded"
8594

95+
@cb_interface(outcomes=["done"])
96+
def _carrying_pose(user_data):
8697
arm.send_joint_goal("carrying_pose", timeout=0.)
98+
robot.speech.speak("Thanks for that!", block=False)
99+
return "done"
87100

88-
return "succeeded"
101+
@cb_interface(outcomes=["done"], input_keys=["item_picked"])
102+
def _remember_item(user_data):
103+
picked_items.append(user_data["item_picked"])
104+
return "done"
89105

90106
with self:
91-
self.add("ROTATE", CBState(_rotate), transitions={"done": "ASK_USER"})
92-
self.add("ASK_USER", CBState(_ask_user), transitions={"succeeded": "succeeded", "failed": "failed"})
107+
self.add("ROTATE", CBState(_rotate), transitions={"done": "HANDOVER_POSE"})
108+
self.add("HANDOVER_POSE", CBState(_handover_pose), transitions={"done": "ASK_USER"})
109+
self.add("ASK_USER", CBState(_ask_user),
110+
transitions={"succeeded": "CHECK_PICK_SUCCESSFUL", "failed": "failed"})
111+
self.add("CHECK_PICK_SUCCESSFUL",
112+
ActiveGraspDetector(robot, armdes),
113+
transitions={'true': "ADD_ITEM_TO_LIST",
114+
'false': "SAY_SOMETHING_WENT_WRONG",
115+
'failed': "failed",
116+
'cannot_determine': "SAY_SOMETHING_WENT_WRONG"}
117+
)
118+
self.add("SAY_SOMETHING_WENT_WRONG", Say(robot, "Oops, it seems I missed it. Lets try again"),
119+
transitions={"spoken": "ASK_USER2"})
120+
self.add("ASK_USER2", CBState(_ask_user), transitions={"succeeded": "ADD_ITEM_TO_LIST", "failed": "failed"})
121+
self.add("ADD_ITEM_TO_LIST", CBState(_remember_item), transitions={"done": "CARRYING_POSE"})
122+
self.add("CARRYING_POSE", CBState(_carrying_pose), transitions={"done": "succeeded"})
93123

94124

95125
class NavigateToAndPickItem(StateMachine):
@@ -101,7 +131,7 @@ def __init__(self, robot, pick_spot_id, pick_spot_navigation_area):
101131
with self:
102132
StateMachine.add(
103133
"NAVIGATE_TO_PICK_SPOT",
104-
NavigateToSymbolic(robot, {pick_spot: pick_spot_navigation_area}, pick_spot),
134+
NavigateToSymbolic(robot, {pick_spot: pick_spot_navigation_area},pick_spot, speak=False),
105135
transitions={"arrived": "PICK_ITEM", "unreachable": "failed", "goal_not_defined": "failed"},
106136
)
107137

challenge_serve_breakfast/src/challenge_serve_breakfast/navigate_to_and_place_item_on_table.py

Lines changed: 41 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,15 @@
1111
import rospy
1212
import visualization_msgs.msg
1313
from geometry_msgs.msg import PoseStamped, Vector3
14+
from pykdl_ros import FrameStamped
1415

1516
from challenge_serve_breakfast.tuning import (
16-
JOINTS_PRE_PRE_PLACE,
17-
JOINTS_PRE_PLACE_HORIZONTAL,
18-
JOINTS_PRE_PLACE_VERTICAL,
17+
get_item_place_pose,
1918
ITEM_VECTOR_DICT,
2019
item_vector_to_item_frame,
2120
item_frame_to_pose,
22-
JOINTS_PLACE_HORIZONTAL,
23-
JOINTS_PLACE_HORIZONTAL_MILK,
24-
JOINTS_PLACE_VERTICAL,
25-
JOINTS_RETRACT,
26-
COLOR_DICT, REQUIRED_ITEMS,
21+
COLOR_DICT,
22+
REQUIRED_ITEMS,
2723
)
2824
from robot_skills import get_robot
2925
from robot_smach_states.human_interaction import Say
@@ -35,22 +31,22 @@
3531

3632

3733
class PlaceItemOnTable(StateMachine):
38-
def __init__(self, robot, table_id):
34+
def __init__(self, robot, table_id, retract = True):
3935
StateMachine.__init__(self, outcomes=["succeeded", "failed"], input_keys=["item_picked"])
4036
# noinspection PyProtectedMember
4137
arm = robot.get_arm()._arm
38+
self.retract = retract
4239

43-
def send_joint_goal(position_array, wait_for_motion_done=True):
44-
# noinspection PyProtectedMember
45-
arm._send_joint_trajectory([position_array], timeout=rospy.Duration(0))
40+
def send_goal(pose_goal, wait_for_motion_done=True):
41+
arm.send_goal(pose_goal, timeout=0.0)
4642
if wait_for_motion_done:
4743
arm.wait_for_motion_done()
4844

4945
def send_gripper_goal(open_close_string, wait_for_motion_done=True):
5046
arm.gripper.send_goal(open_close_string)
5147

5248
@cb_interface(outcomes=["done"], input_keys=["item_picked"])
53-
def _pre_place(user_data):
49+
def _place(user_data):
5450
item_name = user_data["item_picked"]
5551
rospy.loginfo(f"Preplacing {item_name}...")
5652

@@ -59,57 +55,52 @@ def _pre_place(user_data):
5955
robot.head.look_up()
6056
robot.head.wait_for_motion_done()
6157

62-
send_joint_goal(JOINTS_PRE_PRE_PLACE)
58+
item_place_pose = get_item_place_pose(user_data["item_picked"])
59+
place_fs = FrameStamped(item_place_pose, rospy.Time(0), table_id)
6360

64-
if item_name in ["milk_carton", "cereal_box"]:
65-
send_joint_goal(JOINTS_PRE_PLACE_HORIZONTAL)
66-
else:
67-
send_joint_goal(JOINTS_PRE_PLACE_VERTICAL)
61+
pre_place_fs = copy.deepcopy(place_fs)
62+
pre_place_fs.frame.p.z(place_fs.frame.p.z() + 0.1)
6863

69-
return "done"
70-
71-
@cb_interface(outcomes=["done"], input_keys=["item_picked"])
72-
def _align_with_table(user_data):
73-
item_placement_vector = ITEM_VECTOR_DICT[user_data["item_picked"]]
74-
item_frame = item_vector_to_item_frame(item_placement_vector)
64+
post_place_fs = copy.deepcopy(place_fs)
65+
post_place_fs.frame.p.z(place_fs.frame.p.z() + 0.2)
7566

76-
goal_pose = item_frame_to_pose(item_frame, table_id)
77-
rospy.loginfo("Placing {} at {}".format(user_data["item_picked"], goal_pose))
67+
rospy.loginfo("Pre Placing...")
68+
send_goal(pre_place_fs)
7869
robot.head.look_down()
79-
ControlToPose(robot, goal_pose, ControlParameters(0.5, 1.0, 0.3, 0.3, 0.3, 0.02, 0.1)).execute({})
80-
return "done"
70+
robot.head.look_up()
71+
robot.head.wait_for_motion_done()
8172

82-
@cb_interface(outcomes=["done"], input_keys=["item_picked"])
83-
def _place_and_retract(user_data):
8473
rospy.loginfo("Placing...")
85-
item_name = user_data["item_picked"]
86-
if item_name in ["milk_carton"]:
87-
send_joint_goal(JOINTS_PLACE_HORIZONTAL_MILK)
88-
elif item_name in ["milk_carton", "cereal_box"]:
89-
send_joint_goal(JOINTS_PLACE_HORIZONTAL)
90-
else:
91-
send_joint_goal(JOINTS_PLACE_VERTICAL)
92-
93-
rospy.loginfo("Dropping...")
74+
send_goal(place_fs)
9475
send_gripper_goal("open")
95-
robot.head.look_up()
96-
robot.head.wait_for_motion_done()
9776

98-
if item_name != "cereal_box":
99-
rospy.loginfo("Retract...")
100-
send_joint_goal(JOINTS_RETRACT, wait_for_motion_done=False)
77+
if item_name != "cereal_box" or self.retract:
78+
rospy.loginfo("Retracting...")
79+
send_goal(post_place_fs)
10180
robot.base.force_drive(-0.1, 0, 0, 3) # Drive backwards at 0.1m/s for 3s, so 30cm
10281
send_gripper_goal("close", wait_for_motion_done=False)
10382
arm.send_joint_goal("carrying_pose")
10483

84+
#if item_name in ["milk_carton", "cereal_box"]:
85+
# send_joint_goal(JOINTS_PRE_PLACE_HORIZONTAL)
86+
#else:
87+
# send_joint_goal(JOINTS_PRE_PLACE_VERTICAL)
88+
89+
#rospy.loginfo("Placing...")
90+
#item_name = user_data["item_picked"]
91+
#if item_name in ["milk_carton"]:
92+
# send_joint_goal(JOINTS_PLACE_HORIZONTAL_MILK)
93+
#elif item_name in ["milk_carton", "cereal_box"]:
94+
# send_joint_goal(JOINTS_PLACE_HORIZONTAL)
95+
#else:
96+
# send_joint_goal(JOINTS_PLACE_VERTICAL)
97+
10598
robot.head.reset()
10699

107100
return "done"
108101

109102
with self:
110-
self.add_auto("PRE_PLACE", CBState(_pre_place), ["done"])
111-
self.add_auto("ALIGN_WITH_TABLE", CBState(_align_with_table), ["done"])
112-
self.add("PLACE_AND_RETRACT", CBState(_place_and_retract), transitions={"done": "succeeded"})
103+
self.add("PLACE", CBState(_place), {"done": "succeeded"})
113104

114105

115106
class NavigateToAndPlaceItemOnTable(StateMachine):
@@ -129,7 +120,7 @@ def __init__(self, robot, table_id, table_close_navigation_area):
129120
)
130121
StateMachine.add(
131122
"NAVIGATE_TO_TABLE_CLOSE",
132-
NavigateToSymbolic(robot, {table: table_close_navigation_area}, table),
123+
NavigateToSymbolic(robot, {table: table_close_navigation_area}, table, speak=False),
133124
transitions={
134125
"arrived": "PLACE_ITEM_ON_TABLE",
135126
"unreachable": "SAY_PICK_AWAY_THE_CHAIR",
@@ -159,12 +150,12 @@ def __init__(self, robot, table_id, table_close_navigation_area):
159150

160151
StateMachine.add(
161152
"PLACE_ITEM_ON_TABLE",
162-
PlaceItemOnTable(robot, table_id),
153+
PlaceItemOnTable(robot, table_id, retract=False),
163154
transitions={"succeeded": "succeeded", "failed": "failed"},
164155
)
165156

166157
@cb_interface(outcomes=["done"])
167-
def _publish_item_poses(marker_array_pub, items):
158+
def _publish_item_poses(user_data, marker_array_pub, items):
168159
"""
169160
Publishes item poses as a visualization marker array
170161
@@ -184,7 +175,6 @@ def _publish_item_poses(marker_array_pub, items):
184175
marker_msg.type = visualization_msgs.msg.Marker.SPHERE
185176
marker_msg.action = 0
186177
marker_msg.pose = posestamped.pose
187-
marker_msg.pose.position.z += 1.0
188178
marker_msg.scale = Vector3(0.05, 0.05, 0.05)
189179
marker_msg.color = COLOR_DICT[k]
190180
array_msg.markers.append(marker_msg)

0 commit comments

Comments
 (0)