1313# limitations under the License.
1414
1515import sys
16+ import time
1617import warnings
1718
1819from rcl_interfaces .msg import ParameterType
@@ -40,13 +41,20 @@ def get_value(*, parameter_value):
4041 return value
4142
4243
43- def load_parameter_file (* , node , node_name , parameter_file , use_wildcard ):
44- # Remove leading slash and namespaces
45- client = AsyncParameterClient (node , node_name )
46- client .wait_for_services (timeout_sec = 5.0 )
44+ def busy_wait_client (client , node ):
45+ timeout_sec = 5
46+ prev = time .time ()
47+ while not (client .services_are_ready () or timeout_sec < 0 ):
48+ client .wait_for_services (timeout_sec = 0.1 )
49+ rclpy .spin_once (node )
50+ timeout_sec -= prev - time .time ()
4751 if not client .services_are_ready ():
4852 raise RuntimeError ('Could not reach parameter services' )
4953
54+
55+ def load_parameter_file (* , node , node_name , parameter_file , use_wildcard ):
56+ client = AsyncParameterClient (node , node_name )
57+ busy_wait_client (client , node )
5058 future = client .load_parameter_file (parameter_file , use_wildcard )
5159 parameters = list (parameter_dict_from_yaml_file (parameter_file , use_wildcard ).values ())
5260 rclpy .spin_until_future_complete (node , future )
@@ -69,45 +77,53 @@ def load_parameter_file(*, node, node_name, parameter_file, use_wildcard):
6977
7078def call_describe_parameters (* , node , node_name , parameter_names = None ):
7179 client = AsyncParameterClient (node , node_name )
72- client .wait_for_services (timeout_sec = 5.0 )
73- if not client .services_are_ready ():
74- raise RuntimeError ('Could not reach parameter services' )
80+ busy_wait_client (client , node )
81+
7582 future = client .describe_parameters (parameter_names )
7683 rclpy .spin_until_future_complete (node , future )
7784 response = future .result ()
85+ if response is None :
86+ raise RuntimeError ('Exception while calling service of node '
87+ f'{ node_name } : { future .exception ()} ' )
7888 return response
7989
8090
8191def call_get_parameters (* , node , node_name , parameter_names ):
8292 client = AsyncParameterClient (node , node_name )
83- client .wait_for_services (timeout_sec = 5.0 )
84- if not client .services_are_ready ():
85- raise RuntimeError ('Could not reach parameter services' )
93+ busy_wait_client (client , node )
94+
8695 future = client .get_parameters (parameter_names )
8796 rclpy .spin_until_future_complete (node , future )
8897 response = future .result ()
98+ if response is None :
99+ raise RuntimeError ('Exception while calling service of node '
100+ f'{ node_name } : { future .exception ()} ' )
89101 return response
90102
91103
92104def call_set_parameters (* , node , node_name , parameters ):
93105 client = AsyncParameterClient (node , node_name )
94- client .wait_for_services (timeout_sec = 5.0 )
95- if not client .services_are_ready ():
96- raise RuntimeError ('Could not reach parameter services' )
106+ busy_wait_client (client , node )
107+
97108 future = client .set_parameters (parameters )
98109 rclpy .spin_until_future_complete (node , future )
99110 response = future .result ()
111+ if response is None :
112+ raise RuntimeError ('Exception while calling service of node '
113+ f'{ node_name } : { future .exception ()} ' )
100114 return response
101115
102116
103- def call_list_parameters (* , node , node_name ):
117+ def call_list_parameters (* , node , node_name , prefixes = None ):
104118 client = AsyncParameterClient (node , node_name )
105- client .wait_for_services (timeout_sec = 5.0 )
106- if not client .services_are_ready ():
107- raise RuntimeError ('Could not reach parameter services' )
108- future = client .list_parameters ()
109- rclpy .spin_until_future_complete (node , future ) # This is hanging..
119+ busy_wait_client (client , node )
120+
121+ future = client .list_parameters (prefixes = prefixes )
122+ rclpy .spin_until_future_complete (node , future )
110123 response = future .result ()
124+ if response is None :
125+ raise RuntimeError ('Exception while calling service of node '
126+ f'{ node_name } : { future .exception ()} ' )
111127 return response .result .names
112128
113129
0 commit comments