from launch import LaunchDescription from launch.actions import DeclareLaunchArgument, RegisterEventHandler, OpaqueFunction from launch.conditions import IfCondition from launch.event_handlers import OnProcessExit from launch.substitutions import Command, FindExecutable, LaunchConfiguration, PathJoinSubstitution from launch_ros.actions import Node, node from launch_ros.substitutions import FindPackageShare def launch_setup(context, *args, **kwargs): # Initialize Arguments robot_controller = LaunchConfiguration("robot_controller") gui = LaunchConfiguration("gui") filepath = PathJoinSubstitution( [ FindPackageShare("rbs_servo_test"), "urdf", "simple_robot.urdf" ] ).perform(context) with open(filepath, "r") as file: robot_description_content = file.read() robot_description = {"robot_description": robot_description_content} robot_controllers = PathJoinSubstitution( [ FindPackageShare("rbs_servo_test"), "config", "ros2_controllers.yaml", ] ) rviz_config_file = PathJoinSubstitution( [FindPackageShare("rbs_servo_test"), "config", "driver.rviz"] ) control_node = Node( package="controller_manager", # prefix=['gdbserver localhost:1234'], executable="ros2_control_node", parameters=[robot_description, robot_controllers], output="both", ) robot_state_pub_node = Node( package="robot_state_publisher", executable="robot_state_publisher", output="both", parameters=[robot_description], ) rviz_node = Node( package="rviz2", executable="rviz2", name="rviz2", output="log", # arguments=["-d", rviz_config_file], condition=IfCondition(gui), ) joint_state_broadcaster_spawner = Node( package="controller_manager", executable="spawner", arguments=["joint_state_broadcaster", "--controller-manager", "/controller_manager"], ) robot_controller_spawner = Node( package="controller_manager", executable="spawner", arguments=[robot_controller, "--controller-manager", "/controller_manager"], ) # Delay rviz start after `joint_state_broadcaster` delay_rviz_after_joint_state_broadcaster_spawner = RegisterEventHandler( event_handler=OnProcessExit( target_action=joint_state_broadcaster_spawner, on_exit=[rviz_node], ) ) # Delay start of robot_controller after `joint_state_broadcaster` delay_robot_controller_spawner_after_joint_state_broadcaster_spawner = RegisterEventHandler( event_handler=OnProcessExit( target_action=joint_state_broadcaster_spawner, on_exit=[robot_controller_spawner], ) ) nodes = [ control_node, robot_state_pub_node, joint_state_broadcaster_spawner, delay_rviz_after_joint_state_broadcaster_spawner, delay_robot_controller_spawner_after_joint_state_broadcaster_spawner, ] return nodes def generate_launch_description(): # Declare arguments declared_arguments = [] declared_arguments.append( DeclareLaunchArgument( "gui", default_value="false", description="Start RViz2 automatically with this launch file.", ) ) declared_arguments.append( DeclareLaunchArgument( "robot_controller", default_value="forward_position_controller", description=".......", ) ) return LaunchDescription(declared_arguments + [OpaqueFunction(function=launch_setup)])