Skip to content

Commit fc9898f

Browse files
authored
Use launch_utils instead of a spawner per controller (backport #666) (#667)
1 parent 2faa6d2 commit fc9898f

File tree

4 files changed

+52
-73
lines changed

4 files changed

+52
-73
lines changed

example_13/CMakeLists.txt

+8-1
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,18 @@ install(
2626
)
2727

2828
if(BUILD_TESTING)
29+
find_package(ament_cmake_ros REQUIRED)
30+
find_package(launch_testing_ament_cmake REQUIRED)
2931
find_package(ament_cmake_pytest REQUIRED)
3032

3133
ament_add_pytest_test(example_13_urdf_xacro test/test_urdf_xacro.py)
3234
ament_add_pytest_test(view_example_13_launch test/test_view_robot_launch.py)
33-
ament_add_pytest_test(run_example_13_launch test/test_three_robots_launch.py)
35+
36+
function(add_ros_isolated_launch_test path)
37+
set(RUNNER "${ament_cmake_ros_DIR}/run_test_isolated.py")
38+
add_launch_test("${path}" RUNNER "${RUNNER}" ${ARGN})
39+
endfunction()
40+
add_ros_isolated_launch_test(test/test_three_robots_launch.py)
3441
endif()
3542

3643
## EXPORTS

example_13/bringup/launch/three_robots.launch.py

+37-68
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
from launch_ros.actions import Node
2424
from launch_ros.substitutions import FindPackageShare
25+
from controller_manager.launch_utils import generate_controllers_spawner_launch_description
2526

2627

2728
def generate_launch_description():
@@ -87,7 +88,10 @@ def generate_launch_description():
8788
control_node = Node(
8889
package="controller_manager",
8990
executable="ros2_control_node",
90-
parameters=[robot_description, robot_controllers],
91+
parameters=[robot_controllers],
92+
remappings=[
93+
("~/robot_description", "/robot_description"),
94+
],
9195
)
9296
robot_state_pub_node = Node(
9397
package="robot_state_publisher",
@@ -104,73 +108,44 @@ def generate_launch_description():
104108
condition=IfCondition(gui),
105109
)
106110

107-
# Separate robot state publishers for each robot
108-
109-
# Global joint state broadcaster
110-
joint_state_broadcaster_spawner = Node(
111-
package="controller_manager",
112-
executable="spawner",
113-
arguments=["joint_state_broadcaster"],
111+
# global broadcaster and initially active controllers from RRBot
112+
general_ctrl_spawner = generate_controllers_spawner_launch_description(
113+
[
114+
# Global joint state broadcaster
115+
"joint_state_broadcaster",
116+
# RRBot controllers
117+
"rrbot_joint_state_broadcaster",
118+
"rrbot_position_controller",
119+
# External FTS broadcaster
120+
"rrbot_external_fts_broadcaster",
121+
],
122+
controller_params_files=[robot_controllers],
114123
)
115124

116-
# RRBot controllers
117-
rrbot_joint_state_broadcaster_spawner = Node(
118-
package="controller_manager",
119-
executable="spawner",
120-
arguments=["rrbot_joint_state_broadcaster"],
121-
)
122-
rrbot_position_controller_spawner = Node(
123-
package="controller_manager",
124-
executable="spawner",
125-
arguments=["rrbot_position_controller"],
126-
)
127-
# External FTS broadcaster
128-
rrbot_external_fts_broadcaster_spawner = Node(
129-
package="controller_manager",
130-
executable="spawner",
131-
arguments=["rrbot_external_fts_broadcaster"],
125+
# RRBot with sensors controllers, initially active
126+
rrbot_sensor_ctrl_spawner_active = generate_controllers_spawner_launch_description(
127+
["rrbot_with_sensor_joint_state_broadcaster", "rrbot_with_sensor_fts_broadcaster"],
128+
controller_params_files=[robot_controllers],
132129
)
133130

134-
# RRBot controllers
135-
rrbot_with_sensor_joint_state_broadcaster_spawner = Node(
136-
package="controller_manager",
137-
executable="spawner",
138-
arguments=["rrbot_with_sensor_joint_state_broadcaster"],
139-
)
140-
rrbot_with_sensor_position_controller_spawner = Node(
141-
package="controller_manager",
142-
executable="spawner",
143-
arguments=[
131+
# RRBot with sensors controllers, initially inactive
132+
rrbot_sensor_ctrl_spawner_inactive = generate_controllers_spawner_launch_description(
133+
[
144134
"rrbot_with_sensor_position_controller",
145-
"--inactive",
146135
],
147-
)
148-
rrbot_with_sensor_fts_broadcaster_spawner = Node(
149-
package="controller_manager",
150-
executable="spawner",
151-
arguments=["rrbot_with_sensor_fts_broadcaster"],
136+
controller_params_files=[robot_controllers],
137+
extra_spawner_args=["--inactive"],
152138
)
153139

154-
# ThreeDofBot controllers
155-
threedofbot_joint_state_broadcaster_spawner = Node(
156-
package="controller_manager",
157-
executable="spawner",
158-
arguments=[
140+
# ThreeDofBot controllers, initially inactive
141+
threedofbot_ctrl_spawner = generate_controllers_spawner_launch_description(
142+
[
159143
"threedofbot_joint_state_broadcaster",
160-
"-c",
161-
"/controller_manager",
162-
"--inactive",
144+
"threedofbot_position_controller",
145+
"threedofbot_pid_gain_controller",
163146
],
164-
)
165-
threedofbot_position_controller_spawner = Node(
166-
package="controller_manager",
167-
executable="spawner",
168-
arguments=["threedofbot_position_controller", "--inactive"],
169-
)
170-
threedofbot_pid_gain_controller_spawner = Node(
171-
package="controller_manager",
172-
executable="spawner",
173-
arguments=["threedofbot_pid_gain_controller", "--inactive"],
147+
controller_params_files=[robot_controllers],
148+
extra_spawner_args=["--inactive"],
174149
)
175150

176151
# Command publishers
@@ -197,16 +172,10 @@ def generate_launch_description():
197172
control_node,
198173
robot_state_pub_node,
199174
rviz_node,
200-
joint_state_broadcaster_spawner,
201-
rrbot_joint_state_broadcaster_spawner,
202-
rrbot_position_controller_spawner,
203-
rrbot_external_fts_broadcaster_spawner,
204-
rrbot_with_sensor_joint_state_broadcaster_spawner,
205-
rrbot_with_sensor_position_controller_spawner,
206-
rrbot_with_sensor_fts_broadcaster_spawner,
207-
threedofbot_joint_state_broadcaster_spawner,
208-
threedofbot_position_controller_spawner,
209-
threedofbot_pid_gain_controller_spawner,
175+
general_ctrl_spawner,
176+
rrbot_sensor_ctrl_spawner_active,
177+
rrbot_sensor_ctrl_spawner_inactive,
178+
threedofbot_ctrl_spawner,
210179
rrbot_position_command_publisher,
211180
rrbot_with_sensor_position_command_publisher,
212181
threedofbot_position_command_publisher,

example_13/package.xml

+6-1
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,13 @@
3131
<exec_depend>xacro</exec_depend>
3232

3333
<test_depend>ament_cmake_pytest</test_depend>
34-
<test_depend>launch_testing_ros</test_depend>
34+
<test_depend>ament_cmake_ros</test_depend>
35+
<test_depend>launch_ros</test_depend>
36+
<test_depend>launch_testing_ament_cmake</test_depend>
37+
<test_depend>launch_testing</test_depend>
38+
<test_depend>launch</test_depend>
3539
<test_depend>liburdfdom-tools</test_depend>
40+
<test_depend>rclpy</test_depend>
3641
<test_depend>ros2_control_demo_testing</test_depend>
3742
<test_depend>xacro</test_depend>
3843

example_13/test/test_three_robots_launch.py

+1-3
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
# Author: Christoph Froehlich
3030

3131
import os
32-
import pytest
3332
import unittest
3433
import subprocess
3534

@@ -48,8 +47,7 @@
4847
)
4948

5049

51-
# Executes the given launch file and checks if all nodes can be started
52-
@pytest.mark.rostest
50+
# Executes the given launch file
5351
def generate_test_description():
5452
launch_include = IncludeLaunchDescription(
5553
PythonLaunchDescriptionSource(

0 commit comments

Comments
 (0)