@@ -37,7 +37,14 @@ class TestableControllerManager : public controller_manager::ControllerManager
37
37
FRIEND_TEST (TestControllerManagerWithTestableCM, load_urdf_called_after_callback);
38
38
FRIEND_TEST (TestControllerManagerWithTestableCM, load_urdf_called_after_invalid_urdf_passed);
39
39
FRIEND_TEST (
40
- TestControllerManagerWithTestableCM, when_starting_controller_without_hw_expect_error);
40
+ TestControllerManagerWithTestableCM,
41
+ when_starting_broadcaster_expect_error_before_rm_is_initialized_with_robot_description);
42
+ FRIEND_TEST (
43
+ TestControllerManagerWithTestableCM,
44
+ when_starting_controller_expect_error_before_rm_is_initialized_with_robot_description);
45
+ FRIEND_TEST (
46
+ TestControllerManagerWithTestableCM,
47
+ when_starting_controller_expect_error_before_rm_is_initialized_after_some_time);
41
48
42
49
public:
43
50
TestableControllerManager (
@@ -58,6 +65,45 @@ class TestControllerManagerWithTestableCM
58
65
public:
59
66
// create cm with no urdf
60
67
TestControllerManagerWithTestableCM () : ControllerManagerFixture<TestableControllerManager>(" " ) {}
68
+
69
+ void prepare_controller ()
70
+ {
71
+ ASSERT_FALSE (cm_->resource_manager_ ->is_urdf_already_loaded ());
72
+ test_controller_ = std::make_shared<test_controller::TestController>();
73
+ cm_->add_controller (test_controller_, CONTROLLER_NAME, TEST_CONTROLLER_CLASS_NAME);
74
+ ASSERT_NE (test_controller_, nullptr );
75
+ ASSERT_EQ (
76
+ lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED, test_controller_->get_state ().id ());
77
+ }
78
+
79
+ void configure_and_try_switch_that_returns_error ()
80
+ {
81
+ // configure controller
82
+ cm_->configure_controller (CONTROLLER_NAME);
83
+ EXPECT_EQ (
84
+ lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE, test_controller_->get_state ().id ());
85
+
86
+ // Set ControllerManager into Debug-Mode output to have detailed output on updating controllers
87
+ cm_->get_logger ().set_level (rclcpp::Logger::Level::Debug);
88
+
89
+ switch_test_controllers (
90
+ strvec{CONTROLLER_NAME}, strvec{}, STRICT, std::future_status::ready,
91
+ controller_interface::return_type::ERROR);
92
+
93
+ EXPECT_EQ (
94
+ lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE, test_controller_->get_state ().id ());
95
+ }
96
+
97
+ void try_successful_switch ()
98
+ {
99
+ switch_test_controllers (
100
+ strvec{CONTROLLER_NAME}, strvec{}, STRICT, std::future_status::timeout,
101
+ controller_interface::return_type::OK);
102
+
103
+ EXPECT_EQ (lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE, test_controller_->get_state ().id ());
104
+ }
105
+
106
+ std::shared_ptr<test_controller::TestController> test_controller_;
61
107
};
62
108
63
109
TEST_P (TestControllerManagerWithTestableCM, initial_no_load_urdf_called)
@@ -80,30 +126,92 @@ TEST_P(TestControllerManagerWithTestableCM, load_urdf_called_after_invalid_urdf_
80
126
ASSERT_TRUE (cm_->resource_manager_ ->is_urdf_already_loaded ());
81
127
}
82
128
83
- TEST_P (TestControllerManagerWithTestableCM, when_starting_controller_without_hw_expect_error)
129
+ TEST_P (
130
+ TestControllerManagerWithTestableCM,
131
+ when_starting_broadcaster_expect_error_before_rm_is_initialized_with_robot_description)
84
132
{
85
- ASSERT_FALSE (cm_->resource_manager_ ->is_urdf_already_loaded ());
86
- auto controller_if = cm_->load_controller (CONTROLLER_NAME, TEST_CONTROLLER_CLASS_NAME);
87
- ASSERT_NE (controller_if, nullptr );
88
- ASSERT_EQ (
89
- lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED, controller_if->get_state ().id ());
90
- cm_->configure_controller (CONTROLLER_NAME);
91
- EXPECT_EQ (lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE, controller_if->get_state ().id ());
92
-
93
- // Set ControllerManager into Debug-Mode output to have detailed output on updating controllers
94
- cm_->get_logger ().set_level (rclcpp::Logger::Level::Debug);
95
-
96
- switch_test_controllers (
97
- strvec{CONTROLLER_NAME}, strvec{}, STRICT, std::future_status::timeout,
98
- controller_interface::return_type::ERROR);
99
-
100
- EXPECT_EQ (lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE, controller_if->get_state ().id ());
101
-
102
- // mimic callback
103
- // auto msg = std_msgs::msg::String();
104
- // msg.data = ros2_control_test_assets::minimal_robot_missing_command_keys_urdf;
105
- // cm_->robot_description_callback(msg);
106
- // ASSERT_TRUE(cm_->resource_manager_->is_urdf_already_loaded());
133
+ prepare_controller ();
134
+
135
+ // setup state interfaces to claim from controllers
136
+ controller_interface::InterfaceConfiguration state_itfs_cfg;
137
+ state_itfs_cfg.type = controller_interface::interface_configuration_type::INDIVIDUAL;
138
+ for (const auto & interface : ros2_control_test_assets::TEST_ACTUATOR_HARDWARE_STATE_INTERFACES)
139
+ {
140
+ state_itfs_cfg.names .push_back (interface);
141
+ }
142
+ for (const auto & interface : ros2_control_test_assets::TEST_SENSOR_HARDWARE_STATE_INTERFACES)
143
+ {
144
+ state_itfs_cfg.names .push_back (interface);
145
+ }
146
+ test_controller_->set_state_interface_configuration (state_itfs_cfg);
147
+
148
+ configure_and_try_switch_that_returns_error ();
149
+
150
+ pass_robot_description_to_cm_and_rm ();
151
+ ASSERT_TRUE (cm_->resource_manager_ ->is_urdf_already_loaded ());
152
+
153
+ try_successful_switch ();
154
+ }
155
+
156
+ TEST_P (
157
+ TestControllerManagerWithTestableCM,
158
+ when_starting_controller_expect_error_before_rm_is_initialized_with_robot_description)
159
+ {
160
+ prepare_controller ();
161
+
162
+ // setup command interfaces to claim from controllers
163
+ controller_interface::InterfaceConfiguration cmd_itfs_cfg;
164
+ cmd_itfs_cfg.type = controller_interface::interface_configuration_type::INDIVIDUAL;
165
+ for (const auto & interface : ros2_control_test_assets::TEST_ACTUATOR_HARDWARE_COMMAND_INTERFACES)
166
+ {
167
+ cmd_itfs_cfg.names .push_back (interface);
168
+ }
169
+ test_controller_->set_command_interface_configuration (cmd_itfs_cfg);
170
+
171
+ configure_and_try_switch_that_returns_error ();
172
+
173
+ pass_robot_description_to_cm_and_rm ();
174
+ ASSERT_TRUE (cm_->resource_manager_ ->is_urdf_already_loaded ());
175
+
176
+ try_successful_switch ();
177
+ }
178
+
179
+ TEST_P (
180
+ TestControllerManagerWithTestableCM,
181
+ when_starting_controller_expect_error_before_rm_is_initialized_after_some_time)
182
+ {
183
+ prepare_controller ();
184
+
185
+ // setup state interfaces to claim from controllers
186
+ controller_interface::InterfaceConfiguration state_itfs_cfg;
187
+ state_itfs_cfg.type = controller_interface::interface_configuration_type::INDIVIDUAL;
188
+ for (const auto & interface : ros2_control_test_assets::TEST_ACTUATOR_HARDWARE_STATE_INTERFACES)
189
+ {
190
+ state_itfs_cfg.names .push_back (interface);
191
+ }
192
+ for (const auto & interface : ros2_control_test_assets::TEST_SENSOR_HARDWARE_STATE_INTERFACES)
193
+ {
194
+ state_itfs_cfg.names .push_back (interface);
195
+ }
196
+ test_controller_->set_state_interface_configuration (state_itfs_cfg);
197
+
198
+ // setup command interfaces to claim from controllers
199
+ controller_interface::InterfaceConfiguration cmd_itfs_cfg;
200
+ cmd_itfs_cfg.type = controller_interface::interface_configuration_type::INDIVIDUAL;
201
+ for (const auto & interface : ros2_control_test_assets::TEST_ACTUATOR_HARDWARE_COMMAND_INTERFACES)
202
+ {
203
+ cmd_itfs_cfg.names .push_back (interface);
204
+ }
205
+ test_controller_->set_command_interface_configuration (cmd_itfs_cfg);
206
+
207
+ configure_and_try_switch_that_returns_error ();
208
+
209
+ std::this_thread::sleep_for (std::chrono::milliseconds (3000 ));
210
+
211
+ pass_robot_description_to_cm_and_rm ();
212
+ ASSERT_TRUE (cm_->resource_manager_ ->is_urdf_already_loaded ());
213
+
214
+ try_successful_switch ();
107
215
}
108
216
109
217
INSTANTIATE_TEST_SUITE_P (
0 commit comments