00001
00002
00003 import roslib; roslib.load_manifest('collider')
00004 roslib.load_manifest('actionlib')
00005 roslib.load_manifest('pr2_controllers_msgs')
00006 roslib.load_manifest('geometry_msgs')
00007 roslib.load_manifest('sensor_msgs')
00008
00009 import rospy
00010 from actionlib import SimpleActionClient, GoalStatus, SimpleActionServer
00011 from pr2_controllers_msgs.msg import \
00012 PointHeadAction, PointHeadGoal, \
00013 SingleJointPositionAction, SingleJointPositionGoal
00014 from geometry_msgs.msg import PointStamped
00015 from sensor_msgs.msg import PointCloud2
00016 from arm_navigation_msgs.msg import MakeStaticCollisionMapAction, MakeStaticCollisionMapGoal
00017 from collider.msg import ConstructStaticCollisionMapAction
00018
00019 import numpy as np
00020
00021 class ConstructStaticCollisionMapServer:
00022
00023 def __init__(self,
00024 node_name = 'construct_static_collision_map_server',
00025 action_name = 'construct_static_collision_map_action',
00026 head_topic = '/head_traj_controller/point_head_action',
00027 static_collision_map_topic = '/make_static_collision_map'
00028
00029 ):
00030
00031 rospy.init_node(node_name)
00032 rospy.loginfo ( 'waiting for SimpleActionClient: %s'%( head_topic ) )
00033 self.head_client = SimpleActionClient(head_topic,PointHeadAction )
00034 self.head_client.wait_for_server( )
00035
00036 self.take_static_collision_map_client = SimpleActionClient(static_collision_map_topic, MakeStaticCollisionMapAction)
00037
00038 self._action_server = SimpleActionServer(action_name, ConstructStaticCollisionMapAction, execute_cb=self.execute_cb)
00039 rospy.loginfo('ready')
00040
00041 def execute_cb(self, goal):
00042
00043 self.scan_table()
00044 goal = MakeStaticCollisionMapGoal()
00045 self.take_static_collision_map_client.send_goal(goal)
00046
00047 self._action_server.set_succeeded()
00048
00049 def move_head(self, x, y, z,
00050 min_dur = 0.0,
00051 max_velocity = 1.0,
00052 frame_id = 'base_link',
00053 timeout = 5.0):
00054 point = PointStamped()
00055 point.header.frame_id = frame_id
00056 point.header.stamp = rospy.Time.now()
00057 point.point.x, point.point.y, point.point.z = x, y, z
00058
00059 goal = PointHeadGoal()
00060 goal.pointing_frame = 'head_plate_frame'
00061 goal.max_velocity = max_velocity
00062 goal.min_duration = rospy.Duration.from_sec( min_dur )
00063 goal.target = point
00064
00065 self.head_client.send_goal( goal )
00066 self.head_client.wait_for_result( timeout =
00067 rospy.Duration.from_sec( timeout ) )
00068 if not self.head_client.get_state() == GoalStatus.SUCCEEDED:
00069 rospy.logerr( 'can not move head to:\n %s'%( goal ) )
00070 return False
00071
00072 return True
00073
00074 def scan_table(self,
00075 x = 0.5,
00076 y_min = -1.0, y_max = 1.0,
00077 z = 0.7,
00078 steps = 10,
00079 min_dur = 1.0,
00080 max_wait_time = 10.0
00081 ):
00082 rospy.loginfo( 'scanning table with x = %5.3f, y_min = %5.3f, y_max = %5.3f, z = %5.3f, steps = %d'%( x, y_min, y_max, z, steps ) )
00083 Y = np.linspace( y_min, y_max, steps )
00084
00085 for y in Y:
00086
00087 if not self.move_head( x, y, z, min_dur ):
00088 return
00089
00090 rospy.loginfo( 'done scanning table!' )
00091
00092 if __name__ == '__main__':
00093 ome = ConstructStaticCollisionMapServer()
00094 rospy.spin()