@@ -368,6 +368,21 @@ class RangeWrapper : public nav2_collision_monitor::Range
368368 {
369369 return data_ != nullptr ;
370370 }
371+
372+ void setData (sensor_msgs::msg::Range::ConstSharedPtr msg)
373+ {
374+ data_ = msg;
375+ }
376+
377+ void setObstaclesAngle (const double obstacles_angle)
378+ {
379+ obstacles_angle_ = obstacles_angle;
380+ }
381+
382+ void processData (sensor_msgs::msg::Range::ConstSharedPtr msg)
383+ {
384+ dataCallback (msg);
385+ }
371386}; // RangeWrapper
372387
373388class PolygonWrapper : public nav2_collision_monitor ::PolygonSource
@@ -886,6 +901,94 @@ TEST_F(Tester, testIgnoreTimeShift)
886901 checkPolygon (data);
887902}
888903
904+ TEST_F (Tester, testRangeGeneratedPointLimit)
905+ {
906+ rclcpp::Time curr_time = test_node_->now ();
907+
908+ createSources (false );
909+
910+ auto msg = std::make_shared<sensor_msgs::msg::Range>();
911+ msg->header .frame_id = BASE_FRAME_ID ;
912+ msg->header .stamp = curr_time;
913+ msg->radiation_type = sensor_msgs::msg::Range::ULTRASOUND ;
914+ msg->field_of_view = M_PI ;
915+ msg->min_range = 0.1 ;
916+ msg->max_range = 1.1 ;
917+ msg->range = 1.0 ;
918+
919+ range_->setData (msg);
920+ range_->setObstaclesAngle (M_PI / 1e5 );
921+
922+ std::vector<nav2_collision_monitor::Point> data;
923+ EXPECT_FALSE (range_->getData (curr_time, data));
924+ EXPECT_TRUE (data.empty ());
925+
926+ range_->setData (msg);
927+ range_->setObstaclesAngle (M_PI / 999.0 );
928+
929+ data.clear ();
930+ EXPECT_TRUE (range_->getData (curr_time, data));
931+ EXPECT_EQ (data.size (), 1000u );
932+ }
933+
934+ TEST_F (Tester, testRangeObstaclesAngleValidation)
935+ {
936+ const std::string valid_range_name = " ValidRange" ;
937+
938+ test_node_->declare_parameter (
939+ std::string (RANGE_NAME ) + " .topic" , rclcpp::ParameterValue (RANGE_TOPIC ));
940+ test_node_->declare_parameter (
941+ std::string (RANGE_NAME ) + " .obstacles_angle" , rclcpp::ParameterValue (0.0 ));
942+
943+ range_ = std::make_shared<RangeWrapper>(
944+ test_node_, RANGE_NAME , tf_buffer_,
945+ BASE_FRAME_ID , GLOBAL_FRAME_ID ,
946+ TRANSFORM_TOLERANCE , DATA_TIMEOUT , true );
947+
948+ EXPECT_THROW (range_->configure (), std::runtime_error);
949+
950+ test_node_->declare_parameter (
951+ valid_range_name + " .topic" , rclcpp::ParameterValue (RANGE_TOPIC ));
952+ test_node_->declare_parameter (
953+ valid_range_name + " .obstacles_angle" , rclcpp::ParameterValue (M_PI / 180.0 ));
954+ range_ = std::make_shared<RangeWrapper>(
955+ test_node_, valid_range_name, tf_buffer_,
956+ BASE_FRAME_ID , GLOBAL_FRAME_ID ,
957+ TRANSFORM_TOLERANCE , DATA_TIMEOUT , true );
958+
959+ EXPECT_NO_THROW (range_->configure ());
960+ }
961+
962+ TEST_F (Tester, testRangeMessageValidation)
963+ {
964+ createSources ();
965+
966+ auto msg = std::make_shared<sensor_msgs::msg::Range>();
967+ msg->header .frame_id = SOURCE_FRAME_ID ;
968+ msg->header .stamp = test_node_->now ();
969+ msg->radiation_type = sensor_msgs::msg::Range::ULTRASOUND ;
970+ msg->field_of_view = 0.0 ;
971+ msg->min_range = 0.1 ;
972+ msg->max_range = 1.1 ;
973+ msg->range = 1.0 ;
974+
975+ range_->processData (msg);
976+
977+ EXPECT_FALSE (range_->dataReceived ());
978+
979+ msg->header .frame_id = SOURCE_FRAME_ID ;
980+ msg->header .stamp = test_node_->now ();
981+ msg->radiation_type = sensor_msgs::msg::Range::ULTRASOUND ;
982+ msg->field_of_view = M_PI / 10 ;
983+ msg->min_range = 0.1 ;
984+ msg->max_range = 1.1 ;
985+ msg->range = 1.0 ;
986+
987+ range_->processData (msg);
988+
989+ EXPECT_TRUE (range_->dataReceived ());
990+ }
991+
889992TEST_F (Tester, testPointCloudMinRange)
890993{
891994 rclcpp::Time curr_time = test_node_->now ();
0 commit comments