15from ament_index_python
import get_package_share_directory
16from launch.actions
import Shutdown
17from launch
import LaunchDescription
18from launch_ros.actions
import Node
19from launch_ros.actions
import ComposableNodeContainer
20from launch_ros.descriptions
import ComposableNode
21from launch.substitutions
import EnvironmentVariable
22from carma_ros2_utils.launch.get_log_level
import GetLogLevel
23from carma_ros2_utils.launch.get_current_namespace
import GetCurrentNamespace
24from launch.substitutions
import LaunchConfiguration
25from launch.actions
import DeclareLaunchArgument
26from launch.conditions
import IfCondition
27from launch.substitutions
import PythonExpression
28from pathlib
import PurePath
34 Launch perception nodes.
36 vehicle_calibration_dir = LaunchConfiguration('vehicle_calibration_dir')
38 vehicle_config_param_file = LaunchConfiguration(
'vehicle_config_param_file')
39 declare_vehicle_config_param_file_arg = DeclareLaunchArgument(
40 name =
'vehicle_config_param_file',
41 default_value =
"/opt/carma/vehicle/config/VehicleConfigParams.yaml",
42 description =
"Path to file contain vehicle configuration parameters"
45 use_sim_time = LaunchConfiguration(
'use_sim_time')
46 declare_use_sim_time_arg = DeclareLaunchArgument(
47 name =
'use_sim_time',
48 default_value =
"False",
49 description =
"True if simulation mode is on"
52 vehicle_characteristics_param_file = LaunchConfiguration(
'vehicle_characteristics_param_file')
53 declare_vehicle_characteristics_param_file_arg = DeclareLaunchArgument(
54 name =
'vehicle_characteristics_param_file',
55 default_value =
"/opt/carma/vehicle/calibration/identifiers/UniqueVehicleParams.yaml",
56 description =
"Path to file containing unique vehicle calibrations"
59 vehicle_config_dir = LaunchConfiguration(
'vehicle_config_dir')
60 declare_vehicle_config_dir_arg = DeclareLaunchArgument(
61 name =
'vehicle_config_dir',
62 default_value =
"/opt/carma/vehicle/config",
63 description =
"Path to vehicle configuration directory populated by carma-config"
68 global_params_override_file = LaunchConfiguration(
'global_params_override_file')
69 declare_global_params_override_file_arg = DeclareLaunchArgument(
70 name =
'global_params_override_file',
71 default_value = [vehicle_config_dir,
"/GlobalParamsOverride.yaml"],
72 description =
"Path to global file containing the parameters overwrite"
75 vector_map_file = LaunchConfiguration(
'vector_map_file')
76 declare_vector_map_file = DeclareLaunchArgument(name=
'vector_map_file', default_value =
'vector_map.osm', description =
"Path to the map osm file if using the noupdate load type")
80 is_cp_mot_enabled = LaunchConfiguration(
'is_cp_mot_enabled')
81 declare_is_cp_mot_enabled = DeclareLaunchArgument(
82 name=
'is_cp_mot_enabled',
83 default_value =
'False',
84 description =
'True if user wants Cooperative Perception capability using Multiple Object Tracking to be enabled'
89 is_autoware_lidar_obj_detection_enabled = LaunchConfiguration(
'is_autoware_lidar_obj_detection_enabled')
90 declare_is_autoware_lidar_obj_detection_enabled = DeclareLaunchArgument(
91 name=
'is_autoware_lidar_obj_detection_enabled',
92 default_value =
'False',
93 description =
'True if user wants Autoware Lidar Object Detection to be enabled'
96 autoware_auto_launch_pkg_prefix = get_package_share_directory(
97 'autoware_auto_launch')
99 euclidean_cluster_param_file = os.path.join(
100 autoware_auto_launch_pkg_prefix,
'param/component_style/euclidean_cluster.param.yaml')
102 ray_ground_classifier_param_file = os.path.join(
103 autoware_auto_launch_pkg_prefix,
'param/component_style/ray_ground_classifier.param.yaml')
105 tracking_nodes_param_file = os.path.join(
106 autoware_auto_launch_pkg_prefix,
'param/component_style/tracking_nodes.param.yaml')
108 object_detection_tracking_param_file = os.path.join(
109 get_package_share_directory(
'object_detection_tracking'),
'config/parameters.yaml')
111 subsystem_controller_default_param_file = os.path.join(
112 get_package_share_directory(
'subsystem_controllers'),
'config/environment_perception_controller_config.yaml')
114 subsystem_controller_param_file = LaunchConfiguration(
'subsystem_controller_param_file')
115 declare_subsystem_controller_param_file_arg = DeclareLaunchArgument(
116 name =
'subsystem_controller_param_file',
117 default_value = subsystem_controller_default_param_file,
118 description =
"Path to file containing override parameters for the subsystem controller"
121 frame_transformer_param_file = os.path.join(
122 get_package_share_directory(
'frame_transformer'),
'config/parameters.yaml')
124 object_visualizer_param_file = os.path.join(
125 get_package_share_directory(
'object_visualizer'),
'config/parameters.yaml')
127 points_map_filter_param_file = os.path.join(
128 get_package_share_directory(
'points_map_filter'),
'config/parameters.yaml')
130 motion_computation_param_file = os.path.join(
131 get_package_share_directory(
'motion_computation'),
'config/parameters.yaml')
133 env_log_levels = EnvironmentVariable(
'CARMA_ROS_LOGGING_CONFIG', default_value=
'{ "default_level" : "WARN" }')
135 carma_wm_ctrl_param_file = os.path.join(
136 get_package_share_directory(
'carma_wm_ctrl'),
'config/parameters.yaml')
138 cp_multiple_object_tracker_node_file =
str(
139 PurePath(get_package_share_directory(
"carma_cooperative_perception"),
140 "config/cp_multiple_object_tracker_node.yaml"))
141 cp_host_vehicle_filter_node_file =
str(
142 PurePath(get_package_share_directory(
"carma_cooperative_perception"),
143 "config/cp_host_vehicle_filter_node.yaml"))
144 cp_sdsm_to_detection_list_node_file =
str(
145 PurePath(get_package_share_directory(
"carma_cooperative_perception"),
146 "config/cp_sdsm_to_detection_list_node.yaml"))
152 lidar_perception_container = ComposableNodeContainer(
153 condition=IfCondition(is_autoware_lidar_obj_detection_enabled),
154 package=
'carma_ros2_utils',
155 name=
'perception_points_filter_container',
156 executable=
'lifecycle_component_wrapper_mt',
157 namespace=GetCurrentNamespace(),
158 composable_node_descriptions=[
160 package=
'frame_transformer',
161 plugin=
'frame_transformer::Node',
162 name=
'lidar_to_map_frame_transformer',
164 {
'use_intra_process_comms':
True},
165 {
'--log-level' : GetLogLevel(
'frame_transformer', env_log_levels) },
166 {
'is_lifecycle_node':
True}
169 (
"input", [ EnvironmentVariable(
'CARMA_INTR_NS', default_value=
''),
"/lidar/points_raw" ] ),
170 (
"output",
"points_in_map"),
171 (
"change_state",
"disabled_change_state"),
172 (
"get_state",
"disabled_get_state")
175 {
"target_frame" :
"map"},
176 {
"message_type" :
"sensor_msgs/PointCloud2"},
179 vehicle_config_param_file,
180 global_params_override_file
184 package=
'points_map_filter',
185 plugin=
'points_map_filter::Node',
186 name=
'points_map_filter',
188 {
'use_intra_process_comms':
True},
189 {
'--log-level' : GetLogLevel(
'points_map_filter', env_log_levels) },
190 {
'is_lifecycle_node':
True}
193 (
"points_raw",
"points_in_map" ),
194 (
"filtered_points",
"map_filtered_points"),
195 (
"lanelet2_map",
"semantic_map"),
196 (
"change_state",
"disabled_change_state"),
197 (
"get_state",
"disabled_get_state")
199 parameters=[ points_map_filter_param_file,
200 vehicle_config_param_file,
201 global_params_override_file]
204 package=
'frame_transformer',
205 plugin=
'frame_transformer::Node',
206 name=
'lidar_frame_transformer',
208 {
'use_intra_process_comms':
True},
209 {
'--log-level' : GetLogLevel(
'frame_transformer', env_log_levels) },
210 {
'is_lifecycle_node':
True}
213 (
"input",
"map_filtered_points" ),
214 (
"output",
"points_in_base_link"),
215 (
"change_state",
"disabled_change_state"),
216 (
"get_state",
"disabled_get_state")
218 parameters=[frame_transformer_param_file,
219 vehicle_config_param_file,
220 global_params_override_file]
223 package=
'ray_ground_classifier_nodes',
224 name=
'ray_ground_filter',
225 plugin=
'autoware::perception::filters::ray_ground_classifier_nodes::RayGroundClassifierCloudNode',
227 {
'use_intra_process_comms':
True},
228 {
'--log-level' : GetLogLevel(
'ray_ground_classifier_nodes', env_log_levels) }
231 (
"points_in",
"points_in_base_link"),
232 (
"points_nonground",
"points_no_ground")
234 parameters=[ray_ground_classifier_param_file,
235 vehicle_config_param_file,
236 global_params_override_file]
239 package=
'euclidean_cluster_nodes',
240 name=
'euclidean_cluster',
241 plugin=
'autoware::perception::segmentation::euclidean_cluster_nodes::EuclideanClusterNode',
243 {
'use_intra_process_comms':
True},
244 {
'--log-level' : GetLogLevel(
'euclidean_cluster_nodes', env_log_levels) }
247 (
"points_in",
"points_no_ground")
249 parameters=[euclidean_cluster_param_file,
250 vehicle_config_param_file,
251 global_params_override_file]
254 package=
'object_detection_tracking',
255 plugin=
'bounding_box_to_detected_object::Node',
256 name=
'bounding_box_converter',
258 {
'use_intra_process_comms':
True},
259 {
'--log-level' : GetLogLevel(
'object_detection_tracking', env_log_levels) },
260 {
'is_lifecycle_node':
True}
263 (
"bounding_boxes",
"lidar_bounding_boxes"),
264 (
"lidar_detected_objects",
"detected_objects"),
266 parameters=[vehicle_config_param_file, global_params_override_file]
269 package=
'tracking_nodes',
270 plugin=
'autoware::tracking_nodes::MultiObjectTrackerNode',
271 name=
'tracking_nodes_node',
273 {
'use_intra_process_comms':
True},
274 {
'--log-level' : GetLogLevel(
'tracking_nodes', env_log_levels) }
277 (
"ego_state", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''),
"/current_pose_with_covariance" ] ),
281 parameters=[tracking_nodes_param_file,
282 vehicle_config_param_file,
283 global_params_override_file]
292 carma_external_objects_container = ComposableNodeContainer(
293 package=
'carma_ros2_utils',
294 name=
'external_objects_container',
295 executable=
'carma_component_container_mt',
296 namespace=GetCurrentNamespace(),
297 composable_node_descriptions=[
299 package=
'carma_wm_ctrl',
300 plugin=
'carma_wm_ctrl::WMBroadcasterNode',
301 name=
'carma_wm_broadcaster',
303 {
'use_intra_process_comms':
True},
304 {
'--log-level' : GetLogLevel(
'carma_wm_ctrl', env_log_levels) }
307 (
"georeference", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''),
"/map_param_loader/georeference" ] ),
308 (
"geofence", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/incoming_geofence_control" ] ),
309 (
"incoming_map", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/incoming_map" ] ),
310 (
"current_pose", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''),
"/current_pose" ] ),
311 (
"route", [ EnvironmentVariable(
'CARMA_GUIDE_NS', default_value=
''),
"/route" ] ),
312 (
"outgoing_geofence_ack", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/outgoing_mobility_operation" ] ),
313 (
"outgoing_geofence_request", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/outgoing_geofence_request" ] )
315 parameters=[carma_wm_ctrl_param_file,
316 vehicle_config_param_file,
317 vehicle_characteristics_param_file,
318 global_params_override_file]
321 package=
'object_detection_tracking',
322 plugin=
'object::ObjectDetectionTrackingNode',
323 name=
'external_object',
325 {
'use_intra_process_comms':
True},
326 {
'--log-level' : GetLogLevel(
'object_detection_tracking', env_log_levels) }
329 (
"detected_objects",
"tracked_objects"),
331 parameters=[object_detection_tracking_param_file,
332 vehicle_config_param_file,
333 global_params_override_file]
336 package=
'object_visualizer',
337 plugin=
'object_visualizer::Node',
338 name=
'object_visualizer_node',
340 {
'use_intra_process_comms':
True},
341 {
'--log-level' : GetLogLevel(
'object_visualizer', env_log_levels) }
344 (
"external_objects",
"external_object_predictions"),
345 (
"external_objects_viz",
"fused_external_objects_viz")
347 parameters=[object_visualizer_param_file, vehicle_config_param_file,
348 {
'pedestrian_icon_path': [
350 vehicle_calibration_dir,
351 '/visualization_meshes/pedestrian.stl']},
352 global_params_override_file
356 package=
'motion_computation',
357 plugin=
'motion_computation::MotionComputationNode',
358 name=
'motion_computation_node',
360 {
'use_intra_process_comms':
True},
361 {
'--log-level' : GetLogLevel(
'motion_computation', env_log_levels) }
364 (
"incoming_mobility_path", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/incoming_mobility_path" ] ),
365 (
"incoming_psm", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/incoming_psm" ] ),
366 (
"incoming_bsm", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/incoming_bsm" ] ),
367 (
"georeference", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''),
"/map_param_loader/georeference" ] ),
369 (
"external_objects", PythonExpression([
'"fused_external_objects" if "', is_cp_mot_enabled,
'" == "True" else "external_objects"'])),
372 motion_computation_param_file,
373 vehicle_config_param_file,
374 global_params_override_file
378 package=
'motion_prediction_visualizer',
379 plugin=
'motion_prediction_visualizer::Node',
380 name=
'motion_prediction_visualizer',
382 {
'use_intra_process_comms':
True},
383 {
'--log-level' : GetLogLevel(
'motion_prediction_visualizer', env_log_levels) }
386 (
"external_objects",
"external_object_predictions" ),
388 parameters=[ vehicle_config_param_file, global_params_override_file ]
391 package=
'traffic_incident_parser',
392 plugin=
'traffic_incident_parser::TrafficIncidentParserNode',
393 name=
'traffic_incident_parser_node',
395 {
'use_intra_process_comms':
True},
396 {
'--log-level' : GetLogLevel(
'traffic_incident_parser', env_log_levels) }
399 (
"georeference", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''),
"/map_param_loader/georeference" ] ),
400 (
"geofence", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/incoming_geofence_control" ] ),
401 (
"incoming_mobility_operation", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/incoming_mobility_operation" ] ),
402 (
"incoming_spat", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/incoming_spat" ] ),
403 (
"route", [ EnvironmentVariable(
'CARMA_GUIDE_NS', default_value=
''),
"/route" ] )
406 vehicle_config_param_file, global_params_override_file
414 lanelet2_map_loader_container = ComposableNodeContainer(
415 package=
'carma_ros2_utils',
416 name=
'lanelet2_map_loader_container',
417 executable=
'lifecycle_component_wrapper_mt',
418 namespace=GetCurrentNamespace(),
419 composable_node_descriptions=[
421 package=
'map_file_ros2',
422 plugin=
'lanelet2_map_loader::Lanelet2MapLoader',
423 name=
'lanelet2_map_loader',
425 {
'use_intra_process_comms':
True},
426 {
'--log-level' : GetLogLevel(
'lanelet2_map_loader', env_log_levels) },
427 {
'is_lifecycle_node':
True}
430 (
"lanelet_map_bin",
"base_map"),
431 (
"change_state",
"disabled_change_state"),
432 (
"get_state",
"disabled_get_state")
435 {
"lanelet2_filename" : vector_map_file},
436 vehicle_config_param_file,
437 global_params_override_file
444 lanelet2_map_visualization_container = ComposableNodeContainer(
445 package=
'carma_ros2_utils',
446 name=
'lanelet2_map_visualization_container',
447 executable=
'lifecycle_component_wrapper_mt',
448 namespace= GetCurrentNamespace(),
449 composable_node_descriptions=[
451 package=
'map_file_ros2',
452 plugin=
'lanelet2_map_visualization::Lanelet2MapVisualization',
453 name=
'lanelet2_map_visualization',
455 {
'use_intra_process_comms':
True},
456 {
'--log-level' : GetLogLevel(
'lanelet2_map_visualization', env_log_levels) },
457 {
'is_lifecycle_node':
True}
460 (
"lanelet_map_bin",
"semantic_map"),
461 (
"change_state",
"disabled_change_state"),
462 (
"get_state",
"disabled_get_state")
465 vehicle_config_param_file,
466 global_params_override_file
473 carma_cooperative_perception_container = ComposableNodeContainer(
474 condition=IfCondition(is_cp_mot_enabled),
475 package=
'carma_ros2_utils',
476 name=
'carma_cooperative_perception_container',
477 executable=
'carma_component_container_mt',
478 namespace= GetCurrentNamespace(),
480 composable_node_descriptions=[
482 package=
'carma_cooperative_perception',
483 plugin=
'carma_cooperative_perception::ExternalObjectListToDetectionListNode',
484 name=
'cp_external_object_list_to_detection_list_node',
486 {
'use_intra_process_comms':
True},
487 {
'--log-level' : GetLogLevel(
'cp_external_object_list_to_detection_list_node', env_log_levels) },
490 (
"input/georeference", [EnvironmentVariable(
"CARMA_LOCZ_NS", default_value=
""),
"/map_param_loader/georeference"]),
491 (
"output/detections",
"full_detection_list"),
492 (
"input/external_objects",
"external_objects"),
495 vehicle_config_param_file,
496 global_params_override_file
500 package=
'carma_cooperative_perception',
501 plugin=
'carma_cooperative_perception::ExternalObjectListToSdsmNode',
502 name=
'cp_external_object_list_to_sdsm_node',
504 {
'use_intra_process_comms':
True},
505 {
'--log-level' : GetLogLevel(
'cp_external_object_list_to_sdsm_node', env_log_levels) },
508 (
"input/georeference", [EnvironmentVariable(
"CARMA_LOCZ_NS", default_value=
""),
"/map_param_loader/georeference"]),
509 (
"output/sdsms", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/outgoing_sdsm" ] ),
510 (
"input/pose_stamped", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''),
"/current_pose" ] ),
511 (
"input/external_objects",
"external_objects"),
514 vehicle_config_param_file,
515 global_params_override_file
519 package=
'carma_cooperative_perception',
520 plugin=
'carma_cooperative_perception::HostVehicleFilterNode',
521 name=
'cp_host_vehicle_filter_node',
523 {
'use_intra_process_comms':
True},
524 {
'--log-level' : GetLogLevel(
'cp_host_vehicle_filter_node', env_log_levels) },
527 (
"input/host_vehicle_pose", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''),
"/current_pose" ] ),
528 (
"input/detection_list",
"full_detection_list"),
529 (
"output/detection_list",
"filtered_detection_list")
532 cp_host_vehicle_filter_node_file,
533 vehicle_config_param_file,
534 global_params_override_file
538 package=
'carma_cooperative_perception',
539 plugin=
'carma_cooperative_perception::SdsmToDetectionListNode',
540 name=
'cp_sdsm_to_detection_list_node',
542 {
'use_intra_process_comms':
True},
543 {
'--log-level' : GetLogLevel(
'cp_sdsm_to_detection_list_node', env_log_levels) },
546 (
"input/georeference", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''),
"/map_param_loader/georeference" ] ),
547 (
"input/sdsm", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/incoming_sdsm" ] ),
548 (
"input/cdasim_clock",
"/sim_clock"),
549 (
"output/detections",
"full_detection_list"),
552 vehicle_config_param_file,
553 cp_sdsm_to_detection_list_node_file,
554 global_params_override_file
558 package=
'carma_cooperative_perception',
559 plugin=
'carma_cooperative_perception::TrackListToExternalObjectListNode',
560 name=
'cp_track_list_to_external_object_list_node',
562 {
'use_intra_process_comms':
True},
563 {
'--log-level' : GetLogLevel(
'cp_track_list_to_external_object_list_node', env_log_levels) },
566 (
"input/track_list",
"cooperative_perception_track_list"),
567 (
"output/external_object_list",
"fused_external_objects"),
570 vehicle_config_param_file,
571 global_params_override_file
575 package=
'carma_cooperative_perception',
576 plugin=
'carma_cooperative_perception::MultipleObjectTrackerNode',
577 name=
'cp_multiple_object_tracker_node',
579 {
'use_intra_process_comms':
True},
580 {
'--log-level' : GetLogLevel(
'cp_multiple_object_tracker_node', env_log_levels) },
583 (
"output/track_list",
"cooperative_perception_track_list"),
584 (
"input/detection_list",
"filtered_detection_list"),
587 cp_multiple_object_tracker_node_file,
588 vehicle_config_param_file,
589 global_params_override_file
598 subsystem_controller = Node(
599 package=
'subsystem_controllers',
600 name=
'environment_perception_controller',
601 executable=
'environment_perception_controller',
603 subsystem_controller_default_param_file,
604 subsystem_controller_param_file,
605 {
"use_sim_time" : use_sim_time}],
607 arguments=[
'--ros-args',
'--log-level', GetLogLevel(
'subsystem_controllers', env_log_levels)]
610 return LaunchDescription([
611 declare_vehicle_characteristics_param_file_arg,
612 declare_vehicle_config_param_file_arg,
613 declare_vehicle_config_dir_arg,
614 declare_global_params_override_file_arg,
615 declare_use_sim_time_arg,
616 declare_is_autoware_lidar_obj_detection_enabled,
617 declare_is_cp_mot_enabled,
618 declare_subsystem_controller_param_file_arg,
619 declare_vector_map_file,
620 lidar_perception_container,
621 carma_external_objects_container,
622 lanelet2_map_loader_container,
623 lanelet2_map_visualization_container,
624 carma_cooperative_perception_container,
def generate_launch_description()