ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange |
1 | initial version |
Tools like pgrep
could definitely work, but perhaps the Slave API would be more efficient (and perhaps less error prone). Specifically the getPid(..)
service.
2 | No.2 Revision |
Tools like pgrep
could definitely work, but perhaps the Slave API would be more efficient (and perhaps less error prone). Specifically the getPid(..)
service.
Edit: try this. It prints the PIDs of all nodes known to a specific ROS master.
If you don't specify a XMLRPC URI of a specific ROS master, it will use whatever is currently configured in your shell (ie: the value of the ROS_MASTER_URI
env var).
The same information can be retrieved using a bare-bones XMLRPC (Python) client, but it would be a bit more work. It would avoid the dependency on rosgraph
and rosnode
, so could work from any OS with a suitable XMLRPC client.
#!/usr/bin/env python
import rosnode
import rosgraph
import sys
import argparse
# lots of things 'borrowed' from rosnode
try:
from xmlrpc.client import ServerProxy
except ImportError:
from xmlrpclib import ServerProxy
parser = argparse.ArgumentParser()
parser.add_argument('ROS_MASTER_URI', type=str, nargs='?', metavar='URI', help='ROS master URI to use.')
args = parser.parse_args()
ID = '/rosnode'
master = rosgraph.Master(ID, master_uri=args.ROS_MASTER_URI)
print ("Using master at {}".format(master.getUri()))
nodes = rosnode.get_node_names()
print ("Known nodes: " + ', '.join(nodes))
for node in nodes:
print (" " + node)
print (" retrieving API URI for '{}'".format(node))
node_api = rosnode.get_api_uri(master, node)
if not node_api:
print(" cannot get API URI for '{}': unknown node".format(node))
continue
print (" -> {}".format(node_api))
node = ServerProxy(node_api)
pid = rosnode._succeed(node.getPid(ID))
print (" PID: {}".format(pid))
Most of this is done by rosnode
as well, so I used that as a reference. See ros_comm/rosnode/src/rosnode/__init__.py.
3 | No.3 Revision |
Tools like pgrep
could definitely work, but perhaps the Slave API would be more efficient (and perhaps less error prone). Specifically the getPid(..)
service.
Edit: try this. It prints the PIDs of all nodes known to a specific ROS master.
If you don't specify a XMLRPC URI of a specific ROS master, it will use whatever is currently configured in your shell (ie: the value of the ROS_MASTER_URI
env var).
The same information can be retrieved using a bare-bones XMLRPC (Python) client, but it would be a bit more work. It would avoid the dependency on rosgraph
and rosnode
, so could work from any OS with a suitable XMLRPC client.
#!/usr/bin/env python
import rosnode
import rosgraph
import sys
import argparse
# lots of things 'borrowed' from rosnode
try:
from xmlrpc.client import ServerProxy
except ImportError:
from xmlrpclib import ServerProxy
parser = argparse.ArgumentParser()
parser.add_argument('ROS_MASTER_URI', type=str, nargs='?', metavar='URI', help='ROS master URI to use.')
args = parser.parse_args()
ID = '/rosnode'
master = rosgraph.Master(ID, master_uri=args.ROS_MASTER_URI)
print ("Using master at {}".format(master.getUri()))
nodes = rosnode.get_node_names()
print ("Known nodes: " + ', '.join(nodes))
for node in nodes:
print (" " + node)
print (" retrieving API URI for '{}'".format(node))
node_api = rosnode.get_api_uri(master, node)
if not node_api:
print(" cannot get API URI for '{}': unknown node".format(node))
URI: error (unknown node: {}?)".format(node))
continue
print (" -> {}".format(node_api))
API URI: " + node_api)
node = ServerProxy(node_api)
pid = rosnode._succeed(node.getPid(ID))
print (" PID: PID : {}".format(pid))
Most of this is done by rosnode
as well, so I used that as a reference. See ros_comm/rosnode/src/rosnode/__init__.py.