# Copyright (c) 2020 Samsung Research Russia # # 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, IncludeLaunchDescription, GroupAction from launch.launch_description_sources import PythonLaunchDescriptionSource from launch.substitutions import LaunchConfiguration from launch_ros.actions import Node, SetRemap from launch_ros.descriptions import ParameterFile from nav2_common.launch import RewrittenYaml def generate_launch_description(): # Input parameters declaration namespace = LaunchConfiguration("namespace") params_file = LaunchConfiguration("params_file") use_sim_time = LaunchConfiguration("use_sim_time") autostart = LaunchConfiguration("autostart") use_respawn = LaunchConfiguration("use_respawn") log_level = LaunchConfiguration("log_level") # Variables lifecycle_nodes = ["map_saver"] # Getting directories and launch-files slam_toolbox_dir = get_package_share_directory("slam_toolbox") slam_launch_file = os.path.join(slam_toolbox_dir, "launch", "online_sync_launch.py") # Create our own temporary YAML files that include substitutions param_substitutions = {"use_sim_time": use_sim_time} configured_params = ParameterFile( RewrittenYaml( source_file=params_file, root_key=namespace, param_rewrites=param_substitutions, convert_types=True, ), allow_substs=True, ) # Declare the launch arguments declare_namespace_cmd = DeclareLaunchArgument( "namespace", default_value="robot", description="Top-level namespace" ) declare_params_file_cmd = DeclareLaunchArgument( "params_file", default_value="/params.yaml", description="Full path to the ROS2 parameters file to use for all launched nodes", ) declare_use_sim_time_cmd = DeclareLaunchArgument( "use_sim_time", default_value="True", description="Use simulation (Gazebo) clock if true" ) declare_autostart_cmd = DeclareLaunchArgument( "autostart", default_value="True", description="Automatically startup the nav2 stack" ) declare_use_respawn_cmd = DeclareLaunchArgument( "use_respawn", default_value="False", description="Whether to respawn if a node crashes. Applied when composition is disabled.", ) declare_log_level_cmd = DeclareLaunchArgument( "log_level", default_value="info", description="log level" ) # Nodes launching commands start_map_saver_server_cmd = Node( package="nav2_map_server", executable="map_saver_server", output="screen", respawn=use_respawn, respawn_delay=2.0, arguments=["--ros-args", "--log-level", log_level], parameters=[configured_params], ) start_lifecycle_manager_cmd = Node( package="nav2_lifecycle_manager", executable="lifecycle_manager", name="lifecycle_manager_slam", output="screen", arguments=["--ros-args", "--log-level", log_level], parameters=[ {"use_sim_time": use_sim_time}, {"autostart": autostart}, {"node_names": lifecycle_nodes}, ], ) start_slam_toolbox_cmd_with_params = IncludeLaunchDescription( PythonLaunchDescriptionSource(slam_launch_file), launch_arguments={"use_sim_time": use_sim_time, "slam_params_file": params_file}.items(), ) group_actions = [] # Remapping group_actions.append(SetRemap("/map", "map")) group_actions.append(SetRemap("/map_metadata", "map_metadata")) group_actions.append(SetRemap("/scan", "scan")) # Running Map Saver Server group_actions.append(start_map_saver_server_cmd) group_actions.append(start_lifecycle_manager_cmd) # Running SLAM Toolbox (Only one of them will be run) group_actions.append(start_slam_toolbox_cmd_with_params) slam_ns = GroupAction(actions=group_actions) ld = LaunchDescription() # Declare the launch options ld.add_action(declare_namespace_cmd) ld.add_action(declare_params_file_cmd) ld.add_action(declare_use_sim_time_cmd) ld.add_action(declare_autostart_cmd) ld.add_action(declare_use_respawn_cmd) ld.add_action(declare_log_level_cmd) # Running SLAM ld.add_action(slam_ns) return ld