@@ -521,6 +521,71 @@ TEST_F(PidControllerTest, receive_message_and_publish_updated_status)
521
521
}
522
522
}
523
523
524
+ /* *
525
+ * @brief check chained pid controller with feedforward and gain as non-zero, single interface
526
+ */
527
+ TEST_F (PidControllerTest, test_update_chained_feedforward_with_gain)
528
+ {
529
+ // state interface value is 1.1 as defined in test fixture
530
+ // with p gain 0.5, the command value should be 0.5 * (5.0 - 1.1) = 1.95
531
+ // with feedforward gain 1.0, the command value should be 1.95 + 1.0 * 5.0 = 6.95
532
+ auto target_value = 5.0 ;
533
+ auto exepected_command_value = 6.95 ;
534
+
535
+ SetUpController (" test_pid_controller_with_feedforward_gain" );
536
+ ASSERT_EQ (controller_->on_configure (rclcpp_lifecycle::State ()), NODE_SUCCESS);
537
+
538
+ // check on interfaces & pid gain parameters
539
+ for (const auto & dof_name : dof_names_)
540
+ {
541
+ ASSERT_EQ (controller_->params_ .gains .dof_names_map [dof_name].p , 0.5 );
542
+ ASSERT_EQ (controller_->params_ .gains .dof_names_map [dof_name].feedforward_gain , 1.0 );
543
+ }
544
+ ASSERT_EQ (controller_->params_ .command_interface , command_interface_);
545
+ EXPECT_THAT (
546
+ controller_->params_ .reference_and_state_interfaces ,
547
+ testing::ElementsAreArray (state_interfaces_));
548
+ ASSERT_FALSE (controller_->params_ .use_external_measured_states );
549
+
550
+ // setup executor
551
+ rclcpp::executors::MultiThreadedExecutor executor;
552
+ executor.add_node (controller_->get_node ()->get_node_base_interface ());
553
+ executor.add_node (service_caller_node_->get_node_base_interface ());
554
+
555
+ controller_->set_chained_mode (true );
556
+
557
+ // activate controller
558
+ ASSERT_EQ (controller_->on_activate (rclcpp_lifecycle::State ()), NODE_SUCCESS);
559
+ ASSERT_TRUE (controller_->is_in_chained_mode ());
560
+
561
+ // turn on feedforward
562
+ controller_->control_mode_ .writeFromNonRT (feedforward_mode_type::ON);
563
+ ASSERT_EQ (*(controller_->control_mode_ .readFromRT ()), feedforward_mode_type::ON);
564
+
565
+ // send a message to update reference interface
566
+ std::shared_ptr<ControllerCommandMsg> msg = std::make_shared<ControllerCommandMsg>();
567
+ msg->dof_names = controller_->params_ .dof_names ;
568
+ msg->values .resize (msg->dof_names .size (), 0.0 );
569
+ for (size_t i = 0 ; i < msg->dof_names .size (); ++i)
570
+ {
571
+ msg->values [i] = target_value;
572
+ }
573
+ msg->values_dot .resize (msg->dof_names .size (), std::numeric_limits<double >::quiet_NaN ());
574
+ controller_->input_ref_ .writeFromNonRT (msg);
575
+ ASSERT_EQ (
576
+ controller_->update_reference_from_subscribers (
577
+ rclcpp::Time (0 ), rclcpp::Duration::from_seconds (0.01 )),
578
+ controller_interface::return_type::OK);
579
+
580
+ // run update
581
+ ASSERT_EQ (
582
+ controller_->update (rclcpp::Time (0 ), rclcpp::Duration::from_seconds (0.01 )),
583
+ controller_interface::return_type::OK);
584
+
585
+ // check on result from update
586
+ ASSERT_EQ (controller_->command_interfaces_ [0 ].get_value (), exepected_command_value);
587
+ }
588
+
524
589
int main (int argc, char ** argv)
525
590
{
526
591
::testing::InitGoogleTest (&argc, argv);
0 commit comments