text: # Copyright (c) 2018 Intel Corporation
  #
  # Licensed under the Apache License, Version 2.0 (the "License");
  # you may not use this file except in compliance with the License.
  # You may obtain a copy of the License at
  #
  #     http://www.apache.org/licenses/LICENSE-2.0
  #
  # Unless required by applicable law or agreed to in writing, software
  # distributed under the License is distributed on an "AS IS" BASIS,
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  # See the License for the specific language governing permissions and
  # limitations under the License.
  
  import os
  
  from ament_index_python.packages import get_package_share_directory
  
  from launch import LaunchDescription
  from launch.actions import DeclareLaunchArgument, SetEnvironmentVariable
  from launch.substitutions import LaunchConfiguration
  from launch_ros.actions import Node
  from nav2_common.launch import RewrittenYaml
  
  
  def generate_launch_description():
      # Get the launch directory
      my_nav_dir = get_package_share_directory('neuronbot2_nav')
      my_param_dir = os.path.join(my_nav_dir, 'param')
      my_param_file = 'neuronbot_params.yaml'
      my_bt_file ='navigate_w_replanning_time.xml'
  
      namespace = LaunchConfiguration('namespace')
      use_sim_time = LaunchConfiguration('use_sim_time')
      autostart = LaunchConfiguration('autostart')
      params_file = LaunchConfiguration('params_file')
      default_bt_xml_filename = LaunchConfiguration('default_bt_xml_filename')
      map_subscribe_transient_local = LaunchConfiguration('map_subscribe_transient_local')
  
      lifecycle_nodes = ['controller_server',
                         'planner_server',
                         'recoveries_server',
                         'bt_navigator',
                         'waypoint_follower']
  
      # Map fully qualified names to relative ones so the node's namespace can be prepended.
      # In case of the transforms (tf), currently, there doesn't seem to be a better alternative
      # https://github.com/ros/geometry2/issues/32
      # https://github.com/ros/robot_state_publisher/pull/30
      # TODO(orduno) Substitute with `PushNodeRemapping`
      #              https://github.com/ros2/launch_ros/issues/56
      remappings = [('/tf', 'tf'),
                    ('/tf_static', 'tf_static')]
  
      # Create our own temporary YAML files that include substitutions
      param_substitutions = {
          'use_sim_time': use_sim_time,
          'default_bt_xml_filename': default_bt_xml_filename,
          'autostart': autostart,
          'map_subscribe_transient_local': map_subscribe_transient_local}
  
      configured_params = RewrittenYaml(
              source_file=params_file,
              root_key=namespace,
              param_rewrites=param_substitutions,
              convert_types=True)
  
      return LaunchDescription([
          # Set env var to print messages to stdout immediately
          SetEnvironmentVariable('RCUTILS_LOGGING_BUFFERED_STREAM', '1'),
  
          DeclareLaunchArgument(
              'namespace', default_value='',
              description='Top-level namespace'),
  
          DeclareLaunchArgument(
              'use_sim_time', default_value='false',
              description='Use simulation (Gazebo) clock if true'),
  
          DeclareLaunchArgument(
              'autostart', default_value='true',
              description='Automatically startup the nav2 stack'),
  
          DeclareLaunchArgument(
              'params_file',
              default_value=os.path.join(my_param_dir, my_param_file),
              description='Full path to the ROS2 parameters file to use'),
  
          DeclareLaunchArgument(
              'default_bt_xml_filename',
              default_value=os.path.join(my_param_dir, my_bt_file),
              description='Full path to the behavior tree xml file to use'),
  
          DeclareLaunchArgument(
              'map_subscribe_transient_local', default_value='true',
              description='Whether to set the map subscriber QoS to transient local'),
  
          Node(
              package='nav2_controller',
              executable='controller_server',
              output='screen',
              parameters=[{configured_params}],
              remappings=remappings),
  
          Node(
              package='nav2_planner',
              executable='planner_server',
              name='planner_server',
              output='screen',
              parameters=[configured_params],
              remappings=remappings),
  
          Node(
              package='nav2_recoveries',
              executable='recoveries_server',
              name='recoveries_server',
              output='screen',
              parameters=[{'use_sim_time': use_sim_time}],
              remappings=remappings),
  
          Node(
              package='nav2_bt_navigator',
              executable='bt_navigator',
              name='bt_navigator',
              output='screen',
              parameters=[configured_params],
              remappings=remappings),
  
          Node(
              package='nav2_waypoint_follower',
              executable='waypoint_follower',
              name='waypoint_follower',
              output='screen',
              parameters=[configured_params],
              remappings=remappings),
  
          Node(
              package='nav2_lifecycle_manager',
              executable='lifecycle_manager',
              name='lifecycle_manager_navigation',
              output='screen',
              parameters=[{'use_sim_time': use_sim_time},
                          {'autostart': autostart},
                          {'node_names': lifecycle_nodes}]),
  
      ])
  