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