def load(self, delay_service_creation=0.): ''' Load the launch file configuration ''' with self.__lock: self._pending_starts.clear() # shutdown the services to inform the caller about a new configuration. if not self.runService is None: self.runService.shutdown('reload config') self.runService = None if not self.listService is None: self.listService.shutdown('reload config') self.listService = None self.nodes = [] # the name of nodes with namespace self.sensors = {} # sensor descriptions launch_path = self.getPath(self.launch_file, self.package) rospy.loginfo("loading launch file: %s", launch_path) self.masteruri = self._masteruri_from_ros() self.roscfg = ROSLaunchConfig() loader = XmlLoader() argv = [a for a in sys.argv if not a.startswith('__ns:=')] # remove namespace from sys.argv to avoid load the launchfile info local namespace sys.argv = [a for a in sys.argv if not a.startswith('__ns:=')] # set the global environment to empty namespace os.environ[ROS_NAMESPACE] = rospy.names.SEP loader.load(launch_path, self.roscfg, verbose=False, argv=argv) # create the list with node names for item in self.roscfg.nodes: if item.machine_name and not item.machine_name == 'localhost': machine = self.roscfg.machines[item.machine_name] if roslib.network.is_local_address(machine.address): self.nodes.append(roslib.names.ns_join(item.namespace, item.name)) else: self.nodes.append(roslib.names.ns_join(item.namespace, item.name)) # get the robot description self.description_response = dr = ListDescriptionResponse() dr.robot_name = '' dr.robot_type = '' dr.robot_descr = '' for param, p in self.roscfg.params.items(): if param.endswith('robots'): if isinstance(p.value, list): if len(p.value) > 0 and len(p.value[0]) != 5: print "WRONG format, expected: ['host(ROS master Name)', 'type', 'name', 'images', 'description'] -> ignore", param else: for entry in p.value: try: print entry[0], rospy.get_param('/mastername', '') if not entry[0] or entry[0] == rospy.get_param('/mastername', ''): dr.robot_name = self._decode(entry[2]) dr.robot_type = entry[1] dr.robot_images = entry[3].split(',') dr.robot_descr = self._decode(entry[4]) break except: pass # get the sensor description tmp_cap_dict = self.getCapabilitiesDesrc() for machine, ns_dict in tmp_cap_dict.items(): if self.roscfg.machines.has_key(machine): machine = self.roscfg.machines[machine].address if not machine or roslib.network.is_local_address(machine): for ns, group_dict in ns_dict.items(): for group, descr_dict in group_dict.items(): if descr_dict['nodes']: cap = Capability() cap.namespace = ns cap.name = group cap.type = descr_dict['type'] cap.images = list(descr_dict['images']) cap.description = descr_dict['description'] cap.nodes = list(descr_dict['nodes']) dr.capabilities.append(cap) # load parameters into the ROS parameter server self.loadParams() # initialize the ROS services #HACK to let the node_manager to update the view if delay_service_creation > 0.: t = threading.Timer(delay_service_creation, self._timed_service_creation) t.start() else: self._timed_service_creation() # self.timer = rospy.Timer(rospy.Duration(2), self.timed_service_creation, True) # if self.nodes: # self.runService = rospy.Service('~run', Task, self.rosservice_start_node) # self.listServic = rospy.Service('~list_nodes', ListNodes, self.rosservice_list_nodes) # except: # import traceback # print traceback.format_exc() if self.do_autostart: for n in self.nodes: try: self.runNode(n, self.do_autostart) except Exception as e: rospy.logwarn("Error while start %s: %s", n, e) self.do_autostart = False
def load(self, delay_service_creation=0.): ''' Load the launch file configuration ''' with self.__lock: self._pending_starts.clear() # shutdown the services to inform the caller about a new configuration. if not self.runService is None: self.runService.shutdown('reload config') self.runService = None if not self.listService is None: self.listService.shutdown('reload config') self.listService = None self.nodes = [] # the name of nodes with namespace self.sensors = {} # sensor descriptions launch_path = self.getPath(self.launch_file, self.package) rospy.loginfo("loading launch file: %s", launch_path) self.masteruri = self._masteruri_from_ros() self.roscfg = ROSLaunchConfig() loader = XmlLoader() argv = [a for a in sys.argv if not a.startswith('__ns:=')] # remove namespace from sys.argv to avoid load the launchfile info local namespace sys.argv = [a for a in sys.argv if not a.startswith('__ns:=')] # set the global environment to empty namespace os.environ[ROS_NAMESPACE] = rospy.names.SEP loader.load(launch_path, self.roscfg, verbose=False, argv=argv) # create the list with node names for item in self.roscfg.nodes: if item.machine_name and not item.machine_name == 'localhost': machine = self.roscfg.machines[item.machine_name] if roslib.network.is_local_address(machine.address): self.nodes.append( roslib.names.ns_join(item.namespace, item.name)) else: self.nodes.append( roslib.names.ns_join(item.namespace, item.name)) # get the robot description self.description_response = dr = ListDescriptionResponse() dr.robot_name = '' dr.robot_type = '' dr.robot_descr = '' for param, p in self.roscfg.params.items(): if param.endswith('robots'): if isinstance(p.value, list): if len(p.value) > 0 and len(p.value[0]) != 5: print "WRONG format, expected: ['host(ROS master Name)', 'type', 'name', 'images', 'description'] -> ignore", param else: for entry in p.value: try: print entry[0], rospy.get_param( '/mastername', '') if not entry[0] or entry[ 0] == rospy.get_param( '/mastername', ''): dr.robot_name = self._decode(entry[2]) dr.robot_type = entry[1] dr.robot_images = entry[3].split(',') dr.robot_descr = self._decode(entry[4]) break except: pass # get the sensor description tmp_cap_dict = self.getCapabilitiesDesrc() for machine, ns_dict in tmp_cap_dict.items(): if self.roscfg.machines.has_key(machine): machine = self.roscfg.machines[machine].address if not machine or roslib.network.is_local_address(machine): for ns, group_dict in ns_dict.items(): for group, descr_dict in group_dict.items(): if descr_dict['nodes']: cap = Capability() cap.namespace = ns cap.name = group cap.type = descr_dict['type'] cap.images = list(descr_dict['images']) cap.description = descr_dict['description'] cap.nodes = list(descr_dict['nodes']) dr.capabilities.append(cap) # load parameters into the ROS parameter server if self.load_params_at_start: self.loadParams() # initialize the ROS services #HACK to let the node_manager to update the view if delay_service_creation > 0.: t = threading.Timer(delay_service_creation, self._timed_service_creation) t.start() else: self._timed_service_creation() # self.timer = rospy.Timer(rospy.Duration(2), self.timed_service_creation, True) # if self.nodes: # self.runService = rospy.Service('~run', Task, self.rosservice_start_node) # self.listServic = rospy.Service('~list_nodes', ListNodes, self.rosservice_list_nodes) # except: # import traceback # print traceback.format_exc() if self.do_autostart: if not self.parameter_loaded: self.loadParams() for n in self.nodes: try: self.runNode(n, self.do_autostart) except Exception as e: rospy.logwarn("Error while start %s: %s", n, e) self.do_autostart = False
def read_launch(launch_file_name): config = ROSLaunchConfig() XmlLoader().load(launch_file_name, config, verbose=False) return config