Example #1
0
    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
Example #2
0
def read_launch(launch_file_name):
    config = ROSLaunchConfig()
    XmlLoader().load(launch_file_name, config, verbose=False)
    return config