2018-03-15 00:54:19 +08:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
|
|
# Copyright (c) 2017 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>.
|
|
|
|
|
|
|
|
"""A client for benchmarking the CARLA server."""
|
|
|
|
|
|
|
|
import argparse
|
|
|
|
import logging
|
|
|
|
import os
|
|
|
|
import random
|
|
|
|
import sys
|
|
|
|
import time
|
|
|
|
|
|
|
|
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
|
|
|
|
|
|
|
|
import carla
|
|
|
|
|
|
|
|
from carla import sensor
|
|
|
|
from carla.client import make_carla_client
|
|
|
|
from carla.sensor import Camera
|
|
|
|
from carla.settings import CarlaSettings
|
|
|
|
from carla.util import StopWatch
|
|
|
|
|
|
|
|
TEXT = \
|
|
|
|
"""===========================
|
|
|
|
Annotated {count:d} frames.
|
|
|
|
---------------------------
|
|
|
|
average = {avg:.2f} FPS
|
|
|
|
maximum = {max:.2f} FPS
|
|
|
|
minimum = {min:.2f} FPS
|
|
|
|
===========================
|
|
|
|
"""
|
|
|
|
|
2018-03-15 21:35:49 +08:00
|
|
|
def make_base_settings():
|
|
|
|
return CarlaSettings(
|
|
|
|
WeatherId=1,
|
|
|
|
SendNonPlayerAgentsInfo=False,
|
|
|
|
SynchronousMode=False,
|
|
|
|
NumberOfVehicles=20,
|
|
|
|
NumberOfPedestrians=30,
|
|
|
|
SeedVehicles=123456789,
|
|
|
|
SeedPedestrians=123456789,
|
|
|
|
QualityLevel='Epic')
|
|
|
|
|
2018-03-20 17:45:33 +08:00
|
|
|
|
2018-03-15 00:54:19 +08:00
|
|
|
def generate_settings_scenario_001():
|
2018-03-20 17:45:33 +08:00
|
|
|
logging.info('Scenario 001: no sensors')
|
2018-03-15 21:35:49 +08:00
|
|
|
return make_base_settings()
|
2018-03-15 00:54:19 +08:00
|
|
|
|
|
|
|
|
|
|
|
def generate_settings_scenario_002():
|
2018-03-20 17:45:33 +08:00
|
|
|
logging.info('Scenario 002: no sensors, no agents at all')
|
2018-03-15 21:35:49 +08:00
|
|
|
settings = make_base_settings()
|
2018-03-20 17:45:33 +08:00
|
|
|
settings.set(NumberOfVehicles=0, NumberOfPedestrians=0)
|
2018-03-15 00:54:19 +08:00
|
|
|
return settings
|
|
|
|
|
|
|
|
|
|
|
|
def generate_settings_scenario_003():
|
2018-03-20 17:45:33 +08:00
|
|
|
logging.info('Scenario 003: no sensors, no pedestrians')
|
2018-03-15 21:35:49 +08:00
|
|
|
settings = make_base_settings()
|
2018-03-20 17:45:33 +08:00
|
|
|
settings.set(NumberOfPedestrians=0)
|
2018-03-15 00:54:19 +08:00
|
|
|
return settings
|
|
|
|
|
|
|
|
|
|
|
|
def generate_settings_scenario_004():
|
2018-03-20 17:45:33 +08:00
|
|
|
logging.info('Scenario 004: no sensors, no vehicles')
|
2018-03-15 21:35:49 +08:00
|
|
|
settings = make_base_settings()
|
2018-03-20 17:45:33 +08:00
|
|
|
settings.set(NumberOfVehicles=0)
|
2018-03-15 00:54:19 +08:00
|
|
|
return settings
|
|
|
|
|
|
|
|
|
|
|
|
def generate_settings_scenario_005():
|
2018-03-20 17:45:33 +08:00
|
|
|
logging.info('Scenario 005: no sensors, hard rain')
|
2018-03-15 21:35:49 +08:00
|
|
|
settings = make_base_settings()
|
2018-03-20 17:45:33 +08:00
|
|
|
settings.set(WeatherId=13)
|
2018-03-15 00:54:19 +08:00
|
|
|
return settings
|
|
|
|
|
|
|
|
|
|
|
|
def generate_settings_scenario_006():
|
2018-03-20 17:45:33 +08:00
|
|
|
logging.info('Scenario 006: no sensors, sending agents info')
|
|
|
|
settings = make_base_settings()
|
|
|
|
settings.set(SendNonPlayerAgentsInfo=True)
|
|
|
|
return settings
|
|
|
|
|
|
|
|
|
|
|
|
def generate_settings_scenario_007():
|
|
|
|
logging.info('Scenario 007: single camera RGB')
|
|
|
|
settings = make_base_settings()
|
|
|
|
settings.add_sensor(Camera('DefaultRGBCamera'))
|
|
|
|
return settings
|
|
|
|
|
|
|
|
|
|
|
|
def generate_settings_scenario_008():
|
|
|
|
logging.info('Scenario 008: single camera Depth')
|
2018-03-15 21:35:49 +08:00
|
|
|
settings = make_base_settings()
|
2018-03-15 00:54:19 +08:00
|
|
|
settings.add_sensor(Camera('DefaultDepthCamera', PostProcessing='Depth'))
|
2018-03-20 17:45:33 +08:00
|
|
|
return settings
|
|
|
|
|
|
|
|
|
|
|
|
def generate_settings_scenario_009():
|
|
|
|
logging.info('Scenario 009: single camera SemanticSegmentation')
|
|
|
|
settings = make_base_settings()
|
2018-03-15 00:54:19 +08:00
|
|
|
settings.add_sensor(Camera('DefaultSemSegCamera', PostProcessing='SemanticSegmentation'))
|
|
|
|
return settings
|
|
|
|
|
|
|
|
|
2018-03-20 17:45:33 +08:00
|
|
|
def generate_settings_scenario_010():
|
|
|
|
logging.info('Scenario 010: 3 cameras')
|
2018-03-15 21:35:49 +08:00
|
|
|
settings = make_base_settings()
|
2018-03-20 17:45:33 +08:00
|
|
|
settings.add_sensor(Camera('DefaultRGBCamera'))
|
|
|
|
settings.add_sensor(Camera('DefaultDepthCamera', PostProcessing='Depth'))
|
|
|
|
settings.add_sensor(Camera('DefaultSemSegCamera', PostProcessing='SemanticSegmentation'))
|
2018-03-15 00:54:19 +08:00
|
|
|
return settings
|
|
|
|
|
|
|
|
|
|
|
|
class FPSWatch(object):
|
|
|
|
def __init__(self):
|
|
|
|
self.stop_watch = StopWatch()
|
|
|
|
self.sum = 0.0
|
|
|
|
self.count = 0
|
|
|
|
self.max = 0.0
|
|
|
|
self.min = float("inf")
|
|
|
|
|
|
|
|
def annotate(self):
|
|
|
|
self.stop_watch.stop()
|
|
|
|
fps = 1.0 / self.stop_watch.seconds()
|
|
|
|
self.sum += fps
|
|
|
|
self.count += 1
|
|
|
|
self.max = max(self.max, fps)
|
|
|
|
self.min = min(self.min, fps)
|
|
|
|
self.stop_watch.restart()
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return TEXT.format(
|
|
|
|
count=self.count,
|
|
|
|
avg=self.sum/self.count,
|
|
|
|
max=self.max,
|
|
|
|
min=self.min)
|
|
|
|
|
|
|
|
|
|
|
|
def run_carla_client(args, settings_generators):
|
|
|
|
with make_carla_client(args.host, args.port, timeout=25) as client:
|
|
|
|
for settings_generator in settings_generators:
|
|
|
|
scene = client.load_settings(settings_generator())
|
|
|
|
client.start_episode(0)
|
|
|
|
watch = FPSWatch()
|
|
|
|
for frame in range(0, 3000):
|
|
|
|
measurements, sensor_data = client.read_data()
|
|
|
|
client.send_control(measurements.player_measurements.autopilot_control)
|
|
|
|
watch.annotate()
|
|
|
|
print(str(watch))
|
|
|
|
print('done.')
|
|
|
|
|
2018-03-15 21:35:49 +08:00
|
|
|
|
2018-03-15 00:54:19 +08:00
|
|
|
def main():
|
|
|
|
argparser = argparse.ArgumentParser(description=__doc__)
|
|
|
|
argparser.add_argument(
|
|
|
|
'-v', '--verbose',
|
|
|
|
action='store_true',
|
|
|
|
dest='debug',
|
|
|
|
help='print debug information')
|
|
|
|
argparser.add_argument(
|
|
|
|
'--log',
|
|
|
|
metavar='LOG_FILE',
|
|
|
|
default=None,
|
|
|
|
help='print output to file')
|
|
|
|
argparser.add_argument(
|
|
|
|
'--host',
|
|
|
|
metavar='H',
|
|
|
|
default='localhost',
|
|
|
|
help='IP of the host server (default: localhost)')
|
|
|
|
argparser.add_argument(
|
|
|
|
'-p', '--port',
|
|
|
|
metavar='P',
|
|
|
|
default=2000,
|
|
|
|
type=int,
|
|
|
|
help='TCP port to listen to (default: 2000)')
|
|
|
|
argparser.add_argument(
|
|
|
|
'-s', '--scenario',
|
|
|
|
metavar='N',
|
|
|
|
default=-1,
|
|
|
|
type=int,
|
|
|
|
help='benchmark scenario to use')
|
|
|
|
argparser.add_argument(
|
|
|
|
'-l', '--list',
|
|
|
|
action='store_true',
|
|
|
|
help='list available benchmark scenarios')
|
|
|
|
|
|
|
|
args = argparser.parse_args()
|
|
|
|
|
|
|
|
logging_config = {
|
|
|
|
'format': '%(levelname)s: %(message)s',
|
|
|
|
'level': logging.DEBUG if args.debug else logging.INFO
|
|
|
|
}
|
|
|
|
if args.log:
|
|
|
|
logging_config['filename'] = args.log
|
|
|
|
logging_config['filemode'] = 'w+'
|
|
|
|
logging.basicConfig(**logging_config)
|
|
|
|
|
|
|
|
self_module = sys.modules[__name__]
|
|
|
|
generators = sorted(x for x in dir(self_module) if x.startswith('generate_settings_scenario_'))
|
|
|
|
|
|
|
|
if args.list:
|
|
|
|
for generator_name in generators:
|
|
|
|
getattr(self_module, generator_name)()
|
|
|
|
return
|
|
|
|
|
|
|
|
if args.scenario == -1:
|
|
|
|
generators_to_use = generators
|
|
|
|
elif args.scenario < 1 or args.scenario > len(generators):
|
|
|
|
logging.error('invalid scenario %d', args.scenario)
|
|
|
|
sys.exit(1)
|
|
|
|
else:
|
|
|
|
generators_to_use = [generators[args.scenario - 1]]
|
|
|
|
|
|
|
|
settings_generators = [getattr(self_module, x) for x in generators_to_use]
|
|
|
|
|
|
|
|
logging.info('listening to server %s:%s', args.host, args.port)
|
|
|
|
|
|
|
|
while True:
|
|
|
|
try:
|
|
|
|
|
|
|
|
run_carla_client(args, settings_generators)
|
|
|
|
return
|
|
|
|
|
|
|
|
except AssertionError as assertion:
|
|
|
|
raise assertion
|
|
|
|
except Exception as exception:
|
|
|
|
logging.error('exception: %s', exception)
|
|
|
|
time.sleep(1)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
|
|
|
try:
|
|
|
|
main()
|
|
|
|
except KeyboardInterrupt:
|
|
|
|
print('\nCancelled by user. Bye!')
|