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(