00001
00002
00003 PKG = 'planning_environment'
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 math
00011
00012 import sensor_msgs.msg
00013 import mapping_msgs.msg
00014 from mapping_msgs.msg import CollisionObject
00015 from mapping_msgs.msg import AttachedCollisionObject
00016 from motion_planning_msgs.msg import CollisionOperation, ArmNavigationErrorCodes, AllowedContactSpecification, RobotState
00017 from geometric_shapes_msgs.msg import Shape
00018 from geometry_msgs.msg import Pose, PointStamped
00019 from planning_environment_msgs.srv import GetRobotState, GetStateValidity, GetRobotStateRequest, GetStateValidityRequest
00020 from tf import TransformListener
00021
00022 default_prefix = "/environment_server"
00023
00024 class TestGetStateValidity(unittest.TestCase):
00025
00026 def setUp(self):
00027
00028 rospy.init_node('test_get_base_state_validity')
00029
00030 self.tf = TransformListener()
00031
00032 self.obj_pub = rospy.Publisher('collision_object',CollisionObject,latch=True)
00033
00034 rospy.wait_for_service(default_prefix+'/get_robot_state')
00035 self.get_robot_state_server = rospy.ServiceProxy(default_prefix+'/get_robot_state', GetRobotState)
00036
00037 rospy.wait_for_service(default_prefix+'/get_state_validity')
00038 self.get_state_validity_server = rospy.ServiceProxy(default_prefix+'/get_state_validity', GetStateValidity)
00039
00040 obj1 = CollisionObject()
00041
00042 obj1.header.stamp = rospy.Time.now()
00043 obj1.header.frame_id = 'odom_combined'
00044 obj1.id = 'table'
00045 obj1.operation.operation = mapping_msgs.msg.CollisionObjectOperation.ADD
00046 obj1.shapes = [Shape() for _ in range(1)]
00047 obj1.shapes[0].type = Shape.BOX
00048 obj1.shapes[0].dimensions = [float() for _ in range(3)]
00049 obj1.shapes[0].dimensions[0] = 1.0
00050 obj1.shapes[0].dimensions[1] = 1.0
00051 obj1.shapes[0].dimensions[2] = .1
00052 obj1.poses = [Pose() for _ in range(1)]
00053 obj1.poses[0].position.x = 4.25
00054 obj1.poses[0].position.y = 0
00055 obj1.poses[0].position.z = .75
00056 obj1.poses[0].orientation.x = 0
00057 obj1.poses[0].orientation.y = 0
00058 obj1.poses[0].orientation.z = 0
00059 obj1.poses[0].orientation.w = 1
00060
00061 self.obj_pub.publish(obj1)
00062
00063 rospy.sleep(5.)
00064
00065 def test_get_base_state_validity(self):
00066
00067 state_req = GetStateValidityRequest()
00068 state_req.check_collisions = True
00069
00070
00071 res = self.get_state_validity_server.call(state_req)
00072 self.failIf(res.error_code.val != res.error_code.SUCCESS)
00073
00074
00075 state_req.robot_state.multi_dof_joint_state.joint_names.append("base_joint")
00076 state_req.robot_state.multi_dof_joint_state.frame_ids.append("odom_combined")
00077 state_req.robot_state.multi_dof_joint_state.child_frame_ids.append("base_footprint")
00078 pose = Pose()
00079 pose.position.x = 4.0
00080 pose.orientation.w = 1.0
00081 state_req.robot_state.multi_dof_joint_state.poses.append(pose)
00082 res = self.get_state_validity_server.call(state_req)
00083 self.failIf(res.error_code.val == res.error_code.SUCCESS)
00084 self.assertEqual(res.error_code.val, res.error_code.COLLISION_CONSTRAINTS_VIOLATED)
00085
00086
00087 state_req.robot_state.multi_dof_joint_state.frame_ids[0] = ""
00088 res = self.get_state_validity_server.call(state_req)
00089 self.failIf(res.error_code.val != res.error_code.SUCCESS)
00090
00091
00092 state_req.robot_state.joint_state.name.append("floating_trans_x");
00093 state_req.robot_state.joint_state.position.append(4.0);
00094 res = self.get_state_validity_server.call(state_req)
00095 self.failIf(res.error_code.val == res.error_code.SUCCESS)
00096 self.assertEqual(res.error_code.val, res.error_code.COLLISION_CONSTRAINTS_VIOLATED)
00097
00098
00099
00100
00101 state_req.robot_state.joint_state.position[0] = 3.3;
00102 res = self.get_state_validity_server.call(state_req)
00103 self.failIf(res.error_code.val == res.error_code.SUCCESS)
00104 self.assertEqual(res.error_code.val, res.error_code.COLLISION_CONSTRAINTS_VIOLATED)
00105
00106
00107 state_req.robot_state.joint_state.name.append("floating_rot_z");
00108 state_req.robot_state.joint_state.position.append(.7071);
00109 state_req.robot_state.joint_state.name.append("floating_rot_w");
00110 state_req.robot_state.joint_state.position.append(.7071);
00111 res = self.get_state_validity_server.call(state_req)
00112 self.failIf(res.error_code.val != res.error_code.SUCCESS)
00113
00114
00115 if __name__ == '__main__':
00116 import rostest
00117 rostest.unitrun('test_get_state_validity', 'test_get_state_validity', TestGetStateValidity, sys.argv)
00118
00119