7 #include <gtest/gtest.h>
14 #include "../test_helpers/path_planning_checker.hpp"
16 TEST(fields2cover_types_path, addState) {
23 auto state0 =
path.getState(0);
24 auto c_state0 = const_path.
getState(0);
25 EXPECT_EQ(state0.point, c_state0.point);
26 EXPECT_EQ(state0.angle, c_state0.angle);
28 EXPECT_EQ(state0.point,
F2CPoint(1,2));
29 EXPECT_EQ(state0.angle, 0.5*M_PI);
30 EXPECT_EQ(state0.len, 3);
33 EXPECT_EQ(state0.velocity, 5);
35 auto states =
path.getStates();
37 EXPECT_EQ(states[0].point,
F2CPoint(1,2));
38 EXPECT_EQ(c_states[0].point,
F2CPoint(1,2));
39 EXPECT_EQ(states[0].point,
path.atStart());
40 EXPECT_EQ(c_states[0].point, const_path.
atStart());
45 TEST(fields2cover_types_path, getDimMin_getDimMax) {
47 path.setStates(std::vector<F2CPathState>(3));
52 EXPECT_NEAR(
path.getDimMinX(), -3, 1e-7);
53 EXPECT_NEAR(
path.getDimMinY(), -2, 1e-7);
54 EXPECT_NEAR(
path.getDimMaxX(), 2, 1e-7);
55 EXPECT_NEAR(
path.getDimMaxY(), 4, 1e-7);
58 TEST(fields2cover_types_path, mirrorX_mirrorY) {
60 path.setStates(std::vector<F2CPathState>(4));
64 path[1].angle = 1.5*M_PI;
71 EXPECT_NEAR(
path[0].point.getX(), -1, 1e-7);
72 EXPECT_NEAR(
path[0].point.getY(), 1, 1e-7);
73 EXPECT_NEAR(
path[0].angle, M_PI, 1e-7);
74 EXPECT_NEAR(
path[1].point.getX(), -2, 1e-7);
75 EXPECT_NEAR(
path[1].point.getY(), 1, 1e-7);
76 EXPECT_NEAR(
path[1].angle, 1.5*M_PI, 1e-7);
77 EXPECT_NEAR(
path[2].point.getX(), -2, 1e-7);
78 EXPECT_NEAR(
path[2].point.getY(), -2, 1e-7);
79 EXPECT_NEAR(
path[2].angle, 0, 1e-7);
80 EXPECT_NEAR(
path[3].point.getX(), 2, 1e-7);
81 EXPECT_NEAR(
path[3].point.getY(), -2, 1e-7);
82 EXPECT_NEAR(
path[3].angle, M_PI, 1e-7);
85 EXPECT_NEAR(
path[0].point.getX(), -1, 1e-7);
86 EXPECT_NEAR(
path[0].point.getY(), -1, 1e-7);
87 EXPECT_NEAR(
path[0].angle, M_PI, 1e-7);
88 EXPECT_NEAR(
path[1].point.getX(), -2, 1e-7);
89 EXPECT_NEAR(
path[1].point.getY(), -1, 1e-7);
90 EXPECT_NEAR(
path[1].angle, .5*M_PI, 1e-7);
91 EXPECT_NEAR(
path[2].point.getX(), -2, 1e-7);
92 EXPECT_NEAR(
path[2].point.getY(), 2, 1e-7);
93 EXPECT_NEAR(
path[2].angle, 0, 1e-7);
94 EXPECT_NEAR(
path[3].point.getX(), 2, 1e-7);
95 EXPECT_NEAR(
path[3].point.getY(), 2, 1e-7);
96 EXPECT_NEAR(
path[3].angle, M_PI, 1e-7);
99 TEST(fields2cover_types_path, setters) {
101 path.setStates(std::vector<F2CPathState>(4));
105 path[1].angle = 1.5*M_PI;
107 path[2].angle = M_PI;
111 path.setBackwardDir();
112 for (
auto&& s :
path) {
113 EXPECT_EQ(
static_cast<int>(s.dir),
116 path.setForwardDir();
117 for (
auto&& s :
path) {
118 EXPECT_EQ(
static_cast<int>(s.dir),
122 for (
auto&& s :
path) {
123 EXPECT_EQ(
static_cast<int>(s.type),
127 for (
auto&& s :
path) {
128 EXPECT_EQ(
static_cast<int>(s.type),
133 TEST(fields2cover_types_path, at) {
135 path.setStates(std::vector<F2CPathState>(3));
140 path[1].angle = 0.5*M_PI;
147 EXPECT_NEAR(
path.length(), 10.0, 1e-7);
149 EXPECT_NEAR(
path.at(0).point.getX(), -3, 1e-7);
150 EXPECT_NEAR(
path.at(0).point.getY(), 1, 1e-7);
151 EXPECT_NEAR(
path.at(0).angle, 0, 1e-7);
152 EXPECT_NEAR(
path.at(-1).point.getX(), -3, 1e-7);
153 EXPECT_NEAR(
path.at(-1).point.getY(), 1, 1e-7);
154 EXPECT_NEAR(
path.at(-1).angle, 0, 1e-7);
156 EXPECT_NEAR(
path.at(2.5).point.getX(), -0.5, 1e-7);
157 EXPECT_NEAR(
path.at(2.5).point.getY(), 1, 1e-7);
158 EXPECT_NEAR(
path.at(2.5).angle, 0, 1e-7);
160 EXPECT_NEAR(
path.at(6).point.getX(), 2, 1e-7);
161 EXPECT_NEAR(
path.at(6).point.getY(), 2, 1e-7);
162 EXPECT_NEAR(
path.at(6).angle, 0.5*M_PI, 1e-7);
164 EXPECT_NEAR(
path.at(7).point.getX(), 2, 1e-7);
165 EXPECT_NEAR(
path.at(7).point.getY(), 3, 1e-7);
166 EXPECT_NEAR(
path.at(7).angle, 0.5*M_PI, 1e-7);
168 EXPECT_NEAR(
path.at(8).point.getX(), 1, 1e-7);
169 EXPECT_NEAR(
path.at(8).point.getY(), 3, 1e-7);
170 EXPECT_NEAR(
path.at(8).angle, 0, 1e-7);
172 EXPECT_NEAR(
path.at(10).point.getX(), -1, 1e-7);
173 EXPECT_NEAR(
path.at(10).point.getY(), 3, 1e-7);
174 EXPECT_NEAR(
path.at(10).angle, 0, 1e-7);
175 EXPECT_NEAR(
path.at(17).point.getX(), -1, 1e-7);
176 EXPECT_NEAR(
path.at(17).point.getY(), 3, 1e-7);
177 EXPECT_NEAR(
path.at(17).angle, 0, 1e-7);
182 TEST(fields2cover_types_path, appendSwath) {
187 EXPECT_EQ(path1.
size(), 2);
188 EXPECT_EQ(path1[0].point.getX(), 0.0);
189 EXPECT_EQ(path1[0].point.getY(), 1.0);
190 EXPECT_EQ(path1[0].velocity, 2.0);
191 EXPECT_EQ(path1[0].len, 1.0);
192 EXPECT_EQ(
static_cast<int>(path1[0].type),
194 EXPECT_EQ(path1[1].point.getX(), 1.0);
195 EXPECT_EQ(path1[1].point.getY(), 1.0);
196 EXPECT_EQ(path1[1].velocity, 2.0);
197 EXPECT_EQ(path1[1].len, 3.0);
198 EXPECT_EQ(
static_cast<int>(path1[1].type),
203 TEST(fields2cover_types_path, op_plus_equal) {
211 EXPECT_EQ(path1[0].point.getX(), 0.0);
212 EXPECT_EQ(path1[0].point.getY(), 1.0);
213 EXPECT_EQ(path1[0].len, 1.0);
214 EXPECT_EQ(path1[0].velocity, 2.0);
215 EXPECT_EQ(
static_cast<int>(path1[0].type),
217 EXPECT_EQ(path1[1].point.getX(), 1.0);
218 EXPECT_EQ(path1[1].point.getY(), 1.0);
219 EXPECT_EQ(path1[1].velocity, 2.0);
220 EXPECT_EQ(path1[1].len, 3.0);
221 EXPECT_EQ(
static_cast<int>(path1[1].type),
223 EXPECT_EQ(path1[2].point.getX(), 1.0);
224 EXPECT_EQ(path1[2].point.getY(), 4.0);
225 EXPECT_EQ(path1[2].velocity, 1.0);
226 EXPECT_EQ(path1[2].len, 4.0);
227 EXPECT_EQ(
static_cast<int>(path1[2].type),
229 EXPECT_EQ(path1[3].point.getX(), 1.0);
230 EXPECT_EQ(path1[3].point.getY(), 0.0);
231 EXPECT_EQ(path1[3].velocity, 1.0);
232 EXPECT_EQ(path1[3].len, 1.0);
233 EXPECT_EQ(
static_cast<int>(path1[3].type),
236 EXPECT_EQ(path1.
size(), 4);
239 TEST(fields2cover_types_path, populate_and_reduce) {
241 EXPECT_EQ(path1.
size(), 0);
242 EXPECT_EQ(path1.
length(), 0.0);
245 EXPECT_EQ(path1.
size(), 0);
246 EXPECT_EQ(path1.
length(), 0.0);
256 EXPECT_EQ(path1.
size(), 4);
257 EXPECT_EQ(path1.
length(), 7.0);
259 for (
auto s : path1) {
260 EXPECT_EQ(
static_cast<int>(s.dir),
265 EXPECT_EQ(path1.size(), 200);
266 EXPECT_NEAR(path1.length(), 7.0, 1e-2);
267 EXPECT_NEAR(path1.getTaskTime(), 5.5, 1e-2);
268 for (
auto s : path1) {
269 EXPECT_EQ(
static_cast<int>(s.dir),
271 EXPECT_EQ(
static_cast<int>(s.type),
275 EXPECT_EQ(path1.size(), 10);
276 EXPECT_NEAR(path1.length(), 7.0, 1e-2);
277 EXPECT_NEAR(path1.getTaskTime(), 5.5, 0.5);
278 for (
auto&& s : path1) {
279 EXPECT_EQ(
static_cast<int>(s.dir),
281 EXPECT_EQ(
static_cast<int>(s.type),
285 EXPECT_EQ(path1.size(), 500);
286 EXPECT_NEAR(path1.length(), 7.0, 1e-2);
287 EXPECT_NEAR(path1.getTaskTime(), 5.5, 0.5);
289 EXPECT_NEAR(path1.length(), 7.0, 1e-2);
290 EXPECT_NEAR(path1.getTaskTime(), 5.5, 0.5);
292 EXPECT_NEAR(path1.length(), 7.0, 1e-2);
293 EXPECT_NEAR(path1.getTaskTime(), 5.5, 0.5);
294 EXPECT_LT(path1.size(), 100);
296 for (
auto s : path1) {
297 EXPECT_EQ(
static_cast<int>(s.dir),
299 EXPECT_EQ(
static_cast<int>(s.type),
304 TEST(fields2cover_types_path, length) {
306 line1.addPoint( 0.0, 1.0);
307 line1.addPoint( 1.0, 1.0);
308 line1.addPoint( 1.0, 4.0);
309 line2.addPoint( 1.0, 4.0);
310 line2.addPoint( 1.0, 0.0);
311 line2.addPoint( 0.0, 0.0);
317 EXPECT_EQ(path1.
length(), 4.0);
320 EXPECT_EQ(path1.
length(), 9.0);
322 EXPECT_EQ(path1.
length(), 5.0);
325 TEST(fields2cover_types_path, serialize) {
329 EXPECT_EQ(0,
path.serializePath().compare(
""));
336 path.addState(state);
338 EXPECT_EQ(
path.serializePath(),
339 "2.3 -5 0 0.1 3 6 1 2\n");
347 path.addState(state);
349 EXPECT_EQ(
path.serializePath(10),
350 "2.3 -5 0 0.1 3 6 1 2\n0.123456789 -9.87654 0 0.2 3.2 6.2 -1 2\n");
352 path.saveToFile(
"/tmp/test_path");
353 path_read.
loadFile(
"/tmp/test_path");
358 TEST(fields2cover_types_path, moveTo) {
364 EXPECT_EQ(path1[0].point.getX(), 100.0);
365 EXPECT_EQ(path1[0].point.getY(), 201.0);
366 EXPECT_EQ(path1[0].velocity, 2.0);
367 EXPECT_EQ(path1[0].len, 1.0);
368 EXPECT_EQ(
static_cast<int>(path1[0].type),
370 EXPECT_EQ(path1[1].point.getX(), 101.0);
371 EXPECT_EQ(path1[1].point.getY(), 201.0);
372 EXPECT_EQ(path1[1].velocity, 2.0);
373 EXPECT_EQ(path1[1].len, 3.0);
374 EXPECT_EQ(
static_cast<int>(path1[1].type),
376 EXPECT_EQ(path1.
size(), 2);
380 TEST(fields2cover_types_path, toLineString) {
382 path.setStates(std::vector<F2CPathState>(3));
387 path[1].angle = 0.5 * M_PI;
395 EXPECT_EQ(line.
size(),
path.size() + 1);
406 TEST(fields2cover_types_path, discretize_swath) {
409 double field_Y = 100;
421 robot.setMinTurningRadius(2.5);
435 double discretize_step_size = 2;
437 for (
size_t i = 0; i < new_path.
size()-1; i++) {
440 EXPECT_NEAR(new_path[i].point.distance(new_path[i+1].point),
441 discretize_step_size, 1e-6);
451 double discretize_step_size_2 = 150;
453 for (
size_t i = 0; i < new_path_2.
size()-1; i++) {
456 EXPECT_NEAR(new_path_2[i].point.distance(new_path_2[i+1].point),
470 state1.
angle = 0.5 * boost::math::constants::half_pi<double>();
475 state2.
angle = 0.5 * boost::math::constants::half_pi<double>();
477 path.addState(state1);
478 path.addState(state2);
480 double step_size_4 = 5;
481 double approximated_step_size_4 = 4.71405;
482 F2CPath discretized_path =
path.discretizeSwath(step_size_4);
484 EXPECT_EQ(discretized_path.
size(), 4);
486 EXPECT_EQ(discretized_path[0].point, state1.
point);
487 EXPECT_EQ(discretized_path[2].atEnd(), state2.
point);
489 EXPECT_NEAR(discretized_path[0].point.distance(discretized_path[1].point),
490 approximated_step_size_4 , 1e-4);
491 EXPECT_NEAR(discretized_path[1].point.distance(discretized_path[2].point),
492 approximated_step_size_4 , 1e-4);
495 0.5*boost::math::constants::half_pi<double>(),
496 state2.
point, 0.5 * boost::math::constants::half_pi<double>(),
false));