@@ -131,6 +131,11 @@ class CollisionMonitorWrapper : public nav2_collision_monitor::CollisionMonitor
131131 }
132132 return false ;
133133 }
134+
135+ bool isEnabled () const
136+ {
137+ return enabled_;
138+ }
134139}; // CollisionMonitorWrapper
135140
136141class Tester : public ::testing::Test
@@ -180,6 +185,9 @@ class Tester : public ::testing::Test
180185 const std::chrono::nanoseconds & timeout);
181186 bool waitActionState (const std::chrono::nanoseconds & timeout);
182187 bool waitCollisionPointsMarker (const std::chrono::nanoseconds & timeout);
188+ bool waitToggle (
189+ rclcpp::Client<nav2_msgs::srv::Toggle>::SharedFuture result_future,
190+ const std::chrono::nanoseconds & timeout);
183191
184192protected:
185193 void cmdVelOutCallback (geometry_msgs::msg::Twist::SharedPtr msg);
@@ -215,6 +223,9 @@ class Tester : public ::testing::Test
215223
216224 // Service client for setting CollisionMonitor parameters
217225 rclcpp::Client<rcl_interfaces::srv::SetParameters>::SharedPtr parameters_client_;
226+
227+ // Service client for toggling collision monitor
228+ rclcpp::Client<nav2_msgs::srv::Toggle>::SharedPtr toggle_client_;
218229}; // Tester
219230
220231Tester::Tester ()
@@ -249,6 +260,8 @@ Tester::Tester()
249260 cm_->create_client <rcl_interfaces::srv::SetParameters>(
250261 std::string (
251262 cm_->get_name ()) + " /set_parameters" );
263+
264+ toggle_client_ = cm_->create_client <nav2_msgs::srv::Toggle>(" ~/toggle" );
252265}
253266
254267Tester::~Tester ()
@@ -745,6 +758,22 @@ bool Tester::waitFuture(
745758 return false ;
746759}
747760
761+ bool Tester::waitToggle (
762+ rclcpp::Client<nav2_msgs::srv::Toggle>::SharedFuture result_future,
763+ const std::chrono::nanoseconds & timeout)
764+ {
765+ rclcpp::Time start_time = cm_->now ();
766+ while (rclcpp::ok () && cm_->now () - start_time <= rclcpp::Duration (timeout)) {
767+ std::future_status status = result_future.wait_for (10ms);
768+ if (status == std::future_status::ready) {
769+ return true ;
770+ }
771+ rclcpp::spin_some (cm_->get_node_base_interface ());
772+ std::this_thread::sleep_for (10ms);
773+ }
774+ return false ;
775+ }
776+
748777bool Tester::waitActionState (const std::chrono::nanoseconds & timeout)
749778{
750779 rclcpp::Time start_time = cm_->now ();
@@ -786,6 +815,39 @@ void Tester::collisionPointsMarkerCallback(visualization_msgs::msg::MarkerArray:
786815 collision_points_marker_msg_ = msg;
787816}
788817
818+ TEST_F (Tester, testToggleService)
819+ {
820+ // Set parameters for collision monitor
821+ setCommonParameters ();
822+ addPolygon (" Stop" , POLYGON, 1.0 , " stop" );
823+ addSource (SCAN_NAME, SCAN);
824+ setVectors ({" Stop" }, {SCAN_NAME});
825+
826+ // Start collision monitor node
827+ cm_->start ();
828+
829+ auto request = std::make_shared<nav2_msgs::srv::Toggle::Request>();
830+
831+ // Disable test
832+ request->enable = false ;
833+ {
834+ auto result_future = toggle_client_->async_send_request (request);
835+ ASSERT_TRUE (waitToggle (result_future.share (), 2s));
836+ }
837+ ASSERT_FALSE (cm_->isEnabled ());
838+
839+ // Enable test
840+ request->enable = true ;
841+ {
842+ auto result_future = toggle_client_->async_send_request (request);
843+ ASSERT_TRUE (waitToggle (result_future.share (), 2s));
844+ }
845+ ASSERT_TRUE (cm_->isEnabled ());
846+
847+ // Stop the collision monitor
848+ cm_->stop ();
849+ }
850+
789851TEST_F (Tester, testProcessStopSlowdownLimit)
790852{
791853 rclcpp::Time curr_time = cm_->now ();
0 commit comments