challenge_carry_my_luggage
carry_my_luggage.py
Go to the documentation of this file.
1 #!/usr/bin/env python3
2 import os
3 import PyKDL as kdl
4 
5 import robot_smach_states.util.designators as ds
6 from ed.entity import Entity
7 from ed.shape import RightPrism
8 from pykdl_ros import FrameStamped
9 from robocup_knowledge import load_knowledge
10 from robot_skills.arm import arms
11 from robot_skills.simulation.sim_mode import is_sim_mode
12 from robot_smach_states.human_interaction import AskYesNo, AskYesNoPicoVoice, Say
13 from robot_smach_states.manipulation import HandoverToHuman
14 from robot_smach_states.navigation import FollowOperator, NavigateToWaypoint, NavigateToPose
15 from robot_smach_states.utility import Initialize, SetInitialPose
16 from robot_smach_states.utility import WaitTime
17 from smach import StateMachine, cb_interface, CBState
18 
19 import rospy
20 
21 challenge_knowledge = load_knowledge("challenge_carry_my_luggage")
22 
23 STARTING_POINT = challenge_knowledge.starting_point
24 
25 
26 @cb_interface(outcomes=["done"])
27 def place(userdata, designator, robot):
28  entity_id = "bag"
29  pose = FrameStamped(
30  frame=kdl.Frame(kdl.Rotation.RPY(0.0, 0.0, 0.0), kdl.Vector(1.0, 3.0, 0.3)),
31  stamp=rospy.Time.now(),
32  frame_id="map",
33  )
34  robot.ed.update_entity(uuid=entity_id, frame_stamped=pose)
35  shape = RightPrism(
36  [kdl.Vector(0, 0, 0), kdl.Vector(0, 0.05, 0), kdl.Vector(0.05, 0.05, 0), kdl.Vector(0.05, 0, 0)], -0.1, 0.1
37  )
38  item = Entity(entity_id, "bag", pose.header.frame_id, pose.frame, shape, None, None, rospy.Time.now())
39  designator.write(item)
40  return "done"
41 
42 
43 @cb_interface(outcomes=["done"])
44 def kill_global_planner(userdata, robot):
45  rospy.set_param(f"/{robot.robot_name}/global_planner/global_costmap/track_unknown_space", True)
46  os.system(f"rosnode kill /{robot.robot_name}/global_planner")
47  rospy.sleep(3.0)
48  return "done"
49 
50 
51 class CarryMyLuggage(StateMachine):
52  def __init__(self, robot):
53  """
54 
55  :param robot:
56  """
57  StateMachine.__init__(self, outcomes=["Done", "Aborted"])
58  self.robot = robot
59 
60  start_pose = self.robot.base.get_location()
61  start_x = start_pose.frame.p.x()
62  start_y = start_pose.frame.p.y()
63  start_rz = start_pose.frame.M.GetRPY()[2]
64 
65  self.entity_designator = ds.VariableDesignator(resolve_type=Entity)
66  self.arm_designator = ds.UnoccupiedArmDesignator(
67  robot,
68  {
69  "required_goals": ["reset", "handover_to_human", "carrying_pose"],
70  "required_gripper_types": [arms.GripperTypes.GRASPING],
71  },
72  ).lockable()
73  self.waypoint_designator = ds.EntityByIdDesignator(robot, uuid=STARTING_POINT)
74  # noinspection PyProtectedMember
75  self._arm = robot.get_arm()._arm
76 
77  with self:
78  StateMachine.add(
79  "INITIALIZE",
80  Initialize(self.robot),
81  transitions={"initialized": "MOVE_CUSTOM_CARRY", "abort": "MOVE_CUSTOM_CARRY"},
82  )
83 
84  # StateMachine.add(
85  # "SET_INITIAL_POSE",
86  # SetInitialPose(self.robot, STARTING_POINT),
87  # transitions={
88  # "done": "MOVE_CUSTOM_CARRY", # Choice here; try to pick up the bag or not: MOVE_CUSTOM_CARRY or POINT_BAG
89  # "preempted": "MOVE_CUSTOM_CARRY", # todo: change this?
90  # "error": "MOVE_CUSTOM_CARRY", # Choice here; try to pick up the bag or not: MOVE_CUSTOM_CARRY or POINT_BAG
91  # },
92  # )
93 
94  # Choice 1; Do no try to pick up the bag
95  @cb_interface(outcomes=["done"])
96  def move_to_custom_carry_pose(_):
97  p = [0.15, 0, -1.1, -1.37, 0]
98  # noinspection PyProtectedMember
99  self._arm._send_joint_trajectory([p], timeout=0)
100  self._arm.wait_for_motion_done()
101  self._arm.gripper.send_goal('open')
102  self._arm.wait_for_motion_done()
103  return "done"
104 
105  self.add("MOVE_CUSTOM_CARRY", CBState(move_to_custom_carry_pose), transitions={"done": "ASK_BAG_HANDOVER"})
106 
107  StateMachine.add(
108  "ASK_BAG_HANDOVER",
109  Say(
110  self.robot,
111  ["I am unable to pick up the bag, please put it in my gripper"],
112  block=True,
113  look_at_standing_person=True,
114  ),
115  transitions={
116  "spoken": "WAIT_FOR_OPERATOR",
117  },
118  )
119 
120  StateMachine.add(
121  "WAIT_FOR_OPERATOR",
122  WaitTime(10),
123  transitions={
124  "waited": "CLOSE_GRIPPER",
125  "preempted": "CLOSE_GRIPPER"
126  },
127  )
128 
129  @cb_interface(outcomes=["done"])
130  def gripper_close(_):
131  self._arm.gripper.send_goal('close')
132  self._arm.wait_for_motion_done()
133  return "done"
134 
135  self.add("CLOSE_GRIPPER", CBState(gripper_close),
136  transitions={"done": "SAY_BAG_HANDOVER_SUCCESS"})
137 
138  # Old behavior with a handover
139  # StateMachine.add(
140  # "BAG_HANDOVER_FROM_HUMAN",
141  # HandoverFromHuman(self.robot, self.arm_designator, "bag", None, 15),
142  # transitions={
143  # "succeeded": "SAY_BAG_HANDOVER_SUCCESS",
144  # "failed": "SAY_BAG_HANDOVER_FAILED",
145  # "timeout": "SAY_BAG_HANDOVER_FAILED",
146  # },
147  # )
148  # StateMachine.add(
149  # "SAY_BAG_HANDOVER_FAILED",
150  # Say(
151  # self.robot,
152  # ["It seems the handing over failed... Let me just accompany you to your car!"],
153  # block=True,
154  # look_at_standing_person=True,
155  # ),
156  # transitions={
157  # "spoken": "FOLLOW_OPERATOR",
158  # },
159  # )
160 
161  StateMachine.add(
162  "SAY_BAG_HANDOVER_SUCCESS",
163  Say(
164  self.robot,
165  ["Lets go to your car! I will follow you!"],
166  block=True,
167  look_at_standing_person=True,
168  ),
169  transitions={
170  "spoken": "FOLLOW_OPERATOR",
171  },
172  )
173 
174  # # Choice 2: Try to pick up the bag
175  # StateMachine.add(
176  # "POINT_BAG",
177  # Say(
178  # self.robot,
179  # ["Please point at the bag you want me to carry and await further instructions!"],
180  # block=True,
181  # look_at_standing_person=True,
182  # ),
183  # transitions={
184  # "spoken": "GET_ENTITY_POSE",
185  # },
186  # )
187  #
188  # # workaround to remove dependency from simulating raytracing
189  # StateMachine.add(
190  # "GET_ENTITY_POSE",
191  # CBState(place, cb_args=[self.entity_designator.writeable, self.robot]),
192  # transitions={"done": "GRAB_BAG"},
193  # )
194  #
195  # # StateMachine.add(
196  # # 'GET_ENTITY_POSE',
197  # # GetFurnitureFromOperatorPose(self.robot, self.entity_designator.writeable),
198  # # transitions={'succeeded': 'GRAB_BAG',
199  # # 'failed': 'GRAB_BAG'} #todo: change this?
200  # # )
201  #
202  # StateMachine.add(
203  # "GRAB_BAG",
204  # Grab(self.robot, self.entity_designator, self.arm_designator),
205  # transitions={"done": "FOLLOW_OPERATOR", "failed": "SAY_BAG_GRAB_FAILED"},
206  # )
207  #
208  # StateMachine.add(
209  # "SAY_BAG_GRAB_FAILED",
210  # Say(
211  # self.robot,
212  # ["I'm unable to grab your bag... Let me just accompany you to your car!"],
213  # block=True,
214  # look_at_standing_person=True,
215  # ),
216  # transitions={
217  # "spoken": "FOLLOW_OPERATOR", # ToDo: Change this to handover bag handover?
218  # },
219  # )
220 
221  # End of choices
222  StateMachine.add(
223  "FOLLOW_OPERATOR",
224  FollowOperator(self.robot, operator_timeout=30, ask_follow=True, learn_face=False, replan=True),
225  transitions={
226  "stopped": "ASK_FOR_TASK",
227  "lost_operator": "ASK_FOR_TASK",
228  "no_operator": "ASK_FOR_TASK",
229  },
230  )
231 
232  StateMachine.add(
233  "ASK_FOR_TASK",
234  Say(
235  self.robot,
236  ["Are we at the car already?"],
237  block=True,
238  look_at_standing_person=True,
239  ),
240  transitions={
241  "spoken": "WAIT_FOR_TASK",
242  },
243  )
244 
245  if is_sim_mode():
246  StateMachine.add(
247  "WAIT_FOR_TASK",
248  AskYesNo(self.robot),
249  transitions={"yes": "HANDOVER_TO_HUMAN", "no": "FOLLOW_OPERATOR", "no_result": "FOLLOW_OPERATOR"}, #todo this last one can create an infinite loop
250  )
251  else:
252  StateMachine.add(
253  "WAIT_FOR_TASK",
254  AskYesNoPicoVoice(self.robot),
255  transitions={"yes": "HANDOVER_TO_HUMAN", "no": "FOLLOW_OPERATOR", "no_result": "FOLLOW_OPERATOR"}, #ToDo this last one can create an infinite loop
256  )
257 
258  StateMachine.add(
259  "HANDOVER_TO_HUMAN",
260  HandoverToHuman(self.robot, self.arm_designator),
261  transitions={
262  "succeeded": "KILL_GLOBAL_PLANNER",
263  "failed": "KILL_GLOBAL_PLANNER", # todo change this?
264  },
265  )
266 
267  # StateMachine.add(
268  # "NAVIGATE_TO_ARENA",
269  # NavigateToWaypoint(self.robot, self.waypoint_designator),
270  # transitions={
271  # "arrived": "Done",
272  # "unreachable": "Done", # todo change this?
273  # "goal_not_defined": "Done", # todo change this?
274  # },
275  # )
276 
277  StateMachine.add(
278  "KILL_GLOBAL_PLANNER",
279  CBState(kill_global_planner, cb_args=[self.robot]),
280  transitions={"done": "NAVIGATE_TO_ARENA"},
281  )
282 
283  StateMachine.add(
284  "NAVIGATE_TO_ARENA",
285  NavigateToPose(robot=self.robot, x=start_x, y=start_y, rz=start_rz, radius=0.3),
286  transitions={
287  "arrived": "Done",
288  "unreachable": "Done", # todo change this?
289  "goal_not_defined": "Done", # todo change this?
290  },
291  )
292 
293 
294 if __name__ == "__main__":
295  from robot_skills import get_robot
296  import sys
297  import rospy
298 
299  if len(sys.argv) < 2:
300  print("Please provide robot name as argument.")
301  sys.exit(1)
302 
303  rospy.init_node("carry_my_luggage_exec")
304 
305  robot_name = sys.argv[1]
306  robot = get_robot(robot_name)
307 
308  CarryMyLuggage(robot)
challenge_carry_my_luggage.carry_my_luggage.CarryMyLuggage
Definition: carry_my_luggage.py:51
challenge_carry_my_luggage.carry_my_luggage.CarryMyLuggage.arm_designator
arm_designator
Definition: carry_my_luggage.py:66
challenge_carry_my_luggage.carry_my_luggage.CarryMyLuggage.__init__
def __init__(self, robot)
Definition: carry_my_luggage.py:52
challenge_carry_my_luggage.carry_my_luggage.CarryMyLuggage.waypoint_designator
waypoint_designator
Definition: carry_my_luggage.py:73
challenge_carry_my_luggage.carry_my_luggage.CarryMyLuggage.entity_designator
entity_designator
Definition: carry_my_luggage.py:65
challenge_carry_my_luggage.carry_my_luggage.kill_global_planner
def kill_global_planner(userdata, robot)
Definition: carry_my_luggage.py:44
challenge_carry_my_luggage.carry_my_luggage.CarryMyLuggage._arm
_arm
Definition: carry_my_luggage.py:75
challenge_carry_my_luggage.carry_my_luggage.CarryMyLuggage.robot
robot
Definition: carry_my_luggage.py:58
challenge_carry_my_luggage.carry_my_luggage.place
def place(userdata, designator, robot)
Definition: carry_my_luggage.py:27