17 from ament_index_python.packages
import get_package_share_directory
18 from launch
import LaunchDescription
19 from launch.actions
import DeclareLaunchArgument, GroupAction, IncludeLaunchDescription
20 from launch.conditions
import IfCondition, UnlessCondition
21 from launch.launch_description_sources
import PythonLaunchDescriptionSource
22 from launch.substitutions
import LaunchConfiguration
23 from launch_ros.actions
import Node, PushROSNamespace, SetParameter, SetRemap
24 from launch_ros.descriptions
import ParameterFile
28 def get_lifecycle_nodes(context):
32 def generate_launch_description() -> LaunchDescription:
34 namespace = LaunchConfiguration(
'namespace')
35 params_file = LaunchConfiguration(
'params_file')
36 use_sim_time = LaunchConfigAsBool(
'use_sim_time')
37 use_respawn = LaunchConfigAsBool(
'use_respawn')
38 log_level = LaunchConfiguration(
'log_level')
42 bringup_dir = get_package_share_directory(
'nav2_bringup')
43 slam_toolbox_dir = get_package_share_directory(
'slam_toolbox')
44 slam_launch_file = os.path.join(slam_toolbox_dir,
'launch',
'online_sync_launch.py')
47 configured_params = ParameterFile(
49 source_file=params_file,
58 declare_namespace_cmd = DeclareLaunchArgument(
59 'namespace', default_value=
'', description=
'Top-level namespace'
62 declare_params_file_cmd = DeclareLaunchArgument(
64 default_value=os.path.join(bringup_dir,
'params',
'nav2_params.yaml'),
65 description=
'Full path to the ROS2 parameters file to use for all launched nodes',
68 declare_use_sim_time_cmd = DeclareLaunchArgument(
71 description=
'Use simulation (Gazebo) clock if true',
74 declare_use_respawn_cmd = DeclareLaunchArgument(
76 default_value=
'False',
77 description=
'Whether to respawn if a node crashes. Applied when composition is disabled.',
80 declare_log_level_cmd = DeclareLaunchArgument(
81 'log_level', default_value=
'info', description=
'log level'
85 start_map_server = GroupAction(
87 PushROSNamespace(namespace),
88 SetParameter(
'use_sim_time', use_sim_time),
90 package=
'nav2_map_server',
91 executable=
'map_saver_server',
95 arguments=[
'--ros-args',
'--log-level', log_level],
96 parameters=[configured_params],
104 has_slam_toolbox_params = HasNodeParams(
105 source_file=params_file, node_name=
'slam_toolbox'
108 start_slam_toolbox_cmd = GroupAction(
111 PushROSNamespace(namespace),
114 SetRemap(src=
'/scan', dst=
'scan'),
115 SetRemap(src=
'/tf', dst=
'tf'),
116 SetRemap(src=
'/tf_static', dst=
'tf_static'),
117 SetRemap(src=
'/map', dst=
'map'),
119 IncludeLaunchDescription(
120 PythonLaunchDescriptionSource(slam_launch_file),
121 launch_arguments={
'use_sim_time': use_sim_time}.items(),
122 condition=UnlessCondition(has_slam_toolbox_params),
125 IncludeLaunchDescription(
126 PythonLaunchDescriptionSource(slam_launch_file),
127 launch_arguments={
'use_sim_time': use_sim_time,
128 'slam_params_file': params_file}.items(),
129 condition=IfCondition(has_slam_toolbox_params),
134 ld = LaunchDescription()
137 ld.add_action(declare_namespace_cmd)
138 ld.add_action(declare_params_file_cmd)
139 ld.add_action(declare_use_sim_time_cmd)
140 ld.add_action(declare_use_respawn_cmd)
141 ld.add_action(declare_log_level_cmd)
144 ld.add_action(start_map_server)
147 ld.add_action(start_slam_toolbox_cmd)