def requester(service_type, service_name, values, period): # TODO(wjwwood) this logic should come from a rosidl related package try: package_name, srv_name = service_type.split('/', 2) if not package_name or not srv_name: raise ValueError() except ValueError: raise RuntimeError('The passed service type is invalid') # TODO(sloretz) node API to get topic types should indicate if action or srv middle_module = 'srv' if service_name.endswith('/_action/get_result') or service_name.endswith( '/_action/send_goal'): middle_module = 'action' module = importlib.import_module(package_name + '.' + middle_module) srv_module = getattr(module, srv_name) values_dictionary = yaml.load(values) rclpy.init() node = rclpy.create_node(NODE_NAME_PREFIX + '_requester_%s_%s' % (package_name, srv_name)) cli = node.create_client(srv_module, service_name) request = srv_module.Request() try: set_msg_fields(request, values_dictionary) except SetFieldError as e: # noqa: F841 return "Failed to populate field '{e.field_name}': {e.exception}" \ .format_map(locals()) if not cli.service_is_ready(): print('waiting for service to become available...') cli.wait_for_service() while True: print('requester: making request: %r\n' % request) last_call = time.time() future = cli.call_async(request) rclpy.spin_until_future_complete(node, future) if future.result() is not None: print('response:\n%r\n' % future.result()) else: raise RuntimeError('Exception while calling service: %r' % future.exception()) if period is None or not rclpy.ok(): break time_until_next_period = (last_call + period) - time.time() if time_until_next_period > 0: time.sleep(time_until_next_period) node.destroy_node() rclpy.shutdown()
def publisher(message_type, topic_name, values, node_name, period, print_nth, once): # TODO(dirk-thomas) this logic should come from a rosidl related package try: package_name, message_name = message_type.split('/', 2) if not package_name or not message_name: raise ValueError() except ValueError: raise RuntimeError('The passed message type is invalid') module = importlib.import_module(package_name + '.msg') msg_module = getattr(module, message_name) values_dictionary = yaml.load(values) if not isinstance(values_dictionary, dict): return 'The passed value needs to be a dictionary in YAML format' if not node_name: node_name = 'publisher_%s_%s' % (package_name, message_name) rclpy.init() node = rclpy.create_node(node_name) pub = node.create_publisher(msg_module, topic_name) msg = msg_module() try: set_msg_fields(msg, values_dictionary) except SetFieldError as e: # noqa: F841 return "Failed to populate field '{e.field_name}': {e.exception}" \ .format_map(locals()) print('publisher: beginning loop') count = 0 def timer_callback(): nonlocal count count += 1 if print_nth and count % print_nth == 0: print('publishing #%d: %r\n' % (count, msg)) pub.publish(msg) timer = node.create_timer(period, timer_callback) if once: rclpy.spin_once(node) time.sleep( 0.1) # make sure the message reaches the wire before exiting else: rclpy.spin(node) node.destroy_timer(timer) node.destroy_node() rclpy.shutdown()
def requester(service_type, service_name, values, period): # TODO(wjwwood) this logic should come from a rosidl related package try: package_name, srv_name = service_type.split('/', 2) if not package_name or not srv_name: raise ValueError() except ValueError: raise RuntimeError('The passed service type is invalid') module = importlib.import_module(package_name + '.srv') srv_module = getattr(module, srv_name) values_dictionary = yaml.load(values) rclpy.init() node = rclpy.create_node('requester_%s_%s' % (package_name, srv_name)) cli = node.create_client(srv_module, service_name) request = srv_module.Request() try: set_msg_fields(request, values_dictionary) except SetFieldError as e: return "Failed to populate field '{e.field_name}': {e.exception}" \ .format_map(locals()) if not cli.service_is_ready(): print('waiting for service to become available...') cli.wait_for_service() while True: print('requester: making request: %r\n' % request) last_call = time.time() cli.call(request) cli.wait_for_future() if cli.response is not None: print('response:\n%r\n' % cli.response) if period is None or not rclpy.ok(): break time_until_next_period = (last_call + period) - time.time() if time_until_next_period > 0: time.sleep(time_until_next_period) node.destroy_node() rclpy.try_shutdown( ) # avoid duplicate shutdown from shutdown within cli.wait_for_future()
def publisher(message_type, topic_name, values, node_name, period, print_nth, once): msg_module = import_message_type(topic_name, message_type) values_dictionary = yaml.load(values) if not isinstance(values_dictionary, dict): return 'The passed value needs to be a dictionary in YAML format' if not node_name: node_name = NODE_NAME_PREFIX + '_publisher_%s' % (message_type.replace( '/', '_'), ) rclpy.init() node = rclpy.create_node(node_name) pub = node.create_publisher(msg_module, topic_name) msg = msg_module() try: set_msg_fields(msg, values_dictionary) except SetFieldError as e: # noqa: F841 return "Failed to populate field '{e.field_name}': {e.exception}" \ .format_map(locals()) print('publisher: beginning loop') count = 0 def timer_callback(): nonlocal count count += 1 if print_nth and count % print_nth == 0: print('publishing #%d: %r\n' % (count, msg)) pub.publish(msg) timer = node.create_timer(period, timer_callback) if once: rclpy.spin_once(node) time.sleep( 0.1) # make sure the message reaches the wire before exiting else: rclpy.spin(node) node.destroy_timer(timer) node.destroy_node() rclpy.shutdown()
def publisher(message_type, topic_name, values, period, once): # TODO(dirk-thomas) this logic should come from a rosidl related package try: package_name, message_name = message_type.split('/', 2) if not package_name or not message_name: raise ValueError() except ValueError: raise RuntimeError('The passed message type is invalid') module = importlib.import_module(package_name + '.msg') msg_module = getattr(module, message_name) values_dictionary = yaml.load(values) if not isinstance(values_dictionary, dict): return 'The passed value needs to be a dictionary in YAML format' rclpy.init() node = rclpy.create_node('publisher_%s_%s' % (package_name, message_name)) pub = node.create_publisher(msg_module, topic_name) msg = msg_module() try: set_msg_fields(msg, values_dictionary) except SetFieldError as e: return "Failed to populate field '{e.field_name}': {e.exception}" \ .format_map(locals()) print('publisher: beginning loop') while rclpy.ok(): pub.publish(msg) print('publishing %r\n' % msg) if once: time.sleep( 0.1) # make sure the message reaches the wire before exiting break time.sleep(period) node.destroy_node() rclpy.shutdown()