From 59304e44c6924e8d9f985e9b83679c4d879f72e6 Mon Sep 17 00:00:00 2001
From: Sergi Hernandez Juan <shernand@iri.upc.edu>
Date: Fri, 1 Jan 2021 19:27:52 +0100
Subject: [PATCH] Solved several bugs to use the correct curvature for the
 splines.

---
 include/opendrive_link.h         |  1 -
 include/opendrive_road_segment.h |  1 +
 src/opendrive_lane.cpp           |  4 +---
 src/opendrive_link.cpp           | 11 +++++-----
 src/opendrive_road_node.cpp      |  5 ++++-
 src/opendrive_road_segment.cpp   | 36 ++++++++++++++++++++++----------
 6 files changed, 37 insertions(+), 21 deletions(-)

diff --git a/include/opendrive_link.h b/include/opendrive_link.h
index f8ad897..fe015f0 100644
--- a/include/opendrive_link.h
+++ b/include/opendrive_link.h
@@ -36,7 +36,6 @@ class COpendriveLink
     double get_resolution(void) const;
     double get_scale_factor(void) const;
     double find_closest_world_point(TOpendriveWorldPoint &world,TPoint &point);
-    double find_closest_local_point(TOpendriveLocalPoint &local,TPoint &point);
     double get_track_point_world(TOpendriveTrackPoint &track,TOpendriveWorldPoint &world);
     double get_track_point_local(TOpendriveTrackPoint &track,TOpendriveLocalPoint &local);
     void get_trajectory(std::vector<double> &x, std::vector<double> &y,double start_length=0.0, double end_length=-1.0) const;
diff --git a/include/opendrive_road_segment.h b/include/opendrive_road_segment.h
index 90a2431..76dc362 100644
--- a/include/opendrive_road_segment.h
+++ b/include/opendrive_road_segment.h
@@ -31,6 +31,7 @@ class COpendriveRoadSegment
     std::vector<COpendriveRoadSegment *> connecting;
     std::string name;
     unsigned int id;
+    opendrive_mark_t center_mark;
   protected:
     COpendriveRoadSegment();
     COpendriveRoadSegment(const COpendriveRoadSegment &object,std::map<COpendriveRoadNode *,COpendriveRoadNode *> &node_refs,COpendriveRoad *road_ref);
diff --git a/src/opendrive_lane.cpp b/src/opendrive_lane.cpp
index 9251711..01e2542 100644
--- a/src/opendrive_lane.cpp
+++ b/src/opendrive_lane.cpp
@@ -296,12 +296,10 @@ TOpendriveWorldPoint COpendriveLane::get_start_point(void) const
   else
   {
     track_point.t=this->get_offset()+this->get_width()/2.0;
+    track_point.s=0.0;
     for(unsigned int i=0;i<this->nodes[this->nodes.size()-1]->get_num_lanes();i++)
       if(&this->nodes[this->nodes.size()-1]->get_lane(i)==this)
-      {
-        track_point.s=this->nodes[this->nodes.size()-1]->get_geometry(i).get_length();
         this->nodes[this->nodes.size()-1]->get_geometry(i).get_world_pose(track_point,world_point);
-      }
   }
   if(this->get_id()>0)
     world_point.heading=normalize_angle(world_point.heading+3.14159);
diff --git a/src/opendrive_link.cpp b/src/opendrive_link.cpp
index 65b3771..6ded761 100644
--- a/src/opendrive_link.cpp
+++ b/src/opendrive_link.cpp
@@ -61,7 +61,6 @@ void COpendriveLink::generate(double start_curvature,double end_curvature,double
   end.y=node_end.y;
   end.heading=node_end.heading;
   end.curvature=end_curvature;
-//  std::cout << start.x << "," << start.y << "," << start.heading << "," << start_curvature << "," << end.x << "," << end.y << "," << end.heading << "," << end_curvature << std::endl;
   this->spline=new CG2Spline(start,end);
   this->spline->generate(this->resolution,length);
 }
@@ -99,12 +98,14 @@ double COpendriveLink::get_scale_factor(void) const
 
 double COpendriveLink::find_closest_world_point(TOpendriveWorldPoint &world,TPoint &point)
 {
+  double length;
 
-}
-
-double COpendriveLink::find_closest_local_point(TOpendriveLocalPoint &local,TPoint &point)
-{
+  if(this->spline!=NULL)
+    length=this->spline->find_closest_point(world.x,world.y,point);
+  else
+    length=std::numeric_limits<double>::max();
 
+  return length;
 }
 
 double COpendriveLink::get_track_point_world(TOpendriveTrackPoint &track,TOpendriveWorldPoint &world)
diff --git a/src/opendrive_road_node.cpp b/src/opendrive_road_node.cpp
index 5003ef5..7e21d0e 100644
--- a/src/opendrive_road_node.cpp
+++ b/src/opendrive_road_node.cpp
@@ -61,7 +61,10 @@ void COpendriveRoadNode::add_link(COpendriveRoadNode *node,opendrive_mark_t mark
   node_start=node->get_start_pose();
   for(unsigned int i=0;i<this->lanes.size();i++)
   {
-    lane_end=this->lanes[i]->get_start_point();
+    if(this->lanes[i]->get_id()<0)
+      lane_end=this->lanes[i]->get_end_point();
+    else
+      lane_end=this->lanes[i]->get_start_point();
     if(fabs(lane_end.x-node_start.x)<this->resolution && fabs(lane_end.y-node_start.y)<this->resolution)
     {
       this->geometries[i]->get_curvature(start_curvature,end_curvature);
diff --git a/src/opendrive_road_segment.cpp b/src/opendrive_road_segment.cpp
index fccf826..2b6ee40 100644
--- a/src/opendrive_road_segment.cpp
+++ b/src/opendrive_road_segment.cpp
@@ -252,7 +252,6 @@ void COpendriveRoadSegment::add_nodes(OpenDRIVE::road_type &road_info)
 
 void COpendriveRoadSegment::link_neightbour_lanes(lanes::laneSection_type &lane_section)
 {
-  opendrive_mark_t center_mark;
   center::lane_type center_lane;
 
   if(lane_section.center().lane().present())
@@ -261,30 +260,30 @@ void COpendriveRoadSegment::link_neightbour_lanes(lanes::laneSection_type &lane_
     if(center_lane.roadMark().size()>1)
       throw CException(_HERE_,"Only one road mark supported for lane");
     else if(center_lane.roadMark().size()==0)
-      center_mark=OD_MARK_NONE;
+      this->center_mark=OD_MARK_NONE;
     else if(center_lane.roadMark().size()==1)
     {
       if(center_lane.roadMark().begin()->type1().present())
       {
         if(center_lane.roadMark().begin()->type1().get()=="none")
-          center_mark=OD_MARK_NONE;
+          this->center_mark=OD_MARK_NONE;
         else if(center_lane.roadMark().begin()->type1().get()=="solid")
-          center_mark=OD_MARK_SOLID;
+          this->center_mark=OD_MARK_SOLID;
         else if(center_lane.roadMark().begin()->type1().get()=="broken")
-          center_mark=OD_MARK_BROKEN;
+          this->center_mark=OD_MARK_BROKEN;
         else if(center_lane.roadMark().begin()->type1().get()=="solid solid")
-          center_mark=OD_MARK_SOLID_SOLID;
+          this->center_mark=OD_MARK_SOLID_SOLID;
         else if(center_lane.roadMark().begin()->type1().get()=="solid broken")
-          center_mark=OD_MARK_SOLID_BROKEN;
+          this->center_mark=OD_MARK_SOLID_BROKEN;
         else if(center_lane.roadMark().begin()->type1().get()=="broken solid")
-         center_mark=OD_MARK_BROKEN_SOLID;
+          this->center_mark=OD_MARK_BROKEN_SOLID;
         else if(center_lane.roadMark().begin()->type1().get()=="broken broken")
-          center_mark=OD_MARK_BROKEN_BROKEN;
+          this->center_mark=OD_MARK_BROKEN_BROKEN;
         else
-          center_mark=OD_MARK_NONE;
+          this->center_mark=OD_MARK_NONE;
       }
       else
-        center_mark=OD_MARK_NONE;
+        this->center_mark=OD_MARK_NONE;
     }
   }
   for(int i=-this->num_right_lanes;i<0;i++)
@@ -522,7 +521,22 @@ const COpendriveRoadSegment &COpendriveRoadSegment::get_connecting(unsigned int
 
 TOpendriveLocalPoint COpendriveRoadSegment::transform_to_local_point(const TOpendriveTrackPoint &track)
 {
+  TOpendriveTrackPoint point;
+  TOpendriveLocalPoint local;
+
+  if(track.s<0.0)
+    throw CException(_HERE_,"Invalid track point");
+  point=track;
+  if(this->num_right_lanes>0)
+    local=this->lanes[-1]->transform_to_local_point(point);
+  else
+  {
+    point.s=this->lanes[1]->get_length()-track.s;
+    point.heading=normalize_angle(track.heading+3.14159);
+    local=this->lanes[1]->transform_to_local_point(point);
+  }
 
+  return local;
 }
 
 TOpendriveWorldPoint COpendriveRoadSegment::transform_to_world_point(const TOpendriveTrackPoint &track)
-- 
GitLab