285 lines
8.9 KiB
Python
Executable File
285 lines
8.9 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
# Copyright (c) 2019 Computer Vision Center (CVC) at the Universitat Autonoma de
|
|
# Barcelona (UAB).
|
|
#
|
|
# This work is licensed under the terms of the MIT license.
|
|
# For a copy, see <https://opensource.org/licenses/MIT>.
|
|
|
|
"""
|
|
Configure and inspect an instance of CARLA Simulator.
|
|
|
|
For further details, visit
|
|
https://carla.readthedocs.io/en/latest/configuring_the_simulation/
|
|
"""
|
|
|
|
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
|
|
|
|
import carla
|
|
|
|
import argparse
|
|
import datetime
|
|
import re
|
|
import socket
|
|
import textwrap
|
|
|
|
|
|
def get_ip(host):
|
|
if host in ['localhost', '127.0.0.1']:
|
|
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
try:
|
|
sock.connect(('10.255.255.255', 1))
|
|
host = sock.getsockname()[0]
|
|
except RuntimeError:
|
|
pass
|
|
finally:
|
|
sock.close()
|
|
return host
|
|
|
|
|
|
def find_weather_presets():
|
|
presets = [x for x in dir(carla.WeatherParameters) if re.match('[A-Z].+', x)]
|
|
return [(getattr(carla.WeatherParameters, x), x) for x in presets]
|
|
|
|
|
|
def list_options(client):
|
|
maps = [m.replace('/Game/Carla/Maps/', '') for m in client.get_available_maps()]
|
|
indent = 4 * ' '
|
|
def wrap(text):
|
|
return '\n'.join(textwrap.wrap(text, initial_indent=indent, subsequent_indent=indent))
|
|
print('weather presets:\n')
|
|
print(wrap(', '.join(x for _, x in find_weather_presets())) + '.\n')
|
|
print('available maps:\n')
|
|
print(wrap(', '.join(sorted(maps))) + '.\n')
|
|
|
|
|
|
def list_blueprints(world, bp_filter):
|
|
blueprint_library = world.get_blueprint_library()
|
|
blueprints = [bp.id for bp in blueprint_library.filter(bp_filter)]
|
|
print('available blueprints (filter %r):\n' % bp_filter)
|
|
for bp in sorted(blueprints):
|
|
print(' ' + bp)
|
|
print('')
|
|
|
|
|
|
def inspect(args, client):
|
|
address = '%s:%d' % (get_ip(args.host), args.port)
|
|
|
|
world = client.get_world()
|
|
elapsed_time = world.get_snapshot().timestamp.elapsed_seconds
|
|
elapsed_time = datetime.timedelta(seconds=int(elapsed_time))
|
|
|
|
actors = world.get_actors()
|
|
s = world.get_settings()
|
|
|
|
weather = 'Custom'
|
|
current_weather = world.get_weather()
|
|
for preset, name in find_weather_presets():
|
|
if current_weather == preset:
|
|
weather = name
|
|
|
|
if s.fixed_delta_seconds is None:
|
|
frame_rate = 'variable'
|
|
else:
|
|
frame_rate = '%.2f ms (%d FPS)' % (
|
|
1000.0 * s.fixed_delta_seconds,
|
|
1.0 / s.fixed_delta_seconds)
|
|
|
|
print('-' * 34)
|
|
print('address:% 26s' % address)
|
|
print('version:% 26s\n' % client.get_server_version())
|
|
print('map: % 22s' % world.get_map().name)
|
|
print('weather: % 22s\n' % weather)
|
|
print('time: % 22s\n' % elapsed_time)
|
|
print('frame rate: % 22s' % frame_rate)
|
|
print('rendering: % 22s' % ('disabled' if s.no_rendering_mode else 'enabled'))
|
|
print('sync mode: % 22s\n' % ('disabled' if not s.synchronous_mode else 'enabled'))
|
|
print('actors: % 22d' % len(actors))
|
|
print(' * spectator:% 20d' % len(actors.filter('spectator')))
|
|
print(' * static: % 20d' % len(actors.filter('static.*')))
|
|
print(' * traffic: % 20d' % len(actors.filter('traffic.*')))
|
|
print(' * vehicles: % 20d' % len(actors.filter('vehicle.*')))
|
|
print(' * walkers: % 20d' % len(actors.filter('walker.*')))
|
|
print('-' * 34)
|
|
|
|
|
|
def main():
|
|
argparser = argparse.ArgumentParser(
|
|
description=__doc__)
|
|
argparser.add_argument(
|
|
'--host',
|
|
metavar='H',
|
|
default='localhost',
|
|
help='IP of the host CARLA Simulator (default: localhost)')
|
|
argparser.add_argument(
|
|
'-p', '--port',
|
|
metavar='P',
|
|
default=2000,
|
|
type=int,
|
|
help='TCP port of CARLA Simulator (default: 2000)')
|
|
argparser.add_argument(
|
|
'-d', '--default',
|
|
action='store_true',
|
|
help='set default settings')
|
|
argparser.add_argument(
|
|
'-m', '--map',
|
|
help='load a new map, use --list to see available maps')
|
|
argparser.add_argument(
|
|
'-r', '--reload-map',
|
|
action='store_true',
|
|
help='reload current map')
|
|
argparser.add_argument(
|
|
'--delta-seconds',
|
|
metavar='S',
|
|
type=float,
|
|
help='set fixed delta seconds, zero for variable frame rate')
|
|
argparser.add_argument(
|
|
'--fps',
|
|
metavar='N',
|
|
type=float,
|
|
help='set fixed FPS, zero for variable FPS (similar to --delta-seconds)')
|
|
argparser.add_argument(
|
|
'--rendering',
|
|
action='store_true',
|
|
help='enable rendering')
|
|
argparser.add_argument(
|
|
'--no-rendering',
|
|
action='store_true',
|
|
help='disable rendering')
|
|
argparser.add_argument(
|
|
'--no-sync',
|
|
action='store_true',
|
|
help='disable synchronous mode')
|
|
argparser.add_argument(
|
|
'--weather',
|
|
help='set weather preset, use --list to see available presets')
|
|
argparser.add_argument(
|
|
'-i', '--inspect',
|
|
action='store_true',
|
|
help='inspect simulation')
|
|
argparser.add_argument(
|
|
'-l', '--list',
|
|
action='store_true',
|
|
help='list available options')
|
|
argparser.add_argument(
|
|
'-b', '--list-blueprints',
|
|
metavar='FILTER',
|
|
help='list available blueprints matching FILTER (use \'*\' to list them all)')
|
|
argparser.add_argument(
|
|
'-x', '--xodr-path',
|
|
metavar='XODR_FILE_PATH',
|
|
help='load a new map with a minimum physical road representation of the provided OpenDRIVE')
|
|
|
|
if len(sys.argv) < 2:
|
|
argparser.print_help()
|
|
return
|
|
|
|
args = argparser.parse_args()
|
|
|
|
client = carla.Client(args.host, args.port, worker_threads=1)
|
|
client.set_timeout(10.0)
|
|
|
|
if args.default:
|
|
args.rendering = True
|
|
args.delta_seconds = 0.0
|
|
args.weather = 'Default'
|
|
args.no_sync = True
|
|
|
|
if args.map is not None:
|
|
print('load map %r.' % args.map)
|
|
world = client.load_world(args.map)
|
|
elif args.reload_map:
|
|
print('reload map.')
|
|
world = client.reload_world()
|
|
elif args.xodr_path is not None:
|
|
if os.path.exists(args.xodr_path):
|
|
with open(args.xodr_path) as od_file:
|
|
try:
|
|
data = od_file.read()
|
|
except OSError:
|
|
print('file could not be readed.')
|
|
sys.exit()
|
|
print('load opendrive map %r.' % os.path.basename(args.xodr_path))
|
|
vertex_distance = 2.0 # in meters
|
|
max_road_length = 500.0 # in meters
|
|
wall_height = 1.0 # in meters
|
|
extra_width = 0.6 # in meters
|
|
world = client.generate_opendrive_world(
|
|
data, carla.OpendriveGenerationParameters(
|
|
vertex_distance=vertex_distance,
|
|
max_road_length=max_road_length,
|
|
wall_height=wall_height,
|
|
additional_width=extra_width,
|
|
smooth_junctions=True,
|
|
enable_mesh_visibility=True))
|
|
else:
|
|
print('file not found.')
|
|
|
|
else:
|
|
world = client.get_world()
|
|
|
|
settings = world.get_settings()
|
|
|
|
if args.no_rendering:
|
|
print('disable rendering.')
|
|
settings.no_rendering_mode = True
|
|
elif args.rendering:
|
|
print('enable rendering.')
|
|
settings.no_rendering_mode = False
|
|
|
|
if args.no_sync:
|
|
print('disable synchronous mode.')
|
|
settings.synchronous_mode = False
|
|
|
|
if args.delta_seconds is not None:
|
|
settings.fixed_delta_seconds = args.delta_seconds
|
|
elif args.fps is not None:
|
|
settings.fixed_delta_seconds = (1.0 / args.fps) if args.fps > 0.0 else 0.0
|
|
|
|
if args.delta_seconds is not None or args.fps is not None:
|
|
if settings.fixed_delta_seconds > 0.0:
|
|
print('set fixed frame rate %.2f milliseconds (%d FPS)' % (
|
|
1000.0 * settings.fixed_delta_seconds,
|
|
1.0 / settings.fixed_delta_seconds))
|
|
else:
|
|
print('set variable frame rate.')
|
|
settings.fixed_delta_seconds = None
|
|
|
|
world.apply_settings(settings)
|
|
|
|
if args.weather is not None:
|
|
if not hasattr(carla.WeatherParameters, args.weather):
|
|
print('ERROR: weather preset %r not found.' % args.weather)
|
|
else:
|
|
print('set weather preset %r.' % args.weather)
|
|
world.set_weather(getattr(carla.WeatherParameters, args.weather))
|
|
|
|
if args.inspect:
|
|
inspect(args, client)
|
|
if args.list:
|
|
list_options(client)
|
|
if args.list_blueprints:
|
|
list_blueprints(world, args.list_blueprints)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
try:
|
|
|
|
main()
|
|
|
|
except KeyboardInterrupt:
|
|
print('\nCancelled by user. Bye!')
|
|
except RuntimeError as e:
|
|
print(e)
|