def _init_signal_handlers(): global _sig_initialized if _sig_initialized: return if not roslib.is_interactive(): _signal_chain[signal.SIGTERM] = signal.signal(signal.SIGTERM, rl_signal) _signal_chain[signal.SIGINT] = signal.signal(signal.SIGINT, rl_signal) _signal_chain[signal.SIGHUP] = signal.signal(signal.SIGHUP, rl_signal) atexit.register(pmon_shutdown) _sig_initialized = True
def test_interactive(): import roslib # make sure that it's part of high-level API assert not roslib.is_interactive(), "interactive should be false by default" for v in [True, False]: roslib.set_interactive(v) assert v == roslib.is_interactive()
def test_interactive(): import roslib # make sure that it's part of high-level API assert not roslib.is_interactive( ), 'interactive should be false by default' for v in [True, False]: roslib.set_interactive(v) assert v == roslib.is_interactive()
def test_interactive(self): import roslib import roslib.scriptutil # make sure that it's part of high-level API self.failIf(roslib.is_interactive(), "interactive should be false by default") for v in [True, False]: roslib.set_interactive(v) self.assertEquals(v, roslib.is_interactive()) self.assertEquals(v, roslib.scriptutil.is_interactive())
def _init_signal_handlers(): global _sig_initialized if _sig_initialized: return if not roslib.is_interactive(): for s in _signal_list: _signal_chain[s] = signal.signal(s, rl_signal) atexit.register(pmon_shutdown) _sig_initialized = True
def init_node(name, argv=None, anonymous=False, log_level=None, disable_rostime=False, disable_rosout=False, disable_signals=False): """ Register client node with the master under the specified name. This MUST be called from the main Python thread unless disable_signals is set to True. Duplicate calls to init_node are only allowed if the arguments are identical as the side-effects of this method are not reversible. @param name: Node's name. This parameter must be a base name, meaning that it cannot contain namespaces (i.e. '/') @type name: str @param argv: Command line arguments to this program, including remapping arguments (default: sys.argv). If you provide argv to init_node(), any previously created rospy data structure (Publisher, Subscriber, Service) will have invalid mappings. It is important that you call init_node() first if you wish to provide your own argv. @type argv: [str] @param anonymous: if True, a name will be auto-generated for the node using name as the base. This is useful when you wish to have multiple instances of the same node and don't care about their actual names (e.g. tools, guis). name will be used as the stem of the auto-generated name. NOTE: you cannot remap the name of an anonymous node. @type anonymous: bool @param log_level: log level for sending message to /rosout and log file, which is INFO by default. For convenience, you may use rospy.DEBUG, rospy.INFO, rospy.ERROR, rospy.WARN, rospy.FATAL @type log_level: int @param disable_signals: If True, rospy will not register its own signal handlers. You must set this flag if (a) you are unable to call init_node from the main thread and/or you are using rospy in an environment where you need to control your own signal handling (e.g. WX). If you set this to True, you should call rospy.signal_shutdown(reason) to initiate clean shutdown. NOTE: disable_signals is overridden to True if roslib.is_interactive() is True. @type disable_signals: bool @param disable_rostime: for internal testing only: suppresses automatic subscription to rostime @type disable_rostime: bool @param disable_rosout: for internal testing only: suppress auto-publication of rosout @type disable_rostime: bool @raise ROSInitException: if initialization/registration fails @raise ValueError: if parameters are invalid (e.g. name contains a namespace or is otherwise illegal) """ if argv is None: argv = sys.argv else: # reload the mapping table. Any previously created rospy data # structure does *not* reinitialize based on the new mappings. rospy.names.reload_mappings(argv) # this test can be eliminated once we change from warning to error in the next check if rosgraph.names.SEP in name: raise ValueError("namespaces are not allowed in node names") if not rosgraph.names.is_legal_base_name(name): import warnings warnings.warn( "'%s' is not a legal ROS base name. This may cause problems with other ROS tools" % name, stacklevel=2) global _init_node_args # #972: allow duplicate init_node args if calls are identical # NOTE: we don't bother checking for node name aliases (e.g. 'foo' == '/foo'). if _init_node_args: if _init_node_args != (name, argv, anonymous, log_level, disable_rostime, disable_signals): raise rospy.exceptions.ROSException( "rospy.init_node() has already been called with different arguments: " + str(_init_node_args)) else: return #already initialized # for scripting environments, we don't want to use the ROS signal # handlers disable_signals = disable_signals or roslib.is_interactive() _init_node_args = (name, argv, anonymous, log_level, disable_rostime, disable_signals) if not disable_signals: # NOTE: register_signals must be called from main thread rospy.core.register_signals() # add handlers for SIGINT/etc... else: logdebug("signal handlers for rospy disabled") # check for name override mappings = rospy.names.get_mappings() if '__name' in mappings: # use rosgraph version of resolve_name to avoid remapping name = rosgraph.names.resolve_name(mappings['__name'], rospy.core.get_caller_id()) if anonymous: logdebug( "[%s] WARNING: due to __name setting, anonymous setting is being changed to false" % name) anonymous = False if anonymous: # not as good as a uuid/guid, but more readable. can't include # hostname as that is not guaranteed to be a legal ROS name name = "%s_%s_%s" % (name, os.getpid(), int(time.time() * 1000)) resolved_node_name = rospy.names.resolve_name(name) rospy.core.configure_logging(resolved_node_name) # #1810 rospy.names.initialize_mappings(resolved_node_name) logger = logging.getLogger("rospy.client") logger.info("init_node, name[%s], pid[%s]", resolved_node_name, os.getpid()) # node initialization blocks until registration with master node = rospy.impl.init.start_node(os.environ, resolved_node_name) rospy.core.set_node_uri(node.uri) rospy.core.add_shutdown_hook(node.shutdown) if rospy.core.is_shutdown(): logger.warn( "aborting node initialization as shutdown has been triggered") raise rospy.exceptions.ROSInitException( "init_node interrupted before it could complete") # upload private params (set via command-line) to parameter server _init_node_params(argv, name) rospy.core.set_initialized(True) if not disable_rosout: rospy.impl.rosout.init_rosout() rospy.impl.rosout.load_rosout_handlers(log_level) if not disable_rostime: if not rospy.impl.simtime.init_simtime(): raise rospy.exceptions.ROSInitException( "Failed to initialize time. Please check logs for additional details" ) else: rospy.rostime.set_rostime_initialized(True) logdebug("init_node, name[%s], pid[%s]", resolved_node_name, os.getpid()) # advertise logging level services Service('~get_loggers', GetLoggers, _get_loggers) Service('~set_logger_level', SetLoggerLevel, _set_logger_level)
def init_node(name, argv=None, anonymous=False, log_level=None, disable_rostime=False, disable_rosout=False, disable_signals=False, xmlrpc_port=0, tcpros_port=0): """ Register client node with the master under the specified name. This MUST be called from the main Python thread unless disable_signals is set to True. Duplicate calls to init_node are only allowed if the arguments are identical as the side-effects of this method are not reversible. @param name: Node's name. This parameter must be a base name, meaning that it cannot contain namespaces (i.e. '/') @type name: str @param argv: Command line arguments to this program, including remapping arguments (default: sys.argv). If you provide argv to init_node(), any previously created rospy data structure (Publisher, Subscriber, Service) will have invalid mappings. It is important that you call init_node() first if you wish to provide your own argv. @type argv: [str] @param anonymous: if True, a name will be auto-generated for the node using name as the base. This is useful when you wish to have multiple instances of the same node and don't care about their actual names (e.g. tools, guis). name will be used as the stem of the auto-generated name. NOTE: you cannot remap the name of an anonymous node. @type anonymous: bool @param log_level: log level for sending message to /rosout and log file, which is INFO by default. For convenience, you may use rospy.DEBUG, rospy.INFO, rospy.ERROR, rospy.WARN, rospy.FATAL @type log_level: int @param disable_signals: If True, rospy will not register its own signal handlers. You must set this flag if (a) you are unable to call init_node from the main thread and/or you are using rospy in an environment where you need to control your own signal handling (e.g. WX). If you set this to True, you should call rospy.signal_shutdown(reason) to initiate clean shutdown. NOTE: disable_signals is overridden to True if roslib.is_interactive() is True. @type disable_signals: bool @param disable_rostime: for internal testing only: suppresses automatic subscription to rostime @type disable_rostime: bool @param disable_rosout: for internal testing only: suppress auto-publication of rosout @type disable_rostime: bool @param xmlrpc_port: If provided, it will use this port number for the client XMLRPC node. @type xmlrpc_port: int @param tcpros_port: If provided, the TCPROS server will listen for connections on this port @type tcpros_port: int @raise ROSInitException: if initialization/registration fails @raise ValueError: if parameters are invalid (e.g. name contains a namespace or is otherwise illegal) """ if argv is None: argv = sys.argv else: # reload the mapping table. Any previously created rospy data # structure does *not* reinitialize based on the new mappings. rospy.names.reload_mappings(argv) # this test can be eliminated once we change from warning to error in the next check if rosgraph.names.SEP in name: raise ValueError("namespaces are not allowed in node names") if not rosgraph.names.is_legal_base_name(name): import warnings warnings.warn("'%s' is not a legal ROS base name. This may cause problems with other ROS tools"%name, stacklevel=2) global _init_node_args # #972: allow duplicate init_node args if calls are identical # NOTE: we don't bother checking for node name aliases (e.g. 'foo' == '/foo'). if _init_node_args: if _init_node_args != (name, argv, anonymous, log_level, disable_rostime, disable_signals): raise rospy.exceptions.ROSException("rospy.init_node() has already been called with different arguments: "+str(_init_node_args)) else: return #already initialized # for scripting environments, we don't want to use the ROS signal # handlers disable_signals = disable_signals or roslib.is_interactive() _init_node_args = (name, argv, anonymous, log_level, disable_rostime, disable_signals) if not disable_signals: # NOTE: register_signals must be called from main thread rospy.core.register_signals() # add handlers for SIGINT/etc... else: logdebug("signal handlers for rospy disabled") # check for name override mappings = rospy.names.get_mappings() if '__name' in mappings: # use rosgraph version of resolve_name to avoid remapping name = rosgraph.names.resolve_name(mappings['__name'], rospy.core.get_caller_id()) if anonymous: logdebug("[%s] WARNING: due to __name setting, anonymous setting is being changed to false"%name) anonymous = False if anonymous: # not as good as a uuid/guid, but more readable. can't include # hostname as that is not guaranteed to be a legal ROS name name = "%s_%s_%s"%(name, os.getpid(), int(time.time()*1000)) resolved_node_name = rospy.names.resolve_name(name) rospy.core.configure_logging(resolved_node_name) # #1810 rospy.names.initialize_mappings(resolved_node_name) logger = logging.getLogger("rospy.client") logger.info("init_node, name[%s], pid[%s]", resolved_node_name, os.getpid()) # node initialization blocks until registration with master node = rospy.impl.init.start_node(os.environ, resolved_node_name, port=xmlrpc_port, tcpros_port=tcpros_port) rospy.core.set_node_uri(node.uri) rospy.core.add_shutdown_hook(node.shutdown) if rospy.core.is_shutdown(): logger.warn("aborting node initialization as shutdown has been triggered") raise rospy.exceptions.ROSInitException("init_node interrupted before it could complete") # upload private params (set via command-line) to parameter server _init_node_params(argv, name) rospy.core.set_initialized(True) if not disable_rosout: rospy.impl.rosout.init_rosout() rospy.impl.rosout.load_rosout_handlers(log_level) if not disable_rostime: if not rospy.impl.simtime.init_simtime(): raise rospy.exceptions.ROSInitException("Failed to initialize time. Please check logs for additional details") else: rospy.rostime.set_rostime_initialized(True) logdebug("init_node, name[%s], pid[%s]", resolved_node_name, os.getpid()) # advertise logging level services Service('~get_loggers', GetLoggers, _get_loggers) Service('~set_logger_level', SetLoggerLevel, _set_logger_level)