00001
00002
00003 PKG = 'move_arm'
00004
00005 import roslib; roslib.load_manifest(PKG)
00006 import rospy
00007 import planning_environment_msgs.srv
00008 import sys
00009 import unittest
00010 import actionlib
00011 import actionlib_msgs
00012 import math
00013
00014 import sensor_msgs.msg
00015 import mapping_msgs.msg
00016 from mapping_msgs.msg import CollisionObject, AttachedCollisionObject
00017 from motion_planning_msgs.msg import CollisionOperation
00018 from geometric_shapes_msgs.msg import Shape
00019 from geometry_msgs.msg import Pose, PointStamped
00020 from move_arm_msgs.msg import MoveArmGoal, MoveArmAction
00021 from tf import TransformListener
00022 from motion_planning_msgs.msg import JointConstraint
00023
00024 class TestMotionExecutionBuffer(unittest.TestCase):
00025
00026 def setUp(self):
00027
00028 self.tf = TransformListener()
00029
00030 self.move_arm_action_client = actionlib.SimpleActionClient("move_right_arm", MoveArmAction)
00031
00032
00033
00034 att_pub = rospy.Publisher('attached_collision_object', AttachedCollisionObject)
00035 obj_pub = rospy.Publisher('collision_object',CollisionObject)
00036
00037 rospy.init_node('test_motion_execution_buffer')
00038
00039
00040 rospy.sleep(5.)
00041
00042 obj1 = CollisionObject()
00043
00044 obj1.header.stamp = rospy.Time.now()-rospy.Duration(.1)
00045 obj1.header.frame_id = "base_footprint"
00046 obj1.id = "obj2";
00047 obj1.operation.operation = mapping_msgs.msg.CollisionObjectOperation.ADD
00048 obj1.shapes = [Shape() for _ in range(3)]
00049 obj1.poses = [Pose() for _ in range(3)]
00050
00051 obj1.shapes[0].type = Shape.BOX
00052 obj1.shapes[0].dimensions = [float() for _ in range(3)]
00053 obj1.shapes[0].dimensions[0] = .5
00054 obj1.shapes[0].dimensions[1] = 1.0
00055 obj1.shapes[0].dimensions[2] = .2
00056 obj1.poses[0].position.x = .95
00057 obj1.poses[0].position.y = -.25
00058 obj1.poses[0].position.z = .62
00059 obj1.poses[0].orientation.x = 0
00060 obj1.poses[0].orientation.y = 0
00061 obj1.poses[0].orientation.z = 0
00062 obj1.poses[0].orientation.w = 1
00063
00064 obj1.shapes[2].type = Shape.BOX
00065 obj1.shapes[2].dimensions = [float() for _ in range(3)]
00066 obj1.shapes[2].dimensions[0] = .5
00067 obj1.shapes[2].dimensions[1] = .1
00068 obj1.shapes[2].dimensions[2] = 1.0
00069 obj1.poses[2].position.x = .95
00070 obj1.poses[2].position.y = -.14
00071 obj1.poses[2].position.z = 1.2
00072 obj1.poses[2].orientation.x = 0
00073 obj1.poses[2].orientation.y = 0
00074 obj1.poses[2].orientation.z = 0
00075 obj1.poses[2].orientation.w = 1
00076
00077 obj1.shapes[1].type = Shape.BOX
00078 obj1.shapes[1].dimensions = [float() for _ in range(3)]
00079 obj1.shapes[1].dimensions[0] = .5
00080 obj1.shapes[1].dimensions[1] = .1
00081 obj1.shapes[1].dimensions[2] = 1.0
00082 obj1.poses[1].position.x = .95
00083 obj1.poses[1].position.y = .12
00084 obj1.poses[1].position.z = 1.2
00085 obj1.poses[1].orientation.x = 0
00086 obj1.poses[1].orientation.y = 0
00087 obj1.poses[1].orientation.z = 0
00088 obj1.poses[1].orientation.w = 1
00089
00090 obj_pub.publish(obj1)
00091
00092 att_object = AttachedCollisionObject()
00093 att_object.object.header.stamp = rospy.Time.now()
00094 att_object.object.header.frame_id = "r_gripper_r_finger_tip_link"
00095 att_object.link_name = "r_gripper_r_finger_tip_link"
00096 att_object.object.operation.operation = mapping_msgs.msg.CollisionObjectOperation.ADD
00097 att_object.object = CollisionObject();
00098
00099 att_object.object.header.stamp = rospy.Time.now()
00100 att_object.object.header.frame_id = "r_gripper_r_finger_tip_link"
00101 att_object.object.id = "pole"
00102 att_object.object.shapes = [Shape() for _ in range(1)]
00103 att_object.object.shapes[0].type = Shape.CYLINDER
00104 att_object.object.shapes[0].dimensions = [float() for _ in range(2)]
00105 att_object.object.shapes[0].dimensions[0] = .02
00106 att_object.object.shapes[0].dimensions[1] = .1
00107 att_object.object.poses = [Pose() for _ in range(1)]
00108 att_object.object.poses[0].position.x = -.02
00109 att_object.object.poses[0].position.y = .04
00110 att_object.object.poses[0].position.z = 0
00111 att_object.object.poses[0].orientation.x = 0
00112 att_object.object.poses[0].orientation.y = 0
00113 att_object.object.poses[0].orientation.z = 0
00114 att_object.object.poses[0].orientation.w = 1
00115
00116 att_pub.publish(att_object)
00117
00118 rospy.sleep(5.0)
00119
00120 def testMotionExecutionBuffer(self):
00121
00122 global padd_name
00123 global extra_buffer
00124
00125
00126 allow_padd = .05
00127
00128
00129 joint_names = ['%s_%s' % ('r', j) for j in ['shoulder_pan_joint', 'shoulder_lift_joint', 'upper_arm_roll_joint', 'elbow_flex_joint', 'forearm_roll_joint', 'wrist_flex_joint', 'wrist_roll_joint']]
00130 goal = MoveArmGoal()
00131
00132 goal.motion_plan_request.goal_constraints.joint_constraints = [JointConstraint() for i in range(len(joint_names))]
00133
00134 goal.motion_plan_request.group_name = "right_arm"
00135 goal.motion_plan_request.num_planning_attempts = 1
00136 goal.motion_plan_request.allowed_planning_time = rospy.Duration(5.)
00137 goal.motion_plan_request.planner_id = ""
00138 goal.planner_service_name = "chomp_planner_longrange/plan_path"
00139 goal.disable_collision_monitoring = True;
00140
00141 r = rospy.Rate(10)
00142
00143 goal.motion_plan_request.goal_constraints.joint_constraints = [JointConstraint() for i in range(len(joint_names))]
00144 for z in range(6):
00145 for i in range(len(joint_names)):
00146 goal.motion_plan_request.goal_constraints.joint_constraints[i].joint_name = joint_names[i]
00147 goal.motion_plan_request.goal_constraints.joint_constraints[i].position = 0.0
00148 goal.motion_plan_request.goal_constraints.joint_constraints[i].tolerance_above = 0.08
00149 goal.motion_plan_request.goal_constraints.joint_constraints[i].tolerance_below = 0.08
00150
00151 if(z%2==0):
00152 goal.motion_plan_request.goal_constraints.joint_constraints[0].position = -1.0
00153 goal.motion_plan_request.goal_constraints.joint_constraints[3].position = -0.2
00154 goal.motion_plan_request.goal_constraints.joint_constraints[5].position = -0.2
00155 else:
00156 goal.motion_plan_request.goal_constraints.joint_constraints[0].position = .22
00157 goal.motion_plan_request.goal_constraints.joint_constraints[1].position = .51
00158 goal.motion_plan_request.goal_constraints.joint_constraints[2].position = .05
00159 goal.motion_plan_request.goal_constraints.joint_constraints[3].position = -0.41
00160 goal.motion_plan_request.goal_constraints.joint_constraints[4].position = -.06
00161 goal.motion_plan_request.goal_constraints.joint_constraints[5].position = -.1
00162 goal.motion_plan_request.goal_constraints.joint_constraints[6].position = 0.0
00163
00164 for x in range(3):
00165
00166 self.move_arm_action_client.send_goal(goal)
00167
00168 while True:
00169 cur_state = self.move_arm_action_client.get_state()
00170 if(cur_state != actionlib_msgs.msg.GoalStatus.ACTIVE and
00171 cur_state != actionlib_msgs.msg.GoalStatus.PENDING):
00172 break
00173 r.sleep()
00174
00175 end_state = self.move_arm_action_client.get_state()
00176
00177 if(end_state == actionlib_msgs.msg.GoalStatus.SUCCEEDED): break
00178
00179 final_state = self.move_arm_action_client.get_state()
00180
00181 self.assertEqual(final_state, actionlib_msgs.msg.GoalStatus.SUCCEEDED)
00182
00183 if __name__ == '__main__':
00184
00185 import rostest
00186 rostest.unitrun('test_motion_execution_buffer', 'test_motion_execution_buffer', TestMotionExecutionBuffer)
00187
00188
00189