Formula Student Autonomous Systems
The code for the main driverless system
Loading...
Searching...
No Matches
ransac_test.cpp
Go to the documentation of this file.
2
3#include <gtest/gtest.h>
4
5#include <memory>
7#include <utils/plane.hpp>
8
13class RANSACTest : public ::testing::Test {
14protected:
15 void SetUp() override {
16 cloud_pts = {{1.0, 0.0, 0.0, 0.5, 0},
17 {0.0, 1.0, 0.0, 1.0, 0},
18 {0.0, 0.0, 1.0, 1.5, 0},
19 {0.0060, 0.0060, 0.0060, 2.0, 0},
20 {10, 10, 10, 2.5, 0}};
21 empty_cloud_pts = {};
22 cloud_3_pts = {{1.0, 0.0, 0.0, 0.5, 0}, {0.0, 1.0, 0.0, 1.0, 0}, {0.0, 0.0, 1.0, 1.5, 0}};
23 }
24
25 std::vector<std::array<float, 5>> cloud_pts;
26 std::vector<std::array<float, 5>> empty_cloud_pts;
27 std::vector<std::array<float, 5>> cloud_3_pts;
28
29 GroundGrid default_grid{30.0, 0.1, 0.5, 10.0, 0.1, 3.14};
30};
31
36TEST_F(RANSACTest, TestBigEpsilon) {
37 const RANSAC ground_removal(10'000, 1);
38 auto cloud_ptr = test_utils::make_lidar_pointcloud2(cloud_pts);
39 auto ground_removed_cloud_ptr = test_utils::make_lidar_pointcloud2({});
40 ground_removal.ground_removal(cloud_ptr, ground_removed_cloud_ptr, default_grid);
41 ASSERT_EQ(ground_removed_cloud_ptr->width, 0);
42}
43
48TEST_F(RANSACTest, TestCommonScenario) {
49 const RANSAC ground_removal(0.05, 100);
50 auto cloud_ptr = test_utils::make_lidar_pointcloud2(cloud_pts);
51 auto ground_removed_cloud_ptr = test_utils::make_lidar_pointcloud2({});
52 ground_removal.ground_removal(cloud_ptr, ground_removed_cloud_ptr, default_grid);
53 ASSERT_EQ(ground_removed_cloud_ptr->width, 2);
54}
55
60TEST_F(RANSACTest, TestCommonScenario2) {
61 const RANSAC ground_removal(0.5, 100);
62 auto cloud_ptr = test_utils::make_lidar_pointcloud2(cloud_pts);
63 auto ground_removed_cloud_ptr = test_utils::make_lidar_pointcloud2({});
64 ground_removal.ground_removal(cloud_ptr, ground_removed_cloud_ptr, default_grid);
65 ASSERT_EQ(ground_removed_cloud_ptr->width, 1);
66}
67
72TEST_F(RANSACTest, TestThresholdZero) {
73 const RANSAC ground_removal(0, 10);
74 auto cloud_ptr = test_utils::make_lidar_pointcloud2(cloud_pts);
75 auto ground_removed_cloud_ptr = test_utils::make_lidar_pointcloud2({});
76 ground_removal.ground_removal(cloud_ptr, ground_removed_cloud_ptr, default_grid);
77 ASSERT_EQ(ground_removed_cloud_ptr->width, 5);
78}
79
84TEST_F(RANSACTest, TestZeroRepetitions) {
85 const RANSAC ground_removal(100, 0);
86 auto cloud_ptr = test_utils::make_lidar_pointcloud2(cloud_pts);
87 auto ground_removed_cloud_ptr = test_utils::make_lidar_pointcloud2({});
88 ground_removal.ground_removal(cloud_ptr, ground_removed_cloud_ptr, default_grid);
89 ASSERT_EQ(ground_removed_cloud_ptr->width, 0);
90}
91
97TEST_F(RANSACTest, TestSmallEpsilon) {
98 const RANSAC ground_removal(0.000'000'000'000'000'01, 40);
99 auto cloud_ptr = test_utils::make_lidar_pointcloud2(cloud_pts);
100 auto ground_removed_cloud_ptr = test_utils::make_lidar_pointcloud2({});
101 ground_removal.ground_removal(cloud_ptr, ground_removed_cloud_ptr, default_grid);
102 ASSERT_EQ(ground_removed_cloud_ptr->width, 2);
103}
104
109TEST_F(RANSACTest, TestBigEpsilon2) {
110 const RANSAC ground_removal(1'000'000, 1);
111 auto cloud_ptr = test_utils::make_lidar_pointcloud2(cloud_pts);
112 auto ground_removed_cloud_ptr = test_utils::make_lidar_pointcloud2({});
113 ground_removal.ground_removal(cloud_ptr, ground_removed_cloud_ptr, default_grid);
114 ASSERT_EQ(ground_removed_cloud_ptr->width, 0);
115}
116
122TEST_F(RANSACTest, TestCommonScenario3Points) {
123 const RANSAC ground_removal(100, 100);
124 auto cloud3_ptr = test_utils::make_lidar_pointcloud2(cloud_3_pts);
125 auto ground_removed_cloud_ptr = test_utils::make_lidar_pointcloud2({});
126 ground_removal.ground_removal(cloud3_ptr, ground_removed_cloud_ptr, default_grid);
127 ASSERT_EQ(ground_removed_cloud_ptr->width, 0);
128}
129
135TEST_F(RANSACTest, Test3PointsThresholdZero) {
136 const RANSAC ground_removal(0, 100);
137 auto cloud3_ptr = test_utils::make_lidar_pointcloud2(cloud_3_pts);
138 auto ground_removed_cloud_ptr = test_utils::make_lidar_pointcloud2({});
139 ground_removal.ground_removal(cloud3_ptr, ground_removed_cloud_ptr, default_grid);
140 ASSERT_EQ(ground_removed_cloud_ptr->width, 3);
141}
142
147TEST_F(RANSACTest, TestEmptyPointCloud) {
148 const RANSAC ground_removal(100, 100);
149 auto empty_ptr = test_utils::make_lidar_pointcloud2(empty_cloud_pts);
150 auto ground_removed_cloud_ptr = test_utils::make_lidar_pointcloud2({});
151 ground_removal.ground_removal(empty_ptr, ground_removed_cloud_ptr, default_grid);
152 ASSERT_EQ(ground_removed_cloud_ptr->width, 0);
153}
154
160TEST_F(RANSACTest, TestEmptyPointCloud2) {
161 const RANSAC ground_removal(0, 0);
162 auto empty_ptr = test_utils::make_lidar_pointcloud2(empty_cloud_pts);
163 auto ground_removed_cloud_ptr = test_utils::make_lidar_pointcloud2({});
164 ground_removal.ground_removal(empty_ptr, ground_removed_cloud_ptr, default_grid);
165 ASSERT_EQ(ground_removed_cloud_ptr->width, 0);
166}
Class to represent a ground height grid for ground proximity checks.
Ground removal using the RANSAC algorithm.
Definition ransac.hpp:12
void ground_removal(const sensor_msgs::msg::PointCloud2::SharedPtr &trimmed_point_cloud, sensor_msgs::msg::PointCloud2::SharedPtr &ground_removed_point_cloud, GroundGrid &ground_grid) const override
Perform ground removal using the RANSAC algorithm.
Definition ransac.cpp:8
Test class for setting up data and testing RANSAC algorithm.
void SetUp() override
std::vector< std::array< float, 5 > > cloud_pts
GroundGrid default_grid
std::vector< std::array< float, 5 > > empty_cloud_pts
std::vector< std::array< float, 5 > > cloud_3_pts
sensor_msgs::msg::PointCloud2::SharedPtr make_lidar_pointcloud2(const std::vector< std::array< float, 5 > > &pts)
TEST_F(RANSACTest, TestBigEpsilon)
Test Scenario: All points fit in the model.