Nav2 Navigation Stack - lyrical  lyrical
ROS 2 Navigation Stack
navigation_launch.py
1 # Copyright (c) 2018 Intel Corporation
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 # http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14 
15 import os
16 
17 from ament_index_python.packages import get_package_share_directory
18 from launch import LaunchDescription
19 from launch.actions import DeclareLaunchArgument, GroupAction, SetEnvironmentVariable
20 from launch.conditions import IfCondition
21 from launch.substitutions import LaunchConfiguration, PythonExpression
22 from launch_ros.actions import LoadComposableNodes, Node, PushROSNamespace, SetParameter
23 from launch_ros.descriptions import ComposableNode, ParameterFile
24 from nav2_common.launch import LaunchConfigAsBool, RewrittenYaml
25 
26 
27 def generate_launch_description() -> LaunchDescription:
28  # Get the launch directory
29  bringup_dir = get_package_share_directory('nav2_bringup')
30 
31  namespace = LaunchConfiguration('namespace')
32  use_sim_time = LaunchConfigAsBool('use_sim_time')
33  autostart = LaunchConfigAsBool('autostart')
34  graph_filepath = LaunchConfiguration('graph')
35  params_file = LaunchConfiguration('params_file')
36  use_composition = LaunchConfigAsBool('use_composition')
37  use_intra_process_comms = LaunchConfigAsBool('use_intra_process_comms')
38  container_name = LaunchConfiguration('container_name')
39  container_name_full = (namespace, '/', container_name)
40  use_respawn = LaunchConfigAsBool('use_respawn')
41  log_level = LaunchConfiguration('log_level')
42  use_keepout_zones = LaunchConfigAsBool('use_keepout_zones')
43  use_speed_zones = LaunchConfigAsBool('use_speed_zones')
44 
45  lifecycle_nodes = [
46  'controller_server',
47  'smoother_server',
48  'planner_server',
49  'route_server',
50  'behavior_server',
51  'velocity_smoother',
52  'collision_monitor',
53  'bt_navigator',
54  'waypoint_follower',
55  'docking_server',
56  'following_server',
57  ]
58 
59  # Map fully qualified names to relative ones so the node's namespace can be prepended.
60  remappings = [('/tf', 'tf'), ('/tf_static', 'tf_static')]
61 
62  # Create our own temporary YAML files that include substitutions
63  param_substitutions = {'autostart': autostart}
64 
65  yaml_substitutions = {
66  'KEEPOUT_ZONE_ENABLED': use_keepout_zones,
67  'SPEED_ZONE_ENABLED': use_speed_zones,
68  }
69 
70  # RewrittenYaml: Adds namespace to the parameters file as a root key
71  # Note: Make sure that all frames are correctly namespaced in the parameters file
72  # Do not add namespace to topics in the parameters file, as they will be remapped
73  # by the root key only if they are not prefixed with a forward slash.
74  # e.g. 'map' will be remapped to '/<namespace>/map', but '/map' will not be remapped.
75  # IMPORTANT: to make your yaml file dynamic you can refer to humble branch under
76  # nav2_bringup/launch/bringup_launch.py to see how the parameters file is configured
77  # using ReplaceString <robot_namespace>
78  configured_params = ParameterFile(
79  RewrittenYaml(
80  source_file=params_file,
81  root_key=namespace,
82  param_rewrites=param_substitutions,
83  value_rewrites=yaml_substitutions,
84  convert_types=True,
85  ),
86  allow_substs=True,
87  )
88 
89  stdout_linebuf_envvar = SetEnvironmentVariable(
90  'RCUTILS_LOGGING_BUFFERED_STREAM', '1'
91  )
92 
93  declare_namespace_cmd = DeclareLaunchArgument(
94  'namespace', default_value='', description='Top-level namespace'
95  )
96 
97  declare_use_sim_time_cmd = DeclareLaunchArgument(
98  'use_sim_time',
99  default_value='false',
100  description='Use simulation (Gazebo) clock if true',
101  )
102 
103  declare_params_file_cmd = DeclareLaunchArgument(
104  'params_file',
105  default_value=os.path.join(bringup_dir, 'params', 'nav2_params.yaml'),
106  description='Full path to the ROS2 parameters file to use for all launched nodes',
107  )
108 
109  declare_graph_file_cmd = DeclareLaunchArgument(
110  'graph',
111  default_value='', description='Path to the graph file to load'
112  )
113 
114  declare_autostart_cmd = DeclareLaunchArgument(
115  'autostart',
116  default_value='true',
117  description='Automatically startup the nav2 stack',
118  )
119 
120  declare_use_composition_cmd = DeclareLaunchArgument(
121  'use_composition',
122  default_value='False',
123  description='Use composed bringup if True',
124  )
125 
126  declare_use_intra_process_comms_cmd = DeclareLaunchArgument(
127  'use_intra_process_comms',
128  default_value='False',
129  description='Whether to use intra process communication',
130  )
131 
132  declare_container_name_cmd = DeclareLaunchArgument(
133  'container_name',
134  default_value='nav2_container',
135  description='the name of container that nodes will load in if use composition',
136  )
137 
138  declare_use_respawn_cmd = DeclareLaunchArgument(
139  'use_respawn',
140  default_value='False',
141  description='Whether to respawn if a node crashes. Applied when composition is disabled.',
142  )
143 
144  declare_log_level_cmd = DeclareLaunchArgument(
145  'log_level', default_value='info', description='log level'
146  )
147 
148  declare_use_keepout_zones_cmd = DeclareLaunchArgument(
149  'use_keepout_zones', default_value='True',
150  description='Whether to enable keepout zones or not'
151  )
152 
153  declare_use_speed_zones_cmd = DeclareLaunchArgument(
154  'use_speed_zones', default_value='True',
155  description='Whether to enable speed zones or not'
156  )
157 
158  load_nodes = GroupAction(
159  condition=IfCondition(PythonExpression(['not ', use_composition])),
160  actions=[
161  SetParameter('use_sim_time', use_sim_time),
162  PushROSNamespace(namespace=namespace),
163  Node(
164  package='nav2_controller',
165  executable='controller_server',
166  output='screen',
167  respawn=use_respawn,
168  respawn_delay=2.0,
169  parameters=[configured_params],
170  arguments=['--ros-args', '--log-level', log_level],
171  remappings=remappings + [('cmd_vel', 'cmd_vel_nav')],
172  ),
173  Node(
174  package='nav2_smoother',
175  executable='smoother_server',
176  name='smoother_server',
177  output='screen',
178  respawn=use_respawn,
179  respawn_delay=2.0,
180  parameters=[configured_params],
181  arguments=['--ros-args', '--log-level', log_level],
182  remappings=remappings,
183  ),
184  Node(
185  package='nav2_planner',
186  executable='planner_server',
187  name='planner_server',
188  output='screen',
189  respawn=use_respawn,
190  respawn_delay=2.0,
191  parameters=[configured_params],
192  arguments=['--ros-args', '--log-level', log_level],
193  remappings=remappings,
194  ),
195  Node(
196  package='nav2_route',
197  executable='route_server',
198  name='route_server',
199  output='screen',
200  respawn=use_respawn,
201  respawn_delay=2.0,
202  parameters=[configured_params, {'graph_filepath': graph_filepath}],
203  arguments=['--ros-args', '--log-level', log_level],
204  remappings=remappings),
205  Node(
206  package='nav2_behaviors',
207  executable='behavior_server',
208  name='behavior_server',
209  output='screen',
210  respawn=use_respawn,
211  respawn_delay=2.0,
212  parameters=[configured_params],
213  arguments=['--ros-args', '--log-level', log_level],
214  remappings=remappings + [('cmd_vel', 'cmd_vel_nav')],
215  ),
216  Node(
217  package='nav2_bt_navigator',
218  executable='bt_navigator',
219  name='bt_navigator',
220  output='screen',
221  respawn=use_respawn,
222  respawn_delay=2.0,
223  parameters=[configured_params],
224  arguments=['--ros-args', '--log-level', log_level],
225  remappings=remappings,
226  ),
227  Node(
228  package='nav2_waypoint_follower',
229  executable='waypoint_follower',
230  name='waypoint_follower',
231  output='screen',
232  respawn=use_respawn,
233  respawn_delay=2.0,
234  parameters=[configured_params],
235  arguments=['--ros-args', '--log-level', log_level],
236  remappings=remappings,
237  ),
238  Node(
239  package='nav2_velocity_smoother',
240  executable='velocity_smoother',
241  name='velocity_smoother',
242  output='screen',
243  respawn=use_respawn,
244  respawn_delay=2.0,
245  parameters=[configured_params],
246  arguments=['--ros-args', '--log-level', log_level],
247  remappings=remappings
248  + [('cmd_vel', 'cmd_vel_nav')],
249  ),
250  Node(
251  package='nav2_collision_monitor',
252  executable='collision_monitor',
253  name='collision_monitor',
254  output='screen',
255  respawn=use_respawn,
256  respawn_delay=2.0,
257  parameters=[configured_params],
258  arguments=['--ros-args', '--log-level', log_level],
259  remappings=remappings,
260  ),
261  Node(
262  package='opennav_docking',
263  executable='opennav_docking',
264  name='docking_server',
265  output='screen',
266  respawn=use_respawn,
267  respawn_delay=2.0,
268  parameters=[configured_params],
269  arguments=['--ros-args', '--log-level', log_level],
270  remappings=remappings,
271  ),
272  Node(
273  package='opennav_following',
274  executable='opennav_following',
275  name='following_server',
276  output='screen',
277  respawn=use_respawn,
278  respawn_delay=2.0,
279  parameters=[configured_params],
280  arguments=['--ros-args', '--log-level', log_level],
281  remappings=remappings,
282  ),
283  Node(
284  package='nav2_lifecycle_manager',
285  executable='lifecycle_manager',
286  name='lifecycle_manager_navigation',
287  output='screen',
288  arguments=['--ros-args', '--log-level', log_level],
289  parameters=[
290  configured_params,
291  {'autostart': autostart}, {'node_names': lifecycle_nodes}
292  ],
293  ),
294  ],
295  )
296 
297  load_composable_nodes = GroupAction(
298  condition=IfCondition(use_composition),
299  actions=[
300  SetParameter('use_sim_time', use_sim_time),
301  PushROSNamespace(namespace=namespace),
302  LoadComposableNodes(
303  target_container=container_name_full,
304  composable_node_descriptions=[
305  ComposableNode(
306  package='nav2_controller',
307  plugin='nav2_controller::ControllerServer',
308  name='controller_server',
309  parameters=[configured_params],
310  remappings=remappings + [('cmd_vel', 'cmd_vel_nav')],
311  extra_arguments=[{'use_intra_process_comms': use_intra_process_comms}],
312  ),
313  ComposableNode(
314  package='nav2_smoother',
315  plugin='nav2_smoother::SmootherServer',
316  name='smoother_server',
317  parameters=[configured_params],
318  remappings=remappings,
319  extra_arguments=[{'use_intra_process_comms': use_intra_process_comms}],
320  ),
321  ComposableNode(
322  package='nav2_planner',
323  plugin='nav2_planner::PlannerServer',
324  name='planner_server',
325  parameters=[configured_params],
326  remappings=remappings,
327  extra_arguments=[{'use_intra_process_comms': use_intra_process_comms}],
328  ),
329  ComposableNode(
330  package='nav2_route',
331  plugin='nav2_route::RouteServer',
332  name='route_server',
333  parameters=[configured_params, {'graph_filepath': graph_filepath}],
334  remappings=remappings,
335  extra_arguments=[{'use_intra_process_comms': use_intra_process_comms}],
336  ),
337  ComposableNode(
338  package='nav2_behaviors',
339  plugin='behavior_server::BehaviorServer',
340  name='behavior_server',
341  parameters=[configured_params],
342  remappings=remappings + [('cmd_vel', 'cmd_vel_nav')],
343  extra_arguments=[{'use_intra_process_comms': use_intra_process_comms}],
344  ),
345  ComposableNode(
346  package='nav2_bt_navigator',
347  plugin='nav2_bt_navigator::BtNavigator',
348  name='bt_navigator',
349  parameters=[configured_params],
350  remappings=remappings,
351  extra_arguments=[{'use_intra_process_comms': use_intra_process_comms}],
352  ),
353  ComposableNode(
354  package='nav2_waypoint_follower',
355  plugin='nav2_waypoint_follower::WaypointFollower',
356  name='waypoint_follower',
357  parameters=[configured_params],
358  remappings=remappings,
359  extra_arguments=[{'use_intra_process_comms': use_intra_process_comms}],
360  ),
361  ComposableNode(
362  package='nav2_velocity_smoother',
363  plugin='nav2_velocity_smoother::VelocitySmoother',
364  name='velocity_smoother',
365  parameters=[configured_params],
366  remappings=remappings
367  + [('cmd_vel', 'cmd_vel_nav')],
368  extra_arguments=[{'use_intra_process_comms': use_intra_process_comms}],
369  ),
370  ComposableNode(
371  package='nav2_collision_monitor',
372  plugin='nav2_collision_monitor::CollisionMonitor',
373  name='collision_monitor',
374  parameters=[configured_params],
375  remappings=remappings,
376  extra_arguments=[{'use_intra_process_comms': use_intra_process_comms}],
377  ),
378  ComposableNode(
379  package='opennav_docking',
380  plugin='opennav_docking::DockingServer',
381  name='docking_server',
382  parameters=[configured_params],
383  remappings=remappings,
384  extra_arguments=[{'use_intra_process_comms': use_intra_process_comms}],
385  ),
386  ComposableNode(
387  package='opennav_following',
388  plugin='opennav_following::FollowingServer',
389  name='following_server',
390  parameters=[configured_params],
391  remappings=remappings,
392  extra_arguments=[{'use_intra_process_comms': use_intra_process_comms}],
393  ),
394  ComposableNode(
395  package='nav2_lifecycle_manager',
396  plugin='nav2_lifecycle_manager::LifecycleManager',
397  name='lifecycle_manager_navigation',
398  parameters=[
399  configured_params,
400  {'autostart': autostart, 'node_names': lifecycle_nodes}
401  ],
402  extra_arguments=[{'use_intra_process_comms': use_intra_process_comms}],
403  ),
404  ],
405  ),
406  ],
407  )
408 
409  # Create the launch description and populate
410  ld = LaunchDescription()
411 
412  # Set environment variables
413  ld.add_action(stdout_linebuf_envvar)
414 
415  # Declare the launch options
416  ld.add_action(declare_namespace_cmd)
417  ld.add_action(declare_use_sim_time_cmd)
418  ld.add_action(declare_params_file_cmd)
419  ld.add_action(declare_autostart_cmd)
420  ld.add_action(declare_graph_file_cmd)
421  ld.add_action(declare_use_composition_cmd)
422  ld.add_action(declare_use_intra_process_comms_cmd)
423  ld.add_action(declare_container_name_cmd)
424  ld.add_action(declare_use_respawn_cmd)
425  ld.add_action(declare_log_level_cmd)
426  ld.add_action(declare_use_keepout_zones_cmd)
427  ld.add_action(declare_use_speed_zones_cmd)
428  # Add the actions to launch all of the navigation nodes
429  ld.add_action(load_nodes)
430  ld.add_action(load_composable_nodes)
431 
432  return ld