From 6dd4954eaf74783497e1b8abfd52a67e7295035d Mon Sep 17 00:00:00 2001 From: swsamleo Date: Wed, 22 Feb 2023 18:08:01 -0800 Subject: [PATCH 1/2] add listener and change single_2lanefree_carla --- .../single_2lanefree_carla.py | 14 +++- .../utils/keyboard_listener.py | 76 +++++++++++++++++++ 2 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 opencda/scenario_testing/utils/keyboard_listener.py diff --git a/opencda/scenario_testing/single_2lanefree_carla.py b/opencda/scenario_testing/single_2lanefree_carla.py index 3aebe5d37..4e22ba3ec 100644 --- a/opencda/scenario_testing/single_2lanefree_carla.py +++ b/opencda/scenario_testing/single_2lanefree_carla.py @@ -16,7 +16,7 @@ from opencda.scenario_testing.evaluations.evaluate_manager import \ EvaluationManager from opencda.scenario_testing.utils.yaml_utils import load_yaml - +from opencda.scenario_testing.utils.keyboard_listener import KeyListener def run_scenario(opt, config_yaml): try: @@ -55,8 +55,20 @@ def run_scenario(opt, config_yaml): current_time=scenario_params['current_time']) spectator = scenario_manager.world.get_spectator() + + # initialize a key listener and start monitoring the keyboard + kl = KeyListener() + kl.start() + # run steps while True: + # press esc to end the program + # press p to pause demonstration + if kl.keys['esc']: + exit(0) + if kl.keys['p']: + continue + scenario_manager.tick() transform = single_cav_list[0].vehicle.get_transform() spectator.set_transform(carla.Transform( diff --git a/opencda/scenario_testing/utils/keyboard_listener.py b/opencda/scenario_testing/utils/keyboard_listener.py new file mode 100644 index 000000000..f029edd3c --- /dev/null +++ b/opencda/scenario_testing/utils/keyboard_listener.py @@ -0,0 +1,76 @@ +from pynput import keyboard + + +class KeyListener(object): + """ + A keyboard listener class to record the states of keys. + + Parameters + ---------- + None + + Attributes + ---------- + keys : dict + Keyboard keys and states + """ + def __init__(self): + """ + Initialize a listener instance + """ + self.keys = {'p': False, 'esc': False} + + def start(self): + """ + Start keyboard listening + + Parameters + ---------- + None + + Returns + ------- + None + """ + listener = keyboard.Listener( + on_press=self.on_press, + on_release=self.on_release) + listener.start() + + def on_press(self, key): + """ + Update the dict when a key is pressed + + Parameters + ---------- + key: A KeyCode represents the description of a key code used by the operating system. + + Returns + ------- + Update the dict keys + """ + try: + print(f'alphanumeric key {key.char} pressed') + if key.char in self.keys: + self.keys[key.char] = not self.keys[key.char] + else: + self.keys[key] = False + except AttributeError: + print(f'special key {key} pressed') + + def on_release(self, key): + """ + Update the dict keys when a key is released + + Parameters + ---------- + key: A KeyCode represents the description of a key code used by the operating system. + + Returns + ------- + Update the dict keys + """ + if key == keyboard.Key.esc: + self.keys['esc'] = True + + From 49210e60be59c4735549d6baff4f3ef9c9cddeb6 Mon Sep 17 00:00:00 2001 From: swsamleo Date: Thu, 23 Feb 2023 10:23:15 -0800 Subject: [PATCH 2/2] update keyboard_listener.py with comments --- opencda/scenario_testing/utils/keyboard_listener.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/opencda/scenario_testing/utils/keyboard_listener.py b/opencda/scenario_testing/utils/keyboard_listener.py index f029edd3c..2eadc027d 100644 --- a/opencda/scenario_testing/utils/keyboard_listener.py +++ b/opencda/scenario_testing/utils/keyboard_listener.py @@ -1,3 +1,10 @@ +# -*- coding: utf-8 -*- +""" +keyboard listener: a keyboard listenr to record typeing and can be used for pasue, resume and stop the program using multi-threading. +""" +# Author: Wei Shao +# License: TDG-Attribution-NonCommercial-NoDistrib + from pynput import keyboard @@ -74,3 +81,4 @@ def on_release(self, key): self.keys['esc'] = True +