carla/PythonAPI/util/osm_to_xodr.py

108 lines
2.8 KiB
Python
Raw Normal View History

2021-10-11 21:56:37 +08:00
""" Convert OpenStreetMap file to OpenDRIVE file. """
import argparse
import glob
import os
import sys
try:
sys.path.append(glob.glob('../carla/dist/carla-*%d.%d-%s.egg' % (
sys.version_info.major,
sys.version_info.minor,
'win-amd64' if os.name == 'nt' else 'linux-x86_64'))[0])
except IndexError:
pass
2021-10-11 21:56:37 +08:00
import carla
def convert(args):
# Read the .osm data
with open(args.input_path, mode="r", encoding="utf-8") as osmFile:
osm_data = osmFile.read()
# Define the desired settings
settings = carla.Osm2OdrSettings()
# Set OSM road types to export to OpenDRIVE
settings.set_osm_way_types([
"motorway",
"motorway_link",
"trunk",
"trunk_link",
"primary",
"primary_link",
"secondary",
"secondary_link",
"tertiary",
"tertiary_link",
"unclassified",
"residential"
])
settings.default_lane_width = args.lane_width
settings.generate_traffic_lights = args.traffic_lights
settings.all_junctions_with_traffic_lights = args.all_junctions_lights
settings.center_map = args.center_map
# Convert to .xodr
xodr_data = carla.Osm2Odr.convert(osm_data, settings)
# save opendrive file
with open(args.output_path, "w", encoding="utf-8") as xodrFile:
xodrFile.write(xodr_data)
def main():
argparser = argparse.ArgumentParser(
description=__doc__)
argparser.add_argument(
'-i', '--input-path',
metavar='OSM_FILE_PATH',
help='set the input OSM file path')
argparser.add_argument(
'-o', '--output-path',
metavar='XODR_FILE_PATH',
help='set the output XODR file path')
argparser.add_argument(
'--lane-width',
default=6.0,
help='width of each road lane in meters')
argparser.add_argument(
'--traffic-lights',
default='store_true',
help='enable traffic light generation from OSM data')
argparser.add_argument(
'--all-junctions-lights',
default='store_true',
help='set traffic lights for all junctions')
argparser.add_argument(
'--center-map',
default='store_true',
help='set center of map to the origin coordinates')
if len(sys.argv) < 2:
argparser.print_help()
return
args = argparser.parse_args()
if args.input_path is None or not os.path.exists(args.input_path):
print('input file not found.')
if args.output_path is None:
print('output file path not found.')
try:
convert()
except:
print('\nAn error has occurred in conversion.')
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print('\nCancelled by user. Bye!')
except RuntimeError as e:
print(e)