@@ -284,57 +284,90 @@ def unload_controller(
284
284
)
285
285
286
286
287
- def get_parameter_from_param_file (
288
- node , controller_name , namespace , parameter_file , parameter_name
287
+ def get_params_files_with_controller_parameters (
288
+ node , controller_name : str , namespace : str , parameter_files : list
289
289
):
290
- with open (parameter_file ) as f :
291
- namespaced_controller = (
292
- f"/{ controller_name } " if namespace == "/" else f"{ namespace } /{ controller_name } "
293
- )
294
- WILDCARD_KEY = "/**"
295
- ROS_PARAMS_KEY = "ros__parameters"
296
- parameters = yaml .safe_load (f )
297
- controller_param_dict = None
298
- # check for the parameter in 'controller_name' or 'namespaced_controller' or '/**/namespaced_controller' or '/**/controller_name'
299
- for key in [
300
- controller_name ,
301
- namespaced_controller ,
302
- f"{ WILDCARD_KEY } /{ controller_name } " ,
303
- f"{ WILDCARD_KEY } { namespaced_controller } " ,
304
- ]:
305
- if key in parameters :
306
- if key == controller_name and namespace != "/" :
307
- node .get_logger ().fatal (
308
- f"{ bcolors .FAIL } Missing namespace : { namespace } or wildcard in parameter file for controller : { controller_name } { bcolors .ENDC } "
290
+ controller_parameter_files = []
291
+ for parameter_file in parameter_files :
292
+ if parameter_file in controller_parameter_files :
293
+ continue
294
+ with open (parameter_file ) as f :
295
+ namespaced_controller = (
296
+ f"/{ controller_name } " if namespace == "/" else f"{ namespace } /{ controller_name } "
297
+ )
298
+ WILDCARD_KEY = "/**"
299
+ parameters = yaml .safe_load (f )
300
+ # check for the parameter in 'controller_name' or 'namespaced_controller' or '/**/namespaced_controller' or '/**/controller_name'
301
+ for key in [
302
+ controller_name ,
303
+ namespaced_controller ,
304
+ f"{ WILDCARD_KEY } /{ controller_name } " ,
305
+ f"{ WILDCARD_KEY } { namespaced_controller } " ,
306
+ ]:
307
+ if key in parameters :
308
+ if key == controller_name and namespace != "/" :
309
+ node .get_logger ().fatal (
310
+ f"{ bcolors .FAIL } Missing namespace : { namespace } or wildcard in parameter file for controller : { controller_name } { bcolors .ENDC } "
311
+ )
312
+ break
313
+ controller_parameter_files .append (parameter_file )
314
+
315
+ if WILDCARD_KEY in parameters and key in parameters [WILDCARD_KEY ]:
316
+ controller_parameter_files .append (parameter_file )
317
+ return controller_parameter_files
318
+
319
+
320
+ def get_parameter_from_param_files (
321
+ node , controller_name : str , namespace : str , parameter_files : list , parameter_name : str
322
+ ):
323
+ for parameter_file in parameter_files :
324
+ with open (parameter_file ) as f :
325
+ namespaced_controller = (
326
+ f"/{ controller_name } " if namespace == "/" else f"{ namespace } /{ controller_name } "
327
+ )
328
+ WILDCARD_KEY = "/**"
329
+ ROS_PARAMS_KEY = "ros__parameters"
330
+ parameters = yaml .safe_load (f )
331
+ controller_param_dict = None
332
+ # check for the parameter in 'controller_name' or 'namespaced_controller' or '/**/namespaced_controller' or '/**/controller_name'
333
+ for key in [
334
+ controller_name ,
335
+ namespaced_controller ,
336
+ f"{ WILDCARD_KEY } /{ controller_name } " ,
337
+ f"{ WILDCARD_KEY } { namespaced_controller } " ,
338
+ ]:
339
+ if key in parameters :
340
+ if key == controller_name and namespace != "/" :
341
+ node .get_logger ().fatal (
342
+ f"{ bcolors .FAIL } Missing namespace : { namespace } or wildcard in parameter file for controller : { controller_name } { bcolors .ENDC } "
343
+ )
344
+ break
345
+ controller_param_dict = parameters [key ]
346
+
347
+ if WILDCARD_KEY in parameters and key in parameters [WILDCARD_KEY ]:
348
+ controller_param_dict = parameters [WILDCARD_KEY ][key ]
349
+
350
+ if controller_param_dict and (
351
+ not isinstance (controller_param_dict , dict )
352
+ or ROS_PARAMS_KEY not in controller_param_dict
353
+ ):
354
+ raise RuntimeError (
355
+ f"YAML file : { parameter_file } is not a valid ROS parameter file for controller node : { namespaced_controller } "
309
356
)
357
+ if (
358
+ controller_param_dict
359
+ and ROS_PARAMS_KEY in controller_param_dict
360
+ and parameter_name in controller_param_dict [ROS_PARAMS_KEY ]
361
+ ):
310
362
break
311
- controller_param_dict = parameters [key ]
312
-
313
- if WILDCARD_KEY in parameters and key in parameters [WILDCARD_KEY ]:
314
- controller_param_dict = parameters [WILDCARD_KEY ][key ]
315
-
316
- if controller_param_dict and (
317
- not isinstance (controller_param_dict , dict )
318
- or ROS_PARAMS_KEY not in controller_param_dict
319
- ):
320
- raise RuntimeError (
321
- f"YAML file : { parameter_file } is not a valid ROS parameter file for controller node : { namespaced_controller } "
322
- )
323
- if (
324
- controller_param_dict
325
- and ROS_PARAMS_KEY in controller_param_dict
326
- and parameter_name in controller_param_dict [ROS_PARAMS_KEY ]
327
- ):
328
- break
329
-
330
- if controller_param_dict is None :
331
- node .get_logger ().fatal (
332
- f"{ bcolors .FAIL } Controller : { namespaced_controller } parameters not found in parameter file : { parameter_file } { bcolors .ENDC } "
333
- )
334
- if parameter_name in controller_param_dict [ROS_PARAMS_KEY ]:
335
- return controller_param_dict [ROS_PARAMS_KEY ][parameter_name ]
336
363
337
- return None
364
+ if controller_param_dict and parameter_name in controller_param_dict [ROS_PARAMS_KEY ]:
365
+ return controller_param_dict [ROS_PARAMS_KEY ][parameter_name ]
366
+ if controller_param_dict is None :
367
+ node .get_logger ().fatal (
368
+ f"{ bcolors .FAIL } Controller : { namespaced_controller } parameters not found in parameter files : { parameter_files } { bcolors .ENDC } "
369
+ )
370
+ return None
338
371
339
372
340
373
def set_controller_parameters (
@@ -378,26 +411,36 @@ def set_controller_parameters(
378
411
return True
379
412
380
413
381
- def set_controller_parameters_from_param_file (
382
- node , controller_manager_name , controller_name , parameter_file , namespace = None
414
+ def set_controller_parameters_from_param_files (
415
+ node , controller_manager_name : str , controller_name : str , parameter_files : list , namespace = None
383
416
):
384
- if parameter_file :
385
- spawner_namespace = namespace if namespace else node .get_namespace ()
417
+ spawner_namespace = namespace if namespace else node .get_namespace ()
418
+ controller_parameter_files = get_params_files_with_controller_parameters (
419
+ node , controller_name , spawner_namespace , parameter_files
420
+ )
421
+ if controller_parameter_files :
386
422
set_controller_parameters (
387
- node , controller_manager_name , controller_name , "params_file" , parameter_file
423
+ node ,
424
+ controller_manager_name ,
425
+ controller_name ,
426
+ "params_file" ,
427
+ controller_parameter_files ,
388
428
)
389
429
390
- controller_type = get_parameter_from_param_file (
391
- node , controller_name , spawner_namespace , parameter_file , "type"
430
+ controller_type = get_parameter_from_param_files (
431
+ node , controller_name , spawner_namespace , controller_parameter_files , "type"
392
432
)
393
- if controller_type :
394
- if not set_controller_parameters (
395
- node , controller_manager_name , controller_name , "type" , controller_type
396
- ):
397
- return False
433
+ if controller_type and not set_controller_parameters (
434
+ node , controller_manager_name , controller_name , "type" , controller_type
435
+ ):
436
+ return False
398
437
399
- fallback_controllers = get_parameter_from_param_file (
400
- node , controller_name , spawner_namespace , parameter_file , "fallback_controllers"
438
+ fallback_controllers = get_parameter_from_param_files (
439
+ node ,
440
+ controller_name ,
441
+ spawner_namespace ,
442
+ controller_parameter_files ,
443
+ "fallback_controllers" ,
401
444
)
402
445
if fallback_controllers :
403
446
if not set_controller_parameters (
0 commit comments