@@ -675,6 +675,36 @@ lanelet::ArcCoordinates getArcCoordinates(
675
675
return arc_coordinates;
676
676
}
677
677
678
+ lanelet::ArcCoordinates getArcCoordinatesConsideringWaypoints (
679
+ const lanelet::ConstLanelets & lanelet_sequence, const geometry_msgs::msg::Pose & pose,
680
+ const lanelet::LaneletMapConstPtr & lanelet_map_ptr)
681
+ {
682
+ lanelet::ConstLanelet closest_lanelet;
683
+ lanelet::utils::query::getClosestLanelet (lanelet_sequence, pose, &closest_lanelet);
684
+
685
+ double length = 0 ;
686
+ lanelet::ArcCoordinates arc_coordinates;
687
+ for (const auto & llt : lanelet_sequence) {
688
+ ConstLineString2d centerline_2d;
689
+ if (llt.hasAttribute (" waypoints" )) {
690
+ const auto waypoints_id = llt.attribute (" waypoints" ).asId ().value ();
691
+ centerline_2d = lanelet::utils::to2D (lanelet_map_ptr->lineStringLayer .get (waypoints_id));
692
+ } else {
693
+ centerline_2d = lanelet::utils::to2D (llt.centerline ());
694
+ }
695
+
696
+ if (llt == closest_lanelet) {
697
+ const auto lanelet_point = lanelet::utils::conversion::toLaneletPoint (pose.position );
698
+ arc_coordinates = lanelet::geometry::toArcCoordinates (
699
+ centerline_2d, lanelet::utils::to2D (lanelet_point).basicPoint ());
700
+ arc_coordinates.length += length;
701
+ break ;
702
+ }
703
+ length += static_cast <double >(boost::geometry::length (centerline_2d));
704
+ }
705
+ return arc_coordinates;
706
+ }
707
+
678
708
lanelet::ConstLineString3d getClosestSegment (
679
709
const lanelet::BasicPoint2d & search_pt, const lanelet::ConstLineString3d & linestring)
680
710
{
0 commit comments