22 from visualization_msgs.msg
import Marker, MarkerArray
23 from geometry_msgs.msg
import Pose
27 from control_msgs.msg
import (
28 FollowJointTrajectoryAction,
29 FollowJointTrajectoryGoal,
30 JointTrajectoryControllerState
32 from trajectory_msgs.msg
import JointTrajectoryPoint
35 import moveit_commander
37 from tf.transformations
import quaternion_from_euler
38 from control_msgs.msg
import GripperCommandAction, GripperCommandGoal
44 FollowJointTrajectoryAction)
45 self.
_client.wait_for_server(rospy.Duration(5.0))
46 if not self.
_client.wait_for_server(rospy.Duration(5.0)):
47 rospy.logerr(
"Action Server Not Found")
48 rospy.signal_shutdown(
"Action Server not found")
52 def set_angle(self, yaw_angle, pitch_angle, goal_secs=1.0e-9):
55 goal = FollowJointTrajectoryGoal()
56 goal.trajectory.joint_names = [
"neck_yaw_joint",
"neck_pitch_joint"]
58 yawpoint = JointTrajectoryPoint()
59 yawpoint.positions.append(yaw_angle)
60 yawpoint.positions.append(pitch_angle)
61 yawpoint.time_from_start = rospy.Duration(goal_secs)
62 goal.trajectory.points.append(yawpoint)
65 self.
_client.wait_for_result(rospy.Duration(0.1))
66 return self.
_client.get_result()
80 self.
_marker_sub = rospy.Subscriber(
"/sciurus17/example/markers",
83 self.
_right_arm = moveit_commander.MoveGroupCommander(
"r_arm_waist_group")
84 self.
_right_arm.set_max_velocity_scaling_factor(0.1)
88 self.
_left_arm = moveit_commander.MoveGroupCommander(
"l_arm_waist_group")
89 self.
_left_arm.set_max_velocity_scaling_factor(0.1)
116 for marker
in self.
_markers.markers:
117 if marker.pose.position.z < lowest_z:
119 lowest_pose = marker.pose
120 lowest_z = marker.pose.position.z
121 lowest_pose.position.z += marker.scale.z * 0.5
130 highest_pose = Pose()
132 for marker
in self.
_markers.markers:
133 if marker.pose.position.z > highest_z:
136 highest_pose = marker.pose
137 highest_z = marker.pose.position.z
140 highest_pose.position.z += marker.scale.z * 0.5
149 q = quaternion_from_euler(3.14/2.0, 0.0, 0.0)
150 target_pose.orientation.x = q[0]
151 target_pose.orientation.y = q[1]
152 target_pose.orientation.z = q[2]
153 target_pose.orientation.w = q[3]
159 q = quaternion_from_euler(-3.14/2.0, 0.0, 0.0)
160 target_pose.orientation.x = q[0]
161 target_pose.orientation.y = q[1]
162 target_pose.orientation.z = q[2]
163 target_pose.orientation.w = q[3]
164 self.
_left_arm.set_pose_target(target_pose)
172 self.
_right_arm.set_named_target(
"r_arm_waist_init_pose")
175 self.
_left_arm.set_named_target(
"l_arm_waist_init_pose")
189 return self.
_left_gripper.wait_for_result(rospy.Duration(1.0))
215 rospy.loginfo(
"PICK UP")
225 rospy.logwarn(
"NO OBJECTS")
232 if object_pose.position.y < 0:
234 rospy.loginfo(
"Set right arm")
237 rospy.loginfo(
"Set left arm")
243 APPROACH_OFFSET = 0.10
244 PREPARE_OFFSET = 0.06
250 target_pose.position.x = object_pose.position.x
251 target_pose.position.y = object_pose.position.y
252 target_pose.position.z = object_pose.position.z
256 target_pose.position.z = object_pose.position.z + APPROACH_OFFSET
258 rospy.logwarn(
"Approach failed")
265 target_pose.position.z = object_pose.position.z + PREPARE_OFFSET
267 rospy.logwarn(
"Preparation grasping failed")
275 rospy.logwarn(
"Grasping failed")
281 target_pose.position.z = object_pose.position.z + LEAVE_OFFSET
299 def place_on(self, check_result, target_x=0.3, target_y=0):
302 rospy.loginfo(
"PLACE on :" + str(target_x) +
", " + str(target_y))
308 rospy.logwarn(
"NO ARM SELECTED")
313 APPROACH_OFFSET = 0.14
314 PREPARE_OFFSET = 0.10
320 target_pose.position.x = target_x
321 target_pose.position.y = target_y
322 target_pose.position.z = 0.0
326 target_pose.position.z = APPROACH_OFFSET
328 rospy.logwarn(
"Approach failed")
334 target_pose.position.z = PREPARE_OFFSET
336 rospy.logwarn(
"Preparation release failed")
345 target_pose.position.z = LEAVE_OFFSET
365 rospy.loginfo(
"PLACE ON HIGHEST OBJECT")
371 rospy.logwarn(
"NO ARM SELECTED")
378 rospy.logwarn(
"NO OBJECTS")
385 APPROACH_OFFSET = 0.15
386 PREPARE_OFFSET = 0.11
392 target_pose.position.x = object_pose.position.x
393 target_pose.position.y = object_pose.position.y
394 target_pose.position.z = object_pose.position.z
398 target_pose.position.z = object_pose.position.z + APPROACH_OFFSET
400 rospy.logwarn(
"Approach failed")
406 target_pose.position.z = object_pose.position.z + PREPARE_OFFSET
408 rospy.logwarn(
"Preparation release failed")
417 target_pose.position.z = object_pose.position.z + LEAVE_OFFSET
437 neck.set_angle(math.radians(0), math.radians(0), 3.0)
440 stacker.initialize_arms()
446 rospy.on_shutdown(hook_shutdown)
450 INITIAL_YAW_ANGLE = 0
451 INITIAL_PITCH_ANGLE = -70
454 neck.set_angle(math.radians(INITIAL_YAW_ANGLE), math.radians(INITIAL_PITCH_ANGLE))
458 current_mode = PICKING_MODE
469 while not rospy.is_shutdown():
470 if current_mode == PICKING_MODE:
471 if stacker.get_num_of_markers() > 0:
474 if stacker.pick_up(CHECK_RESULT)
is False:
475 rospy.logwarn(
"PickUp Failed")
477 rospy.loginfo(
"PickUp Succeeded")
478 current_mode = PLACE_MODE
480 rospy.loginfo(
"NO MARKERS")
483 elif current_mode == PLACE_MODE:
484 if stacker.get_num_of_markers() == 0:
487 if stacker.place_on(CHECK_RESULT, PLACE_X, PLACE_Y)
is False:
488 rospy.logwarn(
"Place Failed")
490 rospy.loginfo(
"Place Succeeded")
495 if stacker.place_on_highest_object(CHECK_RESULT)
is False:
496 rospy.logwarn(
"Place Failed")
498 rospy.loginfo(
"Place Succeeded")
500 current_mode = PICKING_MODE
505 if __name__ ==
'__main__':
506 rospy.init_node(
"box_stacking_example")