Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 import rospy
00022 import rocon_uri
00023 import concert_service_utilities
00024 import unique_id
00025 import rocon_std_msgs.msg as rocon_std_msgs
00026 import scheduler_msgs.msg as scheduler_msgs
00027 import concert_service_msgs.msg as concert_service_msgs
00028
00029 from concert_software_farmer import SoftwareFarmClient, FailedToStartSoftwareException
00030
00031 class MakeAMapPimp(concert_service_utilities.ResourcePimp):
00032
00033 _default_cmd_vel_topic = '/teleop/cmd_vel'
00034 _default_compressed_image_topic = '/teleop/compressed_image'
00035 _default_map_topic = 'map'
00036 _default_scan_topic = '/make_a_map/scan'
00037 _default_robot_pose_topic = 'robot_pose'
00038 _default_wc_namespace = 'world_canvas'
00039
00040 def setup_variables(self):
00041 '''
00042 Need to setup the following variables
00043 service_priority, service_id, resource_type, available_resource_publisher_name, capture_topic_name
00044 '''
00045 (service_name, service_description, service_priority, service_id) = concert_service_utilities.get_service_info()
00046 self.service_priority = service_priority
00047 self.service_id = service_id
00048 self.resource_type = 'rocon_apps/make_a_map'
00049 self.available_resource_publisher_name = 'available_make_a_map'
00050 self.capture_topic_name = 'capture_make_a_map'
00051
00052 def ros_capture_callback(self, request_id, msg):
00053 '''
00054 Processes the service pair server 'capture_teleop'. This will run
00055 in a thread of its own for each request. It has a significantly long lock
00056 though - this needs to get fixed.
00057 '''
00058
00059
00060
00061 response = concert_service_msgs.CaptureResourceResponse()
00062 response.result = False
00063 if not msg.release:
00064 if msg.rocon_uri not in [r.uri for r in self.available_resources]:
00065 self.logwarn("couldn't capture resource [not available][%s]" % msg.rocon_uri)
00066 response.result = False
00067 else:
00068 resource = self._create_resource(msg.rocon_uri)
00069 request_result, resource_request_id = self.send_allocation_request(resource)
00070 response.result = request_result
00071 if request_result == False:
00072 self.logwarn("couldn't capture resource [timed out][%s]" % msg.rocon_uri)
00073 else:
00074 self.loginfo("captured resource [%s][%s]" % (msg.rocon_uri, resource_request_id))
00075 response.remappings = resource.remappings
00076 else:
00077 self.send_releasing_request(msg.rocon_uri)
00078 response.result = True
00079 return response
00080
00081 def _create_resource(self, uri):
00082
00083 resource = scheduler_msgs.Resource()
00084 resource.id = unique_id.toMsg(unique_id.fromRandom())
00085 resource.rapp = self.resource_type
00086 resource.uri = uri
00087 cmd_vel_remapped, compressed_image_topic_remapped, map_remapped, scan_remapped, robot_pose_remapped = self._get_remapped_topic(rocon_uri.parse(resource.uri).name.string)
00088 resource.remappings = [rocon_std_msgs.Remapping(self._default_cmd_vel_topic, cmd_vel_remapped), rocon_std_msgs.Remapping(self._default_compressed_image_topic, compressed_image_topic_remapped), rocon_std_msgs.Remapping(self._default_map_topic, map_remapped), rocon_std_msgs.Remapping(self._default_scan_topic, scan_remapped), rocon_std_msgs.Remapping(self._default_robot_pose_topic, robot_pose_remapped)]
00089 return resource
00090
00091 def _get_remapped_topic(self, name):
00092 '''
00093 Sets up remapping rules for Rapp configuration
00094 '''
00095 cmd_vel_remapped = '/' + name + self._default_cmd_vel_topic
00096 compressed_image_topic_remapped = '/' + name + self._default_compressed_image_topic
00097 map_remapped = '/' + name + '/' + self._default_map_topic
00098 scan_remapped = '/' + name + self._default_scan_topic
00099 robot_pose_remapped = '/' + name + '/' + self._default_robot_pose_topic
00100
00101 return cmd_vel_remapped, compressed_image_topic_remapped,map_remapped, scan_remapped, robot_pose_remapped
00102
00103 def loginfo(self, msg):
00104 rospy.loginfo("MakeAMapPimp : %s"%str(msg))
00105
00106 def logwarn(self, msg):
00107 rospy.logwarn("MakeAMapPimp : %s"%str(msg))
00108
00109 def logerr(self, msg):
00110 rospy.logerr("MakeAMapPimp : %s"%str(msg))
00111
00112
00113
00114
00115
00116
00117 WORLD_CANVAS_SERVER='concert_software_common/world_canvas_server'
00118
00119 if __name__ == '__main__':
00120 rospy.init_node('make_a_map_pimp')
00121 pimp = MakeAMapPimp()
00122
00123 try:
00124 wc_namespace_param_name = rospy.get_param('wc_namespace_param')
00125
00126 sfc = SoftwareFarmClient()
00127 success, namespace, parameters = sfc.allocate(WORLD_CANVAS_SERVER)
00128
00129 if not success:
00130 raise FailedToStartSoftwareException("Failed to allocate software")
00131 rospy.set_param(wc_namespace_param_name, namespace)
00132 rospy.loginfo("MakeAMap Pimp : World Canvas Server - %s"%namespace)
00133 rospy.loginfo("Done")
00134 rospy.spin()
00135 except FailedToStartSoftwareException as e:
00136 rospy.logerr("MakeAMap Pimp : %s"%str(e))
00137 except KeyError as e:
00138 rospy.logerr("MakeAMapPimp : Key error %s"%e)
00139 if not rospy.is_shutdown():
00140 pimp.cancel_all_requests()