2929#
3030# Author: Denis Stogl
3131
32+ from launch_ros .actions import Node
33+ from launch_ros .substitutions import FindPackageShare
34+
3235from launch import LaunchDescription
33- from launch .actions import DeclareLaunchArgument
34- from launch .actions import OpaqueFunction
36+ from launch .actions import DeclareLaunchArgument , OpaqueFunction
3537from launch .conditions import IfCondition , UnlessCondition
3638from launch .substitutions import Command , FindExecutable , LaunchConfiguration , PathJoinSubstitution
37- from launch_ros .actions import Node
38- from launch_ros .substitutions import FindPackageShare
3939
4040
4141def launch_setup (context , * args , ** kwargs ):
@@ -54,6 +54,7 @@ def launch_setup(context, *args, **kwargs):
5454 prefix = LaunchConfiguration ("prefix" )
5555 use_fake_hardware = LaunchConfiguration ("use_fake_hardware" )
5656 fake_sensor_commands = LaunchConfiguration ("fake_sensor_commands" )
57+ controller_spawner_timeout = LaunchConfiguration ("controller_spawner_timeout" )
5758 initial_joint_controller = LaunchConfiguration ("initial_joint_controller" )
5859 activate_joint_controller = LaunchConfiguration ("activate_joint_controller" )
5960 launch_rviz = LaunchConfiguration ("launch_rviz" )
@@ -271,55 +272,58 @@ def launch_setup(context, *args, **kwargs):
271272 arguments = ["-d" , rviz_config_file ],
272273 )
273274
274- joint_state_broadcaster_spawner = Node (
275- package = "controller_manager" ,
276- executable = "spawner" ,
277- arguments = ["joint_state_broadcaster" , "--controller-manager" , "/controller_manager" ],
278- )
275+ # Spawn controllers
276+ def controller_spawner (name , active = True ):
277+ inactive_flags = ["--inactive" ] if not active else []
278+ return Node (
279+ package = "controller_manager" ,
280+ executable = "spawner" ,
281+ arguments = [
282+ name ,
283+ "--controller-manager" ,
284+ "/controller_manager" ,
285+ "--controller-manager-timeout" ,
286+ controller_spawner_timeout ,
287+ ]
288+ + inactive_flags ,
289+ )
279290
280- io_and_status_controller_spawner = Node (
281- package = "controller_manager" ,
282- executable = "spawner" ,
283- arguments = ["io_and_status_controller" , "-c" , "/controller_manager" ],
284- )
291+ controller_spawner_names = [
292+ "joint_state_broadcaster" ,
293+ "io_and_status_controller" ,
294+ "speed_scaling_state_broadcaster" ,
295+ "force_torque_sensor_broadcaster" ,
296+ ]
297+ controller_spawner_inactive_names = ["forward_position_controller" ]
285298
286- speed_scaling_state_broadcaster_spawner = Node (
287- package = "controller_manager" ,
288- executable = "spawner" ,
289- arguments = [
290- "speed_scaling_state_broadcaster" ,
291- "--controller-manager" ,
292- "/controller_manager" ,
293- ],
294- )
299+ controller_spawners = [controller_spawner (name ) for name in controller_spawner_names ] + [
300+ controller_spawner (name , active = False ) for name in controller_spawner_inactive_names
301+ ]
295302
296- force_torque_sensor_broadcaster_spawner = Node (
303+ # There may be other controllers of the joints, but this is the initially-started one
304+ initial_joint_controller_spawner_started = Node (
297305 package = "controller_manager" ,
298306 executable = "spawner" ,
299307 arguments = [
300- "force_torque_sensor_broadcaster" ,
301- "--controller-manager " ,
308+ initial_joint_controller ,
309+ "-c " ,
302310 "/controller_manager" ,
311+ "--controller-manager-timeout" ,
312+ controller_spawner_timeout ,
303313 ],
304- )
305-
306- forward_position_controller_spawner_stopped = Node (
307- package = "controller_manager" ,
308- executable = "spawner" ,
309- arguments = ["forward_position_controller" , "-c" , "/controller_manager" , "--inactive" ],
310- )
311-
312- # There may be other controllers of the joints, but this is the initially-started one
313- initial_joint_controller_spawner_started = Node (
314- package = "controller_manager" ,
315- executable = "spawner" ,
316- arguments = [initial_joint_controller , "-c" , "/controller_manager" ],
317314 condition = IfCondition (activate_joint_controller ),
318315 )
319316 initial_joint_controller_spawner_stopped = Node (
320317 package = "controller_manager" ,
321318 executable = "spawner" ,
322- arguments = [initial_joint_controller , "-c" , "/controller_manager" , "--inactive" ],
319+ arguments = [
320+ initial_joint_controller ,
321+ "-c" ,
322+ "/controller_manager" ,
323+ "--controller-manager-timeout" ,
324+ controller_spawner_timeout ,
325+ "--inactive" ,
326+ ],
323327 condition = UnlessCondition (activate_joint_controller ),
324328 )
325329
@@ -331,14 +335,9 @@ def launch_setup(context, *args, **kwargs):
331335 controller_stopper_node ,
332336 robot_state_publisher_node ,
333337 rviz_node ,
334- joint_state_broadcaster_spawner ,
335- io_and_status_controller_spawner ,
336- speed_scaling_state_broadcaster_spawner ,
337- force_torque_sensor_broadcaster_spawner ,
338- forward_position_controller_spawner_stopped ,
339338 initial_joint_controller_spawner_stopped ,
340339 initial_joint_controller_spawner_started ,
341- ]
340+ ] + controller_spawners
342341
343342 return nodes_to_start
344343
@@ -441,6 +440,13 @@ def generate_launch_description():
441440 description = "Enable headless mode for robot control" ,
442441 )
443442 )
443+ declared_arguments .append (
444+ DeclareLaunchArgument (
445+ "controller_spawner_timeout" ,
446+ default_value = "10" ,
447+ description = "Timeout used when spawning controllers." ,
448+ )
449+ )
444450 declared_arguments .append (
445451 DeclareLaunchArgument (
446452 "initial_joint_controller" ,
0 commit comments