From ceed8cfc458e60a695f68411077728fa5d41a01d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20Fr=C3=B6hlich?= Date: Mon, 16 Dec 2024 14:10:28 +0100 Subject: [PATCH] Use launch_utils instead of a spawner per controller (#666) --- example_13/CMakeLists.txt | 9 +- .../bringup/launch/three_robots.launch.py | 108 +++++------------- example_13/package.xml | 7 +- example_13/test/test_three_robots_launch.py | 4 +- 4 files changed, 46 insertions(+), 82 deletions(-) diff --git a/example_13/CMakeLists.txt b/example_13/CMakeLists.txt index 06aec8e9d..e63aa68a5 100644 --- a/example_13/CMakeLists.txt +++ b/example_13/CMakeLists.txt @@ -34,11 +34,18 @@ install( ) if(BUILD_TESTING) + find_package(ament_cmake_ros REQUIRED) + find_package(launch_testing_ament_cmake REQUIRED) find_package(ament_cmake_pytest REQUIRED) ament_add_pytest_test(example_13_urdf_xacro test/test_urdf_xacro.py) ament_add_pytest_test(view_example_13_launch test/test_view_robot_launch.py) - ament_add_pytest_test(run_example_13_launch test/test_three_robots_launch.py) + + function(add_ros_isolated_launch_test path) + set(RUNNER "${ament_cmake_ros_DIR}/run_test_isolated.py") + add_launch_test("${path}" RUNNER "${RUNNER}" ${ARGN}) + endfunction() + add_ros_isolated_launch_test(test/test_three_robots_launch.py) endif() ## EXPORTS diff --git a/example_13/bringup/launch/three_robots.launch.py b/example_13/bringup/launch/three_robots.launch.py index 8a2aa2b53..e9a1679cc 100644 --- a/example_13/bringup/launch/three_robots.launch.py +++ b/example_13/bringup/launch/three_robots.launch.py @@ -22,6 +22,7 @@ from launch_ros.actions import Node from launch_ros.substitutions import FindPackageShare +from controller_manager.launch_utils import generate_controllers_spawner_launch_description def generate_launch_description(): @@ -104,85 +105,44 @@ def generate_launch_description(): condition=IfCondition(gui), ) - # Separate robot state publishers for each robot - - # Global joint state broadcaster - joint_state_broadcaster_spawner = Node( - package="controller_manager", - executable="spawner", - arguments=["joint_state_broadcaster"], + # global broadcaster and initially active controllers from RRBot + general_ctrl_spawner = generate_controllers_spawner_launch_description( + [ + # Global joint state broadcaster + "joint_state_broadcaster", + # RRBot controllers + "rrbot_joint_state_broadcaster", + "rrbot_position_controller", + # External FTS broadcaster + "rrbot_external_fts_broadcaster", + ], + controller_params_files=[robot_controllers], ) - # RRBot controllers - rrbot_joint_state_broadcaster_spawner = Node( - package="controller_manager", - executable="spawner", - arguments=["rrbot_joint_state_broadcaster", "--param-file", robot_controllers], - ) - rrbot_position_controller_spawner = Node( - package="controller_manager", - executable="spawner", - arguments=["rrbot_position_controller", "--param-file", robot_controllers], - ) - # External FTS broadcaster - rrbot_external_fts_broadcaster_spawner = Node( - package="controller_manager", - executable="spawner", - arguments=["rrbot_external_fts_broadcaster", "--param-file", robot_controllers], + # RRBot with sensors controllers, initially active + rrbot_sensor_ctrl_spawner_active = generate_controllers_spawner_launch_description( + ["rrbot_with_sensor_joint_state_broadcaster", "rrbot_with_sensor_fts_broadcaster"], + controller_params_files=[robot_controllers], ) - # RRBot controllers - rrbot_with_sensor_joint_state_broadcaster_spawner = Node( - package="controller_manager", - executable="spawner", - arguments=["rrbot_with_sensor_joint_state_broadcaster", "--param-file", robot_controllers], - ) - rrbot_with_sensor_position_controller_spawner = Node( - package="controller_manager", - executable="spawner", - arguments=[ + # RRBot with sensors controllers, initially inactive + rrbot_sensor_ctrl_spawner_inactive = generate_controllers_spawner_launch_description( + [ "rrbot_with_sensor_position_controller", - "--inactive", - "--param-file", - robot_controllers, ], - ) - rrbot_with_sensor_fts_broadcaster_spawner = Node( - package="controller_manager", - executable="spawner", - arguments=["rrbot_with_sensor_fts_broadcaster", "--param-file", robot_controllers], + controller_params_files=[robot_controllers], + extra_spawner_args=["--inactive"], ) - # ThreeDofBot controllers - threedofbot_joint_state_broadcaster_spawner = Node( - package="controller_manager", - executable="spawner", - arguments=[ + # ThreeDofBot controllers, initially inactive + threedofbot_ctrl_spawner = generate_controllers_spawner_launch_description( + [ "threedofbot_joint_state_broadcaster", - "--inactive", - "--param-file", - robot_controllers, - ], - ) - threedofbot_position_controller_spawner = Node( - package="controller_manager", - executable="spawner", - arguments=[ "threedofbot_position_controller", - "--inactive", - "--param-file", - robot_controllers, - ], - ) - threedofbot_pid_gain_controller_spawner = Node( - package="controller_manager", - executable="spawner", - arguments=[ "threedofbot_pid_gain_controller", - "--inactive", - "--param-file", - robot_controllers, ], + controller_params_files=[robot_controllers], + extra_spawner_args=["--inactive"], ) # Command publishers @@ -209,16 +169,10 @@ def generate_launch_description(): control_node, robot_state_pub_node, rviz_node, - joint_state_broadcaster_spawner, - rrbot_joint_state_broadcaster_spawner, - rrbot_position_controller_spawner, - rrbot_external_fts_broadcaster_spawner, - rrbot_with_sensor_joint_state_broadcaster_spawner, - rrbot_with_sensor_position_controller_spawner, - rrbot_with_sensor_fts_broadcaster_spawner, - threedofbot_joint_state_broadcaster_spawner, - threedofbot_position_controller_spawner, - threedofbot_pid_gain_controller_spawner, + general_ctrl_spawner, + rrbot_sensor_ctrl_spawner_active, + rrbot_sensor_ctrl_spawner_inactive, + threedofbot_ctrl_spawner, rrbot_position_command_publisher, rrbot_with_sensor_position_command_publisher, threedofbot_position_command_publisher, diff --git a/example_13/package.xml b/example_13/package.xml index 0cc8f4a59..9e0af6f60 100644 --- a/example_13/package.xml +++ b/example_13/package.xml @@ -31,8 +31,13 @@ xacro ament_cmake_pytest - launch_testing_ros + ament_cmake_ros + launch_ros + launch_testing_ament_cmake + launch_testing + launch liburdfdom-tools + rclpy ros2_control_demo_testing xacro diff --git a/example_13/test/test_three_robots_launch.py b/example_13/test/test_three_robots_launch.py index 9e0fed689..eaaa12ac1 100644 --- a/example_13/test/test_three_robots_launch.py +++ b/example_13/test/test_three_robots_launch.py @@ -29,7 +29,6 @@ # Author: Christoph Froehlich import os -import pytest import unittest import subprocess @@ -48,8 +47,7 @@ ) -# Executes the given launch file and checks if all nodes can be started -@pytest.mark.rostest +# Executes the given launch file def generate_test_description(): launch_include = IncludeLaunchDescription( PythonLaunchDescriptionSource(