8 from visualization_msgs.msg
import Marker, MarkerArray
9 from geometry_msgs.msg
import Pose
13 from control_msgs.msg
import (
14 FollowJointTrajectoryAction,
15 FollowJointTrajectoryGoal,
16 JointTrajectoryControllerState
18 from trajectory_msgs.msg
import JointTrajectoryPoint
21 import moveit_commander
23 from tf.transformations
import quaternion_from_euler
24 from control_msgs.msg
import GripperCommandAction, GripperCommandGoal
30 FollowJointTrajectoryAction)
31 self.
_client.wait_for_server(rospy.Duration(5.0))
32 if not self.
_client.wait_for_server(rospy.Duration(5.0)):
33 rospy.logerr(
"Action Server Not Found")
34 rospy.signal_shutdown(
"Action Server not found")
38 def set_angle(self, yaw_angle, pitch_angle, goal_secs=1.0e-9):
40 goal = FollowJointTrajectoryGoal()
41 goal.trajectory.joint_names = [
"neck_yaw_joint",
"neck_pitch_joint"]
43 yawpoint = JointTrajectoryPoint()
44 yawpoint.positions.append(yaw_angle)
45 yawpoint.positions.append(pitch_angle)
46 yawpoint.time_from_start = rospy.Duration(goal_secs)
47 goal.trajectory.points.append(yawpoint)
50 self.
_client.wait_for_result(rospy.Duration(0.1))
51 return self.
_client.get_result()
64 self.
_marker_sub = rospy.Subscriber(
"/sciurus17/example/markers",
67 self.
_right_arm = moveit_commander.MoveGroupCommander(
"r_arm_waist_group")
68 self.
_right_arm.set_max_velocity_scaling_factor(0.1)
72 self.
_left_arm = moveit_commander.MoveGroupCommander(
"l_arm_waist_group")
73 self.
_left_arm.set_max_velocity_scaling_factor(0.1)
99 if marker.pose.position.z < lowest_z:
101 lowest_pose = marker.pose
102 lowest_z = marker.pose.position.z
103 lowest_pose.position.z += marker.scale.z * 0.5
111 highest_pose = Pose()
113 for marker
in self.
_markers.markers:
114 if marker.pose.position.z > highest_z:
116 highest_pose = marker.pose
117 highest_z = marker.pose.position.z
118 highest_pose.position.z += marker.scale.z * 0.5
126 q = quaternion_from_euler(3.14/2.0, 0.0, 0.0)
127 target_pose.orientation.x = q[0]
128 target_pose.orientation.y = q[1]
129 target_pose.orientation.z = q[2]
130 target_pose.orientation.w = q[3]
135 q = quaternion_from_euler(-3.14/2.0, 0.0, 0.0)
136 target_pose.orientation.x = q[0]
137 target_pose.orientation.y = q[1]
138 target_pose.orientation.z = q[2]
139 target_pose.orientation.w = q[3]
140 self.
_left_arm.set_pose_target(target_pose)
148 self.
_right_arm.set_named_target(
"r_arm_waist_init_pose")
151 self.
_left_arm.set_named_target(
"l_arm_waist_init_pose")
165 return self.
_left_gripper.wait_for_result(rospy.Duration(1.0))
190 rospy.loginfo(
"PICK UP")
197 rospy.logwarn(
"NO OBJECTS")
203 if object_pose.position.y < 0:
205 rospy.loginfo(
"Set right arm")
208 rospy.loginfo(
"Set left arm")
214 APPROACH_OFFSET = 0.10
215 PREPARE_OFFSET = 0.06
220 target_pose.position.x = object_pose.position.x
221 target_pose.position.y = object_pose.position.y
222 target_pose.position.z = object_pose.position.z
225 target_pose.position.z = object_pose.position.z + APPROACH_OFFSET
227 rospy.logwarn(
"Approach failed")
233 target_pose.position.z = object_pose.position.z + PREPARE_OFFSET
235 rospy.logwarn(
"Preparation grasping failed")
242 rospy.logwarn(
"Grasping failed")
247 target_pose.position.z = object_pose.position.z + LEAVE_OFFSET
263 def place_on(self, check_result, target_x=0.3, target_y=0):
265 rospy.loginfo(
"PLACE on :" + str(target_x) +
", " + str(target_y))
270 rospy.logwarn(
"NO ARM SELECTED")
274 APPROACH_OFFSET = 0.14
275 PREPARE_OFFSET = 0.10
280 target_pose.position.x = target_x
281 target_pose.position.y = target_y
282 target_pose.position.z = 0.0
285 target_pose.position.z = APPROACH_OFFSET
287 rospy.logwarn(
"Approach failed")
292 target_pose.position.z = PREPARE_OFFSET
294 rospy.logwarn(
"Preparation release failed")
301 target_pose.position.z = LEAVE_OFFSET
318 rospy.loginfo(
"PLACE ON HIGHEST OBJECT")
323 rospy.logwarn(
"NO ARM SELECTED")
329 rospy.logwarn(
"NO OBJECTS")
335 APPROACH_OFFSET = 0.15
336 PREPARE_OFFSET = 0.11
341 target_pose.position.x = object_pose.position.x
342 target_pose.position.y = object_pose.position.y
343 target_pose.position.z = object_pose.position.z
346 target_pose.position.z = object_pose.position.z + APPROACH_OFFSET
348 rospy.logwarn(
"Approach failed")
353 target_pose.position.z = object_pose.position.z + PREPARE_OFFSET
355 rospy.logwarn(
"Preparation release failed")
362 target_pose.position.z = object_pose.position.z + LEAVE_OFFSET
379 neck.set_angle(math.radians(0), math.radians(0), 3.0)
381 stacker.initialize_arms()
387 rospy.on_shutdown(hook_shutdown)
390 INITIAL_YAW_ANGLE = 0
391 INITIAL_PITCH_ANGLE = -70
393 neck.set_angle(math.radians(INITIAL_YAW_ANGLE), math.radians(INITIAL_PITCH_ANGLE))
398 current_mode = PICKING_MODE
407 while not rospy.is_shutdown():
409 if current_mode == PICKING_MODE:
411 if stacker.get_num_of_markers() > 0:
413 if stacker.pick_up(CHECK_RESULT)
is False:
414 rospy.logwarn(
"PickUp Failed")
416 rospy.loginfo(
"PickUp Succeeded")
417 current_mode = PLACE_MODE
419 rospy.loginfo(
"NO MARKERS")
422 elif current_mode == PLACE_MODE:
424 if stacker.get_num_of_markers() == 0:
426 if stacker.place_on(CHECK_RESULT, PLACE_X, PLACE_Y)
is False:
427 rospy.logwarn(
"Place Failed")
429 rospy.loginfo(
"Place Succeeded")
433 if stacker.place_on_highest_object(CHECK_RESULT)
is False:
434 rospy.logwarn(
"Place Failed")
436 rospy.loginfo(
"Place Succeeded")
439 current_mode = PICKING_MODE
444 if __name__ ==
'__main__':
445 rospy.init_node(
"box_stacking_example")
def _move_arm_to_init_pose(self, current_arm)
def _get_highest_object_pose(self)
def pick_up(self, check_result)
def place_on(self, check_result, target_x=0.3, target_y=0)
def _close_gripper(self, current_arm)
def _open_gripper(self, current_arm)
def set_angle(self, yaw_angle, pitch_angle, goal_secs=1.0e-9)
def place_on_highest_object(self, check_result)
def _markers_callback(self, msg)
def initialize_arms(self)
def _move_arm(self, current_arm, target_pose)
def get_num_of_markers(self)
def _get_lowest_object_pose(self)