Skip to content

Commit 1c8ac68

Browse files
Update filter mask tutorial to allow the use of composable nodes (#89)
* Add option to launch the costmap_filters as a component * Remove unnecessary node and respective launch conditions from launch file * Use PushRosNamespace to launch composable nodes * Use composition as default for the costmap_filters * Remove extra line * Fix alignement, 5 spaces to 4 spaces * Fix indentation --------- Co-authored-by: Filipe Pinto <filipe.pinto@globallogic.com>
1 parent 24ee184 commit 1c8ac68

File tree

1 file changed

+89
-40
lines changed

1 file changed

+89
-40
lines changed

nav2_costmap_filters_demo/launch/costmap_filter_info.launch.py

Lines changed: 89 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,20 @@
1919
from ament_index_python.packages import get_package_share_directory
2020

2121
from 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
2529
from nav2_common.launch import RewrittenYaml
2630

2731

2832
def 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

Comments
 (0)