@@ -388,7 +388,7 @@ TEST_F(SteeringControllersLibraryTest, test_velocity_feedback_ref_timeout)
388388
389389TEST_F (SteeringControllersLibraryTest, test_open_loop_update_ignore_nan_vals)
390390{
391- // 1. Setup Options
391+ // Setup Options
392392 auto node_options = controller_->define_custom_node_options ();
393393 node_options.append_parameter_override (" open_loop" , true );
394394 node_options.append_parameter_override (
@@ -397,61 +397,80 @@ TEST_F(SteeringControllersLibraryTest, test_open_loop_update_ignore_nan_vals)
397397 " steering_joints_names" , std::vector<std::string>{" steer_left" , " steer_right" });
398398 SetUpController (" test_steering_controllers_library" , node_options);
399399
400- // 2. Lifecycle
401400 ASSERT_EQ (controller_->on_configure (rclcpp_lifecycle::State ()), NODE_SUCCESS);
402401 controller_->set_chained_mode (false );
403402 ASSERT_EQ (controller_->on_activate (rclcpp_lifecycle::State ()), NODE_SUCCESS);
404403
405- // 3. The Publicist Hack (Unlock Input AND Output)
406404 struct Publicist : public TestableSteeringControllersLibrary
407405 {
408- // Unlock input buffer
409406 using steering_controllers_library::SteeringControllersLibrary::input_ref_;
410- // Unlock the wheels (Output)
411407 using controller_interface::ControllerInterfaceBase::command_interfaces_;
412408 };
413409 auto * pub_controller = static_cast <Publicist *>(controller_.get ());
414410
415- // 4. Send Valid Command (1.5 m/s)
416411 auto command_msg = ControllerReferenceMsg ();
417412 command_msg.header .stamp = controller_->get_node ()->now ();
418413 command_msg.twist .linear .x = 1.5 ;
419414 command_msg.twist .angular .z = 0.0 ;
420415
421416 pub_controller->input_ref_ .set (command_msg);
422417
423- // 5. Force Update
424418 controller_->update_reference_from_subscribers (
425419 controller_->get_node ()->now (), rclcpp::Duration::from_seconds (0.01 ));
426420 controller_->update_and_write_commands (
427421 controller_->get_node ()->now (), rclcpp::Duration::from_seconds (0.01 ));
428422
429- // 6. CHECK THE WHEELS
430- // FIX: Use .get_optional().value() (This is how ROS 2 reads values back)
431423 double wheel_speed_1 = pub_controller->command_interfaces_ [0 ].get_optional ().value ();
432424
433- // It should be moving
434425 ASSERT_GT (wheel_speed_1, 0.1 );
435426
436- // 7. Send NaN Command
437427 auto nan_msg = ControllerReferenceMsg ();
438428 nan_msg.header .stamp = controller_->get_node ()->now ();
439429 nan_msg.twist .linear .x = std::numeric_limits<double >::quiet_NaN ();
440430 nan_msg.twist .angular .z = std::numeric_limits<double >::quiet_NaN ();
441431
442432 pub_controller->input_ref_ .set (nan_msg);
443433
444- // 8. Force Update Again
445434 controller_->update_reference_from_subscribers (
446435 controller_->get_node ()->now (), rclcpp::Duration::from_seconds (0.01 ));
447436 controller_->update_and_write_commands (
448437 controller_->get_node ()->now (), rclcpp::Duration::from_seconds (0.01 ));
449438
450- // 9. THE PROOF
451439 // The wheel speed should stay exactly the same
452440 EXPECT_DOUBLE_EQ (pub_controller->command_interfaces_ [0 ].get_optional ().value (), 0.0 );
453441}
454442
443+ TEST_F (SteeringControllersLibraryTest, test_open_loop_update_timeout)
444+ {
445+ // 1. SETUP WITH OPTIONS
446+ auto node_options = controller_->define_custom_node_options ();
447+ node_options.append_parameter_override (" open_loop" , true );
448+ node_options.append_parameter_override (" reference_timeout" , 1.0 );
449+
450+ SetUpController (" test_steering_controllers_library" , node_options);
451+
452+ ASSERT_EQ (controller_->on_configure (rclcpp_lifecycle::State ()), NODE_SUCCESS);
453+ controller_->set_chained_mode (false ); // We are testing standalone mode
454+ ASSERT_EQ (controller_->on_activate (rclcpp_lifecycle::State ()), NODE_SUCCESS);
455+
456+ ControllerReferenceMsg msg;
457+ msg.header .stamp = controller_->get_node ()->now ();
458+ msg.twist .linear .x = 5.0 ;
459+ msg.twist .angular .z = 0.0 ;
460+ controller_->input_ref_ .set (msg);
461+
462+
463+ controller_->update (controller_->get_node ()->now (), rclcpp::Duration::from_seconds (0.1 ));
464+
465+ EXPECT_DOUBLE_EQ (controller_->last_linear_velocity_ , 5.0 );
466+
467+ rclcpp::Time future_time = controller_->get_node ()->now () + rclcpp::Duration::from_seconds (2.0 );
468+
469+ controller_->update (future_time, rclcpp::Duration::from_seconds (0.1 ));
470+
471+ EXPECT_DOUBLE_EQ (controller_->last_linear_velocity_ , 0.0 );
472+ }
473+
455474int main (int argc, char ** argv)
456475{
457476 ::testing::InitGoogleTest (&argc, argv);
0 commit comments