Skip to content

Commit 88f1dfd

Browse files
authored
fix(behavior_path_planner): fix bug of turn signal with overlap lane (autowarefoundation#1886)
Signed-off-by: Takayuki Murooka <takayuki5168@gmail.com> Signed-off-by: Takayuki Murooka <takayuki5168@gmail.com>
1 parent 51af89c commit 88f1dfd

File tree

3 files changed

+95
-4
lines changed

3 files changed

+95
-4
lines changed

common/motion_utils/include/motion_utils/trajectory/trajectory.hpp

+32-3
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,8 @@ boost::optional<size_t> findNearestSegmentIndex(
347347
*/
348348
template <class T>
349349
double calcLateralOffset(
350-
const T & points, const geometry_msgs::msg::Point & p_target, const bool throw_exception = false)
350+
const T & points, const geometry_msgs::msg::Point & p_target, const size_t seg_idx,
351+
const bool throw_exception = false)
351352
{
352353
const auto overlap_removed_points = removeOverlapPoints(points, 0);
353354

@@ -371,8 +372,6 @@ double calcLateralOffset(
371372
return std::nan("");
372373
}
373374

374-
const size_t seg_idx = findNearestSegmentIndex(overlap_removed_points, p_target);
375-
376375
const auto p_front = tier4_autoware_utils::getPoint(overlap_removed_points.at(seg_idx));
377376
const auto p_back = tier4_autoware_utils::getPoint(overlap_removed_points.at(seg_idx + 1));
378377

@@ -383,6 +382,36 @@ double calcLateralOffset(
383382
return cross_vec(2) / segment_vec.norm();
384383
}
385384

385+
template <class T>
386+
double calcLateralOffset(
387+
const T & points, const geometry_msgs::msg::Point & p_target, const bool throw_exception = false)
388+
{
389+
const auto overlap_removed_points = removeOverlapPoints(points, 0);
390+
391+
if (throw_exception) {
392+
validateNonEmpty(overlap_removed_points);
393+
} else {
394+
try {
395+
validateNonEmpty(overlap_removed_points);
396+
} catch (const std::exception & e) {
397+
std::cerr << e.what() << std::endl;
398+
return std::nan("");
399+
}
400+
}
401+
402+
if (overlap_removed_points.size() == 1) {
403+
const std::runtime_error e("Same points are given.");
404+
if (throw_exception) {
405+
throw e;
406+
}
407+
std::cerr << e.what() << std::endl;
408+
return std::nan("");
409+
}
410+
411+
const size_t seg_idx = findNearestSegmentIndex(overlap_removed_points, p_target);
412+
return calcLateralOffset(points, p_target, seg_idx, throw_exception);
413+
}
414+
386415
/**
387416
* @brief calcSignedArcLength from index to index
388417
*/

common/motion_utils/test/src/trajectory/test_trajectory.cpp

+61
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,67 @@ TEST(trajectory, calcLateralOffset)
564564
EXPECT_NEAR(calcLateralOffset(traj.points, createPoint(1.0, -3.0, 0.0)), -3.0, epsilon);
565565
}
566566

567+
TEST(trajectory, calcLateralOffset_without_segment_idx)
568+
{
569+
using motion_utils::calcLateralOffset;
570+
571+
const auto traj = generateTestTrajectory<Trajectory>(10, 1.0);
572+
const bool throw_exception = true;
573+
574+
// Empty
575+
EXPECT_THROW(
576+
calcLateralOffset(Trajectory{}.points, geometry_msgs::msg::Point{}, throw_exception),
577+
std::invalid_argument);
578+
579+
// Trajectory size is 1
580+
{
581+
const auto one_point_traj = generateTestTrajectory<Trajectory>(1, 1.0);
582+
EXPECT_THROW(
583+
calcLateralOffset(
584+
one_point_traj.points, geometry_msgs::msg::Point{}, static_cast<size_t>(0),
585+
throw_exception),
586+
std::runtime_error);
587+
}
588+
589+
// Same close points in trajectory
590+
{
591+
const auto invalid_traj = generateTestTrajectory<Trajectory>(10, 0.0);
592+
const auto p = createPoint(3.0, 0.0, 0.0);
593+
EXPECT_THROW(
594+
calcLateralOffset(invalid_traj.points, p, static_cast<size_t>(2), throw_exception),
595+
std::runtime_error);
596+
EXPECT_THROW(
597+
calcLateralOffset(invalid_traj.points, p, static_cast<size_t>(3), throw_exception),
598+
std::runtime_error);
599+
}
600+
601+
// Point on trajectory
602+
EXPECT_NEAR(
603+
calcLateralOffset(traj.points, createPoint(3.1, 0.0, 0.0), static_cast<size_t>(3)), 0.0,
604+
epsilon);
605+
606+
// Point before start point
607+
EXPECT_NEAR(
608+
calcLateralOffset(traj.points, createPoint(-3.9, 3.0, 0.0), static_cast<size_t>(0)), 3.0,
609+
epsilon);
610+
611+
// Point after start point
612+
EXPECT_NEAR(
613+
calcLateralOffset(traj.points, createPoint(13.3, -10.0, 0.0), static_cast<size_t>(8)), -10.0,
614+
epsilon);
615+
616+
// Random cases
617+
EXPECT_NEAR(
618+
calcLateralOffset(traj.points, createPoint(4.3, 7.0, 0.0), static_cast<size_t>(4)), 7.0,
619+
epsilon);
620+
EXPECT_NEAR(
621+
calcLateralOffset(traj.points, createPoint(1.0, -3.0, 0.0), static_cast<size_t>(0)), -3.0,
622+
epsilon);
623+
EXPECT_NEAR(
624+
calcLateralOffset(traj.points, createPoint(1.0, -3.0, 0.0), static_cast<size_t>(1)), -3.0,
625+
epsilon);
626+
}
627+
567628
TEST(trajectory, calcLateralOffset_CurveTrajectory)
568629
{
569630
using motion_utils::calcLateralOffset;

planning/behavior_path_planner/include/behavior_path_planner/utilities.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ FrenetCoordinate3d convertToFrenetCoordinate3d(
119119
motion_utils::calcLongitudinalOffsetToSegment(pose_array, seg_idx, search_point_geom);
120120
frenet_coordinate.length =
121121
motion_utils::calcSignedArcLength(pose_array, 0, seg_idx) + longitudinal_length;
122-
frenet_coordinate.distance = motion_utils::calcLateralOffset(pose_array, search_point_geom);
122+
frenet_coordinate.distance =
123+
motion_utils::calcLateralOffset(pose_array, search_point_geom, seg_idx);
123124

124125
return frenet_coordinate;
125126
}

0 commit comments

Comments
 (0)