1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 from __future__ import with_statement
36
37 import rosnode
38 import rospy
39
40 from rosh.impl.exceptions import ROSHException
41 from rosh.impl.namespace import Namespace, Concept, NSResourceList
42
44
45 - def __init__(self, config, name, pubs, subs, srvs):
46 self.name, self._pubs, self._subs, self._srvs = name, pubs, subs, srvs
47
48
49
50
51
52 t = config.ctx.topics
53 s = config.ctx.services
54 topic_config = t._config
55 service_config = s._config
56 TopicNS = t._nstype
57 ServiceNS = s._nstype
58
59 self.pubs = NSResourceList('', topic_config, pubs, TopicNS)
60 self.subs = NSResourceList('', topic_config, subs, TopicNS)
61 self.srvs = NSResourceList('', service_config, srvs, ServiceNS)
62
63 - def _update(self, pubs, subs, srvs):
64 """
65 In-place update of resource lists
66 """
67 self._pubs, self._subs, self._srvs = pubs, subs, srvs
68 self.pubs._set_resources(pubs)
69 self.subs._set_resources(subs)
70 self.srvs._set_resources(srvs)
71
74
76 pubs, subs, srvs = self._pubs, self._subs, self._srvs
77 buff = 'Node [%s]\n'%(self.name)
78 if pubs:
79 buff += "\nPublications: \n"
80 buff += '\n'.join([" * %s"%(l) for l in pubs]) + '\n'
81 else:
82 buff += "\nPublications: None\n"
83 if subs:
84 buff += "\nSubscriptions: \n"
85 buff += '\n'.join([" * %s"%(l) for l in subs]) + '\n'
86 else:
87 buff += "\nSubscriptions: None\n"
88 if srvs:
89 buff += "\nServices: \n"
90 buff += '\n'.join([" * %s"%l for l in srvs]) + '\n'
91 else:
92 buff += "\nServices: None\n"
93
94 return buff
95
96 -def node_info(config, node_name, node_info_obj=None):
97 """
98 @param config: Namespace config object to use for scoping.
99 @type config: NamespaceConfig
100 @param node_name: ROS Name of Node
101 @type node_name: str
102 @param node_info_obj: (optional) If a NodeInfo instance is
103 provided, it will be updated with the resulting
104 information. Otherwise, a new instance will be generated.
105 @type node_info_obj: NodeInfo
106 """
107
108 state = config.ctx.master.getSystemState()
109 pubs = [t for t, l in state[0] if node_name in l]
110 subs = [t for t, l in state[1] if node_name in l]
111 srvs = [t for t, l in state[2] if node_name in l]
112 if node_info_obj is None:
113 return NodeInfo(config, node_name, pubs, subs, srvs)
114 else:
115 node_info_obj._update(pubs, subs, srvs)
116
118
120 """
121 ctor.
122 @param config: Namespace configuration instance.
123 @type config: L{NamespaceConfig}
124 """
125 super(NodeNS, self).__init__(name, config)
126 self._uri = None
127 self._init_uri()
128 self._info_obj = None
129
131 """
132 Override Namespace._list()
133 """
134 return rosnode.get_node_names(namespace=self._ns)
135
137 if self._process is not None:
138
139 self._process._kill()
140 self._process = None
141 else:
142
143 rosnode.kill_nodes([self._name])
144
146 if self._name and self._uri is None:
147 try:
148 self._uri = rosnode.get_api_uri(self._config.master.handle, self._name)
149 except:
150 pass
151
153 """
154 show() handler
155 """
156 show_graph(self._ns)
157
160
162 """
163 String representation of node. Provides node's URI.
164 """
165 if self._uri is None:
166 self._init_uri()
167 if self._uri is None:
168 return self._ns
169 else:
170 return "Name: %s\nURI: %s"%(self._name, self._uri)
171
173 """
174 info() API.
175
176 @return: node info object that provides access to pubs, subs, and srvs
177 @rtype: L{NodeInfo}
178 """
179
180
181
182 if self._info_obj is None:
183 self._info_obj = node_info(self._config, self._name)
184 else:
185 node_info(self._config, self._name, self._info_obj)
186 return self._info_obj
187
189 """
190 Ping the node.
191 """
192 return rosnode.rosnode_ping(self._name, max_count=1, verbose=False)
193
201
203 import subprocess
204 cmd = ['rxgraph', '--nodens', ns]
205
206 subprocess.Popen(cmd, stderr=subprocess.PIPE)
207