make_a_map_pimp.py
Go to the documentation of this file.
00001 #!/usr/bin/env python
00002 #
00003 # License: BSD
00004 #   https://raw.github.com/robotics-in-concert/concert_services/license/LICENSE
00005 #
00006 ##############################################################################
00007 # About
00008 ##############################################################################
00009 
00010 # Simple script to pimp out make a map operations for rocon interactions.
00011 #
00012 # - watch the app manager status and when it has a remote controller,
00013 # - flip a spawn/kill pair across
00014 # - call the spawn api
00015 #  - the turtle herder will flip back some handles then.
00016 
00017 ##############################################################################
00018 # Imports
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         # Todo : request the scheduler for this resource,
00059         # use self.allocation_timeout to fail gracefully
00060 
00061         response = concert_service_msgs.CaptureResourceResponse()
00062         response.result = False
00063         if not msg.release:  # i.e. we're capturing:
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:  # we're releasing
00077             self.send_releasing_request(msg.rocon_uri)
00078             response.result = True
00079         return response
00080 
00081     def _create_resource(self, uri):
00082         # Create a resource to request
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 # Launch point
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()


concert_service_indoor_2d_map_prep
Author(s): Jihoon Lee
autogenerated on Thu Jun 6 2019 21:35:19