18 #include <gtest/gtest.h>
39 #define EPS_DISTANCE 0.01 // [m]
40 #define EPS_YAW 0.01 // [rad]
41 #define EPS_KAPPA 1e-6 // [1/m]
42 #define KAPPA 1.0 // [1/m]
43 #define SIGMA 1.0 // [1/m^2]
44 #define DISCRETIZATION 0.1 // [m]
45 #define SAMPLES 1e5 // [-]
46 #define OPERATING_REGION_X 20.0 // [m]
47 #define OPERATING_REGION_Y 20.0 // [m]
48 #define OPERATING_REGION_THETA 2 * M_PI // [rad]
49 #define random(lower, upper) (rand() * (upper - lower) / RAND_MAX + lower)
50 #define random_boolean() rand() % 2
68 return sqrt(pow(state2.
x - state1.
x, 2) + pow(state2.
y - state1.
y, 2));
73 double path_length = 0;
75 for (
const auto& state2 :
path)
85 double path_length = 0;
86 for (
const auto& control : controls)
87 path_length += fabs(control.delta_s);
120 int seed(time(
nullptr));
122 TEST(SteeringFunctions, pathLength)
125 for (
int i = 0; i <
SAMPLES; i++)
213 TEST(SteeringFunctions, reachingGoal)
216 for (
int i = 0; i <
SAMPLES; i++)
292 TEST(SteeringFunctions, curvatureContinuity)
295 for (
int i = 0; i <
SAMPLES; i++)
315 state1 = cc_dubins_forwards_path.front();
316 for (
const auto& state2 : cc_dubins_forwards_path)
323 state1 = cc_dubins_backwards_path.front();
324 for (
const auto& state2 : cc_dubins_backwards_path)
331 state1 = cc00_dubins_forwards_path.front();
332 for (
const auto& state2 : cc00_dubins_forwards_path)
339 state1 = cc00_dubins_backwards_path.front();
340 for (
const auto& state2 : cc00_dubins_backwards_path)
347 state1 = cc0pm_dubins_forwards_path.front();
348 for (
const auto& state2 : cc0pm_dubins_forwards_path)
355 state1 = cc0pm_dubins_backwards_path.front();
356 for (
const auto& state2 : cc0pm_dubins_backwards_path)
363 state1 = ccpm0_dubins_forwards_path.front();
364 for (
const auto& state2 : ccpm0_dubins_forwards_path)
371 state1 = ccpm0_dubins_backwards_path.front();
372 for (
const auto& state2 : ccpm0_dubins_backwards_path)
379 state1 = ccpmpm_dubins_forwards_path.front();
380 for (
const auto& state2 : ccpmpm_dubins_forwards_path)
387 state1 = ccpmpm_dubins_backwards_path.front();
388 for (
const auto& state2 : ccpmpm_dubins_backwards_path)
395 state1 = cc00_rs_path.front();
396 for (
const auto& state2 : cc00_rs_path)
403 state1 = hc_rs_path.front();
404 for (
const auto& state2 : hc_rs_path)
406 if (state1.
d * state2.d >= 0)
414 state1 = hc00_rs_path.front();
415 for (
const auto& state2 : hc00_rs_path)
417 if (state1.
d * state2.d >= 0)
425 state1 = hc0pm_rs_path.front();
426 for (
const auto& state2 : hc0pm_rs_path)
428 if (state1.
d * state2.d >= 0)
436 state1 = hcpm0_rs_path.front();
437 for (
const auto& state2 : hcpm0_rs_path)
439 if (state1.
d * state2.d >= 0)
447 state1 = hcpmpm_rs_path.front();
448 for (
const auto& state2 : hcpmpm_rs_path)
450 if (state1.
d * state2.d >= 0)
459 TEST(SteeringFunctions, interpolation)
463 for (
int i = 0; i <
SAMPLES; i++)
465 double t = ((double)rand() / (RAND_MAX));
482 double cc_dubins_forwards_s_path =
get_path_length(cc_dubins_forwards_controls);
483 double cc_dubins_forwards_s_inter =
t * cc_dubins_forwards_s_path;
485 vector<Control> cc_dubins_forwards_controls_inter;
486 cc_dubins_forwards_controls_inter.reserve(cc_dubins_forwards_controls.size());
487 for (
const auto& control : cc_dubins_forwards_controls)
489 double abs_delta_s = fabs(control.delta_s);
491 if (
s < cc_dubins_forwards_s_inter)
492 cc_dubins_forwards_controls_inter.push_back(control);
496 control_inter.
delta_s =
sgn(control.delta_s) * (abs_delta_s - (
s - cc_dubins_forwards_s_inter));
497 control_inter.
kappa = control.kappa;
498 control_inter.
sigma = control.sigma;
499 cc_dubins_forwards_controls_inter.push_back(control_inter);
505 EXPECT_EQ(
is_equal(cc_dubins_forwards_path.back(), cc_dubins_forwards_state_inter),
true);
508 double cc00_dubins_forwards_s_path =
get_path_length(cc00_dubins_forwards_controls);
509 double cc00_dubins_forwards_s_inter =
t * cc00_dubins_forwards_s_path;
511 vector<Control> cc00_dubins_forwards_controls_inter;
512 cc00_dubins_forwards_controls_inter.reserve(cc00_dubins_forwards_controls.size());
513 for (
const auto& control : cc00_dubins_forwards_controls)
515 double abs_delta_s = fabs(control.delta_s);
517 if (
s < cc00_dubins_forwards_s_inter)
518 cc00_dubins_forwards_controls_inter.push_back(control);
522 control_inter.
delta_s =
sgn(control.delta_s) * (abs_delta_s - (
s - cc00_dubins_forwards_s_inter));
523 control_inter.
kappa = control.kappa;
524 control_inter.
sigma = control.sigma;
525 cc00_dubins_forwards_controls_inter.push_back(control_inter);
529 vector<State> cc00_dubins_forwards_path =
531 State cc00_dubins_forwards_state_inter =
533 EXPECT_EQ(
is_equal(cc00_dubins_forwards_path.back(), cc00_dubins_forwards_state_inter),
true);
536 double cc0pm_dubins_forwards_s_path =
get_path_length(cc0pm_dubins_forwards_controls);
537 double cc0pm_dubins_forwards_s_inter =
t * cc0pm_dubins_forwards_s_path;
539 vector<Control> cc0pm_dubins_forwards_controls_inter;
540 cc0pm_dubins_forwards_controls_inter.reserve(cc0pm_dubins_forwards_controls.size());
541 for (
const auto& control : cc0pm_dubins_forwards_controls)
543 double abs_delta_s = fabs(control.delta_s);
545 if (
s < cc0pm_dubins_forwards_s_inter)
546 cc0pm_dubins_forwards_controls_inter.push_back(control);
550 control_inter.
delta_s =
sgn(control.delta_s) * (abs_delta_s - (
s - cc0pm_dubins_forwards_s_inter));
551 control_inter.
kappa = control.kappa;
552 control_inter.
sigma = control.sigma;
553 cc0pm_dubins_forwards_controls_inter.push_back(control_inter);
557 vector<State> cc0pm_dubins_forwards_path =
559 State cc0pm_dubins_forwards_state_inter =
561 EXPECT_EQ(
is_equal(cc0pm_dubins_forwards_path.back(), cc0pm_dubins_forwards_state_inter),
true);
564 double ccpm0_dubins_forwards_s_path =
get_path_length(ccpm0_dubins_forwards_controls);
565 double ccpm0_dubins_forwards_s_inter =
t * ccpm0_dubins_forwards_s_path;
567 vector<Control> ccpm0_dubins_forwards_controls_inter;
568 ccpm0_dubins_forwards_controls_inter.reserve(ccpm0_dubins_forwards_controls.size());
569 for (
const auto& control : ccpm0_dubins_forwards_controls)
571 double abs_delta_s = fabs(control.delta_s);
573 if (
s < ccpm0_dubins_forwards_s_inter)
574 ccpm0_dubins_forwards_controls_inter.push_back(control);
578 control_inter.
delta_s =
sgn(control.delta_s) * (abs_delta_s - (
s - ccpm0_dubins_forwards_s_inter));
579 control_inter.
kappa = control.kappa;
580 control_inter.
sigma = control.sigma;
581 ccpm0_dubins_forwards_controls_inter.push_back(control_inter);
585 vector<State> ccpm0_dubins_forwards_path =
587 State ccpm0_dubins_forwards_state_inter =
589 EXPECT_EQ(
is_equal(ccpm0_dubins_forwards_path.back(), ccpm0_dubins_forwards_state_inter),
true);
592 double ccpmpm_dubins_forwards_s_path =
get_path_length(ccpmpm_dubins_forwards_controls);
593 double ccpmpm_dubins_forwards_s_inter =
t * ccpmpm_dubins_forwards_s_path;
595 vector<Control> ccpmpm_dubins_forwards_controls_inter;
596 ccpmpm_dubins_forwards_controls_inter.reserve(ccpmpm_dubins_forwards_controls.size());
597 for (
const auto& control : ccpmpm_dubins_forwards_controls)
599 double abs_delta_s = fabs(control.delta_s);
601 if (
s < ccpmpm_dubins_forwards_s_inter)
602 ccpmpm_dubins_forwards_controls_inter.push_back(control);
606 control_inter.
delta_s =
sgn(control.delta_s) * (abs_delta_s - (
s - ccpmpm_dubins_forwards_s_inter));
607 control_inter.
kappa = control.kappa;
608 control_inter.
sigma = control.sigma;
609 ccpmpm_dubins_forwards_controls_inter.push_back(control_inter);
613 vector<State> ccpmpm_dubins_forwards_path =
615 State ccpmpm_dubins_forwards_state_inter =
617 EXPECT_EQ(
is_equal(ccpmpm_dubins_forwards_path.back(), ccpmpm_dubins_forwards_state_inter),
true);
620 double dubins_forwards_s_path =
get_path_length(dubins_forwards_controls);
621 double dubins_forwards_s_inter =
t * dubins_forwards_s_path;
623 vector<Control> dubins_forwards_controls_inter;
624 dubins_forwards_controls_inter.reserve(dubins_forwards_controls.size());
625 for (
const auto& control : dubins_forwards_controls)
627 double abs_delta_s = fabs(control.delta_s);
629 if (
s < dubins_forwards_s_inter)
630 dubins_forwards_controls_inter.push_back(control);
634 control_inter.
delta_s =
sgn(control.delta_s) * (abs_delta_s - (
s - dubins_forwards_s_inter));
635 control_inter.
kappa = control.kappa;
636 control_inter.
sigma = control.sigma;
637 dubins_forwards_controls_inter.push_back(control_inter);
643 EXPECT_EQ(
is_equal(dubins_forwards_path.back(), dubins_forwards_state_inter),
true);
647 double cc00_rs_s_inter =
t * cc00_rs_s_path;
649 vector<Control> cc00_rs_controls_inter;
650 cc00_rs_controls_inter.reserve(cc00_rs_controls.size());
651 for (
const auto& control : cc00_rs_controls)
653 double abs_delta_s = fabs(control.delta_s);
655 if (
s < cc00_rs_s_inter)
656 cc00_rs_controls_inter.push_back(control);
660 control_inter.
delta_s =
sgn(control.delta_s) * (abs_delta_s - (
s - cc00_rs_s_inter));
661 control_inter.
kappa = control.kappa;
662 control_inter.
sigma = control.sigma;
663 cc00_rs_controls_inter.push_back(control_inter);
669 EXPECT_EQ(
is_equal(cc00_rs_path.back(), cc00_rs_state_inter),
true);
673 double hc_rs_s_inter =
t * hc_rs_s_path;
675 vector<Control> hc_rs_controls_inter;
676 hc_rs_controls_inter.reserve(hc_rs_controls.size());
677 for (
const auto& control : hc_rs_controls)
679 double abs_delta_s = fabs(control.delta_s);
681 if (
s < hc_rs_s_inter)
682 hc_rs_controls_inter.push_back(control);
686 control_inter.
delta_s =
sgn(control.delta_s) * (abs_delta_s - (
s - hc_rs_s_inter));
687 control_inter.
kappa = control.kappa;
688 control_inter.
sigma = control.sigma;
689 hc_rs_controls_inter.push_back(control_inter);
695 EXPECT_EQ(
is_equal(hc_rs_path.back(), hc_rs_state_inter),
true);
699 double hc00_rs_s_inter =
t * hc00_rs_s_path;
701 vector<Control> hc00_rs_controls_inter;
702 hc00_rs_controls_inter.reserve(hc00_rs_controls.size());
703 for (
const auto& control : hc00_rs_controls)
705 double abs_delta_s = fabs(control.delta_s);
707 if (
s < hc00_rs_s_inter)
708 hc00_rs_controls_inter.push_back(control);
712 control_inter.
delta_s =
sgn(control.delta_s) * (abs_delta_s - (
s - hc00_rs_s_inter));
713 control_inter.
kappa = control.kappa;
714 control_inter.
sigma = control.sigma;
715 hc00_rs_controls_inter.push_back(control_inter);
721 EXPECT_EQ(
is_equal(hc00_rs_path.back(), hc00_rs_state_inter),
true);
725 double hcpmpm_rs_s_inter =
t * hcpmpm_rs_s_path;
727 vector<Control> hcpmpm_rs_controls_inter;
728 hcpmpm_rs_controls_inter.reserve(hcpmpm_rs_controls.size());
729 for (
const auto& control : hcpmpm_rs_controls)
731 double abs_delta_s = fabs(control.delta_s);
733 if (
s < hcpmpm_rs_s_inter)
734 hcpmpm_rs_controls_inter.push_back(control);
738 control_inter.
delta_s =
sgn(control.delta_s) * (abs_delta_s - (
s - hcpmpm_rs_s_inter));
739 control_inter.
kappa = control.kappa;
740 control_inter.
sigma = control.sigma;
741 hcpmpm_rs_controls_inter.push_back(control_inter);
747 EXPECT_EQ(
is_equal(hcpmpm_rs_path.back(), hcpmpm_rs_state_inter),
true);
751 double rs_s_inter =
t * rs_s_path;
753 vector<Control> rs_controls_inter;
754 rs_controls_inter.reserve(rs_controls.size());
755 for (
const auto& control : rs_controls)
757 double abs_delta_s = fabs(control.delta_s);
760 rs_controls_inter.push_back(control);
764 control_inter.
delta_s =
sgn(control.delta_s) * (abs_delta_s - (
s - rs_s_inter));
765 control_inter.
kappa = control.kappa;
766 control_inter.
sigma = control.sigma;
767 rs_controls_inter.push_back(control_inter);
773 EXPECT_EQ(
is_equal(rs_path.back(), rs_state_inter),
true);
777 TEST(SteeringFunctions, symmetry)
780 for (
int i = 0; i <
SAMPLES; ++i)
787 EXPECT_LT(fabs(cc00_rs_distance_forwards - cc00_rs_distance_backwards),
EPS_DISTANCE);
791 EXPECT_LT(fabs(hc00_rs_distance_forwards - hc00_rs_distance_backwards),
EPS_DISTANCE);
795 EXPECT_LT(fabs(hcpmpm_rs_distance_forwards - hcpmpm_rs_distance_backwards),
EPS_DISTANCE);
799 EXPECT_LT(fabs(rs_distance_forwards - rs_distance_backwards),
EPS_DISTANCE);
803 int main(
int argc,
char** argv)
805 testing::InitGoogleTest(&argc, argv);
806 return RUN_ALL_TESTS();