Skip to content

Commit d381585

Browse files
authored
fix(avoidance): fix bug in minimum overhang distance calculation (#6372)
Signed-off-by: satoshi-ota <satoshi.ota928@gmail.com>
1 parent 99c8b32 commit d381585

File tree

1 file changed

+29
-12
lines changed
  • planning/behavior_path_avoidance_module/src

1 file changed

+29
-12
lines changed

planning/behavior_path_avoidance_module/src/utils.cpp

+29-12
Original file line numberDiff line numberDiff line change
@@ -885,41 +885,58 @@ double getRoadShoulderDistance(
885885
return 0.0;
886886
}
887887

888-
std::vector<std::pair<Point, Point>> intersects;
888+
std::vector<std::tuple<double, Point, Point>> intersects;
889889
for (const auto & p1 : object.overhang_points) {
890890
const auto centerline_pose =
891891
lanelet::utils::getClosestCenterPose(object.overhang_lanelet, object_pose.position);
892892
const auto p_tmp =
893893
geometry_msgs::build<Pose>().position(p1.second).orientation(centerline_pose.orientation);
894-
const auto p2 = calcOffsetPose(p_tmp, 0.0, (isOnRight(object) ? 100.0 : -100.0), 0.0).position;
895894

896895
// TODO(Satoshi OTA): check if the basic point is on right or left of bound.
897896
const auto bound = isOnRight(object) ? data.left_bound : data.right_bound;
898897

899898
for (size_t i = 1; i < bound.size(); i++) {
900-
const auto opt_intersect =
901-
tier4_autoware_utils::intersect(p1.second, p2, bound.at(i - 1), bound.at(i));
902-
903-
if (!opt_intersect) {
904-
continue;
899+
{
900+
const auto p2 =
901+
calcOffsetPose(p_tmp, 0.0, (isOnRight(object) ? 100.0 : -100.0), 0.0).position;
902+
const auto opt_intersect =
903+
tier4_autoware_utils::intersect(p1.second, p2, bound.at(i - 1), bound.at(i));
904+
905+
if (opt_intersect.has_value()) {
906+
intersects.emplace_back(
907+
calcDistance2d(p1.second, opt_intersect.value()), p1.second, opt_intersect.value());
908+
break;
909+
}
905910
}
906911

907-
intersects.emplace_back(p1.second, opt_intersect.value());
912+
{
913+
const auto p2 =
914+
calcOffsetPose(p_tmp, 0.0, (isOnRight(object) ? -100.0 : 100.0), 0.0).position;
915+
const auto opt_intersect =
916+
tier4_autoware_utils::intersect(p1.second, p2, bound.at(i - 1), bound.at(i));
917+
918+
if (opt_intersect.has_value()) {
919+
intersects.emplace_back(
920+
-1.0 * calcDistance2d(p1.second, opt_intersect.value()), p1.second,
921+
opt_intersect.value());
922+
break;
923+
}
924+
}
908925
}
909926
}
910927

911928
std::sort(intersects.begin(), intersects.end(), [](const auto & a, const auto & b) {
912-
return calcDistance2d(a.first, a.second) < calcDistance2d(b.first, b.second);
929+
return std::get<0>(a) < std::get<0>(b);
913930
});
914931

915932
if (intersects.empty()) {
916933
return 0.0;
917934
}
918935

919-
object.narrowest_place = intersects.front();
936+
object.narrowest_place =
937+
std::make_pair(std::get<1>(intersects.front()), std::get<2>(intersects.front()));
920938

921-
return calcDistance2d(
922-
object.narrowest_place.value().first, object.narrowest_place.value().second);
939+
return std::get<0>(intersects.front());
923940
}
924941
} // namespace filtering_utils
925942

0 commit comments

Comments
 (0)