Formula Student Autonomous Systems
The code for the main driverless system
Loading...
Searching...
No Matches
transformations_test.cpp
Go to the documentation of this file.
2
3#include <gtest/gtest.h>
4
5#include <random>
6
7// Function to generate a random integer in the interval [a, b[
8int generate_random_integer(const int a, const int b) {
9 std::random_device rd;
10 std::default_random_engine eng(rd());
11 std::uniform_int_distribution distr(a, b - 1);
12 return distr(eng);
13}
14
15// Function to generate a random double in the interval [a, b[
16double generate_random_double(const double a, const double b) {
17 std::random_device rd;
18 std::default_random_engine eng(rd());
19 std::uniform_real_distribution distr(a, b);
20 return distr(eng);
21}
22
28TEST(TransformGlobalToLocal, TestCase1) {
29 const Eigen::Vector3d reference_frame(0, 0, 0);
30 const Eigen::VectorXd global_landmarks = Eigen::VectorXd::Zero(0);
31 const Eigen::VectorXd transformed_landmarks =
32 common_lib::maths::global_to_local_coordinates(reference_frame, global_landmarks);
33 EXPECT_EQ(transformed_landmarks.size(), 0);
34}
35
41TEST(TransformGlobalToLocal, TestCase2) {
42 const Eigen::Vector3d reference_frame(12, -2, 1.5);
43 const Eigen::VectorXd global_landmarks = Eigen::VectorXd::Zero(0);
44 const Eigen::VectorXd transformed_landmarks =
45 common_lib::maths::global_to_local_coordinates(reference_frame, global_landmarks);
46 EXPECT_EQ(transformed_landmarks.size(), 0);
47}
48
53TEST(TransformGlobalToLocal, TestCase3) {
54 const Eigen::Vector3d reference_frame(0, 0, 0);
55 Eigen::VectorXd global_landmarks = Eigen::VectorXd::Zero(10);
56 global_landmarks << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;
57 Eigen::VectorXd expected_local_landmarks(10);
58 expected_local_landmarks << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;
59 Eigen::VectorXd local_landmarks =
60 common_lib::maths::global_to_local_coordinates(reference_frame, global_landmarks);
61 for (int i = 0; i < 10; i++) {
62 EXPECT_NEAR(local_landmarks(i), expected_local_landmarks(i), 1e-6);
63 }
64}
65
70TEST(TransformGlobalToLocal, TestCase4) {
71 const Eigen::Vector3d reference_frame(5, -5, 1.1);
72 Eigen::VectorXd global_landmarks = Eigen::VectorXd::Zero(10);
73 global_landmarks << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;
74 Eigen::VectorXd expected_local_landmarks(10);
75 expected_local_landmarks << 4.424067034727738, 6.740002290224783, 7.113673997701763,
76 5.864779812953067, 9.803280960675789, 4.989557335681351, 12.492887923649814,
77 4.114334858409635, 15.18249488662384, 3.239112381137919;
78 Eigen::VectorXd local_landmarks =
79 common_lib::maths::global_to_local_coordinates(reference_frame, global_landmarks);
80 for (int i = 0; i < 10; i++) {
81 EXPECT_NEAR(local_landmarks(i), expected_local_landmarks(i), 1e-6);
82 }
83}
84
90TEST(TransformLocalToGlobal, TestCase1) {
91 const Eigen::Vector3d reference_frame(0, 0, 0);
92 const Eigen::VectorXd local_landmarks = Eigen::VectorXd::Zero(0);
93 const Eigen::VectorXd transformed_landmarks =
94 common_lib::maths::local_to_global_coordinates(reference_frame, local_landmarks);
95 EXPECT_EQ(transformed_landmarks.size(), 0);
96}
97
102TEST(TransformLocalToGlobal, TestCase2) {
103 const Eigen::Vector3d reference_frame(5, -5, 1.1);
104 Eigen::VectorXd local_landmarks = Eigen::VectorXd::Zero(0);
105 Eigen::VectorXd global_landmarks =
106 common_lib::maths::local_to_global_coordinates(reference_frame, local_landmarks);
107 EXPECT_EQ(global_landmarks.size(), 0);
108}
109
114TEST(TransformLocalToGlobal, TestCase3) {
115 const Eigen::Vector3d reference_frame(0, 0, 0);
116 Eigen::VectorXd local_landmarks = Eigen::VectorXd::Zero(10);
117 local_landmarks << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;
118 Eigen::VectorXd expected_global_landmarks(10);
119 expected_global_landmarks << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;
120 Eigen::VectorXd global_landmarks =
121 common_lib::maths::local_to_global_coordinates(reference_frame, local_landmarks);
122 for (int i = 0; i < 10; i++) {
123 EXPECT_NEAR(global_landmarks(i), expected_global_landmarks(i), 1e-6);
124 }
125}
126
131TEST(TransformLocalToGlobal, TestCase4) {
132 const Eigen::Vector3d reference_frame(5, -5, 1.1);
133 Eigen::VectorXd local_landmarks = Eigen::VectorXd::Zero(10);
134 local_landmarks << 4.424067034727738, 6.740002290224783, 7.113673997701763, 5.864779812953067,
135 9.803280960675789, 4.989557335681351, 12.492887923649814, 4.114334858409635,
136 15.18249488662384, 3.239112381137919;
137 Eigen::VectorXd expected_global_landmarks(10);
138 expected_global_landmarks << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;
139 Eigen::VectorXd global_landmarks =
140 common_lib::maths::local_to_global_coordinates(reference_frame, local_landmarks);
141 for (int i = 0; i < 10; i++) {
142 EXPECT_NEAR(global_landmarks(i), expected_global_landmarks(i), 1e-6);
143 }
144}
145
151TEST(TransformGlobalANDLocal, TestCase1) {
152 Eigen::Vector3d referencial;
153 Eigen::VectorXd global_landmarks;
154 Eigen::VectorXd transformed_landmarks;
155
156 // Run 15 randomized tests
157 for (int i = 0; i < 15; i++) {
158 const int number_of_landmarks = ::generate_random_integer(1, 20);
159 referencial << ::generate_random_double(-100, 100), ::generate_random_double(-100, 100),
160 ::generate_random_double(-M_PI, M_PI);
161 global_landmarks = Eigen::VectorXd::Zero(2 * number_of_landmarks);
162 for (int j = 0; j < 2 * number_of_landmarks; j++) {
163 global_landmarks(j) = ::generate_random_double(-100, 100);
164 }
165 transformed_landmarks =
166 common_lib::maths::global_to_local_coordinates(referencial, global_landmarks);
167 transformed_landmarks =
168 common_lib::maths::local_to_global_coordinates(referencial, transformed_landmarks);
169 for (int j = 0; j < 2 * number_of_landmarks; j++) {
170 EXPECT_NEAR(global_landmarks(j), transformed_landmarks(j), 1e-6);
171 }
172 }
173}
174
180TEST(TransformGlobalANDLocal, TestCase2) {
181 Eigen::Vector3d referencial;
182 Eigen::VectorXd local_landmarks;
183 Eigen::VectorXd transformed_landmarks;
184
185 // Run 15 randomized tests
186 for (int i = 0; i < 15; i++) {
187 const int number_of_landmarks = ::generate_random_integer(1, 20);
188 referencial << ::generate_random_double(-100, 100), ::generate_random_double(-100, 100),
189 ::generate_random_double(-M_PI, M_PI);
190 local_landmarks = Eigen::VectorXd::Zero(2 * number_of_landmarks);
191 for (int j = 0; j < 2 * number_of_landmarks; j++) {
192 local_landmarks(j) = ::generate_random_double(-100, 100);
193 }
194 transformed_landmarks =
195 common_lib::maths::local_to_global_coordinates(referencial, local_landmarks);
196 transformed_landmarks =
197 common_lib::maths::global_to_local_coordinates(referencial, transformed_landmarks);
198 for (int j = 0; j < 2 * number_of_landmarks; j++) {
199 EXPECT_NEAR(local_landmarks(j), transformed_landmarks(j), 1e-6);
200 }
201 }
202}
Eigen::VectorXd global_to_local_coordinates(const Eigen::Vector3d &local_reference_frame, const Eigen::VectorXd &global_points)
Transform points from a global reference frame to a local reference frame.
Eigen::VectorXd local_to_global_coordinates(const Eigen::Vector3d &local_reference_frame, const Eigen::VectorXd &local_points)
Transform points from a local reference frame to a global reference frame.
int generate_random_integer(const int a, const int b)
double generate_random_double(const double a, const double b)
TEST(TransformGlobalToLocal, TestCase1)
Trivial scenario of transformation from global to local coordinates with no landmarks and trivial sta...