Browse Source

change tool/map_lanetoxodr. add road noavoid support.

yuchuli 3 years ago
parent
commit
7396ed7838

+ 48 - 5
src/common/common/xodr/OpenDrive/OpenDriveXmlParser.cpp

@@ -207,11 +207,15 @@ bool OpenDriveXmlParser::ReadRoad(TiXmlElement *node)
         bProc = ReadRoadBorrows(road, subNode);
         if(bProc == false)
         {
-            TiXmlPrinter *printer = new TiXmlPrinter();
-            subNode->Accept(printer );//保存该节点及其子节点到字符串
-            std::string str = printer->Str();
-            road->GetUserData()->push_back(str);
- //           road->getroadb ->push_back(str);
+            bProc = ReadRoadNoavoids(road,subNode);
+            if(bProc == false)
+            {
+                TiXmlPrinter *printer = new TiXmlPrinter();
+                subNode->Accept(printer );//保存该节点及其子节点到字符串
+                std::string str = printer->Str();
+                road->GetUserData()->push_back(str);
+                //           road->getroadb ->push_back(str);
+            }
         }
         subNode=subNode->NextSiblingElement("userData");
     }
@@ -1689,6 +1693,45 @@ bool OpenDriveXmlParser::ReadRoadBorrow(Road *road, TiXmlElement *node)
     return true;
 }
 
+//--------------
+bool OpenDriveXmlParser::ReadRoadNoavoids(Road * road, TiXmlElement *node)
+{
+    string strcode;
+    if(node->QueryStringAttribute("code",&strcode) != TIXML_SUCCESS)
+    {
+        return false;
+    }
+    if(strcode != "roadnoavoid")
+    {
+        return false;
+    }
+
+    TiXmlElement *subNode = node->FirstChildElement("roadnoavoid");
+    while (subNode)
+    {
+        ReadRoadNoavoid(road, subNode);
+        subNode=subNode->NextSiblingElement("roadnoavoid");
+    }
+
+    return true;
+}
+
+bool OpenDriveXmlParser::ReadRoadNoavoid(Road * road,TiXmlElement * node)
+{
+    double s;
+    double length;
+    int checker=TIXML_SUCCESS;
+    checker+=node->QueryDoubleAttribute("sOffset",&s);
+    checker+=node->QueryDoubleAttribute("length",&length);
+    if(checker != TIXML_SUCCESS)
+    {
+        cout<<"Error parsing Road Noavoid attributes"<<endl;
+        return false;
+    }
+    road->AddRoadNoavoid(s,length);
+    return true;
+}
+
 //--------------
 
 bool OpenDriveXmlParser::ReadSignals (Road* road, TiXmlElement *node)

+ 3 - 0
src/common/common/xodr/OpenDrive/OpenDriveXmlParser.h

@@ -69,6 +69,9 @@ public:
 
     bool ReadRoadBorrows(Road * road, TiXmlElement *node);
     bool ReadRoadBorrow(Road * road,TiXmlElement * node);
+
+    bool ReadRoadNoavoids(Road * road, TiXmlElement *node);
+    bool ReadRoadNoavoid(Road * road,TiXmlElement * node);
 	//--------------
 
 	bool ReadObjects (Road* road, TiXmlElement *node);

+ 34 - 0
src/common/common/xodr/OpenDrive/OpenDriveXmlWriter.cpp

@@ -184,6 +184,11 @@ bool OpenDriveXmlWriter::WriteRoad(TiXmlElement *node, Road *road)
         WriteRoadBorrows(nodeRoad,road);
     }
 
+    if(road->GetRoadNoavoidCount()>0)
+    {
+        WriteRoadNoavoids(nodeRoad,road);
+    }
+
 	/*
 	//Proceed to Surface
 	subNode=node->FirstChildElement("surface");
@@ -1511,6 +1516,35 @@ bool OpenDriveXmlWriter::WriteRoadBorrows(TiXmlElement *node, Road *road)
 }
 //--------------
 
+bool OpenDriveXmlWriter::WriteRoadNoavoids(TiXmlElement *node, Road* road)
+{
+    TiXmlElement* nodeRoadNoavoids = new TiXmlElement("userData");
+    nodeRoadNoavoids->SetAttribute("code","roadnoavoid");
+    node->LinkEndChild(nodeRoadNoavoids);
+
+    unsigned int lRoadNoavoidCount = road->GetRoadNoavoidCount();
+    for(unsigned int i=0; i<lRoadNoavoidCount; i++)
+    {
+        WriteRoadNoavoid(nodeRoadNoavoids, road->GetRoadNoavoid(i));
+    }
+
+    return true;
+}
+
+//--------------
+
+bool OpenDriveXmlWriter::WriteRoadNoavoid(TiXmlElement *node,RoadNoavoid * pRoadNoavoid)
+{
+    TiXmlElement* nodeRoadNoavoid = new TiXmlElement("roadnoavoid");
+    node->LinkEndChild(nodeRoadNoavoid);
+
+    nodeRoadNoavoid->SetDoubleAttribute("sOffset",pRoadNoavoid->GetS());
+    nodeRoadNoavoid->SetDoubleAttribute("length",pRoadNoavoid->GetLength());
+    return true;
+}
+
+//--------------
+
 bool OpenDriveXmlWriter::WriteSignals (TiXmlElement *node, Road* road)
 {
 	TiXmlElement* nodeSignals = new TiXmlElement("signals");

+ 2 - 0
src/common/common/xodr/OpenDrive/OpenDriveXmlWriter.h

@@ -67,6 +67,8 @@ public:
     bool WriteLaneBorder(TiXmlElement *node, LaneBorder* laneWidth);
 	//--------------
 
+    bool WriteRoadNoavoids(TiXmlElement *node, Road* road);
+    bool WriteRoadNoavoid(TiXmlElement *node,RoadNoavoid * pRoadNoavoid);
     bool WriteRoadBorrows(TiXmlElement *node, Road* road);
     bool WriteRoadBorrow(TiXmlElement *node,RoadBorrow * pRoadBorrow);
 	bool WriteObjects (TiXmlElement *node, Road* road);

+ 2 - 0
src/common/common/xodr/OpenDrive/Road.cpp

@@ -63,6 +63,7 @@ Road::Road (const Road& road)
 	mSignalsVector=road.mSignalsVector;
     mLaneOffsetVector=road.mLaneOffsetVector;
     mRoadBorrowVector = road.mRoadBorrowVector;
+    mRoadNoavoidVector = road.mRoadNoavoidVector;
 
 }
 
@@ -107,6 +108,7 @@ const Road& Road::operator=(const Road& otherRoad)
 		mSignalsVector=otherRoad.mSignalsVector;
         mLaneOffsetVector=otherRoad.mLaneOffsetVector;
         mRoadBorrowVector = otherRoad.mRoadBorrowVector;
+        mRoadNoavoidVector = otherRoad.mRoadNoavoidVector;
 	}
 	return *this;
 }