@@ -142,10 +142,12 @@ TEST_F(PidControllerTest, activate_success)
142142 EXPECT_TRUE (std::isnan (cmd));
143143 }
144144
145+ // With set_current_state_as_first_setpoint=true (default), reference interfaces are initialized
146+ // to the current state values on activation
145147 EXPECT_EQ (controller_->reference_interfaces_ .size (), dof_state_values_.size ());
146- for (const auto & interface : controller_->reference_interfaces_ )
148+ for (size_t i = 0 ; i < controller_->reference_interfaces_ . size (); ++i )
147149 {
148- EXPECT_TRUE ( std::isnan (interface) );
150+ EXPECT_EQ (controller_-> reference_interfaces_ [i], dof_state_values_[i] );
149151 }
150152}
151153
@@ -175,16 +177,18 @@ TEST_F(PidControllerTest, reactivate_success)
175177 SetUpController ();
176178
177179 ASSERT_EQ (controller_->on_configure (rclcpp_lifecycle::State ()), NODE_SUCCESS);
180+ // With set_current_state_as_first_setpoint=true (default), reference interfaces are set to
181+ // current state values (dof_state_values_[0] = 1.1) on each activation
178182 ASSERT_EQ (controller_->on_activate (rclcpp_lifecycle::State ()), NODE_SUCCESS);
179- ASSERT_TRUE ( std::isnan ( controller_->reference_interfaces_ [0 ]) );
183+ ASSERT_EQ ( controller_->reference_interfaces_ [0 ], dof_state_values_[ 0 ] );
180184 ASSERT_TRUE (std::isnan (controller_->measured_state_values_ [0 ]));
181185 ASSERT_EQ (controller_->command_interfaces_ [0 ].get_optional ().value (), 101.101 );
182186 ASSERT_EQ (controller_->on_deactivate (rclcpp_lifecycle::State ()), NODE_SUCCESS);
183- ASSERT_TRUE ( std::isnan ( controller_->reference_interfaces_ [0 ]) );
187+ ASSERT_EQ ( controller_->reference_interfaces_ [0 ], dof_state_values_[ 0 ] );
184188 ASSERT_TRUE (std::isnan (controller_->measured_state_values_ [0 ]));
185189 ASSERT_EQ (controller_->command_interfaces_ [0 ].get_optional ().value (), 101.101 );
186190 ASSERT_EQ (controller_->on_activate (rclcpp_lifecycle::State ()), NODE_SUCCESS);
187- ASSERT_TRUE ( std::isnan ( controller_->reference_interfaces_ [0 ]) );
191+ ASSERT_EQ ( controller_->reference_interfaces_ [0 ], dof_state_values_[ 0 ] );
188192 ASSERT_TRUE (std::isnan (controller_->measured_state_values_ [0 ]));
189193 ASSERT_EQ (controller_->command_interfaces_ [0 ].get_optional ().value (), 101.101 );
190194
@@ -211,7 +215,7 @@ TEST_F(PidControllerTest, test_update_logic_zero_feedforward_gain)
211215 EXPECT_TRUE (std::isnan (controller_->input_ref_ .get ().values [0 ]));
212216 for (const auto & interface : controller_->reference_interfaces_ )
213217 {
214- EXPECT_TRUE (std::isnan (interface));
218+ EXPECT_TRUE (std::isfinite (interface));
215219 }
216220
217221 controller_->set_reference (dof_command_values_);
@@ -220,7 +224,7 @@ TEST_F(PidControllerTest, test_update_logic_zero_feedforward_gain)
220224 {
221225 EXPECT_FALSE (std::isnan (controller_->input_ref_ .get ().values [i]));
222226 EXPECT_EQ (controller_->input_ref_ .get ().values [i], dof_command_values_[i]);
223- EXPECT_TRUE (std::isnan (controller_->reference_interfaces_ [i]));
227+ EXPECT_TRUE (std::isfinite (controller_->reference_interfaces_ [i]));
224228 }
225229
226230 ASSERT_EQ (
@@ -389,7 +393,7 @@ TEST_F(PidControllerTest, subscribe_and_get_messages_success)
389393 for (size_t i = 0 ; i < dof_names_.size (); ++i)
390394 {
391395 ASSERT_EQ (msg.dof_states [i].name , dof_names_[i]);
392- EXPECT_TRUE (std::isnan (msg.dof_states [i].reference ));
396+ EXPECT_TRUE (std::isfinite (msg.dof_states [i].reference ));
393397 ASSERT_EQ (msg.dof_states [i].output , dof_command_values_[i]);
394398 }
395399}
@@ -414,21 +418,21 @@ TEST_F(PidControllerTest, receive_message_and_publish_updated_status)
414418 for (size_t i = 0 ; i < dof_names_.size (); ++i)
415419 {
416420 ASSERT_EQ (msg.dof_states [i].name , dof_names_[i]);
417- EXPECT_TRUE (std::isnan (msg.dof_states [i].reference ));
421+ EXPECT_TRUE (std::isfinite (msg.dof_states [i].reference ));
418422 ASSERT_EQ (msg.dof_states [i].output , dof_command_values_[i]);
419423 }
420424
421425 for (size_t i = 0 ; i < controller_->reference_interfaces_ .size (); ++i)
422426 {
423- EXPECT_TRUE (std::isnan (controller_->reference_interfaces_ [i]));
427+ EXPECT_TRUE (std::isfinite (controller_->reference_interfaces_ [i]));
424428 }
425429
426430 publish_commands ();
427431 controller_->wait_for_commands (executor);
428432
429433 for (size_t i = 0 ; i < controller_->reference_interfaces_ .size (); ++i)
430434 {
431- EXPECT_TRUE (std::isnan (controller_->reference_interfaces_ [i]));
435+ EXPECT_TRUE (std::isfinite (controller_->reference_interfaces_ [i]));
432436 }
433437
434438 ASSERT_EQ (
@@ -690,6 +694,49 @@ TEST_F(PidControllerTest, test_save_i_term_on)
690694 EXPECT_NEAR (actual_value, 2.00002 , 1e-5 ); // i_term from above
691695}
692696
697+ /* *
698+ * @brief Test that reference interfaces are initialized to current state on activation when
699+ * set_current_state_as_first_setpoint is true (default).
700+ */
701+ TEST_F (PidControllerTest, test_activate_set_current_state_as_first_setpoint_true)
702+ {
703+ SetUpController (); // uses test_pid_controller: set_current_state_as_first_setpoint defaults to
704+ // true
705+
706+ ASSERT_EQ (controller_->on_configure (rclcpp_lifecycle::State ()), NODE_SUCCESS);
707+ ASSERT_TRUE (controller_->params_ .set_current_state_as_first_setpoint );
708+
709+ ASSERT_EQ (controller_->on_activate (rclcpp_lifecycle::State ()), NODE_SUCCESS);
710+
711+ // reference interfaces must be initialized to the current state values (dof_state_values_)
712+ ASSERT_EQ (controller_->reference_interfaces_ .size (), dof_state_values_.size ());
713+ for (size_t i = 0 ; i < controller_->reference_interfaces_ .size (); ++i)
714+ {
715+ EXPECT_EQ (controller_->reference_interfaces_ [i], dof_state_values_[i]);
716+ }
717+ }
718+
719+ /* *
720+ * @brief Test that reference interfaces remain NaN on activation when
721+ * set_current_state_as_first_setpoint is false.
722+ */
723+ TEST_F (PidControllerTest, test_activate_set_current_state_as_first_setpoint_false)
724+ {
725+ SetUpController (" test_pid_controller_no_first_setpoint" );
726+
727+ ASSERT_EQ (controller_->on_configure (rclcpp_lifecycle::State ()), NODE_SUCCESS);
728+ ASSERT_FALSE (controller_->params_ .set_current_state_as_first_setpoint );
729+
730+ ASSERT_EQ (controller_->on_activate (rclcpp_lifecycle::State ()), NODE_SUCCESS);
731+
732+ // reference interfaces must remain NaN since set_current_state_as_first_setpoint is false
733+ ASSERT_EQ (controller_->reference_interfaces_ .size (), dof_state_values_.size ());
734+ for (const auto & interface : controller_->reference_interfaces_ )
735+ {
736+ EXPECT_TRUE (std::isnan (interface));
737+ }
738+ }
739+
693740int main (int argc, char ** argv)
694741{
695742 ::testing::InitGoogleTest (&argc, argv);
0 commit comments