From 1ef3ee18d8a2f2d35918e43cee39f44461b4121e Mon Sep 17 00:00:00 2001 From: Sergi Hernandez Juan <shernand@iri.upc.edu> Date: Wed, 2 Aug 2023 08:18:30 +0200 Subject: [PATCH] The parent element are only erased if neither the segment not the lane have been updated. Improved the way to update the pose of the node. --- include/opendrive_road_node.h | 4 ++-- src/opendrive_road_node.cpp | 40 ++++++----------------------------- 2 files changed, 8 insertions(+), 36 deletions(-) diff --git a/include/opendrive_road_node.h b/include/opendrive_road_node.h index 9ae44c6..a647f02 100644 --- a/include/opendrive_road_node.h +++ b/include/opendrive_road_node.h @@ -48,8 +48,8 @@ class COpendriveRoadNode COpendriveRoadNode *get_original_node(node_up_ref_t &node_refs); void update_references(segment_up_ref_t &segment_refs,lane_up_ref_t &lane_refs,node_up_ref_t &node_refs); void clean_references(segment_up_ref_t &segment_refs,lane_up_ref_t &lane_refs,node_up_ref_t &node_refs,link_up_ref_t &new_link_ref); - void update_start_pose(COpendriveLane *lane,TOpendriveWorldPose &start,double distance); - void update_end_pose(COpendriveLane *lane,TOpendriveWorldPose &end,double distance); + void update_start_pose(TOpendriveWorldPose &start,node_up_ref_t &node_refs,double distance); + void update_end_pose(TOpendriveWorldPose &end,node_up_ref_t &node_refs); public: /** * \brief Returns the resolution diff --git a/src/opendrive_road_node.cpp b/src/opendrive_road_node.cpp index 4631bab..40f7b06 100644 --- a/src/opendrive_road_node.cpp +++ b/src/opendrive_road_node.cpp @@ -297,7 +297,7 @@ void COpendriveRoadNode::clean_references(segment_up_ref_t &segment_refs,lane_up } for(parent_it=this->parents.begin();parent_it!=this->parents.end();) { - if(!parent_it->segment->updated(segment_refs) || !parent_it->lane->updated(lane_refs)) + if(!parent_it->segment->updated(segment_refs) && !parent_it->lane->updated(lane_refs)) parent_it=this->parents.erase(parent_it); else parent_it++; @@ -305,63 +305,35 @@ void COpendriveRoadNode::clean_references(segment_up_ref_t &segment_refs,lane_up // } } -void COpendriveRoadNode::update_start_pose(COpendriveLane *lane,TOpendriveWorldPose &start,double distance) +void COpendriveRoadNode::update_start_pose(TOpendriveWorldPose &start,node_up_ref_t &node_refs,double distance) { - std::vector<TOpendriveRoadNodeParent>::iterator parent_it; std::vector<COpendriveLink *>::iterator link_it; - TOpendriveRoadNodeParent *parent; this->pose=start; - // remove the references to all lanes and segments except for lane - for(parent_it=this->parents.begin();parent_it!=this->parents.end();) - { - if(parent_it->lane!=lane) - parent_it=this->parents.erase(parent_it); - else - { - parent=&(*parent_it); - parent_it++; - } - } // update the links for(link_it=this->links.begin();link_it!=this->links.end();) { - if((*link_it)->next==this) + if((*link_it)->next==this->get_original_node(node_refs)) { delete *link_it; link_it=this->links.erase(link_it); } else { - if((*link_it)->lane==lane) - { - parent->start_curvature=(*link_it)->get_curvature_at(distance); - (*link_it)->update_start_pose(start,parent->start_curvature); - } - else - (*link_it)->update_start_pose(start,0.0); + (*link_it)->update_start_pose(start,(*link_it)->get_curvature_at(distance)); link_it++; } } } -void COpendriveRoadNode::update_end_pose(COpendriveLane *lane,TOpendriveWorldPose &end,double distance) +void COpendriveRoadNode::update_end_pose(TOpendriveWorldPose &end,node_up_ref_t &node_refs) { - std::vector<TOpendriveRoadNodeParent>::iterator parent_it; std::vector<COpendriveLink *>::iterator link_it; - // remove the references to all lanes and segments except for lane - for(parent_it=this->parents.begin();parent_it!=this->parents.end();) - { - if(parent_it->lane!=lane) - parent_it=this->parents.erase(parent_it); - else - parent_it++; - } // update the links for(link_it=this->links.begin();link_it!=this->links.end();) { - if((*link_it)->prev==this) + if((*link_it)->prev==this->get_original_node(node_refs)) { delete *link_it; link_it=this->links.erase(link_it); -- GitLab