From 41b5073db20d3cbe9efa754d26e6ab5b2e3c10e2 Mon Sep 17 00:00:00 2001 From: "Minju, Lee" <70446214+leeminju531@users.noreply.github.com> Date: Mon, 16 Oct 2023 13:05:26 +0900 Subject: [PATCH] Add ros2 service info (#771) Signed-off-by: leeminju531 --- ros2cli/ros2cli/daemon/__init__.py | 4 ++- ros2cli/test/test_daemon.py | 8 +++++ ros2service/ros2service/verb/info.py | 54 ++++++++++++++++++++++++++++ ros2service/setup.py | 1 + 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 ros2service/ros2service/verb/info.py diff --git a/ros2cli/ros2cli/daemon/__init__.py b/ros2cli/ros2cli/daemon/__init__.py index 38a2fe5dc..d885e6aaa 100644 --- a/ros2cli/ros2cli/daemon/__init__.py +++ b/ros2cli/ros2cli/daemon/__init__.py @@ -95,7 +95,9 @@ def serve(server, *, timeout=2 * 60 * 60): bind(rclpy.action.get_action_server_names_and_types_by_node, node), bind(rclpy.action.get_action_client_names_and_types_by_node, node), node.count_publishers, - node.count_subscribers + node.count_subscribers, + node.count_clients, + node.count_services ] server.register_introspection_functions() diff --git a/ros2cli/test/test_daemon.py b/ros2cli/test/test_daemon.py index e94218d1d..ce05b1c5a 100644 --- a/ros2cli/test/test_daemon.py +++ b/ros2cli/test/test_daemon.py @@ -237,3 +237,11 @@ def test_count_publishers(daemon_node): def test_count_subscribers(daemon_node): assert 1 == daemon_node.count_subscribers(TEST_TOPIC_NAME) + + +def test_count_clients(daemon_node): + assert 1 == daemon_node.count_clients(TEST_SERVICE_NAME) + + +def test_count_services(daemon_node): + assert 1 == daemon_node.count_services(TEST_SERVICE_NAME) diff --git a/ros2service/ros2service/verb/info.py b/ros2service/ros2service/verb/info.py new file mode 100644 index 000000000..f640fd7a5 --- /dev/null +++ b/ros2service/ros2service/verb/info.py @@ -0,0 +1,54 @@ +# Copyright 2022 CLOBOT Co., Ltd. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ros2cli.node.strategy import add_arguments as add_strategy_node_arguments +from ros2cli.node.strategy import NodeStrategy +from ros2service.api import get_service_names_and_types +from ros2service.api import ServiceNameCompleter +from ros2topic.verb import VerbExtension + + +class InfoVerb(VerbExtension): + """Print information about a service.""" + + def add_arguments(self, parser, cli_name): + add_strategy_node_arguments(parser) + arg = parser.add_argument( + 'service_name', + help="Name of the ROS service to get info (e.g. '/add_two_ints')") + arg.completer = ServiceNameCompleter( + include_hidden_services_key='include_hidden_services') + + def main(self, *, args): + with NodeStrategy(args) as node: + service_names_and_types = get_service_names_and_types( + node=node, + include_hidden_services=args.include_hidden_services) + service_name = args.service_name + + for (s_name, s_types) in service_names_and_types: + if s_name == service_name: + service_types = s_types + break + else: + return "Unknown service '%s'" % service_name + + type_str = service_types[0] if len(service_types) == 1 else service_types + print('Type: %s' % type_str, end='\n') + + print('Clients count: %d' % + node.count_clients(service_name), end='\n') + + print('Services count: %d' % + node.count_services(service_name), end='\n') diff --git a/ros2service/setup.py b/ros2service/setup.py index 74b3d6a40..c599ad0d3 100644 --- a/ros2service/setup.py +++ b/ros2service/setup.py @@ -43,6 +43,7 @@ 'call = ros2service.verb.call:CallVerb', 'echo = ros2service.verb.echo:EchoVerb', 'find = ros2service.verb.find:FindVerb', + 'info = ros2service.verb.info:InfoVerb', 'list = ros2service.verb.list:ListVerb', 'type = ros2service.verb.type:TypeVerb', ],