예제 #1
0
    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))
예제 #2
0
    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)
예제 #3
0
  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))
예제 #4
0
    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)
예제 #5
0
  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)