def runNode(self, node, autostart=False): ''' Start the node with given name from the currently loaded configuration. @param node: the name of the node @type node: C{str} @raise StartException: if an error occurred while start. ''' if not self.parameter_loaded: self.loadParams() n = None nodename = os.path.basename(node) namespace = os.path.dirname(node).strip('/') for item in self.roscfg.nodes: if (item.name == nodename) and ( (item.namespace.strip('/') == namespace) or not namespace): n = item break if n is None: raise StartException("Node '%s' not found!" % node) if autostart and self._get_start_exclude( rospy.names.ns_join(n.namespace, n.name)): # skip autostart rospy.loginfo("%s is in exclude list, skip autostart", n.name) return # env = n.env_args prefix = n.launch_prefix if not n.launch_prefix is None else '' args = ['__ns:=%s' % n.namespace, '__name:=%s' % n.name] if not (n.cwd is None): args.append('__cwd:=%s' % n.cwd) # add remaps for remap in n.remap_args: args.append('%s:=%s' % (remap[0], remap[1])) # masteruri = self.masteruri # if n.machine_name and not n.machine_name == 'localhost': # machine = self.roscfg.machines[n.machine_name] #TODO: env-loader support? # if machine.env_args: # env[len(env):] = machine.env_args # nm.screen().testScreen() cmd = self._get_node(n.package, n.type) # determine the current working path, Default: the package of the node cwd = self.get_ros_home() if not (n.cwd is None): if n.cwd == 'ROS_HOME': cwd = self.get_ros_home() elif n.cwd == 'node': cwd = os.path.dirname(cmd[0]) respawn = [''] if n.respawn: respawn = self._get_node('node_manager_fkie', 'respawn') # set the respawn environment variables respawn_params = self._get_respawn_params( rospy.names.ns_join(n.namespace, n.name)) if respawn_params['max'] > 0: n.env_args.append( ('RESPAWN_MAX', '%d' % respawn_params['max'])) if respawn_params['min_runtime'] > 0: n.env_args.append(('RESPAWN_MIN_RUNTIME', '%d' % respawn_params['min_runtime'])) if respawn_params['delay'] > 0: n.env_args.append( ('RESPAWN_DELAY', '%d' % respawn_params['delay'])) node_cmd = [respawn[0], prefix, cmd[0]] cmd_args = [ScreenHandler.getSceenCmd(node)] cmd_args[len(cmd_args):] = node_cmd cmd_args.append(n.args) cmd_args[len(cmd_args):] = args # print 'runNode: ', cmd_args popen_cmd = shlex.split(str(' '.join(cmd_args))) rospy.loginfo("run node '%s as': %s", node, str(' '.join(popen_cmd))) # remove the 'BASH_ENV' and 'ENV' from environment new_env = dict(os.environ) try: for k in ['BASH_ENV', 'ENV']: del new_env[k] except: pass # add node environment parameter for k, v in n.env_args: new_env[k] = v # set delayed autostart parameter self._run_node(popen_cmd, cwd, new_env, rospy.names.ns_join(n.namespace, n.name), autostart) if len(cmd) > 1: raise StartException( 'Multiple executables are found! The first one was started! Exceutables:\n%s' % str(cmd))
def runNode(self, node): ''' Start the node with given name from the currently loaded configuration. @param node: the name of the node @type node: C{str} @raise StartException: if an error occurred while start. ''' n = None nodename = os.path.basename(node) namespace = os.path.dirname(node).strip('/') for item in self.roscfg.nodes: if (item.name == nodename) and (item.namespace.strip('/') == namespace): n = item break if n is None: raise StartException(''.join(["Node '", node, "' not found!"])) env = n.env_args prefix = n.launch_prefix if not n.launch_prefix is None else '' args = [ ''.join(['__ns:=', n.namespace]), ''.join(['__name:=', n.name]) ] if not (n.cwd is None): args.append(''.join(['__cwd:=', n.cwd])) # add remaps for remap in n.remap_args: args.append(''.join([remap[0], ':=', remap[1]])) masteruri = self.masteruri if n.machine_name: machine = self.roscfg.machines[n.machine_name] #TODO: env-loader support? # if machine.env_args: # env[len(env):] = machine.env_args # set the global parameter if not self.global_parameter_setted: global_node_names = self.getGlobalParams(self.roscfg) self._load_parameters(masteruri, global_node_names, []) self.global_parameter_setted = True # add params nodens = ''.join([n.namespace, n.name, '/']) params = dict() for param, value in self.roscfg.params.items(): if param.startswith(nodens): params[param] = value clear_params = [] for cparam in self.roscfg.clear_params: if cparam.startswith(nodens): clear_params.append(param) rospy.loginfo("register PARAMS:\n%s", '\n'.join(params)) self._load_parameters(masteruri, params, clear_params) # nm.screen().testScreen() try: cmd = roslib.packages.find_node(n.package, n.type) except roslib.packages.ROSPkgException as e: # multiple nodes, invalid package raise StartException(str(e)) # handle diferent result types str or array of string import types if isinstance(cmd, types.StringTypes): cmd = [cmd] if cmd is None or len(cmd) == 0: raise StartException(' '.join( [n.type, 'in package [', n.package, '] not found!'])) node_cmd = [prefix, cmd[0]] cmd_args = [ScreenHandler.getSceenCmd(node)] cmd_args[len(cmd_args):] = node_cmd cmd_args.append(n.args) cmd_args[len(cmd_args):] = args # print 'runNode: ', cmd_args popen_cmd = shlex.split(str(' '.join(cmd_args))) rospy.loginfo("run node '%s as': %s", node, str(' '.join(popen_cmd))) subprocess.Popen(popen_cmd)
def runNode(self, node): ''' Start the node with given name from the currently loaded configuration. @param node: the name of the node @type node: C{str} @raise StartException: if an error occurred while start. ''' n = None nodename = os.path.basename(node) namespace = os.path.dirname(node).strip('/') for item in self.roscfg.nodes: if (item.name == nodename) and (item.namespace.strip('/') == namespace): n = item break if n is None: raise StartException(''.join(["Node '", node, "' not found!"])) # env = n.env_args prefix = n.launch_prefix if not n.launch_prefix is None else '' args = [''.join(['__ns:=', n.namespace]), ''.join(['__name:=', n.name])] if not (n.cwd is None): args.append(''.join(['__cwd:=', n.cwd])) # add remaps for remap in n.remap_args: args.append(''.join([remap[0], ':=', remap[1]])) # masteruri = self.masteruri # if n.machine_name and not n.machine_name == 'localhost': # machine = self.roscfg.machines[n.machine_name] #TODO: env-loader support? # if machine.env_args: # env[len(env):] = machine.env_args # nm.screen().testScreen() cmd = self._get_node(n.package, n.type) # determine the current working path, Default: the package of the node cwd = self.get_ros_home() if not (n.cwd is None): if n.cwd == 'ROS_HOME': cwd = self.get_ros_home() elif n.cwd == 'node': cwd = os.path.dirname(cmd[0]) respawn = [''] if n.respawn: respawn = self._get_node('node_manager_fkie', 'respawn') node_cmd = [respawn[0], prefix, cmd[0]] cmd_args = [ScreenHandler.getSceenCmd(node)] cmd_args[len(cmd_args):] = node_cmd cmd_args.append(n.args) cmd_args[len(cmd_args):] = args # print 'runNode: ', cmd_args popen_cmd = shlex.split(str(' '.join(cmd_args))) rospy.loginfo("run node '%s as': %s", node, str(' '.join(popen_cmd))) # remove the 'BASH_ENV' and 'ENV' from environment new_env = dict(os.environ) try: for k in ['BASH_ENV', 'ENV']: del new_env[k] except: pass # add node environment parameter for k, v in n.env_args: new_env[k] = v ps = subprocess.Popen(popen_cmd, cwd=cwd, env=new_env) # wait for process to avoid 'defunct' processes thread = threading.Thread(target=ps.wait) thread.setDaemon(True) thread.start() # subprocess.Popen(popen_cmd, cwd=cwd) if len(cmd) > 1: raise StartException('Multiple executables are found! The first one was started! Exceutables:\n' + str(cmd))
def runNode(self, node): ''' Start the node with given name from the currently loaded configuration. @param node: the name of the node @type node: C{str} @raise StartException: if an error occurred while start. ''' n = None nodename = os.path.basename(node) namespace = os.path.dirname(node).strip('/') for item in self.roscfg.nodes: if (item.name == nodename) and (item.namespace.strip('/') == namespace): n = item break if n is None: raise StartException(''.join(["Node '", node, "' not found!"])) env = n.env_args prefix = n.launch_prefix if not n.launch_prefix is None else '' args = [ ''.join(['__ns:=', n.namespace]), ''.join(['__name:=', n.name]) ] if not (n.cwd is None): args.append(''.join(['__cwd:=', n.cwd])) # add remaps for remap in n.remap_args: args.append(''.join([remap[0], ':=', remap[1]])) masteruri = self.masteruri if n.machine_name and not n.machine_name == 'localhost': machine = self.roscfg.machines[n.machine_name] #TODO: env-loader support? # if machine.env_args: # env[len(env):] = machine.env_args # nm.screen().testScreen() try: cmd = roslib.packages.find_node(n.package, n.type) except roslib.packages.ROSPkgException as e: # multiple nodes, invalid package raise StartException(str(e)) # handle diferent result types str or array of string import types if isinstance(cmd, types.StringTypes): cmd = [cmd] if cmd is None or len(cmd) == 0: raise StartException(' '.join( [n.type, 'in package [', n.package, '] not found!'])) # determine the current working path, Default: the package of the node cwd = self.get_ros_home() if not (n.cwd is None): if n.cwd == 'ROS_HOME': cwd = self.get_ros_home() elif n.cwd == 'node': cwd = os.path.dirname(cmd[0]) node_cmd = [ 'rosrun node_manager_fkie respawn' if n.respawn else '', prefix, cmd[0] ] cmd_args = [ScreenHandler.getSceenCmd(node)] cmd_args[len(cmd_args):] = node_cmd cmd_args.append(n.args) cmd_args[len(cmd_args):] = args # print 'runNode: ', cmd_args popen_cmd = shlex.split(str(' '.join(cmd_args))) rospy.loginfo("run node '%s as': %s", node, str(' '.join(popen_cmd))) subprocess.Popen(popen_cmd, cwd=cwd)
def runNode(self, node): ''' Start the node with given name from the currently loaded configuration. @param node: the name of the node @type node: C{str} @raise StartException: if an error occurred while start. ''' n = None nodename = os.path.basename(node) namespace = os.path.dirname(node).strip('/') for item in self.roscfg.nodes: if (item.name == nodename) and (item.namespace.strip('/') == namespace): n = item break if n is None: raise StartException(''.join(["Node '", node, "' not found!"])) env = n.env_args prefix = n.launch_prefix if not n.launch_prefix is None else '' args = [''.join(['__ns:=', n.namespace]), ''.join(['__name:=', n.name])] if not (n.cwd is None): args.append(''.join(['__cwd:=', n.cwd])) # add remaps for remap in n.remap_args: args.append(''.join([remap[0], ':=', remap[1]])) masteruri = self.masteruri if n.machine_name: machine = self.roscfg.machines[n.machine_name] #TODO: env-loader support? # if machine.env_args: # env[len(env):] = machine.env_args # set the global parameter if not self.global_parameter_setted: global_node_names = self.getGlobalParams(self.roscfg) self._load_parameters(masteruri, global_node_names, []) self.global_parameter_setted = True # add params nodens = ''.join([n.namespace, n.name, '/']) params = dict() for param, value in self.roscfg.params.items(): if param.startswith(nodens): params[param] = value clear_params = [] for cparam in self.roscfg.clear_params: if cparam.startswith(nodens): clear_params.append(param) rospy.loginfo("register PARAMS:\n%s", '\n'.join(params)) self._load_parameters(masteruri, params, clear_params) # nm.screen().testScreen() try: cmd = roslib.packages.find_node(n.package, n.type) except roslib.packages.ROSPkgException as e: # multiple nodes, invalid package raise StartException(str(e)) # handle diferent result types str or array of string import types if isinstance(cmd, types.StringTypes): cmd = [cmd] if cmd is None or len(cmd) == 0: raise StartException(' '.join([n.type, 'in package [', n.package, '] not found!'])) node_cmd = [prefix, cmd[0]] cmd_args = [ScreenHandler.getSceenCmd(node)] cmd_args[len(cmd_args):] = node_cmd cmd_args.append(n.args) cmd_args[len(cmd_args):] = args # print 'runNode: ', cmd_args popen_cmd = shlex.split(str(' '.join(cmd_args))) rospy.loginfo("run node '%s as': %s", node, str(' '.join(popen_cmd))) subprocess.Popen(popen_cmd)
def runNode(self, node, autostart=False): ''' Start the node with given name from the currently loaded configuration. @param node: the name of the node @type node: C{str} @raise StartException: if an error occurred while start. ''' n = None nodename = os.path.basename(node) namespace = os.path.dirname(node).strip('/') for item in self.roscfg.nodes: if (item.name == nodename) and ((item.namespace.strip('/') == namespace) or not namespace): n = item break if n is None: raise StartException("Node '%s' not found!"%node) if autostart and self._get_start_exclude(rospy.names.ns_join(n.namespace, n.name)): # skip autostart rospy.loginfo("%s is in exclude list, skip autostart", n.name) return # env = n.env_args prefix = n.launch_prefix if not n.launch_prefix is None else '' args = ['__ns:=%s'%n.namespace, '__name:=%s'%n.name] if not (n.cwd is None): args.append('__cwd:=%s'%n.cwd) # add remaps for remap in n.remap_args: args.append('%s:=%s'%(remap[0], remap[1])) # masteruri = self.masteruri # if n.machine_name and not n.machine_name == 'localhost': # machine = self.roscfg.machines[n.machine_name] #TODO: env-loader support? # if machine.env_args: # env[len(env):] = machine.env_args # nm.screen().testScreen() cmd = self._get_node(n.package, n.type) # determine the current working path, Default: the package of the node cwd = self.get_ros_home() if not (n.cwd is None): if n.cwd == 'ROS_HOME': cwd = self.get_ros_home() elif n.cwd == 'node': cwd = os.path.dirname(cmd[0]) respawn = [''] if n.respawn: respawn = self._get_node('node_manager_fkie', 'respawn') # set the respawn environment variables respawn_params = self._get_respawn_params(rospy.names.ns_join(n.namespace, n.name)) if respawn_params['max'] > 0: n.env_args.append(('RESPAWN_MAX', '%d'%respawn_params['max'])) if respawn_params['min_runtime'] > 0: n.env_args.append(('RESPAWN_MIN_RUNTIME', '%d'%respawn_params['min_runtime'])) if respawn_params['delay'] > 0: n.env_args.append(('RESPAWN_DELAY', '%d'%respawn_params['delay'])) node_cmd = [respawn[0], prefix, cmd[0]] cmd_args = [ScreenHandler.getSceenCmd(node)] cmd_args[len(cmd_args):] = node_cmd cmd_args.append(n.args) cmd_args[len(cmd_args):] = args # print 'runNode: ', cmd_args popen_cmd = shlex.split(str(' '.join(cmd_args))) rospy.loginfo("run node '%s as': %s", node, str(' '.join(popen_cmd))) # remove the 'BASH_ENV' and 'ENV' from environment new_env = dict(os.environ) try: for k in ['BASH_ENV', 'ENV']: del new_env[k] except: pass # add node environment parameter for k, v in n.env_args: new_env[k] = v # set delayed autostart parameter self._run_node(popen_cmd, cwd, new_env, rospy.names.ns_join(n.namespace, n.name), autostart) if len(cmd) > 1: raise StartException('Multiple executables are found! The first one was started! Exceutables:\n%s'%str(cmd))
def runNode(self, node): ''' Start the node with given name from the currently loaded configuration. @param node: the name of the node @type node: C{str} @raise StartException: if an error occurred while start. ''' n = None nodename = os.path.basename(node) namespace = os.path.dirname(node).strip('/') for item in self.roscfg.nodes: if (item.name == nodename) and (item.namespace.strip('/') == namespace): n = item break if n is None: raise StartException(''.join(["Node '", node, "' not found!"])) env = n.env_args prefix = n.launch_prefix if not n.launch_prefix is None else '' args = [''.join(['__ns:=', n.namespace]), ''.join(['__name:=', n.name])] if not (n.cwd is None): args.append(''.join(['__cwd:=', n.cwd])) # add remaps for remap in n.remap_args: args.append(''.join([remap[0], ':=', remap[1]])) masteruri = self.masteruri if n.machine_name and not n.machine_name == 'localhost': machine = self.roscfg.machines[n.machine_name] #TODO: env-loader support? # if machine.env_args: # env[len(env):] = machine.env_args # nm.screen().testScreen() try: cmd = roslib.packages.find_node(n.package, n.type) except roslib.packages.ROSPkgException as e: # multiple nodes, invalid package raise StartException(str(e)) # handle diferent result types str or array of string import types if isinstance(cmd, types.StringTypes): cmd = [cmd] if cmd is None or len(cmd) == 0: raise StartException(' '.join([n.type, 'in package [', n.package, '] not found!'])) # determine the current working path, Default: the package of the node cwd = self.get_ros_home() if not (n.cwd is None): if n.cwd == 'ROS_HOME': cwd = self.get_ros_home() elif n.cwd == 'node': cwd = os.path.dirname(cmd[0]) node_cmd = ['rosrun node_manager_fkie respawn' if n.respawn else '', prefix, cmd[0]] cmd_args = [ScreenHandler.getSceenCmd(node)] cmd_args[len(cmd_args):] = node_cmd cmd_args.append(n.args) cmd_args[len(cmd_args):] = args # print 'runNode: ', cmd_args popen_cmd = shlex.split(str(' '.join(cmd_args))) rospy.loginfo("run node '%s as': %s", node, str(' '.join(popen_cmd))) subprocess.Popen(popen_cmd, cwd=cwd)