29
29
#include < algorithm>
30
30
#include < array>
31
31
#include < random>
32
+ #include < utility>
32
33
33
34
namespace
34
35
{
@@ -174,7 +175,7 @@ void MissionPlanner::on_map(const HADMapBin::ConstSharedPtr msg)
174
175
map_ptr_ = msg;
175
176
}
176
177
177
- PoseStamped MissionPlanner::transform_pose (const PoseStamped & input)
178
+ PoseStamped MissionPlanner::transform_pose (const PoseStamped & input) const
178
179
{
179
180
PoseStamped output;
180
181
geometry_msgs::msg::TransformStamped transform;
@@ -728,7 +729,7 @@ void MissionPlanner::on_change_route_points(
728
729
}
729
730
730
731
bool MissionPlanner::check_reroute_safety (
731
- const LaneletRoute & original_route, const LaneletRoute & target_route)
732
+ const LaneletRoute & original_route, const LaneletRoute & target_route) const
732
733
{
733
734
if (original_route.segments .empty () || target_route.segments .empty () || !map_ptr_ || !odometry_) {
734
735
RCLCPP_ERROR (get_logger (), " Check reroute safety failed. Route, map or odometry is not set." );
@@ -749,80 +750,86 @@ bool MissionPlanner::check_reroute_safety(
749
750
return false ;
750
751
}
751
752
752
- bool is_same = false ;
753
753
for (const auto & primitive : original_primitives) {
754
754
const auto has_same = [&](const auto & p) { return p.id == primitive.id ; };
755
- is_same = std::find_if (target_primitives.begin (), target_primitives.end (), has_same) !=
756
- target_primitives.end ();
755
+ const bool is_same =
756
+ std::find_if (target_primitives.begin (), target_primitives.end (), has_same) !=
757
+ target_primitives.end ();
758
+ if (is_same) {
759
+ return true ;
760
+ }
757
761
}
758
- return is_same ;
762
+ return false ;
759
763
};
760
764
761
765
// find idx of original primitives that matches the target primitives
762
- const auto start_idx_opt = std::invoke ([&]() -> std::optional<size_t > {
763
- /*
764
- * find the index of the original route that has same idx with the front segment of the new
765
- * route
766
- *
767
- * start_idx
768
- * +-----------+-----------+-----------+-----------+-----------+
769
- * | | | | | |
770
- * +-----------+-----------+-----------+-----------+-----------+
771
- * | | | | | |
772
- * +-----------+-----------+-----------+-----------+-----------+
773
- * original original original original original
774
- * target target target
775
- */
776
- const auto target_front_primitives = target_route.segments .front ().primitives ;
777
- for (size_t i = 0 ; i < original_route.segments .size (); ++i) {
778
- const auto & original_primitives = original_route.segments .at (i).primitives ;
779
- if (hasSamePrimitives (original_primitives, target_front_primitives)) {
780
- return i;
766
+ const auto start_idx_opt =
767
+ std::invoke ([&]() -> std::optional<std::pair<size_t /* original */ , size_t /* target */ >> {
768
+ /*
769
+ * find the index of the original route that has same idx with the front segment of the new
770
+ * route
771
+ *
772
+ * start_idx == 2
773
+ * +--------------+--------------+--------------+--------------+-------------+
774
+ * | | | | | |
775
+ * +--------------+--------------+--------------+--------------+-------------+
776
+ * | | | | | |
777
+ * +--------------+--------------+--------------+--------------+-------------+
778
+ * original[0] original[1] original[2] original[3] original[4]
779
+ * target[0] target[1] target[2]
780
+ */
781
+ const auto target_front_primitives = target_route.segments .front ().primitives ;
782
+ for (size_t i = 0 ; i < original_route.segments .size (); ++i) {
783
+ const auto & original_primitives = original_route.segments .at (i).primitives ;
784
+ if (hasSamePrimitives (original_primitives, target_front_primitives)) {
785
+ return std::make_pair (i, 0 );
786
+ }
781
787
}
782
- }
783
788
784
- /*
785
- * find the target route that has same idx with the front segment of the original route
786
- *
787
- * start_idx
788
- * +-----------+-----------+-----------+-----------+-----------+
789
- * | | | | | |
790
- * +-----------+-----------+-----------+-----------+-----------+
791
- * | | | | | |
792
- * +-----------+-----------+-----------+-----------+-----------+
793
- * original original original
794
- * target target target target target
795
- */
796
- const auto original_front_primitives = original_route.segments .front ().primitives ;
797
- for (size_t i = 0 ; i < target_route.segments .size (); ++i) {
798
- const auto & target_primitives = target_route.segments .at (i).primitives ;
799
- if (hasSamePrimitives (target_primitives, original_front_primitives)) {
800
- return 0 ;
789
+ /*
790
+ * find the target route that has same idx with the front segment of the original route
791
+ *
792
+ * start_idx == 0
793
+ * +--------------+--------------+--------------+--------------+-------------+
794
+ * | | | | | |
795
+ * +--------------+--------------+--------------+--------------+-------------+
796
+ * | | | | | |
797
+ * +--------------+--------------+--------------+--------------+-------------+
798
+ * original[0] original[1] original[2]
799
+ * target[0] target[1] target[2] target[3] target[4]
800
+ */
801
+ const auto original_front_primitives = original_route.segments .front ().primitives ;
802
+ for (size_t i = 0 ; i < target_route.segments .size (); ++i) {
803
+ const auto & target_primitives = target_route.segments .at (i).primitives ;
804
+ if (hasSamePrimitives (target_primitives, original_front_primitives)) {
805
+ return std::make_pair (0 , i);
806
+ }
801
807
}
802
- }
803
808
804
- return std::nullopt;
805
- });
809
+ return std::nullopt;
810
+ });
806
811
if (!start_idx_opt.has_value ()) {
807
812
RCLCPP_ERROR (
808
813
get_logger (), " Check reroute safety failed. Cannot find the start index of the route." );
809
814
return false ;
810
815
}
811
- const size_t start_idx = start_idx_opt.value ();
816
+ const auto [ start_idx, start_idx_target] = start_idx_opt.value ();
812
817
813
818
// find last idx that matches the target primitives
814
819
size_t end_idx = start_idx;
815
- for (size_t i = 1 ; i < target_route.segments .size (); ++i) {
820
+ size_t end_idx_target = start_idx_target;
821
+ for (size_t i = 1 ; i < target_route.segments .size () - start_idx_target; ++i) {
816
822
if (start_idx + i > original_route.segments .size () - 1 ) {
817
823
break ;
818
824
}
819
825
820
826
const auto & original_primitives = original_route.segments .at (start_idx + i).primitives ;
821
- const auto & target_primitives = target_route.segments .at (i).primitives ;
827
+ const auto & target_primitives = target_route.segments .at (start_idx_target + i).primitives ;
822
828
if (!hasSamePrimitives (original_primitives, target_primitives)) {
823
829
break ;
824
830
}
825
831
end_idx = start_idx + i;
832
+ end_idx_target = end_idx_target + i;
826
833
}
827
834
828
835
// create map
@@ -870,7 +877,7 @@ bool MissionPlanner::check_reroute_safety(
870
877
}
871
878
872
879
// check if the goal is inside of the target terminal lanelet
873
- const auto & target_end_primitives = target_route.segments .at (end_idx - start_idx ).primitives ;
880
+ const auto & target_end_primitives = target_route.segments .at (end_idx_target ).primitives ;
874
881
const auto & target_goal = target_route.goal_pose ;
875
882
for (const auto & target_end_primitive : target_end_primitives) {
876
883
const auto lanelet = lanelet_map_ptr_->laneletLayer .get (target_end_primitive.id );
@@ -882,8 +889,11 @@ bool MissionPlanner::check_reroute_safety(
882
889
lanelet::utils::to2D (target_goal_position).basicPoint ())
883
890
.length ;
884
891
const double target_lanelet_length = lanelet::utils::getLaneletLength2d (lanelet);
885
- const double dist = target_lanelet_length - dist_to_goal;
886
- accumulated_length = std::max (accumulated_length - dist, 0.0 );
892
+ // NOTE: `accumulated_length` here contains the length of the entire target_end_primitive, so
893
+ // the remaining distance from the goal to the end of the target_end_primitive needs to be
894
+ // subtracted.
895
+ const double remaining_dist = target_lanelet_length - dist_to_goal;
896
+ accumulated_length = std::max (accumulated_length - remaining_dist, 0.0 );
887
897
break ;
888
898
}
889
899
}
0 commit comments