ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange |
1 | initial version |
This is the final version of the converted launch file. Thank you @jacobperron :
"""Launch a lifecycle ZED node and the Robot State Publisher"""
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 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.events.lifecycle import ChangeState
from launch_ros.event_handlers import OnStateTransition
import lifecycle_msgs.msg
def generate_launch_description():
# use: 'zed' for "ZED" camera - 'zedm' for "ZED mini" camera
camera_model = 'zedm'
# URDF file to be loaded by Robot State Publisher
urdf = os.path.join(get_package_share_directory('stereolabs_zed'), 'urdf', camera_model + '.urdf')
# ZED Configurations to be loaded by ZED Node
config_common = os.path.join(get_package_share_directory('stereolabs_zed'), 'config', 'common.yaml')
config_camera = os.path.join(get_package_share_directory('stereolabs_zed'), 'config', camera_model + '.yaml')
# Set LOG format
os.environ['RCUTILS_CONSOLE_OUTPUT_FORMAT'] = '{time}: [{name}] [{severity}]\t{message}'
# Launch Description
ld = launch.LaunchDescription()
# Prepare the ZED node
zed_node = LifecycleNode(
node_namespace = 'zed', # must match the namespace in config -> YAML
node_name = 'zed_node', # must match the node name in config -> YAML
package = 'stereolabs_zed',
node_executable = 'zed_wrapper_node',
output = 'screen',
parameters = [
config_common, # Common parameters
config_camera, # Camera related parameters
]
)
# Prepare the Robot State Publisher node
rsp_node = Node(
node_name = 'zed_state_publisher',
package = 'robot_state_publisher',
node_executable = 'robot_state_publisher',
output = 'screen',
arguments = [urdf, 'robot_description:=zed_description']
)
# Make the ZED node take the 'configure' transition
zed_configure_trans_event = EmitEvent(
event=ChangeState(
lifecycle_node_matcher = launch.events.process.matches_action(zed_node),
transition_id = lifecycle_msgs.msg.Transition.TRANSITION_CONFIGURE,
)
)
# Make the ZED node take the 'activate' transition
zed_activate_trans_event = EmitEvent(
event = ChangeState(
lifecycle_node_matcher = launch.events.process.matches_action(zed_node),
transition_id = lifecycle_msgs.msg.Transition.TRANSITION_ACTIVATE,
)
)
# When the ZED node reaches the 'inactive' state, make it take the 'activate' transition and start the Robot State Publisher
zed_inactive_state_handler = RegisterEventHandler(
OnStateTransition(
target_lifecycle_node = zed_node,
goal_state = 'inactive',
entities = [
# Log
LogInfo( msg = "'ZED' reached the 'INACTIVE' state, start the 'Robot State Publisher' node and 'activating'." ),
# Robot State Publisher
rsp_node,
# Change State event ( inactive -> active )
zed_activate_trans_event,
],
)
)
# When the ZED node reaches the 'active' state, log a message.
zed_active_state_handler = RegisterEventHandler(
OnStateTransition(
target_lifecycle_node = zed_node,
goal_state = 'active',
entities = [
# Log
LogInfo( msg = "'ZED' reached the 'ACTIVE' state" ),
],
)
)
# Add the actions to the launch description.
# The order they are added reflects the order in which they will be executed.
ld.add_action( zed_inactive_state_handler )
ld.add_action( zed_active_state_handler )
ld.add_action( zed_node )
ld.add_action( zed_configure_trans_event)
return ld