ros2 / launch

Tools for launching multiple processes and for writing tests involving multiple processes.
Apache License 2.0
124 stars 139 forks source link

[BUG] events.process.matches_name() not working. #672

Closed ZhenshengLee closed 1 year ago

ZhenshengLee commented 1 year ago

Bug report

Required Info:

Steps to reproduce issue

the drive_base_node can be seen in https://github.com/micro-ROS/system_modes/blob/master/system_modes_examples/src/drive_base.cpp and adding initial configuration

with

// driver->set_parameter(rclcpp::Parameter("action", "move"));
  driver->trigger_transition(lifecycle_msgs::msg::Transition::TRANSITION_CONFIGURE);

launch activate_drive_emit_event.launch.py

import os

import launch
from launch import LaunchIntrospector

from ament_index_python.packages import get_package_share_directory

from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import PathJoinSubstitution, TextSubstitution
from launch.actions import EmitEvent
from launch.actions import LogInfo
from launch.actions import RegisterEventHandler
from launch_ros.actions import Node
from launch_ros.actions import LifecycleNode
from launch_ros.actions import SetParameter
from launch_ros.events.lifecycle import ChangeState
from launch_ros.event_handlers import OnStateTransition
from launch_ros.substitutions import FindPackageShare

import lifecycle_msgs.msg

def generate_launch_description():

    # Set LOG format
    # os.environ['RCUTILS_CONSOLE_OUTPUT_FORMAT'] = '{time}: [{name}] [{severity}]\t{message}'

    # Launch Description
    ld = launch.LaunchDescription()

    drive_base_node_action = LifecycleNode(
            package='sm_guardian',
            executable='drive_base_node',
            name='drive_base',
            namespace='',
            output='screen')

    drive_base_node_include = IncludeLaunchDescription(
            PythonLaunchDescriptionSource([
                PathJoinSubstitution([
                    FindPackageShare('sm_guardian'),
                    'launch',
                    'drive_base.launch.py'
                ])
            ])
    )

    drive_base_executable = 'drive_base_node'
    drive_base_name = 'drive_base'

    # Make the drive_base node take the 'configure' transition
    drive_base_configure_trans_event = EmitEvent(
        event=ChangeState(
            lifecycle_node_matcher = launch.events.process.matches_executable(drive_base_executable),
            transition_id = lifecycle_msgs.msg.Transition.TRANSITION_CONFIGURE,
        )
    )

    # drive_base_set_param = SetParameter('drive_base', )

    # Make the drive_base node take the 'activate' transition
    drive_base_activate_trans_event_by_executable = EmitEvent(
        event = ChangeState(
            lifecycle_node_matcher = launch.events.process.matches_executable(drive_base_executable),
            transition_id = lifecycle_msgs.msg.Transition.TRANSITION_ACTIVATE,
         )
    )
    drive_base_activate_trans_event_by_name = EmitEvent(
        event = ChangeState(
            lifecycle_node_matcher = launch.events.process.matches_name(drive_base_node_action),
            # lifecycle_node_matcher = launch.events.process.matches_name(drive_base_name),
            transition_id = lifecycle_msgs.msg.Transition.TRANSITION_ACTIVATE,
         )
    )

    # Add the actions to the launch description.
    # The order they are added reflects the order in which they will be executed.
    # ld.add_action(drive_base_node_action)
    ld.add_action(drive_base_node_include)
    ld.add_action(drive_base_activate_trans_event_by_executable)
    # ld.add_action(drive_base_activate_trans_event_by_name)

    return ld

Expected behavior

the drive_base_node can be activated after the events emitted in activate_drive_emit_event.launch.py

Actual behavior

the state cannote be activated after launching activate_drive.launch.py

Additional information

matches_executable() works well, see #668

ZhenshengLee commented 1 year ago

should use this launch_ros.events.lifecycle.matches_node_name

drive_base_activate_trans_event_by_name = EmitEvent(
        event = ChangeState(
            lifecycle_node_matcher = launch_ros.events.lifecycle.matches_node_name(drive_base_name),
            transition_id = lifecycle_msgs.msg.Transition.TRANSITION_ACTIVATE,
         )
    )