1919from ament_index_python .packages import get_package_share_directory
2020
2121from launch import LaunchDescription
22- from launch .actions import DeclareLaunchArgument
23- from launch .substitutions import LaunchConfiguration
24- from launch_ros .actions import Node
22+ from launch .actions import DeclareLaunchArgument , GroupAction
23+ from launch .conditions import IfCondition
24+ from launch .substitutions import LaunchConfiguration , PythonExpression
25+ from launch .substitutions import NotEqualsSubstitution
26+ from launch_ros .actions import Node , LoadComposableNodes
27+ from launch_ros .actions import PushRosNamespace
28+ from launch_ros .descriptions import ComposableNode
2529from nav2_common .launch import RewrittenYaml
2630
2731
2832def generate_launch_description ():
2933 # Get the launch directory
3034 costmap_filters_demo_dir = get_package_share_directory ('nav2_costmap_filters_demo' )
3135
32- # Create our own temporary YAML files that include substitutions
3336 lifecycle_nodes = ['filter_mask_server' , 'costmap_filter_info_server' ]
3437
3538 # Parameters
@@ -38,6 +41,9 @@ def generate_launch_description():
3841 autostart = LaunchConfiguration ('autostart' )
3942 params_file = LaunchConfiguration ('params_file' )
4043 mask_yaml_file = LaunchConfiguration ('mask' )
44+ use_composition = LaunchConfiguration ('use_composition' )
45+ container_name = LaunchConfiguration ('container_name' )
46+ container_name_full = (namespace , '/' , container_name )
4147
4248 # Declare the launch arguments
4349 declare_namespace_cmd = DeclareLaunchArgument (
@@ -55,12 +61,20 @@ def generate_launch_description():
5561 description = 'Automatically startup the nav2 stack' )
5662
5763 declare_params_file_cmd = DeclareLaunchArgument (
58- 'params_file' ,
59- description = 'Full path to the ROS2 parameters file to use' )
64+ 'params_file' ,
65+ description = 'Full path to the ROS2 parameters file to use' )
6066
6167 declare_mask_yaml_file_cmd = DeclareLaunchArgument (
62- 'mask' ,
63- description = 'Full path to filter mask yaml file to load' )
68+ 'mask' ,
69+ description = 'Full path to filter mask yaml file to load' )
70+
71+ declare_use_composition_cmd = DeclareLaunchArgument (
72+ 'use_composition' , default_value = 'True' ,
73+ description = 'Use composed bringup if True' )
74+
75+ declare_container_name_cmd = DeclareLaunchArgument (
76+ 'container_name' , default_value = 'nav2_container' ,
77+ description = 'The name of container that nodes will load in if use composition' )
6478
6579 # Make re-written yaml
6680 param_substitutions = {
@@ -73,35 +87,68 @@ def generate_launch_description():
7387 param_rewrites = param_substitutions ,
7488 convert_types = True )
7589
76- # Nodes launching commands
77- start_lifecycle_manager_cmd = Node (
78- package = 'nav2_lifecycle_manager' ,
79- executable = 'lifecycle_manager' ,
80- name = 'lifecycle_manager_costmap_filters' ,
81- namespace = namespace ,
82- output = 'screen' ,
83- emulate_tty = True , # https://github.com/ros2/launch/issues/188
84- parameters = [{'use_sim_time' : use_sim_time },
85- {'autostart' : autostart },
86- {'node_names' : lifecycle_nodes }])
87-
88- start_map_server_cmd = Node (
89- package = 'nav2_map_server' ,
90- executable = 'map_server' ,
91- name = 'filter_mask_server' ,
92- namespace = namespace ,
93- output = 'screen' ,
94- emulate_tty = True , # https://github.com/ros2/launch/issues/188
95- parameters = [configured_params ])
96-
97- start_costmap_filter_info_server_cmd = Node (
98- package = 'nav2_map_server' ,
99- executable = 'costmap_filter_info_server' ,
100- name = 'costmap_filter_info_server' ,
101- namespace = namespace ,
102- output = 'screen' ,
103- emulate_tty = True , # https://github.com/ros2/launch/issues/188
104- parameters = [configured_params ])
90+ load_nodes = GroupAction (
91+ condition = IfCondition (PythonExpression (['not ' , use_composition ])),
92+ actions = [
93+ Node (
94+ package = 'nav2_map_server' ,
95+ executable = 'map_server' ,
96+ name = 'filter_mask_server' ,
97+ namespace = namespace ,
98+ output = 'screen' ,
99+ emulate_tty = True , # https://github.com/ros2/launch/issues/188
100+ parameters = [configured_params ]),
101+ Node (
102+ package = 'nav2_map_server' ,
103+ executable = 'costmap_filter_info_server' ,
104+ name = 'costmap_filter_info_server' ,
105+ namespace = namespace ,
106+ output = 'screen' ,
107+ emulate_tty = True , # https://github.com/ros2/launch/issues/188
108+ parameters = [configured_params ]),
109+ Node (
110+ package = 'nav2_lifecycle_manager' ,
111+ executable = 'lifecycle_manager' ,
112+ name = 'lifecycle_manager_costmap_filters' ,
113+ namespace = namespace ,
114+ output = 'screen' ,
115+ emulate_tty = True , # https://github.com/ros2/launch/issues/188
116+ parameters = [{'use_sim_time' : use_sim_time },
117+ {'autostart' : autostart },
118+ {'node_names' : lifecycle_nodes }])
119+ ]
120+ )
121+
122+ load_composable_nodes = GroupAction (
123+ condition = IfCondition (use_composition ),
124+ actions = [
125+ PushRosNamespace (
126+ condition = IfCondition (NotEqualsSubstitution (LaunchConfiguration ('namespace' ), '' )),
127+ namespace = namespace ),
128+ LoadComposableNodes (
129+ target_container = container_name_full ,
130+ composable_node_descriptions = [
131+ ComposableNode (
132+ package = 'nav2_map_server' ,
133+ plugin = 'nav2_map_server::MapServer' ,
134+ name = 'filter_mask_server' ,
135+ parameters = [configured_params ]),
136+ ComposableNode (
137+ package = 'nav2_map_server' ,
138+ plugin = 'nav2_map_server::CostmapFilterInfoServer' ,
139+ name = 'costmap_filter_info_server' ,
140+ parameters = [configured_params ]),
141+ ComposableNode (
142+ package = 'nav2_lifecycle_manager' ,
143+ plugin = 'nav2_lifecycle_manager::LifecycleManager' ,
144+ name = 'lifecycle_manager_costmap_filters' ,
145+ parameters = [{'use_sim_time' : use_sim_time },
146+ {'autostart' : autostart },
147+ {'node_names' : lifecycle_nodes }]),
148+ ]
149+ )
150+ ]
151+ )
105152
106153 ld = LaunchDescription ()
107154
@@ -111,8 +158,10 @@ def generate_launch_description():
111158 ld .add_action (declare_params_file_cmd )
112159 ld .add_action (declare_mask_yaml_file_cmd )
113160
114- ld .add_action (start_lifecycle_manager_cmd )
115- ld .add_action (start_map_server_cmd )
116- ld .add_action (start_costmap_filter_info_server_cmd )
161+ ld .add_action (declare_use_composition_cmd )
162+ ld .add_action (declare_container_name_cmd )
163+
164+ ld .add_action (load_nodes )
165+ ld .add_action (load_composable_nodes )
117166
118167 return ld
0 commit comments