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 launch.substitutions 
import ThisLaunchFileDir
 
   23from carma_ros2_utils.launch.get_log_level 
import GetLogLevel
 
   24from carma_ros2_utils.launch.get_current_namespace 
import GetCurrentNamespace
 
   25from launch.substitutions 
import LaunchConfiguration
 
   29from launch.actions 
import IncludeLaunchDescription
 
   30from launch.launch_description_sources 
import PythonLaunchDescriptionSource
 
   31from launch.actions 
import GroupAction
 
   32from launch_ros.actions 
import set_remap
 
   33from launch.actions 
import DeclareLaunchArgument
 
   34from launch_ros.actions 
import PushRosNamespace
 
   41    route_file_folder = LaunchConfiguration(
'route_file_folder')
 
   42    vehicle_calibration_dir = LaunchConfiguration(
'vehicle_calibration_dir')
 
   43    vehicle_characteristics_param_file = LaunchConfiguration(
'vehicle_characteristics_param_file')
 
   44    enable_guidance_plugin_validator = LaunchConfiguration(
'enable_guidance_plugin_validator')
 
   45    strategic_plugins_to_validate = LaunchConfiguration(
'strategic_plugins_to_validate')
 
   46    tactical_plugins_to_validate = LaunchConfiguration(
'tactical_plugins_to_validate')
 
   47    control_plugins_to_validate = LaunchConfiguration(
'control_plugins_to_validate')
 
   48    vehicle_config_param_file = LaunchConfiguration(
'vehicle_config_param_file')
 
   49    declare_vehicle_config_param_file_arg = DeclareLaunchArgument(
 
   50        name = 
'vehicle_config_param_file',
 
   51        default_value = 
"/opt/carma/vehicle/config/VehicleConfigParams.yaml",
 
   52        description = 
"Path to file contain vehicle configuration parameters" 
   54    vehicle_config_dir = LaunchConfiguration(
'vehicle_config_dir')
 
   55    declare_vehicle_config_dir_arg = DeclareLaunchArgument(
 
   56        name = 
'vehicle_config_dir',
 
   57        default_value = 
"/opt/carma/vehicle/config",
 
   58        description = 
"Path to vehicle configuration directory populated by carma-config" 
   61    use_sim_time = LaunchConfiguration(
'use_sim_time')
 
   62    declare_use_sim_time_arg = DeclareLaunchArgument(
 
   63        name = 
'use_sim_time',
 
   64        default_value = 
"False",
 
   65        description = 
"True if simulation mode is on" 
   68    use_real_time_spat_in_sim = LaunchConfiguration(
'use_real_time_spat_in_sim')
 
   69    declare_use_real_time_spat_in_sim_arg = DeclareLaunchArgument(
 
   70        name = 
'use_real_time_spat_in_sim',
 
   71        default_value = 
'False',
 
   72        description = 
"True if SPaT is being published based on wall clock" 
   75    subsystem_controller_default_param_file = os.path.join(
 
   76        get_package_share_directory(
'subsystem_controllers'), 
'config/guidance_controller_config.yaml')
 
   80    global_params_override_file = LaunchConfiguration(
'global_params_override_file')
 
   81    declare_global_params_override_file_arg = DeclareLaunchArgument(
 
   82        name = 
'global_params_override_file',
 
   83        default_value = [vehicle_config_dir, 
"/GlobalParamsOverride.yaml"],
 
   84        description = 
"Path to global file containing the parameters overwrite" 
   87    mobilitypath_visualizer_param_file = os.path.join(
 
   88        get_package_share_directory(
'mobilitypath_visualizer'), 
'config/params.yaml')
 
   90    trajectory_executor_param_file = os.path.join(
 
   91        get_package_share_directory(
'trajectory_executor'), 
'config/parameters.yaml')
 
   93    route_param_file = os.path.join(
 
   94        get_package_share_directory(
'route'), 
'config/parameters.yaml')
 
   96    trajectory_visualizer_param_file = os.path.join(
 
   97        get_package_share_directory(
'trajectory_visualizer'), 
'config/parameters.yaml')
 
   99    guidance_param_file = os.path.join(
 
  100        get_package_share_directory(
'guidance'), 
'config/parameters.yaml')
 
  102    arbitrator_param_file_path = os.path.join(
 
  103        get_package_share_directory(
'arbitrator'), 
'config/arbitrator_params.yaml')
 
  105    plan_delegator_param_file = os.path.join(
 
  106        get_package_share_directory(
'plan_delegator'), 
'config/plan_delegator_params.yaml')
 
  108    port_drayage_plugin_param_file = os.path.join(
 
  109        get_package_share_directory(
'port_drayage_plugin'), 
'config/parameters.yaml')
 
  111    env_log_levels = EnvironmentVariable(
'CARMA_ROS_LOGGING_CONFIG', default_value=
'{ "default_level" : "WARN" }')
 
  113    subsystem_controller_param_file = LaunchConfiguration(
'subsystem_controller_param_file')
 
  114    declare_subsystem_controller_param_file_arg = DeclareLaunchArgument(
 
  115        name = 
'subsystem_controller_param_file',
 
  116        default_value = subsystem_controller_default_param_file,
 
  117        description = 
"Path to file containing override parameters for the subsystem controller" 
  126    carma_guidance_visualizer_container = ComposableNodeContainer(
 
  127        package=
'carma_ros2_utils',
 
  128        name=
'carma_guidance_visualizer_container',
 
  129        executable=
'carma_component_container_mt',
 
  130        namespace=GetCurrentNamespace(),
 
  131        composable_node_descriptions=[
 
  133                package=
'mobilitypath_visualizer',
 
  134                plugin=
'mobilitypath_visualizer::MobilityPathVisualizer',
 
  135                name=
'mobilitypath_visualizer_node',
 
  137                    {
'use_intra_process_comms': 
True},
 
  138                    {
'--log-level' : GetLogLevel(
'mobilitypath_visualizer', env_log_levels) }
 
  141                    (
"mobility_path_msg", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''), 
"/outgoing_mobility_path" ] ),
 
  142                    (
"incoming_mobility_path", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''), 
"/incoming_mobility_path" ] ),
 
  143                    (
"georeference", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''), 
"/map_param_loader/georeference"])
 
  146                    vehicle_characteristics_param_file,
 
  147                    mobilitypath_visualizer_param_file,
 
  148                    vehicle_config_param_file,
 
  149                    global_params_override_file
 
  153                package=
'trajectory_visualizer',
 
  154                plugin=
'trajectory_visualizer::TrajectoryVisualizer',
 
  155                name=
'trajectory_visualizer_node',
 
  157                    {
'use_intra_process_comms': 
True},
 
  158                    {
'--log-level' : GetLogLevel(
'trajectory_visualizer', env_log_levels) }
 
  161                    trajectory_visualizer_param_file,
 
  162                    vehicle_config_param_file,
 
  163                    global_params_override_file
 
  169    carma_plan_delegator_container = ComposableNodeContainer(
 
  170        package=
'carma_ros2_utils',
 
  171        name=
'carma_plan_delegator_container',
 
  172        executable=
'carma_component_container_mt',
 
  173        namespace=GetCurrentNamespace(),
 
  174        composable_node_descriptions=[
 
  176                package=
'plan_delegator',
 
  177                plugin=
'plan_delegator::PlanDelegator',
 
  178                name=
'plan_delegator',
 
  180                    {
'use_intra_process_comms': 
True},
 
  181                    {
'--log-level' : GetLogLevel(
'plan_delegator', env_log_levels) }
 
  184                    (
"current_velocity", [ EnvironmentVariable(
'CARMA_INTR_NS', default_value=
''), 
"/vehicle/twist" ] ),
 
  185                    (
"current_pose", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''), 
"/current_pose" ] ),
 
  186                    (
"vehicle_status", [ EnvironmentVariable(
'CARMA_INTR_NS', default_value=
''), 
"/vehicle_status" ] ),
 
  187                    (
"semantic_map", [ EnvironmentVariable(
'CARMA_ENV_NS', default_value=
''), 
"/semantic_map" ] ),
 
  188                    (
"map_update", [ EnvironmentVariable(
'CARMA_ENV_NS', default_value=
''), 
"/map_update" ] ),
 
  189                    (
"roadway_objects", [ EnvironmentVariable(
'CARMA_ENV_NS', default_value=
''), 
"/roadway_objects" ] ),
 
  190                    (
"incoming_spat", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''), 
"/incoming_spat" ] ),
 
  191                    (
"guidance_state", [ EnvironmentVariable(
'CARMA_GUIDE_NS', default_value=
''), 
"/state" ] ),
 
  194                    plan_delegator_param_file,
 
  195                    vehicle_config_param_file,
 
  196                    global_params_override_file
 
  202    carma_trajectory_executor_and_route_container = ComposableNodeContainer(
 
  203        package=
'carma_ros2_utils',
 
  204        name=
'carma_trajectory_executor_and_route_container',
 
  205        executable=
'carma_component_container_mt',
 
  206        namespace=GetCurrentNamespace(),
 
  207        composable_node_descriptions=[
 
  210                plugin=
'route::Route',
 
  213                    {
'use_intra_process_comms': 
True},
 
  214                    {
'--log-level' : GetLogLevel(
'route', env_log_levels) }
 
  217                    (
"current_velocity", [ EnvironmentVariable(
'CARMA_INTR_NS', default_value=
''), 
"/vehicle/twist" ] ),
 
  218                    (
"georeference", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''), 
"/map_param_loader/georeference" ] ),
 
  219                    (
"semantic_map", [ EnvironmentVariable(
'CARMA_ENV_NS', default_value=
''), 
"/semantic_map" ] ),
 
  220                    (
"map_update", [ EnvironmentVariable(
'CARMA_ENV_NS', default_value=
''), 
"/map_update" ] ),
 
  221                    (
"roadway_objects", [ EnvironmentVariable(
'CARMA_ENV_NS', default_value=
''), 
"/roadway_objects" ] ),
 
  222                    (
"incoming_spat", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''), 
"/incoming_spat" ] )
 
  225                    {
'route_file_path': route_file_folder},
 
  227                    vehicle_config_param_file,
 
  228                    global_params_override_file
 
  232                package=
'trajectory_executor',
 
  233                plugin=
'trajectory_executor::TrajectoryExecutor',
 
  234                name=
'trajectory_executor_node',
 
  236                    {
'use_intra_process_comms': 
True},
 
  237                    {
'--log-level' : GetLogLevel(
'trajectory_executor', env_log_levels) }
 
  240                    (
"trajectory", 
"plan_trajectory"),
 
  243                    trajectory_executor_param_file,
 
  244                    vehicle_config_param_file,
 
  245                    global_params_override_file
 
  251    carma_arbitrator_container = ComposableNodeContainer(
 
  252        package=
'carma_ros2_utils',
 
  253        name=
'carma_arbitrator_container',
 
  254        executable=
'carma_component_container_mt',
 
  255        namespace=GetCurrentNamespace(),
 
  256        composable_node_descriptions=[
 
  258                package=
'arbitrator',
 
  259                plugin=
'arbitrator::ArbitratorNode',
 
  262                    {
'use_intra_process_comms': 
True},
 
  263                    {
'--log-level' : GetLogLevel(
'arbitrator', env_log_levels) }
 
  266                    (
"current_velocity", [ EnvironmentVariable(
'CARMA_INTR_NS', default_value=
''), 
"/vehicle/twist" ] ),
 
  267                    (
"guidance_state", [ EnvironmentVariable(
'CARMA_GUIDE_NS', default_value=
''), 
"/state" ] ),
 
  268                    (
"semantic_map", [ EnvironmentVariable(
'CARMA_ENV_NS', default_value=
''), 
"/semantic_map" ] ),
 
  269                    (
"map_update", [ EnvironmentVariable(
'CARMA_ENV_NS', default_value=
''), 
"/map_update" ] ),
 
  270                    (
"roadway_objects", [ EnvironmentVariable(
'CARMA_ENV_NS', default_value=
''), 
"/roadway_objects" ] ),
 
  271                    (
"incoming_spat", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''), 
"/incoming_spat" ] )
 
  274                    arbitrator_param_file_path,
 
  275                    vehicle_config_param_file,
 
  276                    global_params_override_file
 
  281    carma_guidance_worker_container = ComposableNodeContainer(
 
  282        package=
'carma_ros2_utils',
 
  283        name=
'carma_guidance_worker_container',
 
  284        executable=
'carma_component_container_mt',
 
  285        namespace=GetCurrentNamespace(),
 
  286        composable_node_descriptions=[
 
  289                plugin=
'guidance::GuidanceWorker',
 
  290                name=
'guidance_node',
 
  292                    {
'use_intra_process_comms': 
True},
 
  293                    {
'--log-level' : GetLogLevel(
'route', env_log_levels) }
 
  296                    (
"vehicle_status", [ EnvironmentVariable(
'CARMA_INTR_NS', default_value=
''), 
"/vehicle_status" ] ),
 
  297                    (
"robot_status", [ EnvironmentVariable(
'CARMA_INTR_NS', default_value=
''), 
"/controller/robot_status" ] ),
 
  298                    (
"enable_robotic", [ EnvironmentVariable(
'CARMA_INTR_NS', default_value=
''), 
"/controller/enable_robotic" ] ),
 
  302                    vehicle_config_param_file,
 
  303                    global_params_override_file
 
  309    carma_port_drayage_plugin_container = ComposableNodeContainer(
 
  310        package=
'carma_ros2_utils',
 
  311        name=
'carma_port_drayage_plugin_container',
 
  312        executable=
'carma_component_container_mt',
 
  313        namespace=GetCurrentNamespace(),
 
  314        composable_node_descriptions=[
 
  316                package=
'port_drayage_plugin',
 
  317                plugin=
'port_drayage_plugin::PortDrayagePlugin',
 
  318                name=
'port_drayage_plugin_node',
 
  320                    {
'use_intra_process_comms': 
True},
 
  321                    {
'--log-level' : GetLogLevel(
'port_drayage_plugin', env_log_levels) }
 
  324                    (
"guidance_state", [ EnvironmentVariable(
'CARMA_GUIDE_NS', default_value=
''), 
"/state" ] ),
 
  325                    (
"georeference", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''), 
"/map_param_loader/georeference" ] ),
 
  326                    (
"current_pose", [ EnvironmentVariable(
'CARMA_LOCZ_NS', default_value=
''), 
"/current_pose" ] ),
 
  327                    (
"incoming_mobility_operation", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''), 
"/incoming_mobility_operation" ] ),
 
  328                    (
"outgoing_mobility_operation", [ EnvironmentVariable(
'CARMA_MSG_NS', default_value=
''), 
"/outgoing_mobility_operation" ] ),
 
  329                    (
"ui_instructions", [ EnvironmentVariable(
'CARMA_UI_NS', default_value=
''), 
"/ui_instructions" ] )
 
  332                    port_drayage_plugin_param_file,
 
  333                    vehicle_characteristics_param_file,
 
  334                    vehicle_config_param_file,
 
  335                    global_params_override_file
 
  341    twist_filter_container = ComposableNodeContainer(
 
  342        package=
'carma_ros2_utils',
 
  343        name=
'twist_filter_container',
 
  344        executable=
'carma_component_container_mt',
 
  345        namespace=GetCurrentNamespace(),
 
  346        composable_node_descriptions=[
 
  348                package=
'twist_filter',
 
  349                plugin=
'twist_filter::TwistFilter',
 
  350                name=
'twist_filter_node',
 
  352                    {
'use_intra_process_comms': 
True},
 
  353                    {
'--log-level' : GetLogLevel(
'twist_filter', env_log_levels) }
 
  356                    (
"/accel_cmd", [
"accel_cmd" ] ),
 
  357                    (
"/brake_cmd", [
"brake_cmd" ] ),
 
  358                    (
"/gear_cmd", [
"gear_cmd" ] ),
 
  359                    (
"/mode_cmd", [
"mode_cmd" ] ),
 
  360                    (
"/remote_cmd", [
"remote_cmd" ] ),
 
  361                    (
"/steer_cmd", [
"steer_cmd" ] ),
 
  362                    (
"/emergency_stop", [
"emergency_stop" ] ),
 
  363                    (
"/state_cmd", [
"state_cmd" ] )
 
  366                    vehicle_config_param_file,
 
  367                    {
'lowpass_gain_linear_x':0.1},
 
  368                    {
'lowpass_gain_angular_z':0.0},
 
  369                    {
'lowpass_gain_steering_angle':0.1},
 
  370                    global_params_override_file
 
  374                package=
'twist_gate',
 
  376                name=
'twist_gate_node',
 
  378                    {
'use_intra_process_comms': 
True},
 
  379                    {
'--log-level' : GetLogLevel(
'twist_gate', env_log_levels) }
 
  382                    (
"vehicle_cmd", [ EnvironmentVariable(
'CARMA_INTR_NS', default_value=
''), 
"/vehicle_cmd" ] ),
 
  383                    (
"/lamp_cmd", [
"lamp_cmd" ] ),
 
  384                    (
"/twist_cmd", [
"twist_cmd" ] ),
 
  385                    (
"/decision_maker/state", [
"decision_maker/state" ] ),
 
  386                    (
"/ctrl_cmd",   [
"ctrl_cmd" ] ),
 
  390                    {
'use_decision_maker':
False},
 
  391                    vehicle_config_param_file,
 
  392                    global_params_override_file
 
  399    plugins_group = GroupAction(
 
  401            PushRosNamespace(
"plugins"),
 
  402            IncludeLaunchDescription(
 
  403                PythonLaunchDescriptionSource([ThisLaunchFileDir(), 
'/plugins.launch.py']),
 
  405                    'route_file_folder' : route_file_folder,
 
  406                    'global_params_override_file' : global_params_override_file,
 
  407                    'vehicle_calibration_dir' : vehicle_calibration_dir,
 
  408                    'vehicle_characteristics_param_file' : vehicle_characteristics_param_file,
 
  409                    'vehicle_config_param_file' : vehicle_config_param_file,
 
  410                    'enable_guidance_plugin_validator' : enable_guidance_plugin_validator,
 
  411                    'strategic_plugins_to_validate' : strategic_plugins_to_validate,
 
  412                    'tactical_plugins_to_validate' : tactical_plugins_to_validate,
 
  413                    'control_plugins_to_validate' : control_plugins_to_validate,
 
  414                    'subsystem_controller_param_file' : [vehicle_config_dir, 
'/SubsystemControllerParams.yaml'],
 
  421    subsystem_controller = Node(
 
  422        package=
'subsystem_controllers',
 
  423        name=
'guidance_controller',
 
  424        executable=
'guidance_controller',
 
  426            subsystem_controller_default_param_file,
 
  427            subsystem_controller_param_file,
 
  428            {
"use_sim_time" : use_sim_time},
 
  429            {
"use_real_time_spat_in_sim" : use_real_time_spat_in_sim}],
 
  431        arguments=[
'--ros-args', 
'--log-level', GetLogLevel(
'subsystem_controllers', env_log_levels)]
 
  434    return LaunchDescription([
 
  435        declare_vehicle_config_param_file_arg,
 
  436        declare_vehicle_config_dir_arg,
 
  437        declare_global_params_override_file_arg,
 
  438        declare_use_sim_time_arg,
 
  439        declare_subsystem_controller_param_file_arg,
 
  440        declare_use_real_time_spat_in_sim_arg,
 
  441        carma_trajectory_executor_and_route_container,
 
  442        carma_guidance_visualizer_container,
 
  443        carma_guidance_worker_container,
 
  444        carma_plan_delegator_container,
 
  445        carma_arbitrator_container,
 
  446        carma_port_drayage_plugin_container,
 
  447        twist_filter_container,
 
def generate_launch_description()