327 lines
10 KiB
Python
327 lines
10 KiB
Python
#!/usr/bin/env python
|
|
|
|
"""
|
|
Script to control weather parameters in simulations
|
|
"""
|
|
|
|
import glob
|
|
import os
|
|
import sys
|
|
import argparse
|
|
|
|
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
|
|
|
|
SUN_PRESETS = {
|
|
'day': (45.0, 0.0),
|
|
'night': (-90.0, 0.0),
|
|
'sunset': (0.5, 0.0)}
|
|
|
|
WEATHER_PRESETS = {
|
|
'clear': [10.0, 0.0, 0.0, 5.0, 0.0, 0.0, 0.2, 0.0, 0.0, 0.0, 0.0331, 0.0],
|
|
'overcast': [80.0, 0.0, 0.0, 50.0, 2.0, 0.75, 0.1, 10.0, 0.0, 0.03, 0.0331, 0.0],
|
|
'rain': [100.0, 80.0, 90.0, 100.0, 7.0, 0.75, 0.1, 100.0, 0.0, 0.03, 0.0331, 0.0]}
|
|
|
|
CAR_LIGHTS = {
|
|
'None' : [carla.VehicleLightState.NONE],
|
|
'Position' : [carla.VehicleLightState.Position],
|
|
'LowBeam' : [carla.VehicleLightState.LowBeam],
|
|
'HighBeam' : [carla.VehicleLightState.HighBeam],
|
|
'Brake' : [carla.VehicleLightState.Brake],
|
|
'RightBlinker' : [carla.VehicleLightState.RightBlinker],
|
|
'LeftBlinker' : [carla.VehicleLightState.LeftBlinker],
|
|
'Reverse' : [carla.VehicleLightState.Reverse],
|
|
'Fog' : [carla.VehicleLightState.Fog],
|
|
'Interior' : [carla.VehicleLightState.Interior],
|
|
'Special1' : [carla.VehicleLightState.Special1],
|
|
'Special2' : [carla.VehicleLightState.Special2],
|
|
'All' : [carla.VehicleLightState.All]}
|
|
|
|
LIGHT_GROUP = {
|
|
'None' : [carla.LightGroup.NONE],
|
|
# 'Vehicle' : [carla.LightGroup.Vehicle],
|
|
'Street' : [carla.LightGroup.Street],
|
|
'Building' : [carla.LightGroup.Building],
|
|
'Other' : [carla.LightGroup.Other]}
|
|
|
|
def apply_sun_presets(args, weather):
|
|
"""Uses sun presets to set the sun position"""
|
|
if args.sun is not None:
|
|
if args.sun in SUN_PRESETS:
|
|
weather.sun_altitude_angle = SUN_PRESETS[args.sun][0]
|
|
weather.sun_azimuth_angle = SUN_PRESETS[args.sun][1]
|
|
else:
|
|
print("[ERROR]: Command [--sun | -s] '" + args.sun + "' not known")
|
|
sys.exit(1)
|
|
|
|
|
|
def apply_weather_presets(args, weather):
|
|
"""Uses weather presets to set the weather parameters"""
|
|
if args.weather is not None:
|
|
if args.weather in WEATHER_PRESETS:
|
|
weather.cloudiness = WEATHER_PRESETS[args.weather][0]
|
|
weather.precipitation = WEATHER_PRESETS[args.weather][1]
|
|
weather.precipitation_deposits = WEATHER_PRESETS[args.weather][2]
|
|
weather.wind_intensity = WEATHER_PRESETS[args.weather][3]
|
|
weather.fog_density = WEATHER_PRESETS[args.weather][4]
|
|
weather.fog_distance = WEATHER_PRESETS[args.weather][5]
|
|
weather.fog_falloff = WEATHER_PRESETS[args.weather][6]
|
|
weather.wetness = WEATHER_PRESETS[args.weather][7]
|
|
weather.scattering_intensity = WEATHER_PRESETS[args.weather][8]
|
|
weather.mie_scattering_scale = WEATHER_PRESETS[args.weather][9]
|
|
weather.rayleigh_scattering_scale = WEATHER_PRESETS[args.weather][10]
|
|
weather.dust_storm = WEATHER_PRESETS[args.weather][11]
|
|
else:
|
|
print("[ERROR]: Command [--weather | -w] '" + args.weather + "' not known")
|
|
sys.exit(1)
|
|
|
|
|
|
def apply_weather_values(args, weather):
|
|
"""Set weather values individually"""
|
|
if args.azimuth is not None:
|
|
weather.sun_azimuth_angle = args.azimuth
|
|
if args.altitude is not None:
|
|
weather.sun_altitude_angle = args.altitude
|
|
if args.clouds is not None:
|
|
weather.cloudiness = args.clouds
|
|
if args.rain is not None:
|
|
weather.precipitation = args.rain
|
|
if args.puddles is not None:
|
|
weather.precipitation_deposits = args.puddles
|
|
if args.wind is not None:
|
|
weather.wind_intensity = args.wind
|
|
if args.fog is not None:
|
|
weather.fog_density = args.fog
|
|
if args.fogdist is not None:
|
|
weather.fog_distance = args.fogdist
|
|
if args.fogfalloff is not None:
|
|
weather.fog_falloff = args.fogfalloff
|
|
if args.wetness is not None:
|
|
weather.wetness = args.wetness
|
|
if args.scatteringintensity is not None:
|
|
weather.scattering_intensity = args.scatteringintensity
|
|
if args.miescatteringscale is not None:
|
|
weather.mie_scattering_scale = args.miescatteringscale
|
|
if args.rayleighscatteringscale is not None:
|
|
weather.rayleigh_scattering_scale = args.rayleighscatteringscale
|
|
if args.dust_storm is not None:
|
|
weather.dust_storm = args.dust_storm
|
|
|
|
|
|
def apply_lights_to_cars(args, world):
|
|
if args.cars is None:
|
|
return
|
|
|
|
light_mask = carla.VehicleLightState.NONE
|
|
for option in args.cars:
|
|
light_mask |= CAR_LIGHTS[option][0]
|
|
|
|
# Get all cars in level
|
|
all_vehicles = world.get_actors()
|
|
for ve in all_vehicles:
|
|
if "vehicle." in ve.type_id:
|
|
ve.set_light_state(carla.VehicleLightState(light_mask))
|
|
|
|
def apply_lights_manager(args, light_manager):
|
|
if args.lights is None:
|
|
return
|
|
|
|
light_group = 'None'
|
|
if args.lightgroup is not None:
|
|
light_group = args.lightgroup
|
|
|
|
# filter by group
|
|
lights = light_manager.get_all_lights(LIGHT_GROUP[light_group][0]) # light_group
|
|
|
|
i = 0
|
|
while (i < len(args.lights)):
|
|
option = args.lights[i]
|
|
|
|
if option == "on":
|
|
light_manager.turn_on(lights)
|
|
elif option == "off":
|
|
light_manager.turn_off(lights)
|
|
elif option == "intensity":
|
|
light_manager.set_intensity(lights, int(args.lights[i + 1]))
|
|
i += 1
|
|
elif option == "color":
|
|
r = int(args.lights[i + 1])
|
|
g = int(args.lights[i + 2])
|
|
b = int(args.lights[i + 3])
|
|
light_manager.set_color(lights, carla.Color(r, g, b))
|
|
i += 3
|
|
|
|
i += 1
|
|
|
|
|
|
def main():
|
|
"""Start function"""
|
|
argparser = argparse.ArgumentParser(
|
|
description=__doc__)
|
|
argparser.add_argument(
|
|
'--host',
|
|
metavar='H',
|
|
default='127.0.0.1',
|
|
help='IP of the host server (default: 127.0.0.1)')
|
|
argparser.add_argument(
|
|
'-p', '--port',
|
|
metavar='P',
|
|
default=2000,
|
|
type=int,
|
|
help='TCP port to listen to (default: 2000)')
|
|
argparser.add_argument(
|
|
'--sun',
|
|
default=None,
|
|
type=str,
|
|
help='Sun position presets [' + ' | '.join([i for i in SUN_PRESETS]) + ']')
|
|
argparser.add_argument(
|
|
'--weather',
|
|
default=None,
|
|
type=str,
|
|
help='Weather condition presets [' + ' | '.join([i for i in WEATHER_PRESETS]) + ']')
|
|
argparser.add_argument(
|
|
'--altitude', '-alt',
|
|
metavar='A',
|
|
default=None,
|
|
type=float,
|
|
help='Sun altitude [-90.0, 90.0]')
|
|
argparser.add_argument(
|
|
'--azimuth', '-azm',
|
|
metavar='A',
|
|
default=None,
|
|
type=float,
|
|
help='Sun azimuth [0.0, 360.0]')
|
|
argparser.add_argument(
|
|
'--clouds', '-c',
|
|
metavar='C',
|
|
default=None,
|
|
type=float,
|
|
help='Clouds amount [0.0, 100.0]')
|
|
argparser.add_argument(
|
|
'--rain', '-r',
|
|
metavar='R',
|
|
default=None,
|
|
type=float,
|
|
help='Rain amount [0.0, 100.0]')
|
|
argparser.add_argument(
|
|
'--puddles', '-pd',
|
|
metavar='Pd',
|
|
default=None,
|
|
type=float,
|
|
help='Puddles amount [0.0, 100.0]')
|
|
argparser.add_argument(
|
|
'--wind', '-w',
|
|
metavar='W',
|
|
default=None,
|
|
type=float,
|
|
help='Wind intensity [0.0, 100.0]')
|
|
argparser.add_argument(
|
|
'--fog', '-f',
|
|
metavar='F',
|
|
default=None,
|
|
type=float,
|
|
help='Fog intensity [0.0, 100.0]')
|
|
argparser.add_argument(
|
|
'--fogdist', '-fd',
|
|
metavar='Fd',
|
|
default=None,
|
|
type=float,
|
|
help='Fog Distance [0.0, 100.0)')
|
|
argparser.add_argument(
|
|
'--fogfalloff', '-fo',
|
|
metavar='Fo',
|
|
default=None,
|
|
type=float,
|
|
help='Fog Falloff [0.0, inf)')
|
|
argparser.add_argument(
|
|
'--wetness', '-wet',
|
|
metavar='Wet',
|
|
default=None,
|
|
type=float,
|
|
help='Wetness intensity [0.0, 100.0]')
|
|
argparser.add_argument(
|
|
'--scatteringintensity', '-si',
|
|
metavar='si',
|
|
default=None,
|
|
type=float,
|
|
help='Scattering intensity [0.0, inf]')
|
|
argparser.add_argument(
|
|
'--rayleighscatteringscale', '-rss',
|
|
metavar='rss',
|
|
default=None,
|
|
type=float,
|
|
help='Rayleigh scattering scale [0.0, 2.0]')
|
|
argparser.add_argument(
|
|
'--miescatteringscale', '-mss',
|
|
metavar='mss',
|
|
default=None,
|
|
type=float,
|
|
help='Mie scattering scale [0.0, 5.0]')
|
|
argparser.add_argument(
|
|
'--dust_storm', '-ds',
|
|
metavar='ds',
|
|
default=None,
|
|
type=float,
|
|
help='Dust storm strength [0.0, 100.0]')
|
|
argparser.add_argument(
|
|
'--cars',
|
|
metavar='Cars',
|
|
default=None,
|
|
type=str,
|
|
nargs='+',
|
|
help='Light Cars [' + ' | '.join([i for i in CAR_LIGHTS]) + ']')
|
|
argparser.add_argument(
|
|
'--lights', '-l',
|
|
metavar='Lights',
|
|
default=None,
|
|
type=str,
|
|
nargs='+',
|
|
help='Street Lights []')
|
|
argparser.add_argument(
|
|
'--lightgroup', '-lg',
|
|
metavar='LightGroup',
|
|
default=None,
|
|
type=str,
|
|
help='Light Group [' + ' | '.join([i for i in LIGHT_GROUP]) + ']')
|
|
args = argparser.parse_args()
|
|
|
|
# since all the arguments are None by default
|
|
# (except for the first 2, host and port)
|
|
# we can check if all the arguments have been provided
|
|
arg_values = [v for _, v in args.__dict__.items()][2:]
|
|
if all(i is (None and False) for i in arg_values):
|
|
argparser.error('No arguments provided.')
|
|
|
|
client = carla.Client(args.host, args.port)
|
|
client.set_timeout(2.0)
|
|
world = client.get_world()
|
|
|
|
weather = world.get_weather()
|
|
|
|
# apply presets
|
|
apply_sun_presets(args, weather)
|
|
apply_weather_presets(args, weather)
|
|
|
|
# apply weather values individually
|
|
apply_weather_values(args, weather)
|
|
|
|
world.set_weather(weather)
|
|
|
|
# apply car light changes
|
|
apply_lights_to_cars(args, world)
|
|
|
|
apply_lights_manager(args, world.get_lightmanager())
|
|
|
|
world.wait_for_tick()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|