Skip to content

Commit 8f35de2

Browse files
committed
loads observers automatically
1 parent d2b99f6 commit 8f35de2

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed

Diff for: scripts/monitor

+84
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,93 @@
11
#!/usr/bin/env python
22

3+
import importlib
4+
import time
5+
import inspect
6+
import pkgutil
7+
38
import rospy
9+
import rosgraph_monitor.observers
10+
from controller_manager_msgs.srv import *
11+
12+
13+
def iter_namespace(ns_pkg):
14+
return pkgutil.iter_modules(ns_pkg.__path__, ns_pkg.__name__ + ".")
15+
16+
17+
class ModuleManager(object):
18+
def __init__(self):
19+
self._modules = {}
20+
self._observers = {}
21+
rospy.Service('/load_observer', LoadController, self.handle_load)
22+
rospy.Service('/unload_observer', UnloadController, self.handle_unload)
23+
rospy.Service('/active_observers',
24+
ListControllerTypes, self.handle_active)
25+
rospy.Service('/list_observers',
26+
ListControllerTypes, self.handle_types)
27+
28+
def handle_load(self, req):
29+
started = self.start_observer(req.name)
30+
return LoadControllerResponse(started)
31+
32+
def handle_unload(self, req):
33+
stopped = self.stop_observer(req.name)
34+
return UnloadControllerResponse(stopped)
35+
36+
def handle_active(self, req):
37+
names = self._observers.keys()
38+
return ListControllerTypesResponse(names, [])
39+
40+
def handle_types(self, req):
41+
names = self._modules.keys()
42+
return ListControllerTypesResponse(names, [])
43+
44+
def load_observers(self):
45+
available_plugins = {
46+
name: importlib.import_module(name)
47+
for finder, name, ispkg
48+
in iter_namespace(rosgraph_monitor.observers)
49+
}
50+
self._modules = self._get_leaf_nodes(
51+
rosgraph_monitor.observer.Observer)
52+
53+
def start_observer(self, name):
54+
started = True
55+
try:
56+
module = self._modules[name]
57+
self._observers[name] = getattr(module, name)(name)
58+
self._observers[name].start()
59+
except Exception as exc:
60+
print("Could not start {}".format(name))
61+
started = False
62+
return started
63+
64+
def stop_observer(self, name):
65+
stopped = True
66+
try:
67+
self._observers[name].stop()
68+
del self._observers[name]
69+
except Exception as exc:
70+
print("Could not stop {}".format(name))
71+
stopped = False
72+
return stopped
73+
74+
def _get_leaf_nodes(self, root):
75+
leafs = {}
76+
self._collect_leaf_nodes(root, leafs)
77+
return leafs
78+
79+
def _collect_leaf_nodes(self, node, leafs):
80+
if node is not None: # change this to see if it is class
81+
if len(node.__subclasses__()) == 0:
82+
leafs[node.__name__] = inspect.getmodule(node)
83+
for n in node.__subclasses__():
84+
self._collect_leaf_nodes(n, leafs)
485

586

687
if __name__ == "__main__":
788
rospy.init_node('graph_monitor')
889

90+
manager = ModuleManager()
91+
manager.load_observers()
92+
993
rospy.spin()

0 commit comments

Comments
 (0)