Skip to content

Commit 27be9ca

Browse files
Use cartesian goals in serve breakfast (#1328)
2 parents a6ac652 + 982e9d5 commit 27be9ca

File tree

5 files changed

+120
-125
lines changed

5 files changed

+120
-125
lines changed

challenge_serve_breakfast/src/challenge_serve_breakfast/navigate_to_and_pick_item.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,10 @@
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
1413
# ROS
1514
from pykdl_ros import VectorStamped
16-
from robot_smach_states.human_interaction import Say
1715
from robot_smach_states.navigation import NavigateToSymbolic
1816
from robot_smach_states.util.designators import EdEntityDesignator
1917
from smach import StateMachine, cb_interface, CBState

challenge_serve_breakfast/src/challenge_serve_breakfast/navigate_to_and_place_item_on_table.py

Lines changed: 39 additions & 47 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=0.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,55 +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", "cereal_box"]:
87-
send_joint_goal(JOINTS_PLACE_HORIZONTAL_MILK)
88-
else:
89-
send_joint_goal(JOINTS_PLACE_VERTICAL)
90-
91-
rospy.loginfo("Dropping...")
74+
send_goal(place_fs)
9275
send_gripper_goal("open")
93-
robot.head.look_up()
94-
robot.head.wait_for_motion_done()
9576

96-
if item_name != "cereal_box":
97-
rospy.loginfo("Retract...")
98-
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)
9980
robot.base.force_drive(-0.1, 0, 0, 3) # Drive backwards at 0.1m/s for 3s, so 30cm
10081
send_gripper_goal("close", wait_for_motion_done=False)
10182
arm.send_joint_goal("carrying_pose")
10283

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+
10398
robot.head.reset()
10499

105100
return "done"
106101

107102
with self:
108-
self.add_auto("PRE_PLACE", CBState(_pre_place), ["done"])
109-
self.add_auto("ALIGN_WITH_TABLE", CBState(_align_with_table), ["done"])
110-
self.add("PLACE_AND_RETRACT", CBState(_place_and_retract), transitions={"done": "succeeded"})
103+
self.add("PLACE", CBState(_place), {"done": "succeeded"})
111104

112105

113106
class NavigateToAndPlaceItemOnTable(StateMachine):
@@ -157,7 +150,7 @@ def __init__(self, robot, table_id, table_close_navigation_area):
157150

158151
StateMachine.add(
159152
"PLACE_ITEM_ON_TABLE",
160-
PlaceItemOnTable(robot, table_id),
153+
PlaceItemOnTable(robot, table_id, retract=False),
161154
transitions={"succeeded": "succeeded", "failed": "failed"},
162155
)
163156

@@ -182,7 +175,6 @@ def _publish_item_poses(user_data, marker_array_pub, items):
182175
marker_msg.type = visualization_msgs.msg.Marker.SPHERE
183176
marker_msg.action = 0
184177
marker_msg.pose = posestamped.pose
185-
marker_msg.pose.position.z = 1.0
186178
marker_msg.scale = Vector3(0.05, 0.05, 0.05)
187179
marker_msg.color = COLOR_DICT[k]
188180
array_msg.markers.append(marker_msg)

challenge_serve_breakfast/src/challenge_serve_breakfast/pick_pour_place_cereal.py

Lines changed: 31 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66

77
import os
88

9-
import PyKDL
109
import rospy
10+
from pykdl_ros import FrameStamped
1111

12-
from challenge_serve_breakfast.tuning import JOINTS_POST_PICK, ITEM_VECTOR_DICT, item_vector_to_item_frame, \
13-
item_frame_to_pose, POUR_OFFSET_Y, JOINTS_PRE_POUR, JOINTS_POUR, JOINTS_PLACE_HORIZONTAL, JOINTS_RETRACT, \
14-
POUR_OFFSET_X
12+
from challenge_serve_breakfast.tuning import (
13+
get_item_pour_poses,
14+
JOINTS_POST_PICK,
15+
)
16+
from challenge_serve_breakfast.navigate_to_and_place_item_on_table import PlaceItemOnTable
1517
from robot_skills import get_robot
16-
from robot_smach_states.navigation.control_to_pose import ControlToPose, ControlParameters
1718
from smach import StateMachine, cb_interface, CBState
1819

1920

@@ -32,71 +33,52 @@ def send_joint_goal(position_array, wait_for_motion_done=True):
3233
def send_gripper_goal(open_close_string, max_torque=0.1, wait_for_motion_done=True):
3334
arm.gripper.send_goal(open_close_string, max_torque=max_torque)
3435

36+
def send_goal(pose_goal, wait_for_motion_done=True):
37+
arm.send_goal(pose_goal, timeout=0.0)
38+
if wait_for_motion_done:
39+
arm.wait_for_motion_done()
40+
3541
@cb_interface(outcomes=["done"])
3642
def _pick(_):
3743
robot.speech.speak("Lets grab some cereal", block=False)
3844
send_gripper_goal("close")
3945
send_joint_goal(JOINTS_POST_PICK)
4046
return "done"
4147

42-
@cb_interface(outcomes=["done"])
43-
def _align_pour(_):
44-
item_placement_vector = ITEM_VECTOR_DICT["cereal_box"] + PyKDL.Vector(POUR_OFFSET_X, POUR_OFFSET_Y, 0)
45-
item_frame = item_vector_to_item_frame(item_placement_vector)
46-
47-
goal_pose = item_frame_to_pose(item_frame, table_id)
48-
rospy.loginfo("Moving to pouring pose at {}".format(goal_pose))
49-
robot.head.look_down()
50-
ControlToPose(robot, goal_pose, ControlParameters(0.5, 1.0, 0.3, 0.3, 0.3, 0.02, 0.1)).execute({})
51-
return "done"
5248

5349
@cb_interface(outcomes=["done"])
5450
def _pour(_):
55-
robot.speech.speak("Hope this goes well", block=False)
56-
send_joint_goal(JOINTS_PRE_POUR)
57-
rospy.sleep(0.5)
58-
send_joint_goal(JOINTS_POUR)
59-
send_joint_goal(JOINTS_PRE_POUR)
60-
send_joint_goal(JOINTS_POST_PICK)
61-
return "done"
51+
pour_target = "bowl"
52+
item_name = "cereal"
53+
rospy.loginfo(f"pouring in {pour_target}...")
6254

63-
@cb_interface(outcomes=["done"])
64-
def _align_place(_):
65-
robot.speech.speak("Awesome", block=False)
66-
item_placement_vector = ITEM_VECTOR_DICT["cereal_box"]
67-
item_frame = item_vector_to_item_frame(item_placement_vector)
68-
69-
goal_pose = item_frame_to_pose(item_frame, table_id)
70-
rospy.loginfo("Moving to place pose at {}".format(goal_pose))
71-
robot.head.look_down()
72-
ControlToPose(robot, goal_pose, ControlParameters(0.5, 1.0, 0.3, 0.3, 0.3, 0.02, 0.1)).execute({})
73-
return "done"
55+
robot.speech.speak(f"I am going to pour the {item_name}", block=False)
7456

75-
@cb_interface(outcomes=["done"])
76-
def _place(_):
77-
robot.speech.speak("Putting back the cereal", block=False)
78-
rospy.loginfo("Placing...")
79-
send_joint_goal(JOINTS_PLACE_HORIZONTAL)
80-
send_gripper_goal("open")
8157
robot.head.look_up()
8258
robot.head.wait_for_motion_done()
8359

84-
rospy.loginfo("Retract...")
85-
send_joint_goal(JOINTS_RETRACT, wait_for_motion_done=False)
60+
item_pour_poses = get_item_pour_poses(pour_target)
61+
for pose in item_pour_poses:
62+
goal_fs = FrameStamped(pose, rospy.Time(0), table_id)
63+
rospy.loginfo("Pouring...")
64+
send_goal(goal_fs)
65+
robot.head.reset()
66+
rospy.loginfo("Retracting...")
8667
robot.base.force_drive(-0.1, 0, 0, 3) # Drive backwards at 0.1m/s for 3s, so 30cm
87-
send_gripper_goal("close", wait_for_motion_done=False)
8868
arm.send_joint_goal("carrying_pose")
69+
return "done"
8970

90-
robot.head.reset()
91-
71+
@cb_interface(outcomes=["done"], output_keys=["item_picked"])
72+
def _set_userdata(user_data):
73+
user_data["item_picked"] = "cereal_box"
9274
return "done"
9375

9476
with self:
95-
self.add("PICK", CBState(_pick), transitions={"done": "ALIGN_POUR"})
96-
self.add("ALIGN_POUR", CBState(_align_pour), transitions={"done": "POUR"})
97-
self.add("POUR", CBState(_pour), transitions={"done": "ALIGN_PLACE"})
98-
self.add("ALIGN_PLACE", CBState(_align_place), transitions={"done": "PLACE"})
99-
self.add("PLACE", CBState(_place), transitions={"done": "succeeded"})
77+
self.add("PICK", CBState(_pick), transitions={"done": "POUR"})
78+
self.add("POUR", CBState(_pour), transitions={"done": "SET_USERDATA"})
79+
self.add("SET_USERDATA", CBState(_set_userdata), transitions={"done": "PLACE"})
80+
self.add("PLACE", PlaceItemOnTable(robot, table_id), transitions={"succeeded": "succeeded",
81+
"failed": "succeeded"})
10082

10183

10284
if __name__ == "__main__":

challenge_serve_breakfast/src/challenge_serve_breakfast/serve_breakfast.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ def setup_statemachine(robot):
142142

143143
StateMachine.add(
144144
"NAVIGATE_TO_EXIT",
145-
NavigateToWaypoint(robot, EdEntityDesignator(robot, uuid=exit_id)),
145+
NavigateToWaypoint(robot, EdEntityDesignator(robot, uuid=exit_id), speak=False),
146146
transitions={
147147
"arrived": "GOODBYE",
148148
"unreachable": "GOODBYE",

0 commit comments

Comments
 (0)