Add synchronous mode example script
This commit is contained in:
parent
d8b64cd86f
commit
338afbdc3b
|
@ -0,0 +1,164 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
# 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>.
|
||||
|
||||
import glob
|
||||
import os
|
||||
import sys
|
||||
|
||||
try:
|
||||
sys.path.append(glob.glob('**/*%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 logging
|
||||
import random
|
||||
|
||||
try:
|
||||
import pygame
|
||||
except ImportError:
|
||||
raise RuntimeError('cannot import pygame, make sure pygame package is installed')
|
||||
|
||||
try:
|
||||
import numpy as np
|
||||
except ImportError:
|
||||
raise RuntimeError('cannot import numpy, make sure numpy package is installed')
|
||||
|
||||
try:
|
||||
import queue
|
||||
except ImportError:
|
||||
import Queue as queue
|
||||
|
||||
|
||||
def draw_image(surface, image):
|
||||
array = np.frombuffer(image.raw_data, dtype=np.dtype("uint8"))
|
||||
array = np.reshape(array, (image.height, image.width, 4))
|
||||
array = array[:, :, :3]
|
||||
array = array[:, :, ::-1]
|
||||
image_surface = pygame.surfarray.make_surface(array.swapaxes(0, 1))
|
||||
surface.blit(image_surface, (0, 0))
|
||||
|
||||
|
||||
def get_font():
|
||||
fonts = [x for x in pygame.font.get_fonts()]
|
||||
default_font = 'ubuntumono'
|
||||
font = default_font if default_font in fonts else fonts[0]
|
||||
font = pygame.font.match_font(font)
|
||||
return pygame.font.Font(font, 14)
|
||||
|
||||
|
||||
def should_quit():
|
||||
for event in pygame.event.get():
|
||||
if event.type == pygame.QUIT:
|
||||
return True
|
||||
elif event.type == pygame.KEYUP:
|
||||
if event.key == pygame.K_ESCAPE:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def main():
|
||||
actor_list = []
|
||||
pygame.init()
|
||||
|
||||
client = carla.Client('localhost', 2000)
|
||||
client.set_timeout(2.0)
|
||||
|
||||
world = client.get_world()
|
||||
|
||||
print('enabling synchronous mode.')
|
||||
settings = world.get_settings()
|
||||
settings.synchronous_mode = True
|
||||
world.apply_settings(settings)
|
||||
|
||||
try:
|
||||
m = world.get_map()
|
||||
start_pose = random.choice(m.get_spawn_points())
|
||||
waypoint = m.get_waypoint(start_pose.location)
|
||||
|
||||
blueprint_library = world.get_blueprint_library()
|
||||
|
||||
vehicle = world.spawn_actor(
|
||||
random.choice(blueprint_library.filter('vehicle.*')),
|
||||
start_pose)
|
||||
actor_list.append(vehicle)
|
||||
vehicle.set_simulate_physics(False)
|
||||
|
||||
camera = world.spawn_actor(
|
||||
blueprint_library.find('sensor.camera.rgb'),
|
||||
carla.Transform(carla.Location(x=-5.5, z=2.8), carla.Rotation(pitch=-15)),
|
||||
attach_to=vehicle)
|
||||
actor_list.append(camera)
|
||||
|
||||
# Make sync queue for sensor data.
|
||||
image_queue = queue.Queue()
|
||||
camera.listen(image_queue.put)
|
||||
|
||||
frame = None
|
||||
|
||||
display = pygame.display.set_mode(
|
||||
(800, 600),
|
||||
pygame.HWSURFACE | pygame.DOUBLEBUF)
|
||||
font = get_font()
|
||||
|
||||
clock = pygame.time.Clock()
|
||||
|
||||
while True:
|
||||
if should_quit():
|
||||
return
|
||||
|
||||
clock.tick()
|
||||
world.tick()
|
||||
ts = world.wait_for_tick()
|
||||
|
||||
if frame is not None:
|
||||
if ts.frame_count != frame + 1:
|
||||
logging.warning('frame skip!')
|
||||
|
||||
frame = ts.frame_count
|
||||
|
||||
while True:
|
||||
image = image_queue.get()
|
||||
if image.frame_number == ts.frame_count:
|
||||
break
|
||||
logging.warning(
|
||||
'wrong image time-stampstamp: frame=%d, image.frame=%d',
|
||||
ts.frame_count,
|
||||
image.frame_number)
|
||||
|
||||
waypoint = random.choice(waypoint.next(2))
|
||||
vehicle.set_transform(waypoint.transform)
|
||||
|
||||
draw_image(display, image)
|
||||
|
||||
text_surface = font.render('% 5d FPS' % clock.get_fps(), True, (255, 255, 255))
|
||||
display.blit(text_surface, (8, 10))
|
||||
|
||||
pygame.display.flip()
|
||||
|
||||
finally:
|
||||
print('\ndisabling synchronous mode.')
|
||||
settings = world.get_settings()
|
||||
settings.synchronous_mode = False
|
||||
world.apply_settings(settings)
|
||||
|
||||
print('destroying actors.')
|
||||
for actor in actor_list:
|
||||
actor.destroy()
|
||||
|
||||
pygame.quit()
|
||||
print('done.')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
main()
|
|
@ -107,6 +107,7 @@ if $DO_COPY_FILES ; then
|
|||
copy_if_changed "./PythonAPI/manual_control.py" "${DESTINATION}/manual_control.py"
|
||||
copy_if_changed "./PythonAPI/no_rendering_mode.py" "${DESTINATION}/no_rendering_mode.py"
|
||||
copy_if_changed "./PythonAPI/spawn_npc.py" "${DESTINATION}/spawn_npc.py"
|
||||
copy_if_changed "./PythonAPI/synchronous_mode.py" "${DESTINATION}/synchronous_mode.py"
|
||||
copy_if_changed "./PythonAPI/tutorial.py" "${DESTINATION}/tutorial.py"
|
||||
copy_if_changed "./PythonAPI/vehicle_gallery.py" "${DESTINATION}/vehicle_gallery.py"
|
||||
copy_if_changed "./Util/ImportMaps.sh" "${DESTINATION}/ImportMaps.sh"
|
||||
|
|
Loading…
Reference in New Issue