$search
00001 #! /usr/bin/env python 00002 00003 PKG = 'planning_environment' 00004 00005 import roslib; roslib.load_manifest(PKG) 00006 import rospy 00007 import arm_navigation_msgs.srv 00008 import sys 00009 import unittest 00010 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 arm_navigation_msgs.msg import CollisionOperation 00017 from arm_navigation_msgs.msg import Shape 00018 from geometry_msgs.msg import Pose 00019 00020 get_collision_objects_service_name = "get_collision_objects" 00021 default_prefix = "/environment_server" 00022 00023 class TestCollisionObjects(unittest.TestCase): 00024 00025 def test_add_convert_objects(self): 00026 00027 rospy.init_node('test_collision_objects') 00028 00029 obj_pub = rospy.Publisher('collision_object',CollisionObject,latch=True) 00030 att_pub = rospy.Publisher('attached_collision_object', AttachedCollisionObject,latch=True) 00031 00032 global get_collision_objects_service_name 00033 full_name = default_prefix+'/'+get_collision_objects_service_name 00034 rospy.wait_for_service(full_name) 00035 get_collision_objects_service = rospy.ServiceProxy(full_name, arm_navigation_msgs.srv.GetCollisionObjects) 00036 00037 clear_all_att = AttachedCollisionObject() 00038 clear_all_att.object.header.stamp = rospy.Time.now() 00039 clear_all_att.object.header.frame_id = "base_link" 00040 clear_all_att.link_name = "all" 00041 clear_all_att.object.operation.operation = mapping_msgs.msg.CollisionObjectOperation.REMOVE 00042 00043 clear_all_obj = CollisionObject() 00044 clear_all_obj.header.stamp = rospy.Time.now() 00045 clear_all_obj.header.frame_id = "base_link" 00046 clear_all_obj.id = "all" 00047 clear_all_obj.operation.operation = mapping_msgs.msg.CollisionObjectOperation.REMOVE 00048 00049 #tripling for publish wonkitude 00050 00051 att_pub.publish(clear_all_att) 00052 00053 obj_pub.publish(clear_all_obj) 00054 00055 rospy.sleep(2.) 00056 00057 get_collision_objects_req = arm_navigation_msgs.srv.GetCollisionObjectsRequest() 00058 try: 00059 get_collision_objects_res = get_collision_objects_service(get_collision_objects_req) 00060 except rospy.ServiceException, e: 00061 print "Service call failed: %s"%e 00062 00063 #should have no objects 00064 self.assertEquals(0, len(get_collision_objects_res.collision_objects)) 00065 self.assertEquals(0, len(get_collision_objects_res.attached_collision_objects)) 00066 00067 # first add a couple objects to the environment 00068 00069 obj1 = CollisionObject() 00070 00071 obj1.header.stamp = rospy.Time.now() 00072 obj1.header.frame_id = "base_link" 00073 obj1.id = "obj1"; 00074 obj1.operation.operation = mapping_msgs.msg.CollisionObjectOperation.ADD 00075 obj1.shapes = [Shape() for _ in range(2)] 00076 obj1.shapes[0].type = Shape.BOX 00077 obj1.shapes[0].dimensions = [float() for _ in range(3)] 00078 obj1.shapes[0].dimensions[0] = 1.0 00079 obj1.shapes[0].dimensions[1] = 1.0 00080 obj1.shapes[0].dimensions[2] = .05 00081 obj1.shapes[1].type = Shape.BOX 00082 obj1.shapes[1].dimensions = [float() for _ in range(3)] 00083 obj1.shapes[1].dimensions[0] = 1.0 00084 obj1.shapes[1].dimensions[1] = 1.0 00085 obj1.shapes[1].dimensions[2] = .05 00086 obj1.poses = [Pose() for _ in range(2)] 00087 obj1.poses[0].position.x = 1.0 00088 obj1.poses[0].position.y = 0 00089 obj1.poses[0].position.z = .5 00090 obj1.poses[0].orientation.x = 0 00091 obj1.poses[0].orientation.y = 0 00092 obj1.poses[0].orientation.z = 0 00093 obj1.poses[0].orientation.w = 1 00094 obj1.poses[1].position.x = 1.0 00095 obj1.poses[1].position.y = 0 00096 obj1.poses[1].position.z = .75 00097 obj1.poses[1].orientation.x = 0 00098 obj1.poses[1].orientation.y = 0 00099 obj1.poses[1].orientation.z = 0 00100 obj1.poses[1].orientation.w = 1 00101 00102 obj_pub.publish(obj1) 00103 00104 rospy.sleep(2.) 00105 00106 obj2 = CollisionObject(); 00107 00108 obj2.header.stamp = rospy.Time.now() 00109 obj2.header.frame_id = "base_link" 00110 obj2.id = "obj2"; 00111 obj2.operation.operation = mapping_msgs.msg.CollisionObjectOperation.ADD 00112 obj2.shapes = [Shape() for _ in range(1)] 00113 obj2.shapes[0].type = Shape.BOX 00114 obj2.shapes[0].dimensions = [float() for _ in range(3)] 00115 obj2.shapes[0].dimensions[0] = 1.0 00116 obj2.shapes[0].dimensions[1] = 1.0 00117 obj2.shapes[0].dimensions[2] = .05 00118 obj2.poses = [Pose() for _ in range(1)] 00119 obj2.poses[0].position.x = .15 00120 obj2.poses[0].position.y = 0 00121 obj2.poses[0].position.z = .5 00122 obj2.poses[0].orientation.x = 0 00123 obj2.poses[0].orientation.y = 0 00124 obj2.poses[0].orientation.z = 0 00125 obj2.poses[0].orientation.w = 1 00126 00127 obj_pub.publish(obj2) 00128 00129 rospy.loginfo("WTF") 00130 00131 rospy.sleep(2.) 00132 00133 get_collision_objects_req = arm_navigation_msgs.srv.GetCollisionObjectsRequest() 00134 00135 get_collision_objects_res = get_collision_objects_service(get_collision_objects_req) 00136 00137 #should have two objects and no attached objects 00138 self.assertEquals(2, len(get_collision_objects_res.collision_objects)) 00139 self.assertEquals(0, len(get_collision_objects_res.attached_collision_objects)) 00140 00141 conv_object = AttachedCollisionObject(); 00142 conv_object.object.header.stamp = rospy.Time.now() 00143 conv_object.object.header.frame_id = "base_link" 00144 conv_object.link_name = "base_link" 00145 conv_object.object.id = "obj2" 00146 conv_object.object.operation.operation = mapping_msgs.msg.CollisionObjectOperation.ATTACH_AND_REMOVE_AS_OBJECT 00147 att_pub.publish(conv_object) 00148 00149 rospy.sleep(2.) 00150 00151 get_collision_objects_req = arm_navigation_msgs.srv.GetCollisionObjectsRequest() 00152 00153 get_collision_objects_res = get_collision_objects_service(get_collision_objects_req) 00154 00155 #should have one object non-attached and one attached 00156 self.assertEquals(1, len(get_collision_objects_res.collision_objects)) 00157 self.assertEquals(1, len(get_collision_objects_res.attached_collision_objects)) 00158 self.assertEquals("obj1", get_collision_objects_res.collision_objects[0].id) 00159 self.assertEquals("obj2", get_collision_objects_res.attached_collision_objects[0].object.id) 00160 00161 #now we add attach another object directly to a different link 00162 att_object = AttachedCollisionObject(); 00163 att_object.object.header.stamp = rospy.Time.now() 00164 att_object.object.header.frame_id = "base_link" 00165 att_object.link_name = "r_gripper_r_finger_tip_link" 00166 att_object.object.operation.operation = mapping_msgs.msg.CollisionObjectOperation.ADD 00167 att_object.object = CollisionObject(); 00168 00169 att_object.object.header.stamp = rospy.Time.now() 00170 att_object.object.header.frame_id = "base_link" 00171 att_object.object.id = "obj3" 00172 att_object.object.shapes = [Shape() for _ in range(1)] 00173 att_object.object.shapes[0].type = Shape.BOX 00174 att_object.object.shapes[0].dimensions = [float() for _ in range(3)] 00175 att_object.object.shapes[0].dimensions[0] = .2 00176 att_object.object.shapes[0].dimensions[1] = 0.3 00177 att_object.object.shapes[0].dimensions[2] = .05 00178 att_object.object.poses = [Pose() for _ in range(1)] 00179 att_object.object.poses[0].position.x = .15 00180 att_object.object.poses[0].position.y = 0 00181 att_object.object.poses[0].position.z = 1.0 00182 att_object.object.poses[0].orientation.x = 0 00183 att_object.object.poses[0].orientation.y = 0 00184 att_object.object.poses[0].orientation.z = 0 00185 att_object.object.poses[0].orientation.w = 1 00186 att_pub.publish(att_object) 00187 00188 rospy.sleep(2.) 00189 00190 get_collision_objects_req = arm_navigation_msgs.srv.GetCollisionObjectsRequest() 00191 00192 get_collision_objects_res = get_collision_objects_service(get_collision_objects_req) 00193 00194 #should have one object and two attached 00195 self.assertEquals(1, len(get_collision_objects_res.collision_objects)) 00196 self.assertEquals(2, len(get_collision_objects_res.attached_collision_objects)) 00197 self.assertEquals("obj1", get_collision_objects_res.collision_objects[0].id) 00198 00199 #deleting those attached to base link 00200 del_object = AttachedCollisionObject(); 00201 del_object.object.header.stamp = rospy.Time.now() 00202 del_object.object.header.frame_id = "base_link" 00203 del_object.link_name = "base_link" 00204 del_object.object.id = "all" 00205 del_object.object.operation.operation = mapping_msgs.msg.CollisionObjectOperation.REMOVE 00206 att_pub.publish(del_object) 00207 00208 rospy.sleep(2.) 00209 00210 get_collision_objects_req = arm_navigation_msgs.srv.GetCollisionObjectsRequest() 00211 00212 get_collision_objects_res = get_collision_objects_service(get_collision_objects_req) 00213 00214 #should have one object and two attached 00215 self.assertEquals(1, len(get_collision_objects_res.collision_objects)) 00216 self.assertEquals(1, len(get_collision_objects_res.attached_collision_objects)) 00217 self.assertEquals("obj1", get_collision_objects_res.collision_objects[0].id) 00218 self.assertEquals("obj3", get_collision_objects_res.attached_collision_objects[0].object.id) 00219 00220 #converting back to object 00221 back_object = AttachedCollisionObject(); 00222 back_object.object.header.stamp = rospy.Time.now() 00223 back_object.object.header.frame_id = "base_link" 00224 back_object.link_name = "r_gripper_r_finger_tip_link" 00225 back_object.object.id = "obj3" 00226 back_object.object.operation.operation = mapping_msgs.msg.CollisionObjectOperation.DETACH_AND_ADD_AS_OBJECT 00227 att_pub.publish(back_object) 00228 00229 rospy.sleep(2.) 00230 00231 get_collision_objects_req = arm_navigation_msgs.srv.GetCollisionObjectsRequest() 00232 00233 get_collision_objects_res = get_collision_objects_service(get_collision_objects_req) 00234 00235 #should have one object and two attached 00236 self.assertEquals(2, len(get_collision_objects_res.collision_objects)) 00237 self.assertEquals(0, len(get_collision_objects_res.attached_collision_objects)) 00238 00239 if __name__ == '__main__': 00240 import rostest 00241 rostest.unitrun('test_collision_objects', 'test_collision_objects', TestCollisionObjects) 00242 00243