From 3a3e7bf73a6ec9e7b829106eff9a3e0b13d36049 Mon Sep 17 00:00:00 2001 From: philipchurchley Date: Tue, 11 Nov 2025 13:52:44 -0500 Subject: [PATCH 1/7] cleaned example_1/rrbot.launch.py --- example_1/bringup/launch/rrbot.launch.py | 169 ++++++++++++----------- 1 file changed, 87 insertions(+), 82 deletions(-) diff --git a/example_1/bringup/launch/rrbot.launch.py b/example_1/bringup/launch/rrbot.launch.py index 23ad9850e..8f5616d39 100644 --- a/example_1/bringup/launch/rrbot.launch.py +++ b/example_1/bringup/launch/rrbot.launch.py @@ -24,102 +24,107 @@ def generate_launch_description(): - # Declare arguments - declared_arguments = [] - declared_arguments.append( - DeclareLaunchArgument( - "gui", - default_value="true", - description="Start RViz2 automatically with this launch file.", - ) - ) - - # Initialize Arguments - gui = LaunchConfiguration("gui") - - # Get URDF via xacro - robot_description_content = Command( - [ - PathJoinSubstitution([FindExecutable(name="xacro")]), - " ", + # Define Node action objects needed to be referenced by RegisterEventHandler + robot_controller_spawner = Node( + package="controller_manager", + executable="spawner", + arguments=[ + "forward_position_controller", + "--param-file", PathJoinSubstitution( [ FindPackageShare("ros2_control_demo_example_1"), - "urdf", - "rrbot.urdf.xacro", + "config", + "rrbot_controllers.yaml", ] ), - ] - ) - robot_description = {"robot_description": robot_description_content} - - robot_controllers = PathJoinSubstitution( - [ - FindPackageShare("ros2_control_demo_example_1"), - "config", - "rrbot_controllers.yaml", - ] - ) - rviz_config_file = PathJoinSubstitution( - [FindPackageShare("ros2_control_demo_description"), "rrbot/rviz", "rrbot.rviz"] + ], ) - control_node = Node( + joint_state_broadcaster_spawner = Node( package="controller_manager", - executable="ros2_control_node", - parameters=[robot_controllers], - output="both", - ) - robot_state_pub_node = Node( - package="robot_state_publisher", - executable="robot_state_publisher", - output="both", - parameters=[robot_description], + executable="spawner", + arguments=["joint_state_broadcaster"], ) + 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"], - ) - - robot_controller_spawner = Node( - package="controller_manager", - executable="spawner", - arguments=["forward_position_controller", "--param-file", robot_controllers], - ) - - # 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], - ) + arguments=[ + "-d", + PathJoinSubstitution( + [ + FindPackageShare("ros2_control_demo_description"), + "rrbot/rviz", + "rrbot.rviz", + ] + ), + ], + condition=IfCondition(LaunchConfiguration("gui")), ) - # Delay start of joint_state_broadcaster after `robot_controller` - # TODO(anyone): This is a workaround for flaky tests. Remove when fixed. - delay_joint_state_broadcaster_after_robot_controller_spawner = RegisterEventHandler( - event_handler=OnProcessExit( - target_action=robot_controller_spawner, - on_exit=[joint_state_broadcaster_spawner], - ) + return LaunchDescription( + [ + DeclareLaunchArgument( + "gui", + default_value="true", + description="Start RViz2 automatically with this launch file.", + ), + # Control node + Node( + package="controller_manager", + executable="ros2_control_node", + parameters=[ + PathJoinSubstitution( + [ + FindPackageShare("ros2_control_demo_example_1"), + "config", + "rrbot_controllers.yaml", + ] + ) + ], + output="both", + ), + # robot_state_publisher with robot_description from xacro + Node( + package="robot_state_publisher", + executable="robot_state_publisher", + output="both", + parameters=[ + { + "robot_description": Command( + [ + PathJoinSubstitution([FindExecutable(name="xacro")]), + " ", + PathJoinSubstitution( + [ + FindPackageShare("ros2_control_demo_example_1"), + "urdf", + "rrbot.urdf.xacro", + ] + ), + ] + ) + } + ], + ), + # Include the robot_controller_spawner action (starts at launch) + robot_controller_spawner, + # When robot_controller_spawner exits, start the joint_state_broadcaster + RegisterEventHandler( + event_handler=OnProcessExit( + target_action=robot_controller_spawner, + on_exit=[joint_state_broadcaster_spawner], + ) + ), + # When joint_state_broadcaster_spawner exits, start RViz + RegisterEventHandler( + event_handler=OnProcessExit( + target_action=joint_state_broadcaster_spawner, + on_exit=[rviz_node], + ) + ), + ] ) - - nodes = [ - control_node, - robot_state_pub_node, - robot_controller_spawner, - delay_rviz_after_joint_state_broadcaster_spawner, - delay_joint_state_broadcaster_after_robot_controller_spawner, - ] - - return LaunchDescription(declared_arguments + nodes) From 40bbc25b3a086f1beaa1147d7a77bb7ab4a3759e Mon Sep 17 00:00:00 2001 From: Philip Churchley <124009071+philipchurchley@users.noreply.github.com> Date: Thu, 13 Nov 2025 12:18:16 -0500 Subject: [PATCH 2/7] Update example_1/bringup/launch/rrbot.launch.py xacro MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Christoph Fröhlich --- example_1/bringup/launch/rrbot.launch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example_1/bringup/launch/rrbot.launch.py b/example_1/bringup/launch/rrbot.launch.py index 8f5616d39..364725cce 100644 --- a/example_1/bringup/launch/rrbot.launch.py +++ b/example_1/bringup/launch/rrbot.launch.py @@ -96,7 +96,7 @@ def generate_launch_description(): { "robot_description": Command( [ - PathJoinSubstitution([FindExecutable(name="xacro")]), + "xacro", " ", PathJoinSubstitution( [ From f78b102ddd27e57a6422ddd1adbc087d8d63c412 Mon Sep 17 00:00:00 2001 From: philipchurchley Date: Thu, 13 Nov 2025 12:51:36 -0500 Subject: [PATCH 3/7] remove unnecessary var --- example_1/bringup/launch/rrbot.launch.py | 54 ++++++++++++------------ 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/example_1/bringup/launch/rrbot.launch.py b/example_1/bringup/launch/rrbot.launch.py index 364725cce..311507dbb 100644 --- a/example_1/bringup/launch/rrbot.launch.py +++ b/example_1/bringup/launch/rrbot.launch.py @@ -17,7 +17,7 @@ from launch.actions import DeclareLaunchArgument, RegisterEventHandler from launch.conditions import IfCondition from launch.event_handlers import OnProcessExit -from launch.substitutions import Command, FindExecutable, LaunchConfiguration, PathJoinSubstitution +from launch.substitutions import Command, LaunchConfiguration, PathJoinSubstitution from launch_ros.actions import Node from launch_ros.substitutions import FindPackageShare @@ -41,30 +41,6 @@ def generate_launch_description(): ], ) - joint_state_broadcaster_spawner = Node( - package="controller_manager", - executable="spawner", - arguments=["joint_state_broadcaster"], - ) - - rviz_node = Node( - package="rviz2", - executable="rviz2", - name="rviz2", - output="log", - arguments=[ - "-d", - PathJoinSubstitution( - [ - FindPackageShare("ros2_control_demo_description"), - "rrbot/rviz", - "rrbot.rviz", - ] - ), - ], - condition=IfCondition(LaunchConfiguration("gui")), - ) - return LaunchDescription( [ DeclareLaunchArgument( @@ -116,14 +92,38 @@ def generate_launch_description(): RegisterEventHandler( event_handler=OnProcessExit( target_action=robot_controller_spawner, - on_exit=[joint_state_broadcaster_spawner], + on_exit=[ + joint_state_broadcaster_spawner := Node( + package="controller_manager", + executable="spawner", + arguments=["joint_state_broadcaster"], + ) + ], ) ), # When joint_state_broadcaster_spawner exits, start RViz RegisterEventHandler( event_handler=OnProcessExit( target_action=joint_state_broadcaster_spawner, - on_exit=[rviz_node], + on_exit=[ + Node( + package="rviz2", + executable="rviz2", + name="rviz2", + output="log", + arguments=[ + "-d", + PathJoinSubstitution( + [ + FindPackageShare("ros2_control_demo_description"), + "rrbot/rviz", + "rrbot.rviz", + ] + ), + ], + condition=IfCondition(LaunchConfiguration("gui")), + ) + ], ) ), ] From c631a9b2139c6d8977d08de8fb1e93724863ad85 Mon Sep 17 00:00:00 2001 From: Philip Churchley <124009071+philipchurchley@users.noreply.github.com> Date: Fri, 14 Nov 2025 14:38:16 -0500 Subject: [PATCH 4/7] switch pathjoinsubstitution to pathsubstitution Co-authored-by: Emerson Knapp <537409+emersonknapp@users.noreply.github.com> --- example_1/bringup/launch/rrbot.launch.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/example_1/bringup/launch/rrbot.launch.py b/example_1/bringup/launch/rrbot.launch.py index 311507dbb..eae6ee6c3 100644 --- a/example_1/bringup/launch/rrbot.launch.py +++ b/example_1/bringup/launch/rrbot.launch.py @@ -113,13 +113,7 @@ def generate_launch_description(): output="log", arguments=[ "-d", - PathJoinSubstitution( - [ - FindPackageShare("ros2_control_demo_description"), - "rrbot/rviz", - "rrbot.rviz", - ] - ), + PathSubstitution(FindPackageShare("ros2_control_demo_description")) / "rrbot" / "rviz" / "rrbot.rviz", ], condition=IfCondition(LaunchConfiguration("gui")), ) From 9ccd5947d7396340341842a30b003f0a37641f59 Mon Sep 17 00:00:00 2001 From: philipchurchley Date: Sun, 16 Nov 2025 18:37:32 -0500 Subject: [PATCH 5/7] universal usage of PathSubstitution --- example_1/bringup/launch/rrbot.launch.py | 37 +++++++++--------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/example_1/bringup/launch/rrbot.launch.py b/example_1/bringup/launch/rrbot.launch.py index eae6ee6c3..500f65e9f 100644 --- a/example_1/bringup/launch/rrbot.launch.py +++ b/example_1/bringup/launch/rrbot.launch.py @@ -17,7 +17,7 @@ from launch.actions import DeclareLaunchArgument, RegisterEventHandler from launch.conditions import IfCondition from launch.event_handlers import OnProcessExit -from launch.substitutions import Command, LaunchConfiguration, PathJoinSubstitution +from launch.substitutions import Command, LaunchConfiguration, PathSubstitution from launch_ros.actions import Node from launch_ros.substitutions import FindPackageShare @@ -31,13 +31,9 @@ def generate_launch_description(): arguments=[ "forward_position_controller", "--param-file", - PathJoinSubstitution( - [ - FindPackageShare("ros2_control_demo_example_1"), - "config", - "rrbot_controllers.yaml", - ] - ), + PathSubstitution(FindPackageShare("ros2_control_demo_example_1")) + / "config" + / "rrbot_controllers.yaml", ], ) @@ -53,13 +49,9 @@ def generate_launch_description(): package="controller_manager", executable="ros2_control_node", parameters=[ - PathJoinSubstitution( - [ - FindPackageShare("ros2_control_demo_example_1"), - "config", - "rrbot_controllers.yaml", - ] - ) + PathSubstitution(FindPackageShare("ros2_control_demo_example_1")) + / "config" + / "rrbot_controllers.yaml" ], output="both", ), @@ -74,13 +66,9 @@ def generate_launch_description(): [ "xacro", " ", - PathJoinSubstitution( - [ - FindPackageShare("ros2_control_demo_example_1"), - "urdf", - "rrbot.urdf.xacro", - ] - ), + PathSubstitution(FindPackageShare("ros2_control_demo_example_1")) + / "urdf" + / "rrbot.urdf.xacro", ] ) } @@ -113,7 +101,10 @@ def generate_launch_description(): output="log", arguments=[ "-d", - PathSubstitution(FindPackageShare("ros2_control_demo_description")) / "rrbot" / "rviz" / "rrbot.rviz", + PathSubstitution(FindPackageShare("ros2_control_demo_description")) + / "rrbot" + / "rviz" + / "rrbot.rviz", ], condition=IfCondition(LaunchConfiguration("gui")), ) From 0b74f84de00b83055a6ce7da85a08f5f02b50f81 Mon Sep 17 00:00:00 2001 From: philipchurchley Date: Tue, 18 Nov 2025 12:41:01 -0500 Subject: [PATCH 6/7] remove EventHandlers --- example_1/bringup/launch/rrbot.launch.py | 76 ++++++++---------------- 1 file changed, 26 insertions(+), 50 deletions(-) diff --git a/example_1/bringup/launch/rrbot.launch.py b/example_1/bringup/launch/rrbot.launch.py index 500f65e9f..020fd2125 100644 --- a/example_1/bringup/launch/rrbot.launch.py +++ b/example_1/bringup/launch/rrbot.launch.py @@ -14,9 +14,8 @@ from launch import LaunchDescription -from launch.actions import DeclareLaunchArgument, RegisterEventHandler +from launch.actions import DeclareLaunchArgument from launch.conditions import IfCondition -from launch.event_handlers import OnProcessExit from launch.substitutions import Command, LaunchConfiguration, PathSubstitution from launch_ros.actions import Node @@ -24,19 +23,6 @@ def generate_launch_description(): - # Define Node action objects needed to be referenced by RegisterEventHandler - robot_controller_spawner = Node( - package="controller_manager", - executable="spawner", - arguments=[ - "forward_position_controller", - "--param-file", - PathSubstitution(FindPackageShare("ros2_control_demo_example_1")) - / "config" - / "rrbot_controllers.yaml", - ], - ) - return LaunchDescription( [ DeclareLaunchArgument( @@ -74,42 +60,32 @@ def generate_launch_description(): } ], ), - # Include the robot_controller_spawner action (starts at launch) - robot_controller_spawner, - # When robot_controller_spawner exits, start the joint_state_broadcaster - RegisterEventHandler( - event_handler=OnProcessExit( - target_action=robot_controller_spawner, - on_exit=[ - joint_state_broadcaster_spawner := Node( - package="controller_manager", - executable="spawner", - arguments=["joint_state_broadcaster"], - ) - ], - ) + Node( + package="rviz2", + executable="rviz2", + name="rviz2", + output="log", + arguments=[ + "-d", + PathSubstitution(FindPackageShare("ros2_control_demo_description")) + / "rrbot/rviz/rrbot.rviz", + ], + condition=IfCondition(LaunchConfiguration("gui")), ), - # When joint_state_broadcaster_spawner exits, start RViz - RegisterEventHandler( - event_handler=OnProcessExit( - target_action=joint_state_broadcaster_spawner, - on_exit=[ - Node( - package="rviz2", - executable="rviz2", - name="rviz2", - output="log", - arguments=[ - "-d", - PathSubstitution(FindPackageShare("ros2_control_demo_description")) - / "rrbot" - / "rviz" - / "rrbot.rviz", - ], - condition=IfCondition(LaunchConfiguration("gui")), - ) - ], - ) + Node( + package="controller_manager", + executable="spawner", + arguments=["joint_state_broadcaster"], + ), + Node( + package="controller_manager", + executable="spawner", + parameters=[ + PathSubstitution(FindPackageShare("ros2_control_demo_example_1")) + / "config" + / "rrbot_controllers.yaml" + ], + arguments=["forward_position_controller"], ), ] ) From 079eac19252d59acc21cc5cb690a1e3c4fd04eaf Mon Sep 17 00:00:00 2001 From: philipchurchley Date: Wed, 19 Nov 2025 13:31:03 -0500 Subject: [PATCH 7/7] param as argument --- example_1/bringup/launch/rrbot.launch.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/example_1/bringup/launch/rrbot.launch.py b/example_1/bringup/launch/rrbot.launch.py index 020fd2125..fe0a9f11e 100644 --- a/example_1/bringup/launch/rrbot.launch.py +++ b/example_1/bringup/launch/rrbot.launch.py @@ -80,12 +80,13 @@ def generate_launch_description(): Node( package="controller_manager", executable="spawner", - parameters=[ + arguments=[ + "forward_position_controller", + "--param-file", PathSubstitution(FindPackageShare("ros2_control_demo_example_1")) / "config" - / "rrbot_controllers.yaml" + / "rrbot_controllers.yaml", ], - arguments=["forward_position_controller"], ), ] )