Exemplo n.º 1
0
    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
Exemplo n.º 3
0
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
                )
            )
Exemplo n.º 5
0
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()