Skip to content

Commit 8ea33f4

Browse files
Improvements (#57)
* Polished OnlineLSTMMapDisplay + debug mode configuration + bug fixes Signed-off-by: [ 大鳄 ] Asew <[email protected]> * Moved to using direct.stdpy.threading Signed-off-by: [ 大鳄 ] Asew <[email protected]> * Implemented key frame speed Signed-off-by: [ 大鳄 ] Asew <[email protected]> * Properly wired up simulator config options Signed-off-by: [ 大鳄 ] Asew <[email protected]> * Fixed rendering bug in WayPoint Signed-off-by: [ 大鳄 ] Asew <[email protected]> * Implemented ImGui line thickness Signed-off-by: [ 大鳄 ] Asew <[email protected]> * Polished GradientListMapDisplay Signed-off-by: [ 大鳄 ] Asew <[email protected]> * Bug fixes Signed-off-by: [ 大鳄 ] Asew <[email protected]> * Further bug fixes Signed-off-by: [ 大鳄 ] Asew <[email protected]> * Added threading module togglability Signed-off-by: [ 大鳄 ] Asew <[email protected]> * Polished threading module Signed-off-by: [ 大鳄 ] Asew <[email protected]>
1 parent 2444bcb commit 8ea33f4

File tree

18 files changed

+139
-43
lines changed

18 files changed

+139
-43
lines changed

src/algorithms/algorithm.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from threading import Condition
1+
from utility.threading import Condition
22
from typing import Optional, List
33
from abc import ABC, abstractmethod
44

src/algorithms/basic_testing.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
from threading import Condition
21
from typing import Dict, Any, List, Callable, Optional
32
from operator import mul
43
from functools import reduce
4+
import time
55

66
import numpy as np
77
from structures.heap import Heap
88

9+
from utility.threading import Condition, cond_var_wait_for
910
from algorithms.configuration.entities.agent import Agent
1011
from algorithms.configuration.entities.trace import Trace
1112
from algorithms.configuration.entities.obstacle import Obstacle
@@ -40,6 +41,7 @@ def __init__(self, services: Services) -> None:
4041
self.cv = None
4142
self.key_frame_skip_count = 0
4243
self.total_time = 0
44+
self.last_frame_time = 0
4345
self.requires_key_frame = False
4446
self.reset()
4547

@@ -51,6 +53,7 @@ def reset(self) -> None:
5153
self.cv = None
5254
self.key_frame_skip_count = 0
5355
self.total_time = 0
56+
self.last_frame_time = 0
5457
if self._services.settings.simulator_key_frame_speed == 0 or not self._services.settings.simulator_graphics:
5558
self.key_frame = lambda *args, **kwargs: None
5659
else:
@@ -86,6 +89,10 @@ def key_frame_internal(self, ignore_key_frame_skip: bool = False, only_render: L
8689
if root_key_frame:
8790
root_key_frame.instance.testing.key_frame(ignore_key_frame_skip=ignore_key_frame_skip, only_render=only_render)
8891

92+
def sleep_pred():
93+
return not self.requires_key_frame or self.is_terminated()
94+
95+
# skip render frame
8996
if ignore_key_frame_skip or self.key_frame_skip_count >= self._services.settings.simulator_key_frame_skip:
9097
self.display_info = self._services.algorithm.instance.set_display_info()
9198

@@ -96,11 +103,26 @@ def key_frame_internal(self, ignore_key_frame_skip: bool = False, only_render: L
96103
with self.cv:
97104
self.requires_key_frame = True
98105
self.cv.notify()
99-
self.cv.wait_for(lambda: not self.requires_key_frame or self.is_terminated())
106+
cond_var_wait_for(self.cv, sleep_pred)
100107
self.key_frame_skip_count = 0
101108
else:
102109
self.key_frame_skip_count += 1
103110

111+
# limit key frame speed
112+
if self.cv is not None:
113+
t = time.time()
114+
sleep_dt = self._services.settings.simulator_key_frame_speed - (t - self.last_frame_time)
115+
self.last_frame_time = t
116+
117+
while sleep_dt > 0:
118+
with self.cv:
119+
self.requires_key_frame = True
120+
self.cv.notify()
121+
cond_var_wait_for(self.cv, sleep_pred)
122+
nt = time.time()
123+
sleep_dt = sleep_dt - nt + t
124+
t = nt
125+
104126
if self.is_terminated():
105127
from simulator.models.map_model import AlgorithmTerminated
106128
raise AlgorithmTerminated()

src/algorithms/lstm/a_star_waypoint.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,9 @@ def _find_path_internal(self) -> None:
137137
local_kernel_algo.find_path(agent_pos=self.way_points[-1], goal_pos=self._get_grid().goal.position)
138138
local_kernel_algo.map.replay_trace(lambda m: self.__replay(m))
139139
self.__accumulate_space(local_kernel_algo)
140-
self.key_frame()
141140
self.__local_kernel_anim = None
142141
self.__global_kernel_anim = None
143-
self.key_frame()
142+
self.key_frame(True)
144143

145144
def __update_map(self, local_kernel_algo, global_kernel_algo):
146145
if isinstance(self._get_grid(), RosMap):

src/algorithms/lstm/combined_online_LSTM.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import copy
2-
from threading import Thread
2+
from utility.threading import Thread
33
from typing import List, Tuple, Optional, Set
44

55
from algorithms.algorithm import Algorithm
@@ -26,7 +26,7 @@ def __init__(self, services: Services, testing: BasicTesting = None, kernel_name
2626
max_it: float = float('inf'), threaded: bool = False):
2727
super().__init__(services, testing)
2828

29-
if not self.kernel_names:
29+
if not kernel_names:
3030
self.kernel_names = [
3131
"tile_by_tile_training_house_10_model",
3232
"tile_by_tile_training_house_100_model",

src/batch_train.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44
module load anaconda3/personal
55

66
pip3 install -r $HOME/projects/PathBench/requirements.txt
7-
python3 $HOME/projects/PathBench/src/runtrainer.py -n 30 -f
7+
python3 $HOME/projects/PathBench/src/run_trainer.py -n 30 -f

src/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ def main() -> bool:
107107
parser.add_argument("-v", "--visualiser", action='store_true', help="run simulator with graphics")
108108
parser.add_argument("-g", "--generator", action='store_true', help="run generator")
109109
parser.add_argument("-t", "--trainer", action='store_true', help="runs model trainer")
110-
parser.add_argument("-d", "--debug", choices=['NONE', 'BASIC', 'LOW', 'MEDIUM', 'HIGH'], default='HIGH', help="set the debug level when running, default is high")
110+
parser.add_argument("-d", "--debug", choices=['NONE', 'BASIC', 'LOW', 'MEDIUM', 'HIGH'], default='LOW', help="set the debug level when running, default is low")
111111
parser.add_argument("-V", dest="visualiser_flags", metavar="VISUALISER_FLAG", action='append',
112112
help="Visualiser options (overriding Panda3D's default Config.prc - see https://docs.panda3d.org/1.10/python/programming/configuration/configuring-panda3d#configuring-panda3d for options [windowed-fullscreen is an additional custom option])")
113113

src/ros/gazebo/ros.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import os
22
import sys
3-
from threading import Lock, Condition
43

54
import numpy as np
65
import cv2 as cv

src/ros/ogm_subscriber/ros.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import os
22
import sys
3-
from threading import Lock, Condition
43
from typing import Optional
54

65
import numpy as np

src/runtrainer.py renamed to src/run_trainer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343

4444
import argparse
4545

46-
parser = argparse.ArgumentParser(prog="runtrainer.py",
46+
parser = argparse.ArgumentParser(prog="run_trainer.py",
4747
description="PathBench trainer runner",
4848
formatter_class=argparse.RawTextHelpFormatter)
4949
parser.add_argument('-n', '--num_maps', type=int, default=100, help="number of maps to generate for the trainer")

src/simulator/models/map_model.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
from threading import Thread, Condition
21
import time
32

3+
from utility.threading import Thread, Condition, cond_var_wait_for
44
from algorithms.configuration.maps.dense_map import DenseMap
55
from algorithms.configuration.maps.sparse_map import SparseMap
66
from simulator.models.model import Model
@@ -60,11 +60,11 @@ def reset(self) -> None:
6060
self.requires_key_frame = False
6161
self.cv.notify_all()
6262
with self.cv:
63-
self.cv.wait_for(lambda: self.last_thread is None or self.requires_key_frame, timeout=0.8)
63+
cond_var_wait_for(self.cv, lambda: self.last_thread is None or self.requires_key_frame, timeout=0.8)
6464
if self.last_thread is not None:
6565
self.requires_key_frame = False
6666
self.cv.notify_all()
67-
self.cv.wait_for(lambda: self.last_thread is None, timeout=0.8)
67+
cond_var_wait_for(self.cv, lambda: self.last_thread is None, timeout=0.8)
6868
self.requires_key_frame = False
6969
if self.last_thread is None:
7070
self._services.ev_manager.post(KeyFrameEvent(refresh=True))
@@ -107,7 +107,7 @@ def tick(self) -> None:
107107
dt = self.frame_timer.stop()
108108
if self.requires_key_frame or (dt < MAX_FRAME_DT):
109109
with self.cv:
110-
if self.cv.wait_for(lambda: self.requires_key_frame or self.last_thread is None, timeout=(MAX_FRAME_DT - dt)):
110+
if cond_var_wait_for(self.cv, lambda: self.requires_key_frame or self.last_thread is None, timeout=(MAX_FRAME_DT - dt)):
111111
self.processing_key_frame = True
112112
self._services.ev_manager.post(KeyFrameEvent())
113113
self.frame_timer = Timer()
@@ -149,11 +149,11 @@ def toggle_convert_map(self) -> None:
149149
else:
150150
self._services.debug.write("Map conversion not applicable", DebugLevel.BASIC)
151151
return
152-
152+
153153
if mp is None:
154154
self._services.debug.write("Map conversion not applicable", DebugLevel.BASIC)
155155
return
156-
156+
157157
self.reset()
158158
timer: Timer = Timer()
159159
self._services.algorithm.map = mp

0 commit comments

Comments
 (0)