16
16
from launch .actions import DeclareLaunchArgument
17
17
from launch .actions import OpaqueFunction
18
18
from launch .conditions import IfCondition
19
- from launch .conditions import UnlessCondition
19
+ from launch .substitutions import AndSubstitution
20
20
from launch .substitutions import AnonName
21
21
from launch .substitutions import LaunchConfiguration
22
+ from launch .substitutions import NotSubstitution
22
23
from launch_ros .actions import ComposableNodeContainer
23
24
from launch_ros .actions import LoadComposableNodes
24
25
from launch_ros .descriptions import ComposableNode
@@ -164,7 +165,7 @@ def load_composable_node_param(param_path):
164
165
)
165
166
166
167
# set euclidean cluster as a component
167
- euclidean_cluster_component = ComposableNode (
168
+ use_downsample_euclidean_cluster_component = ComposableNode (
168
169
package = pkg ,
169
170
namespace = ns ,
170
171
plugin = "euclidean_cluster::VoxelGridBasedEuclideanClusterNode" ,
@@ -176,40 +177,108 @@ def load_composable_node_param(param_path):
176
177
parameters = [load_composable_node_param ("voxel_grid_based_euclidean_param_path" )],
177
178
)
178
179
180
+ use_map_disuse_downsample_euclidean_component = ComposableNode (
181
+ package = pkg ,
182
+ namespace = ns ,
183
+ plugin = "euclidean_cluster::VoxelGridBasedEuclideanClusterNode" ,
184
+ name = "euclidean_cluster" ,
185
+ remappings = [
186
+ ("input" , "map_filter/pointcloud" ),
187
+ ("output" , LaunchConfiguration ("output_clusters" )),
188
+ ],
189
+ parameters = [load_composable_node_param ("voxel_grid_based_euclidean_param_path" )],
190
+ )
191
+ disuse_map_disuse_downsample_euclidean_component = ComposableNode (
192
+ package = pkg ,
193
+ namespace = ns ,
194
+ plugin = "euclidean_cluster::VoxelGridBasedEuclideanClusterNode" ,
195
+ name = "euclidean_cluster" ,
196
+ remappings = [
197
+ ("input" , LaunchConfiguration ("input_pointcloud" )),
198
+ ("output" , LaunchConfiguration ("output_clusters" )),
199
+ ],
200
+ parameters = [load_composable_node_param ("voxel_grid_based_euclidean_param_path" )],
201
+ )
202
+
179
203
container = ComposableNodeContainer (
180
204
name = "euclidean_cluster_container" ,
181
205
package = "rclcpp_components" ,
182
206
namespace = ns ,
183
207
executable = "component_container" ,
184
- composable_node_descriptions = [
185
- voxel_grid_filter_component ,
186
- outlier_filter_component ,
187
- downsample_concat_component ,
188
- euclidean_cluster_component ,
189
- ],
208
+ composable_node_descriptions = [],
190
209
output = "screen" ,
191
210
)
192
211
193
- use_map_loader = LoadComposableNodes (
212
+ use_map_use_downsample_loader = LoadComposableNodes (
194
213
composable_node_descriptions = [
195
214
compare_map_filter_component ,
196
215
use_map_short_range_crop_box_filter_component ,
197
216
use_map_long_range_crop_box_filter_component ,
217
+ voxel_grid_filter_component ,
218
+ outlier_filter_component ,
219
+ downsample_concat_component ,
220
+ use_downsample_euclidean_cluster_component ,
198
221
],
199
222
target_container = container ,
200
- condition = IfCondition (LaunchConfiguration ("use_pointcloud_map" )),
223
+ condition = IfCondition (
224
+ AndSubstitution (
225
+ LaunchConfiguration ("use_pointcloud_map" ),
226
+ LaunchConfiguration ("use_downsample_pointcloud" ),
227
+ )
228
+ ),
201
229
)
202
230
203
- disuse_map_loader = LoadComposableNodes (
231
+ disuse_map_use_downsample_loader = LoadComposableNodes (
204
232
composable_node_descriptions = [
205
233
disuse_map_short_range_crop_box_filter_component ,
206
234
disuse_map_long_range_crop_box_filter_component ,
235
+ voxel_grid_filter_component ,
236
+ outlier_filter_component ,
237
+ downsample_concat_component ,
238
+ use_downsample_euclidean_cluster_component ,
207
239
],
208
240
target_container = container ,
209
- condition = UnlessCondition (LaunchConfiguration ("use_pointcloud_map" )),
241
+ condition = IfCondition (
242
+ AndSubstitution (
243
+ NotSubstitution (LaunchConfiguration ("use_pointcloud_map" )),
244
+ LaunchConfiguration ("use_downsample_pointcloud" ),
245
+ )
246
+ ),
210
247
)
211
248
212
- return [container , use_map_loader , disuse_map_loader ]
249
+ use_map_disuse_downsample_loader = LoadComposableNodes (
250
+ composable_node_descriptions = [
251
+ compare_map_filter_component ,
252
+ use_map_disuse_downsample_euclidean_component ,
253
+ ],
254
+ target_container = container ,
255
+ condition = IfCondition (
256
+ AndSubstitution (
257
+ (LaunchConfiguration ("use_pointcloud_map" )),
258
+ NotSubstitution (LaunchConfiguration ("use_downsample_pointcloud" )),
259
+ )
260
+ ),
261
+ )
262
+
263
+ disuse_map_disuse_downsample_loader = LoadComposableNodes (
264
+ composable_node_descriptions = [
265
+ disuse_map_disuse_downsample_euclidean_component ,
266
+ ],
267
+ target_container = container ,
268
+ condition = IfCondition (
269
+ AndSubstitution (
270
+ NotSubstitution (LaunchConfiguration ("use_pointcloud_map" )),
271
+ NotSubstitution (LaunchConfiguration ("use_downsample_pointcloud" )),
272
+ )
273
+ ),
274
+ )
275
+ return [
276
+ container ,
277
+ use_map_use_downsample_loader ,
278
+ disuse_map_use_downsample_loader ,
279
+ use_map_disuse_downsample_loader ,
280
+ disuse_map_disuse_downsample_loader ,
281
+ ]
213
282
214
283
215
284
def generate_launch_description ():
@@ -222,6 +291,7 @@ def add_launch_arg(name: str, default_value=None):
222
291
add_launch_arg ("input_map" , "/map/pointcloud_map" ),
223
292
add_launch_arg ("output_clusters" , "clusters" ),
224
293
add_launch_arg ("use_pointcloud_map" , "false" ),
294
+ add_launch_arg ("use_downsample_pointcloud" , "false" ),
225
295
add_launch_arg (
226
296
"voxel_grid_param_path" ,
227
297
[
0 commit comments