Skip to content

Commit

Permalink
[ros2node] Add option to info verb to display hidden names (#373)
Browse files Browse the repository at this point in the history
* [ros2node] Add option to info verb to display hidden names

Changes behavior so that hidden names are not shown by default.

* Update ros2component to request hidden service names

Which it uses for identifier component containers.

Signed-off-by: Jacob Perron <jacob@openrobotics.org>
  • Loading branch information
jacobperron authored Oct 21, 2019
1 parent c17f7db commit c41da46
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 18 deletions.
3 changes: 2 additions & 1 deletion ros2component/ros2component/api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,8 @@ def find_container_node_names(*, node, node_names):
container_node_names = []
for n in node_names:
try:
services = get_service_info(node=node, remote_node_name=n.full_name)
services = get_service_info(
node=node, remote_node_name=n.full_name, include_hidden=True)
except rclpy.node.NodeNameNonExistentError:
continue
if not any(s.name.endswith('_container/load_node') and
Expand Down
41 changes: 29 additions & 12 deletions ros2node/ros2node/api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@
TopicInfo = namedtuple('Topic', ('name', 'types'))


def _is_hidden_name(name):
# note, we're assuming the hidden node prefix is the same for other hidden names
return any(part.startswith(HIDDEN_NODE_PREFIX) for part in name.split('/'))


def get_absolute_node_name(node_name):
if not node_name:
return None
Expand Down Expand Up @@ -57,48 +62,60 @@ def get_node_names(*, node, include_hidden_nodes=False):
]


def get_topics(remote_node_name, func):
def get_topics(remote_node_name, func, *, include_hidden_topics=False):
node = parse_node_name(remote_node_name)
names_and_types = func(node.name, node.namespace)
return [
TopicInfo(
name=t[0],
types=t[1])
for t in names_and_types]
for t in names_and_types if include_hidden_topics or not _is_hidden_name(t[0])]


def get_subscriber_info(*, node, remote_node_name):
return get_topics(remote_node_name, node.get_subscriber_names_and_types_by_node)
def get_subscriber_info(*, node, remote_node_name, include_hidden=False):
return get_topics(
remote_node_name,
node.get_subscriber_names_and_types_by_node,
include_hidden_topics=include_hidden
)


def get_publisher_info(*, node, remote_node_name):
return get_topics(remote_node_name, node.get_publisher_names_and_types_by_node)
def get_publisher_info(*, node, remote_node_name, include_hidden=False):
return get_topics(
remote_node_name,
node.get_publisher_names_and_types_by_node,
include_hidden_topics=include_hidden
)


def get_service_info(*, node, remote_node_name):
return get_topics(remote_node_name, node.get_service_names_and_types_by_node)
def get_service_info(*, node, remote_node_name, include_hidden=False):
return get_topics(
remote_node_name,
node.get_service_names_and_types_by_node,
include_hidden_topics=include_hidden
)


def get_action_server_info(*, node, remote_node_name):
def get_action_server_info(*, node, remote_node_name, include_hidden=False):
remote_node = parse_node_name(remote_node_name)
names_and_types = get_action_server_names_and_types_by_node(
node, remote_node.name, remote_node.namespace)
return [
TopicInfo(
name=n,
types=t)
for n, t in names_and_types]
for n, t in names_and_types if include_hidden or not _is_hidden_name(n)]


def get_action_client_info(*, node, remote_node_name):
def get_action_client_info(*, node, remote_node_name, include_hidden=False):
remote_node = parse_node_name(remote_node_name)
names_and_types = get_action_client_names_and_types_by_node(
node, remote_node.name, remote_node.namespace)
return [
TopicInfo(
name=n,
types=t)
for n, t in names_and_types]
for n, t in names_and_types if include_hidden or not _is_hidden_name(n)]


class NodeNameCompleter:
Expand Down
16 changes: 11 additions & 5 deletions ros2node/ros2node/verb/info.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,28 +38,34 @@ def add_arguments(self, parser, cli_name):
'node_name',
help='Node name to request information')
argument.completer = NodeNameCompleter()
parser.add_argument(
'--include-hidden', action='store_true',
help='Display hidden topics, services, and actions as well')

def main(self, *, args):
with NodeStrategy(args) as node:
node_names = get_node_names(node=node, include_hidden_nodes=True)
if args.node_name in (n.full_name for n in node_names):
with DirectNode(args) as node:
print(args.node_name)
subscribers = get_subscriber_info(node=node, remote_node_name=args.node_name)
subscribers = get_subscriber_info(
node=node, remote_node_name=args.node_name, include_hidden=args.include_hidden)
print(' Subscribers:')
print_names_and_types(subscribers)
publishers = get_publisher_info(node=node, remote_node_name=args.node_name)
publishers = get_publisher_info(
node=node, remote_node_name=args.node_name, include_hidden=args.include_hidden)
print(' Publishers:')
print_names_and_types(publishers)
services = get_service_info(node=node, remote_node_name=args.node_name)
services = get_service_info(
node=node, remote_node_name=args.node_name, include_hidden=args.include_hidden)
print(' Services:')
print_names_and_types(services)
actions_servers = get_action_server_info(
node=node, remote_node_name=args.node_name)
node=node, remote_node_name=args.node_name, include_hidden=args.include_hidden)
print(' Action Servers:')
print_names_and_types(actions_servers)
actions_clients = get_action_client_info(
node=node, remote_node_name=args.node_name)
node=node, remote_node_name=args.node_name, include_hidden=args.include_hidden)
print(' Action Clients:')
print_names_and_types(actions_clients)
else:
Expand Down

0 comments on commit c41da46

Please sign in to comment.