Beispiel #1
0
    def ReloadLaunch(self, request, context):
        rospy.logdebug('ReloadLaunch request:\n%s' % str(request))
        result = lmsg.LoadLaunchReply()
        result.path.append(request.path)
        cfgid = CfgId(request.path, request.masteruri)
        rospy.logdebug("reload launch file: %s, masteruri: %s", request.path, request.masteruri)
        if cfgid in self._loaded_files:
            try:
                cfg = self._loaded_files[cfgid]
                stored_roscfg = cfg.roscfg
                argv = cfg.argv
                cfg.load(argv)
                result.status.code = OK
                # detect files changes
                if stored_roscfg and cfg.roscfg:
                    stored_values = [(name, utf8(p.value)) for name, p in stored_roscfg.params.items()]
                    new_values = [(name, utf8(p.value)) for name, p in cfg.roscfg.params.items()]
                    # detect changes parameter
                    paramset = set(name for name, _ in (set(new_values) - set(stored_values)))  # _:=value
                    # detect new parameter
                    paramset |= (set(cfg.roscfg.params.keys()) - set(stored_roscfg.params.keys()))
                    # detect removed parameter
                    paramset |= (set(stored_roscfg.params.keys()) - set(cfg.roscfg.params.keys()))
                    # detect new nodes
                    stored_nodes = [roslib.names.ns_join(item.namespace, item.name) for item in stored_roscfg.nodes]
                    new_nodes = [roslib.names.ns_join(item.namespace, item.name) for item in cfg.roscfg.nodes]
                    nodes2start = set(new_nodes) - set(stored_nodes)
                    # determine the nodes of the changed parameter
                    for p in paramset:
                        for n in new_nodes:
                            if p.startswith(n):
                                nodes2start.add(n)
                    # detect changes in the arguments and remap
                    for n in stored_roscfg.nodes:
                        for new_n in cfg.roscfg.nodes:
                            if n.name == new_n.name and n.namespace == new_n.namespace:
                                if n.args != new_n.args or n.remap_args != new_n.remap_args:
                                    nodes2start.add(roslib.names.ns_join(n.namespace, n.name))
                    # filter out anonymous nodes
                    for n in nodes2start:
                        if not re.search(r"\d{3,6}_\d{10,}", n):
                            result.changed_nodes.append(n)
#                    result.changed_nodes.extend([n for n in nodes2start if not re.search(r"\d{3,6}_\d{10,}", n)])
            except Exception as e:
                print(traceback.format_exc())
                err_text = "%s loading failed!" % request.path
                err_details = "%s: %s" % (err_text, utf8(e))
                rospy.logwarn("Loading launch file: %s", err_details)
                result.status.code = ERROR
                result.status.error_msg = utf8(err_details)
                return result
        else:
            result.status.code = FILE_NOT_FOUND
            return result
        return result
 def UnloadLaunch(self, request, context):
     result = lmsg.LoadLaunchReply()
     result.path.append(request.path)
     cfgid = CfgId(request.path, request.masteruri)
     if cfgid in self._loaded_files:
         try:
             del self._loaded_files[cfgid]
             result.status.code = OK
         except Exception as e:
             err_text = "%s unloading failed!" % request.path
             err_details = "%s: %s" % (err_text, utf8(e))
             rospy.logwarn("Unloading launch file: %s", err_details)
             result.status.code = ERROR
             result.status.error_msg = utf8(err_details)
             return result
     else:
         result.status.code = FILE_NOT_FOUND
         return result
     return result
 def LoadLaunch(self, request, context):
     '''
     Loads launch file
     '''
     result = lmsg.LoadLaunchReply()
     launchfile = request.path
     rospy.logdebug(
         "Loading launch file: %s (package: %s, launch: %s), masteruri: %s, host: %s, args: %s"
         % (launchfile, request.package, request.launch, request.masteruri,
            request.host, request.args))
     if not launchfile:
         # determine path from package name and launch name
         try:
             paths = roslib.packages.find_resource(request.package,
                                                   request.launch)
             if not paths:
                 result.status.code = FILE_NOT_FOUND
                 result.status.error_msg = utf8(
                     "Launch files %s in package %s found!" %
                     (request.launch, request.package))
                 return result
             elif len(paths) > 1:
                 if request.force_first_file:
                     launchfile = paths[0]
                 else:
                     result.status.code = MULTIPLE_LAUNCHES
                     result.status.error_msg = utf8(
                         "Multiple launch files with name %s in package %s found!"
                         % (request.launch, request.package))
                     for mp in paths:
                         result.path.append(mp)
                     rospy.logdebug("..load aborted, MULTIPLE_LAUNCHES")
                     return result
             else:
                 launchfile = paths[0]
         except rospkg.ResourceNotFound as rnf:
             result.status.code = FILE_NOT_FOUND
             result.status.error_msg = utf8("Package %s not found: %s" %
                                            (request.package, rnf))
             rospy.logdebug("..load aborted, FILE_NOT_FOUND")
             return result
     result.path.append(launchfile)
     # it is already loaded?
     if (launchfile, request.masteruri) in self._loaded_files.keys():
         result.status.code = ALREADY_OPEN
         result.status.error_msg = utf8("Launch file %s already loaded!" %
                                        (launchfile))
         rospy.logdebug("..load aborted, ALREADY_OPEN")
         return result
     # load launch configuration
     try:
         # test for required args
         provided_args = ["%s" % arg.name for arg in request.args]
         launch_config = LaunchConfig(launchfile,
                                      masteruri=request.masteruri,
                                      host=request.host)
         # get the list with needed launch args
         req_args = launch_config.get_args()
         req_args_dict = launch_config.argv2dict(req_args)
         if request.request_args and req_args:
             for arg, value in req_args_dict.items():
                 if arg not in provided_args:
                     result.args.extend([
                         lmsg.Argument(name=arg, value=value)
                         for arg, value in req_args_dict.items()
                     ])
                     result.status.code = PARAMS_REQUIRED
                     rospy.logdebug("..load aborted, PARAMS_REQUIRED")
                     return result
         argv = [
             "%s:=%s" % (arg.name, arg.value) for arg in request.args
             if arg.name in req_args_dict
         ]
         _loaded, _res_argv = launch_config.load(argv)
         # parse result args for reply
         result.args.extend([
             lmsg.Argument(name=name, value=value)
             for name, value in launch_config.resolve_dict.items()
         ])
         self._loaded_files[CfgId(launchfile,
                                  request.masteruri)] = launch_config
         rospy.logdebug("..load complete!")
     except Exception as e:
         err_text = "%s loading failed!" % launchfile
         err_details = "%s: %s" % (err_text, utf8(e))
         rospy.logwarn("Loading launch file: %s", err_details)
         result.status.code = ERROR
         result.status.error_msg = utf8(err_details)
         return result
     result.status.code = OK
     return result