lethal233 / ms-thesis-project

GNU General Public License v3.0
1 stars 0 forks source link

Map Parser #10

Closed lethal233 closed 3 months ago

lethal233 commented 6 months ago

Get all crosswalks:

import lanelet2
import lanelet2_extension_python.utility.query as query
from lanelet2.projection import UtmProjector
from lanelet2.core import LaneletMap, Lanelet
from lanelet2.io import Origin
from config import MAPS_DIR, SUPPORTED_MAPS
from lanelet2_extension_python.projection import MGRSProjector

class MapLoader:

    def __init__(self, map_name: str):
        self.hd_map_path = f'~/Desktop/autoware_map/autoware_scenario_data/maps/{map_name}/lanelet2_map.osm'
        origin = self.get_first_reference_origin(self.hd_map_path)
        self.projector = MGRSProjector(origin)

        map_parser = VectorMapParser.instance()
        map_parser.lanelet_map = self.load_map()
        map_parser.projector = self.projector
        self.map_instance = map_parser

    def load_map(self) -> LaneletMap:
        self.lanelet_map = lanelet2.io.load(self.hd_map_path, self.projector)
        return self.lanelet_map

    def get_first_reference_origin(self, hd_map_path: str) -> Origin:
        with open(hd_map_path, 'r') as file:
            xml_data = file.read()

        root = ET.fromstring(xml_data)
        first_node = root.find('.//node')

        lat = float(first_node.get('lat'))
        lon = float(first_node.get('lon'))
        return Origin(lat, lon, 0)

class VectorMapParser:
    _instance = None
    lanelet_map: LaneletMap
    projector: MGRSProjector

    T = TypeVar('T')

    @classmethod
    def instance(cls):
        if cls._instance is None:
            cls._instance = cls.__new__(cls)
        return cls._instance

    def __init__(self):
        raise RuntimeError('Call instance() instead')

    def get_all_crosswalk(self):
        return query.crosswalkLanelets(query.laneletLayer(self.lanelet_map))
if __name__ == '__main__':
    MapLoader("ces2024_demo")
    for s in VectorMapParser.instance().get_all_crosswalk():
        print(s.attributes)

output is

location: urban one_way: yes speed_limit: 10 subtype: crosswalk type: lanelet 
location: urban one_way: yes speed_limit: 10 subtype: crosswalk type: lanelet 
location: urban one_way: yes speed_limit: 10 subtype: crosswalk type: lanelet 
location: urban one_way: yes speed_limit: 10 subtype: crosswalk type: lanelet 
...
lethal233 commented 5 months ago

to get whether a linestring is inverted or not:

lanelet_map.laneletLayer[3302].leftBound.inverted()
lanelet_map.laneletLayer[3289].leftBound.inverted()

returns

False
True
lethal233 commented 5 months ago

https://github.com/fzi-forschungszentrum-informatik/Lanelet2/blob/master/lanelet2_core/doc/LinestringTagging.md#as-lane-boundary

lethal233 commented 5 months ago

autoware lanelet2 python extension

https://github.com/autowarefoundation/autoware_common/blob/main/tmp/lanelet2_extension_python/example/example.py