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')
134 env_log_levels = EnvironmentVariable(
'CARMA_ROS_LOGGING_CONFIG', default_value=
'{ "default_level" : "WARN" }')
136 carma_wm_ctrl_param_file = os.path.join(
137 get_package_share_directory(
'carma_wm_ctrl'),
'config/parameters.yaml')
139 cp_multiple_object_tracker_node_file =
str(
140 PurePath(get_package_share_directory(
"carma_cooperative_perception"),
141 "config/cp_multiple_object_tracker_node.yaml"))
142 cp_host_vehicle_filter_node_file =
str(
143 PurePath(get_package_share_directory(
"carma_cooperative_perception"),
144 "config/cp_host_vehicle_filter_node.yaml"))
145 cp_sdsm_to_detection_list_node_file =
str(
146 PurePath(get_package_share_directory(
"carma_cooperative_perception"),
147 "config/cp_sdsm_to_detection_list_node.yaml"))
153 lidar_perception_container = ComposableNodeContainer(
154 condition=IfCondition(is_autoware_lidar_obj_detection_enabled),
155 package=
'carma_ros2_utils',
156 name=
'perception_points_filter_container',
157 executable=
'lifecycle_component_wrapper_mt',
158 namespace=GetCurrentNamespace(),
159 composable_node_descriptions=[
161 package=
'frame_transformer',
162 plugin=
'frame_transformer::Node',
163 name=
'lidar_to_map_frame_transformer',
165 {
'use_intra_process_comms':
True},
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 {
'is_lifecycle_node':
True}
192 (
"points_raw",
"points_in_map" ),
193 (
"filtered_points",
"map_filtered_points"),
194 (
"lanelet2_map",
"semantic_map"),
195 (
"change_state",
"disabled_change_state"),
196 (
"get_state",
"disabled_get_state")
198 parameters=[ points_map_filter_param_file,
199 vehicle_config_param_file,
200 global_params_override_file]
203 package=
'frame_transformer',
204 plugin=
'frame_transformer::Node',
205 name=
'lidar_frame_transformer',
207 {
'use_intra_process_comms':
True},
208 {
'is_lifecycle_node':
True}
211 (
"input",
"map_filtered_points" ),
212 (
"output",
"points_in_base_link"),
213 (
"change_state",
"disabled_change_state"),
214 (
"get_state",
"disabled_get_state")
216 parameters=[frame_transformer_param_file,
217 vehicle_config_param_file,
218 global_params_override_file]
221 package=
'ray_ground_classifier_nodes',
222 name=
'ray_ground_filter',
223 plugin=
'autoware::perception::filters::ray_ground_classifier_nodes::RayGroundClassifierCloudNode',
225 {
'use_intra_process_comms':
True},
228 (
"points_in",
"points_in_base_link"),
229 (
"points_nonground",
"points_no_ground")
231 parameters=[ray_ground_classifier_param_file,
232 vehicle_config_param_file,
233 global_params_override_file]
236 package=
'euclidean_cluster_nodes',
237 name=
'euclidean_cluster',
238 plugin=
'autoware::perception::segmentation::euclidean_cluster_nodes::EuclideanClusterNode',
240 {
'use_intra_process_comms':
True},
243 (
"points_in",
"points_no_ground")
245 parameters=[euclidean_cluster_param_file,
246 vehicle_config_param_file,
247 global_params_override_file]
250 package=
'object_detection_tracking',
251 plugin=
'bounding_box_to_detected_object::Node',
252 name=
'bounding_box_converter',
254 {
'use_intra_process_comms':
True},
255 {
'is_lifecycle_node':
True}
258 (
"bounding_boxes",
"lidar_bounding_boxes"),
259 (
"lidar_detected_objects",
"detected_objects"),
261 parameters=[vehicle_config_param_file, global_params_override_file]
264 package=
'tracking_nodes',
265 plugin=
'autoware::tracking_nodes::MultiObjectTrackerNode',
266 name=
'tracking_nodes_node',
268 {
'use_intra_process_comms':
True},
271 (
"ego_state", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''),
"/current_pose_with_covariance" ] ),
275 parameters=[tracking_nodes_param_file,
276 vehicle_config_param_file,
277 global_params_override_file]
285 carma_external_objects_container = ComposableNodeContainer(
286 package=
'carma_ros2_utils',
287 name=
'external_objects_container',
288 executable=
'carma_component_container_mt',
289 namespace=GetCurrentNamespace(),
290 composable_node_descriptions=[
292 package=
'carma_wm_ctrl',
293 plugin=
'carma_wm_ctrl::WMBroadcasterNode',
294 name=
'carma_wm_broadcaster',
296 {
'use_intra_process_comms':
True},
299 (
"georeference", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''),
"/map_param_loader/georeference" ] ),
300 (
"geofence", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/incoming_geofence_control" ] ),
301 (
"incoming_map", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/incoming_map" ] ),
302 (
"current_pose", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''),
"/current_pose" ] ),
303 (
"route", [ EnvironmentVariable(
'CARMA_GUIDE_NS', default_value=
''),
"/route" ] ),
304 (
"outgoing_geofence_ack", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/outgoing_mobility_operation" ] ),
305 (
"outgoing_geofence_request", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/outgoing_geofence_request" ] )
307 parameters=[carma_wm_ctrl_param_file,
308 vehicle_config_param_file,
311 vehicle_calibration_dir,
312 '/visualization_meshes/cop.obj']},
313 vehicle_characteristics_param_file,
314 global_params_override_file]
317 package=
'object_detection_tracking',
318 plugin=
'object::ObjectDetectionTrackingNode',
319 name=
'external_object',
321 {
'use_intra_process_comms':
True},
324 (
"detected_objects",
"tracked_objects"),
326 parameters=[object_detection_tracking_param_file,
327 vehicle_config_param_file,
328 global_params_override_file]
331 package=
'object_visualizer',
332 plugin=
'object_visualizer::Node',
333 name=
'object_visualizer_node',
335 {
'use_intra_process_comms':
True},
338 (
"external_objects",
"external_object_predictions"),
339 (
"external_objects_viz",
"fused_external_objects_viz")
341 parameters=[object_visualizer_param_file, vehicle_config_param_file,
342 {
'pedestrian_icon_path': [
344 vehicle_calibration_dir,
345 '/visualization_meshes/pedestrian.stl']},
346 global_params_override_file
350 package=
'motion_computation',
351 plugin=
'motion_computation::MotionComputationNode',
352 name=
'motion_computation_node',
354 {
'use_intra_process_comms':
True},
357 (
"incoming_mobility_path", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/incoming_mobility_path" ] ),
358 (
"incoming_psm", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/incoming_psm" ] ),
359 (
"incoming_bsm", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/incoming_bsm" ] ),
360 (
"georeference", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''),
"/map_param_loader/georeference" ] ),
362 (
"external_objects", PythonExpression([
'"fused_external_objects" if "', is_cp_mot_enabled,
'" == "True" else "external_objects"'])),
365 motion_computation_param_file,
366 vehicle_config_param_file,
367 global_params_override_file
371 package=
'motion_prediction_visualizer',
372 plugin=
'motion_prediction_visualizer::Node',
373 name=
'motion_prediction_visualizer',
375 {
'use_intra_process_comms':
True},
378 (
"external_objects",
"external_object_predictions" ),
380 parameters=[ vehicle_config_param_file, global_params_override_file ]
383 package=
'traffic_incident_parser',
384 plugin=
'traffic_incident_parser::TrafficIncidentParserNode',
385 name=
'traffic_incident_parser_node',
387 {
'use_intra_process_comms':
True},
390 (
"georeference", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''),
"/map_param_loader/georeference" ] ),
391 (
"geofence", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/incoming_geofence_control" ] ),
392 (
"incoming_mobility_operation", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/incoming_mobility_operation" ] ),
393 (
"incoming_spat", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/incoming_spat" ] ),
394 (
"route", [ EnvironmentVariable(
'CARMA_GUIDE_NS', default_value=
''),
"/route" ] )
397 vehicle_config_param_file, global_params_override_file
405 lanelet2_map_loader_container = ComposableNodeContainer(
406 package=
'carma_ros2_utils',
407 name=
'lanelet2_map_loader_container',
408 executable=
'lifecycle_component_wrapper_mt',
409 namespace=GetCurrentNamespace(),
410 composable_node_descriptions=[
412 package=
'map_file_ros2',
413 plugin=
'lanelet2_map_loader::Lanelet2MapLoader',
414 name=
'lanelet2_map_loader',
416 {
'use_intra_process_comms':
True},
417 {
'is_lifecycle_node':
True}
420 (
"lanelet_map_bin",
"base_map"),
421 (
"change_state",
"disabled_change_state"),
422 (
"get_state",
"disabled_get_state")
425 {
"lanelet2_filename" : vector_map_file},
426 vehicle_config_param_file,
427 global_params_override_file
434 lanelet2_map_visualization_container = ComposableNodeContainer(
435 package=
'carma_ros2_utils',
436 name=
'lanelet2_map_visualization_container',
437 executable=
'lifecycle_component_wrapper_mt',
438 namespace= GetCurrentNamespace(),
439 composable_node_descriptions=[
441 package=
'map_file_ros2',
442 plugin=
'lanelet2_map_visualization::Lanelet2MapVisualization',
443 name=
'lanelet2_map_visualization',
445 {
'use_intra_process_comms':
True},
446 {
'is_lifecycle_node':
True}
449 (
"lanelet_map_bin",
"semantic_map"),
450 (
"change_state",
"disabled_change_state"),
451 (
"get_state",
"disabled_get_state")
454 vehicle_config_param_file,
455 global_params_override_file
462 carma_cooperative_perception_container = ComposableNodeContainer(
463 condition=IfCondition(is_cp_mot_enabled),
464 package=
'carma_ros2_utils',
465 name=
'carma_cooperative_perception_container',
466 executable=
'carma_component_container_mt',
467 namespace= GetCurrentNamespace(),
469 composable_node_descriptions=[
471 package=
'carma_cooperative_perception',
472 plugin=
'carma_cooperative_perception::ExternalObjectListToDetectionListNode',
473 name=
'cp_external_object_list_to_detection_list_node',
475 {
'use_intra_process_comms':
True},
478 (
"input/georeference", [EnvironmentVariable(
"CARMA_LOCZ_NS", default_value=
""),
"/map_param_loader/georeference"]),
479 (
"output/detections",
"full_detection_list"),
480 (
"input/external_objects",
"external_objects"),
483 vehicle_config_param_file,
484 global_params_override_file
488 package=
'carma_cooperative_perception',
489 plugin=
'carma_cooperative_perception::ExternalObjectListToSdsmNode',
490 name=
'cp_external_object_list_to_sdsm_node',
492 {
'use_intra_process_comms':
True},
495 (
"input/georeference", [EnvironmentVariable(
"CARMA_LOCZ_NS", default_value=
""),
"/map_param_loader/georeference"]),
496 (
"output/sdsms", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/outgoing_sdsm" ] ),
497 (
"input/pose_stamped", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''),
"/current_pose" ] ),
498 (
"input/external_objects",
"external_objects"),
501 vehicle_config_param_file,
502 global_params_override_file
506 package=
'carma_cooperative_perception',
507 plugin=
'carma_cooperative_perception::HostVehicleFilterNode',
508 name=
'cp_host_vehicle_filter_node',
510 {
'use_intra_process_comms':
True},
513 (
"input/host_vehicle_pose", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''),
"/current_pose" ] ),
514 (
"input/detection_list",
"full_detection_list"),
515 (
"output/detection_list",
"filtered_detection_list")
518 cp_host_vehicle_filter_node_file,
519 vehicle_config_param_file,
520 global_params_override_file
524 package=
'carma_cooperative_perception',
525 plugin=
'carma_cooperative_perception::SdsmToDetectionListNode',
526 name=
'cp_sdsm_to_detection_list_node',
528 {
'use_intra_process_comms':
True},
531 (
"input/georeference", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''),
"/map_param_loader/georeference" ] ),
532 (
"input/sdsm", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''),
"/incoming_sdsm" ] ),
533 (
"input/cdasim_clock",
"/sim_clock"),
534 (
"output/detections",
"full_detection_list"),
537 vehicle_config_param_file,
538 cp_sdsm_to_detection_list_node_file,
539 global_params_override_file
543 package=
'carma_cooperative_perception',
544 plugin=
'carma_cooperative_perception::TrackListToExternalObjectListNode',
545 name=
'cp_track_list_to_external_object_list_node',
547 {
'use_intra_process_comms':
True},
550 (
"input/track_list",
"cooperative_perception_track_list"),
551 (
"output/external_object_list",
"fused_external_objects"),
554 vehicle_config_param_file,
555 global_params_override_file
559 package=
'carma_cooperative_perception',
560 plugin=
'carma_cooperative_perception::MultipleObjectTrackerNode',
561 name=
'cp_multiple_object_tracker_node',
563 {
'use_intra_process_comms':
True},
566 (
"output/track_list",
"cooperative_perception_track_list"),
567 (
"input/detection_list",
"filtered_detection_list"),
570 cp_multiple_object_tracker_node_file,
571 vehicle_config_param_file,
572 global_params_override_file
581 subsystem_controller = Node(
582 package=
'subsystem_controllers',
583 name=
'environment_perception_controller',
584 executable=
'environment_perception_controller',
586 subsystem_controller_default_param_file,
587 subsystem_controller_param_file,
588 {
"use_sim_time" : use_sim_time}],
590 arguments=[
'--ros-args',
'--log-level', GetLogLevel(
'subsystem_controllers', env_log_levels)]
593 return LaunchDescription([
594 declare_vehicle_characteristics_param_file_arg,
595 declare_vehicle_config_param_file_arg,
596 declare_vehicle_config_dir_arg,
597 declare_global_params_override_file_arg,
598 declare_use_sim_time_arg,
599 declare_is_autoware_lidar_obj_detection_enabled,
600 declare_is_cp_mot_enabled,
601 declare_subsystem_controller_param_file_arg,
602 declare_vector_map_file,
603 lidar_perception_container,
604 carma_external_objects_container,
605 lanelet2_map_loader_container,
606 lanelet2_map_visualization_container,
607 carma_cooperative_perception_container,
def generate_launch_description()