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 Master/Slave XML-RPC Wrappers.
36
37 The L{MasterProxy} simplifies usage of master/slave
38 APIs by automatically inserting the caller ID and also adding python
39 dictionary accessors on the parameter server.
40 """
41
42 import rospy.core
43 import rospy.exceptions
44 import rospy.names
45
46 import rospy.impl.paramserver
47 import rospy.impl.masterslave
48
49 _master_arg_remap = {
50 'deleteParam': [0],
51 'setParam': [0],
52 'getParam': [0],
53 'searchParam': [0],
54 'subscribeParam': [0],
55 'unsubscribeParam': [0],
56 'hasParam': [0],
57 'registerService': [0],
58 'lookupService': [0],
59 'unregisterService': [0],
60 'registerSubscriber': [0],
61 'unregisterSubscriber': [0],
62 'registerPublisher': [0],
63 'unregisterPublisher': [0],
64 'lookupNode': [0],
65 'getPublishedTopics': [0],
66 }
67
69 """
70 Convenience wrapper for ROS master API and XML-RPC
71 implementation. The Master API methods can be invoked on this
72 object and will be forwarded appropriately. Names in arguments
73 will be remapped according to current node settings. Provides
74 dictionary-like access to parameter server, e.g.::
75
76 master[key] = value
77
78 """
79
81 """
82 Constructor for wrapping a remote master instance.
83 @param uri: XML-RPC URI of master
84 @type uri: str
85 """
86 self.target = rospy.core.xmlrpcapi(uri)
87
89 f = getattr(self.target, key)
90 if key in _master_arg_remap:
91 remappings = _master_arg_remap[key]
92 else:
93 remappings = rospy.impl.masterslave.ROSHandler.remappings(key)
94 def wrappedF(*args, **kwds):
95 args = [rospy.names.get_caller_id(),]+list(args)
96
97 for i in remappings:
98 i = i + 1
99
100 args[i] = rospy.names.resolve_name(args[i])
101 return f(*args, **kwds)
102 return wrappedF
103
105 """
106 Fetch item from parameter server and subscribe to future updates so that
107 values can be cached.
108 @param key: parameter key
109 @type key: str
110 @raise KeyError: if key is not set
111 """
112
113 resolved_key = rospy.names.resolve_name(key)
114 if 1:
115 code, msg, value = self.target.getParam(rospy.names.get_caller_id(), resolved_key)
116 if code != 1:
117 raise KeyError(key)
118 return value
119
120 try:
121
122 return rospy.impl.paramserver.get_param_server_cache().get(resolved_key)
123 except KeyError:
124
125 code, msg, value = self.target.subscribeParam(rospy.names.get_caller_id(), rospy.core.get_node_uri(), resolved_key)
126 if code != 1:
127 raise KeyError(key)
128
129 rospy.impl.paramserver.get_param_server_cache().set(resolved_key, value)
130 return value
131
133 """
134 Set parameter value on Parameter Server
135 @param key: parameter key
136 @type key: str
137 @param val: parameter value
138 @type val: XMLRPC legal value
139 """
140 self.target.setParam(rospy.names.get_caller_id(), rospy.names.resolve_name(key), val)
141
143 """
144 Search for a parameter matching key on the parameter server
145 @return: found key or None if search did not succeed
146 @rtype: str
147 @raise ROSException: if parameter server reports an error
148 """
149
150 mappings = rospy.names.get_mappings()
151 if key in mappings:
152 key = mappings[key]
153 code, msg, val = self.target.searchParam(rospy.names.get_caller_id(), key)
154 if code == 1:
155 return val
156 elif code == -1:
157 return None
158 else:
159 raise rospy.exceptions.ROSException("cannot search for parameter: %s"%msg)
160
176
178 """
179 Check if parameter is set on Parameter Server
180 @param key: parameter key
181 @type key: str
182 @raise ROSException: if parameter server reports an error
183 """
184 code, msg, value = self.target.hasParam(rospy.names.get_caller_id(), rospy.names.resolve_name(key))
185 if code != 1:
186 raise rospy.exceptions.ROSException("cannot check parameter on server: %s"%msg)
187 return value
188
190 """
191 @raise ROSException: if parameter server reports an error
192 """
193 code, msg, value = self.target.getParamNames(rospy.names.get_caller_id())
194 if code == 1:
195 return value.__iter__()
196 else:
197 raise rospy.exceptions.ROSException("cannot retrieve parameter names: %s"%msg)
198