def load_opendriveFile(self, path): """ Args: path: Returns: """ filename = os.path.basename(path) self.inputOpenDriveFile.setText(filename) # Load road network and print some statistics try: fh = open(path, "r") openDriveXml = parse_opendrive(etree.parse(fh).getroot()) fh.close() except (etree.XMLSyntaxError) as e: errorMsg = "XML Syntax Error: {}".format(e) QMessageBox.warning( self, "OpenDRIVE error", "There was an error during the loading of the selected OpenDRIVE file.\n\n{}" .format(errorMsg), QMessageBox.Ok, ) return except (TypeError, AttributeError, ValueError) as e: errorMsg = "Value Error: {}".format(e) QMessageBox.warning( self, "OpenDRIVE error", "There was an error during the loading of the selected OpenDRIVE file.\n\n{}" .format(errorMsg), QMessageBox.Ok, ) return self.loadedRoadNetwork = Network() self.loadedRoadNetwork.load_opendrive(openDriveXml) self.statsText.setText( """Name: {}<br>Version: {}<br>Date: {}<br><br>OpenDRIVE Version {}.{}<br><br>Number of roads: {}<br>Total length of road network: {:.2f} meters""".format( openDriveXml.header.name if openDriveXml.header.name else "<i>unset</i>", openDriveXml.header.version, openDriveXml.header.date, openDriveXml.header.revMajor, openDriveXml.header.revMinor, len(openDriveXml.roads), sum([road.length for road in openDriveXml.roads]), )) self.exportCommonRoadButton.setDisabled(False) self.viewOutputButton.setDisabled(False)
def open_drive_loader(self, fn): fi = open(fn.format(os.path.dirname(os.path.realpath(__file__))), "r") tree = etree.parse(fi) root = tree.getroot() geoReference = root[0][0].text open_drive = parse_opendrive(root) road_network = Network() road_network.load_opendrive(open_drive) return road_network.export_commonroad_scenario(), geoReference
def convert_opendrive(opendrive: OpenDrive) -> Scenario: """Convert an existing OpenDrive object to a CommonRoad Scenario. Args: opendrive: Parsed in OpenDrive map. Returns: A commonroad scenario with the map represented by lanelets. """ road_network = Network() road_network.load_opendrive(opendrive) return road_network.export_commonroad_scenario()
def convert(self, output_file_path): # Open File file_in = open(self.input_file_path.format(os.path.dirname(os.path.realpath(__file__))), "r") # Parse XML tree = etree.parse(file_in) root = tree.getroot() open_drive = parse_opendrive(root) # Access header = root.find('header') geoReference = header.find('geoReference').text # Build CommonRoad Lanelet1 network road_network = Network() road_network.load_opendrive(open_drive) simple_geoReference = geoReference print('Found geoReference: ' + simple_geoReference) if '+geoidgrids=' in simple_geoReference: print('Ignoring +geoidgrids in projection as it is not currently supported') geoidgrids_tag = re.search('.*?(\+geoidgrids\=.*?\ +).*$', simple_geoReference).group(1) simple_geoReference = simple_geoReference.replace(geoidgrids_tag, '') print('Used conversion projection is ' + simple_geoReference) file_in.close() # Convert to Lanelet2 OSM osm_converter = L2OSMConverter(simple_geoReference) osm_map = osm_converter(road_network.export_commonroad_scenario()) # Add georeference back to osm geo_tag = etree.Element('geoReference') geo_tag.text = geoReference osm_map.insert(0, geo_tag) with open(output_file_path, "wb") as file_out: file_out.write( etree.tostring( osm_map, xml_declaration=True, encoding="UTF-8", pretty_print=True ) )
class MainWindow(QWidget): """ """ def __init__(self, argv): super().__init__() self.loadedRoadNetwork = None self._initUserInterface() self.show() if len(argv) >= 2: self.load_opendriveFile(argv[1]) self.viewLaneletNetwork() def _initUserInterface(self): """ """ self.setWindowTitle("OpenDRIVE 2 Lanelets Converter") self.setFixedSize(560, 345) self.loadButton = QPushButton("Load OpenDRIVE", self) self.loadButton.setToolTip( "Load a OpenDRIVE scenario within a *.xodr file") self.loadButton.move(10, 10) self.loadButton.resize(130, 35) self.loadButton.clicked.connect(self.openOpenDriveFileDialog) self.inputOpenDriveFile = QLineEdit(self) self.inputOpenDriveFile.move(150, 10) self.inputOpenDriveFile.resize(400, 35) self.inputOpenDriveFile.setReadOnly(True) self.statsText = QLabel(self) self.statsText.move(10, 55) self.statsText.resize(540, 235) self.statsText.setAlignment(Qt.AlignLeft | Qt.AlignTop) self.statsText.setTextFormat(Qt.RichText) self.exportCommonRoadButton = QPushButton("Export as CommonRoad", self) self.exportCommonRoadButton.move(10, 300) self.exportCommonRoadButton.resize(170, 35) self.exportCommonRoadButton.setDisabled(True) self.exportCommonRoadButton.clicked.connect(self.exportAsCommonRoad) self.viewOutputButton = QPushButton("View Road Network", self) self.viewOutputButton.move(190, 300) self.viewOutputButton.resize(170, 35) self.viewOutputButton.setDisabled(True) self.viewOutputButton.clicked.connect(self.viewLaneletNetwork) def resetOutputElements(self): """ """ self.exportCommonRoadButton.setDisabled(True) self.viewOutputButton.setDisabled(True) def openOpenDriveFileDialog(self): """ """ self.resetOutputElements() path, _ = QFileDialog.getOpenFileName( self, "QFileDialog.getOpenFileName()", "", "OpenDRIVE files *.xodr (*.xodr)", options=QFileDialog.Options(), ) if not path: return self.load_opendriveFile(path) def load_opendriveFile(self, path): """ Args: path: Returns: """ filename = os.path.basename(path) self.inputOpenDriveFile.setText(filename) # Load road network and print some statistics try: fh = open(path, "r") openDriveXml = parse_opendrive(etree.parse(fh).getroot()) fh.close() except (etree.XMLSyntaxError) as e: errorMsg = "XML Syntax Error: {}".format(e) QMessageBox.warning( self, "OpenDRIVE error", "There was an error during the loading of the selected OpenDRIVE file.\n\n{}" .format(errorMsg), QMessageBox.Ok, ) return except (TypeError, AttributeError, ValueError) as e: errorMsg = "Value Error: {}".format(e) QMessageBox.warning( self, "OpenDRIVE error", "There was an error during the loading of the selected OpenDRIVE file.\n\n{}" .format(errorMsg), QMessageBox.Ok, ) return self.loadedRoadNetwork = Network() self.loadedRoadNetwork.load_opendrive(openDriveXml) self.statsText.setText( """Name: {}<br>Version: {}<br>Date: {}<br><br>OpenDRIVE Version {}.{}<br><br>Number of roads: {}<br>Total length of road network: {:.2f} meters""".format( openDriveXml.header.name if openDriveXml.header.name else "<i>unset</i>", openDriveXml.header.version, openDriveXml.header.date, openDriveXml.header.revMajor, openDriveXml.header.revMinor, len(openDriveXml.roads), sum([road.length for road in openDriveXml.roads]), )) self.exportCommonRoadButton.setDisabled(False) self.viewOutputButton.setDisabled(False) def exportAsCommonRoad(self): """ """ if not self.loadedRoadNetwork: return path, _ = QFileDialog.getSaveFileName( self, "QFileDialog.getSaveFileName()", "", "CommonRoad files *.xml (*.xml)", options=QFileDialog.Options(), ) if not path: return try: with open(path, "w") as fh: writer = CommonRoadFileWriter( scenario=self.loadedRoadNetwork.export_commonroad_scenario( ), planning_problem_set=None, author="", affiliation="", source="OpenDRIVE 2 Lanelet Converter", tags="", ) writer.write_scenario_to_file_io(fh) except (IOError) as e: QMessageBox.critical( self, "CommonRoad file not created!", "The CommonRoad file was not exported due to an error.\n\n{}". format(e), QMessageBox.Ok, ) return QMessageBox.information( self, "CommonRoad file created!", "The CommonRoad file was successfully exported.", QMessageBox.Ok, ) def viewLaneletNetwork(self): """ """ class ViewerWindow(QMainWindow): """ """ def __init__(self, parent=None): super(ViewerWindow, self).__init__(parent) self.viewer = ViewerWidget(self) self.setCentralWidget(self.viewer) viewer = ViewerWindow(self) viewer.viewer.openScenario( self.loadedRoadNetwork.export_commonroad_scenario()) viewer.show()