Skip to content

Commit ad403a8

Browse files
committed
AlmostFeat : replacing emitter / receiver by fifo. Not working
1 parent 05ce411 commit ad403a8

5 files changed

Lines changed: 93 additions & 66 deletions

File tree

scripts/launch_train_multiprocessing.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
from config import *
1616
from TemporalResNetExtractor import TemporalResNetExtractor
17+
from CNN1DResNetExtractor import CNN1DResNetExtractor
1718
from onnx_utils import *
1819

1920
from WebotsSimulationGymEnvironment import WebotsSimulationGymEnvironment
@@ -39,7 +40,7 @@ def make_env(simulation_rank: int, vehicle_rank: int):
3940

4041
envs = SubprocVecEnv([lambda simulation_rank=simulation_rank, vehicle_rank=vehicle_rank : make_env(simulation_rank, vehicle_rank) for vehicle_rank in range(n_vehicles) for simulation_rank in range(n_simulations)])
4142

42-
ExtractorClass = TemporalResNetExtractor
43+
ExtractorClass = CNN1DResNetExtractor
4344

4445
policy_kwargs = dict(
4546
features_extractor_class=ExtractorClass,
@@ -128,6 +129,8 @@ def make_env(simulation_rank: int, vehicle_rank: int):
128129
else:
129130
model.learn(total_timesteps=500_000)
130131

132+
print("iteration over")
133+
131134
model.save(save_path + str(i))
132135

133136
i += 1

src/Simulateur/WebotsSimulationGymEnvironment.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,18 @@ def __init__(self, simulation_rank: int, vehicle_rank: int):
3636

3737
os.mkfifo(f"/tmp/autotech/{simulation_rank}_{vehicle_rank}toserver.pipe")
3838
os.mkfifo(f"/tmp/autotech/serverto{simulation_rank}_{vehicle_rank}.pipe")
39+
os.mkfifo(f"/tmp/autotech/{simulation_rank}_{vehicle_rank}tosupervisor.pipe")
3940

4041
# --mode=fast --minimize --no-rendering --batch --stdout
4142
os.system(f"""
4243
webots {__file__.rsplit('/', 1)[0]}/worlds/piste{simulation_rank % n_map}.wbt --mode=fast --minimize --no-rendering --batch --stdout &
4344
echo $! {simulation_rank}_{vehicle_rank} >>/tmp/autotech/simulationranks
4445
""")
45-
log(f"SERVER{simulation_rank}_{vehicle_rank} : {simulation_rank}_{vehicle_rank}toserver.pipe")
46-
self.fifo_r = open(f"/tmp/autotech/{simulation_rank}_{vehicle_rank}toserver.pipe", "rb")
4746
log(f"SERVER{simulation_rank}_{vehicle_rank} : serverto{simulation_rank}_{vehicle_rank}.pipe")
4847
self.fifo_w = open(f"/tmp/autotech/serverto{simulation_rank}_{vehicle_rank}.pipe", "wb")
49-
log(f"SERVER{simulation_rank}_{vehicle_rank} : fifo opened :D and init done")
48+
log(f"SERVER{simulation_rank}_{vehicle_rank} : {simulation_rank}_{vehicle_rank}toserver.pipe")
49+
self.fifo_r = open(f"/tmp/autotech/{simulation_rank}_{vehicle_rank}toserver.pipe", "rb")
50+
5051
log("-------------------------------------------------------------------")
5152

5253
def reset(self, seed=0):
@@ -56,6 +57,7 @@ def reset(self, seed=0):
5657
# this is true for lidar_horizontal_resolution = camera_horizontal_resolution
5758
self.context = obs = np.zeros([2, context_size, lidar_horizontal_resolution], dtype=np.float32)
5859
info = {}
60+
log(f"SERVER{self.simulation_rank}_{self.vehicle_rank} : finished reset")
5961
return obs, info
6062

6163
def step(self, action):
@@ -64,6 +66,7 @@ def step(self, action):
6466
self.fifo_w.flush()
6567

6668
# communication with the supervisor
69+
log(f"SERVER{self.simulation_rank}_{self.vehicle_rank} : trying to read the fifo_r")
6770
cur_state = np.frombuffer(self.fifo_r.read(np.dtype(np.float32).itemsize * (n_sensors + lidar_horizontal_resolution + camera_horizontal_resolution)), dtype=np.float32)
6871
log(f"SERVER{self.simulation_rank}_{self.vehicle_rank} : received {cur_state=}")
6972
reward = np.frombuffer(self.fifo_r.read(np.dtype(np.float32).itemsize), dtype=np.float32)[0] # scalar
@@ -79,17 +82,13 @@ def step(self, action):
7982
lidar_obs = cur_state[:lidar_horizontal_resolution]
8083
camera_obs = cur_state[lidar_horizontal_resolution:]
8184

82-
# apply dropout to the camera
83-
# p = 0.5
84-
# camera_obs *= np.random.binomial(1, 1-p, camera_obs.shape) # random values in {0, 1}
85-
8685
self.context = obs = np.concatenate([
8786
self.context[:, 1:],
8887
[lidar_obs[None], camera_obs[None]]
8988
], axis=1)
90-
# check if the context is correct
91-
# if self.simulation_rank == 0:
92-
# print(f"{(obs[0] == 0).mean():.3f} {(obs[1] == 0).mean():.3f}")
89+
90+
log(f"SERVER{self.simulation_rank}_{self.vehicle_rank} : step over")
91+
9392
return obs, reward, done, truncated, info
9493

9594

src/Simulateur/config.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
lidar_max_range = 12.0
1212
device = "cuda" if is_available() else "cpu"
1313

14-
context_size = 128
15-
lidar_horizontal_resolution = 128 # DON'T CHANGE THIS VALUE PLS
16-
camera_horizontal_resolution = 128 # DON'T CHANGE THIS VALUE PLS
14+
context_size = 1
15+
lidar_horizontal_resolution = 1024 # DON'T CHANGE THIS VALUE PLS
16+
camera_horizontal_resolution = 1024 # DON'T CHANGE THIS VALUE PLS
1717

18-
B_DEBUG = False
18+
B_DEBUG = True

src/Simulateur/controllers/controllerVehicleDriver/controllerVehicleDriver.py

Lines changed: 47 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,23 @@
11
import numpy as np
2+
import psutil
23
import time
4+
import os
5+
import re
6+
import sys
37

8+
# add src/Simulateur to sys.path
9+
path = __file__.rsplit('/', 3)[0]
10+
sys.path.insert(0, path)
11+
12+
from config import *
413
from vehicle import Driver
514

615

16+
17+
def log(s: str):
18+
if True:
19+
print(s, file=open("/tmp/autotech/logs", "a"))
20+
721
class VehicleDriver(Driver):
822
"""
923
This class is a subclass of the Driver class and is used to control the vehicle.
@@ -16,8 +30,10 @@ def __init__(self):
1630
basicTimeStep = int(self.getBasicTimeStep())
1731
self.sensorTime = basicTimeStep // 4
1832

19-
self.i = int(self.getName().split("_")[-1])
33+
self.v_min = 1
34+
self.v_max = 9
2035

36+
self.i = int(self.getName().split("_")[-1])
2137
# Lidar
2238
self.lidar = self.getDevice("Hokuyo")
2339
self.lidar.enable(self.sensorTime)
@@ -32,14 +48,28 @@ def __init__(self):
3248
self.touch_sensor.enable(self.sensorTime)
3349

3450
# Communication
35-
self.receiver = self.getDevice("TT02_receiver")
36-
self.receiver.enable(self.sensorTime)
37-
self.receiver.setChannel(2 * self.i) # corwe ponds the the supervisor's emitter channel
38-
self.emitter = self.getDevice("TT02_emitter")
39-
self.emitter.setChannel(2 * self.i + 1) # corresponds the the supervisor's receiver channel
4051

41-
# Last data received from the supervisor (steering angle)
42-
self.last_data = np.zeros(2, dtype=np.float32)
52+
proc = psutil.Process(os.getpid()) #current
53+
parent = proc.parent() #parent
54+
grandparent = parent.parent() if parent else None #grandparent
55+
pppid = str(grandparent.pid)
56+
57+
58+
self.simulation_rank = int(
59+
re.search(
60+
pppid + r" (\d+)",
61+
open("/tmp/autotech/simulationranks", "r").read(),
62+
re.MULTILINE
63+
).group(1)
64+
)
65+
66+
log(f"CLIENT{self.simulation_rank}/{self.i} : serverto{self.simulation_rank}_{self.i}.pipe")
67+
self.fifo_r = open(f"/tmp/autotech/serverto{self.simulation_rank}_{self.i}.pipe", "rb")
68+
log(f"CLIENT{self.simulation_rank}/{self.i} : {self.simulation_rank}_{self.i}tosupervisor.pipe")
69+
self.fifo_w = open(f"/tmp/autotech/{self.simulation_rank}_{self.i}tosupervisor.pipe", "wb")
70+
71+
72+
4373

4474
#Vérification de l"état de la voiture
4575
def observe(self):
@@ -78,14 +108,17 @@ def observe(self):
78108
def step(self):
79109
# sends observation to the supervisor
80110

81-
self.emitter.send(self.observe().tobytes())
111+
# First to be executed
112+
self.fifo_w.write(self.observe().tobytes())
113+
114+
log(f"CLIENT{self.simulation_rank}/{self.i} : trying to read from fifo")
115+
action = np.frombuffer(self.fifo_r.read(np.dtype(np.int64).itemsize * 2), dtype=np.int64)
116+
log(f"CLIENT{self.simulation_rank}/{self.i} : received {action=}")
82117

83-
if self.receiver.getQueueLength() > 0:
84-
while self.receiver.getQueueLength() > 1:
85-
self.receiver.nextPacket()
86-
self.last_data = np.frombuffer(self.receiver.getBytes(), dtype=np.float32)
118+
# Simulation step
87119

88-
action_steering, action_speed = self.last_data
120+
action_steering = np.linspace(-.4, .4, n_actions_steering, dtype=np.float32)[action[0], None]
121+
action_speed = np.linspace(self.v_min, self.v_max, n_actions_speed, dtype=np.float32)[action[1], None]
89122

90123
cur_angle = self.getSteeringAngle()
91124
dt = self.getBasicTimeStep()

src/Simulateur/controllers/controllerWorldSupervisor/controllerWorldSupervisor.py

Lines changed: 29 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
from controller import Supervisor
99
supervisor = Supervisor()
10-
1110
import torch.nn as nn
1211

1312
import psutil
@@ -82,7 +81,7 @@ def log(s: str):
8281

8382

8483

85-
class WebotsVehicleGymEnvironment(gym.Env):
84+
class WebotsVehicleManager:
8685
"""
8786
One environment for each vehicle
8887
@@ -102,37 +101,36 @@ def __init__(self, vehicle_rank: int):
102101
# negative value so that the first reset is not skipped
103102
self.last_reset = -1e6
104103

105-
# Emitter
106-
self.emitter = supervisor.getDevice(f"supervisor_emitter_{vehicle_rank}")
107-
self.emitter.setChannel(2 * self.vehicle_rank)
104+
proc = psutil.Process(os.getpid()) #current
105+
parent = proc.parent() #parent
106+
grandparent = parent.parent() if parent else None #grandparent
107+
pppid = str(grandparent.pid)
108108

109-
# Receiver
110-
self.receiver = supervisor.getDevice(f"supervisor_receiver_{vehicle_rank}")
111-
self.receiver.enable(self.sensorTime)
112-
self.receiver.setChannel(2 * self.vehicle_rank + 1)
113109

110+
self.simulation_rank = int(
111+
re.search(
112+
pppid + r" (\d+)",
113+
open("/tmp/autotech/simulationranks", "r").read(),
114+
re.MULTILINE
115+
).group(1)
116+
)
114117

115-
log(f"CLIENT{simulation_rank}/{vehicle_rank}_{vehicle_rank} : begins init")
116-
log(f"CLIENT{simulation_rank}/{vehicle_rank}_{vehicle_rank} : {simulation_rank}_{vehicle_rank}toserver.pipe")
117-
self.fifo_w = open(f"/tmp/autotech/{simulation_rank}_{vehicle_rank}toserver.pipe", "wb")
118-
log(f"CLIENT{simulation_rank}/{vehicle_rank} : serverto{simulation_rank}_{vehicle_rank}.pipe")
119-
self.fifo_r = open(f"/tmp/autotech/serverto{simulation_rank}_{vehicle_rank}.pipe", "rb")
120118

121-
# Last data received from the car
122-
self.last_data = np.zeros(n_sensors + lidar_horizontal_resolution + camera_horizontal_resolution, dtype=np.float32)
119+
log(f"SUPERVISOR{simulation_rank}/{vehicle_rank}_{vehicle_rank} : begins init")
120+
log(f"SUPERVISOR{simulation_rank}/{self.vehicle_rank} : {self.simulation_rank}_{self.vehicle_rank}tosupervisor.pipe")
121+
self.fifo_r = open(f"/tmp/autotech/{self.simulation_rank}_{self.vehicle_rank}tosupervisor.pipe", "rb")
122+
log(f"SUPERVISOR{simulation_rank}/{vehicle_rank}_{vehicle_rank} : {simulation_rank}_{vehicle_rank}toserver.pipe")
123+
self.fifo_w = open(f"/tmp/autotech/{simulation_rank}_{vehicle_rank}toserver.pipe", "wb")
124+
123125

124126
self.translation_field = supervisor.getFromDef(f"TT02_{self.vehicle_rank}").getField("translation") # may cause access issues ...
125127
self.rotation_field = supervisor.getFromDef(f"TT02_{self.vehicle_rank}").getField("rotation") # may cause access issues ...
126128

127129
# returns the lidar data of all vehicles
128130
def observe(self):
129-
# gets from Receiver
130-
if self.receiver.getQueueLength() > 0:
131-
while self.receiver.getQueueLength() > 1:
132-
self.receiver.nextPacket()
133-
self.last_data = np.frombuffer(self.receiver.getBytes(), dtype=np.float32)
131+
# gets from Vehicle
134132

135-
return self.last_data
133+
return np.frombuffer(self.fifo_r.read(np.dtype(np.float32).itemsize * (n_sensors + lidar_horizontal_resolution + camera_horizontal_resolution)), dtype=np.float32)
136134

137135
# reset the gym environment reset
138136
def reset(self, seed=None):
@@ -158,10 +156,9 @@ def reset(self, seed=None):
158156
return obs, info
159157

160158
# step function of the gym environment
161-
def step(self, action):
162-
action_steering = np.linspace(-.4, .4, n_actions_steering, dtype=np.float32)[action[0], None]
163-
action_speed = np.linspace(self.v_min, self.v_max, n_actions_speed, dtype=np.float32)[action[1], None]
164-
self.emitter.send(np.array([action_steering, action_speed], dtype=np.float32).tobytes())
159+
def step(self):
160+
#action_steering = np.linspace(-.4, .4, n_actions_steering, dtype=np.float32)[action[0], None]
161+
#action_speed = np.linspace(self.v_min, self.v_max, n_actions_speed, dtype=np.float32)[action[1], None]
165162

166163
# we should add a beacon sensor pointing upwards to detect the beacon
167164
obs = self.observe()
@@ -191,7 +188,7 @@ def step(self, action):
191188

192189
def main():
193190

194-
envs = [WebotsVehicleGymEnvironment(i) for i in range(n_vehicles)]
191+
envs = [WebotsVehicleManager(i) for i in range(n_vehicles)]
195192
log(f"CLIENT ALL : envs created")
196193
# check_env(env)
197194

@@ -218,22 +215,17 @@ def main():
218215
log(f"CLIENT ALL : begin step")
219216
#Prédiction pour séléctionner une action à partir de l"observation
220217
for e in envs:
221-
log(f"CLIENT{simulation_rank}/{e.vehicle_rank} : trying to read from fifo")
222-
action = np.frombuffer(e.fifo_r.read(np.dtype(np.int64).itemsize * 2), dtype=np.int64)
223-
log(f"CLIENT{simulation_rank}/{e.vehicle_rank} : received {action=}")
224-
225-
obs, reward, done, truncated, info = e.step(action)
226-
218+
obs, reward, done, truncated, info = e.step()
227219
if done:
228220
obs, info = e.reset()
229221

230-
log(f"CLIENT{simulation_rank}/{e.vehicle_rank} : sending {obs=}")
222+
log(f"SUPERVISOR{simulation_rank}/{e.vehicle_rank} : sending {obs=}")
231223
e.fifo_w.write(obs.tobytes())
232-
log(f"CLIENT{simulation_rank}/{e.vehicle_rank} : sending {reward=}")
224+
log(f"SUPERVISOR{simulation_rank}/{e.vehicle_rank} : sending {reward=}")
233225
e.fifo_w.write(reward.tobytes())
234-
log(f"CLIENT{simulation_rank}/{e.vehicle_rank} : sending {done=}")
226+
log(f"SUPERVISOR{simulation_rank}/{e.vehicle_rank} : sending {done=}")
235227
e.fifo_w.write(done.tobytes())
236-
log(f"CLIENT{simulation_rank}/{e.vehicle_rank} : sending {truncated=}")
228+
log(f"SUPERVISOR{simulation_rank}/{e.vehicle_rank} : sending {truncated=}")
237229
e.fifo_w.write(truncated.tobytes())
238230
e.fifo_w.flush()
239231

0 commit comments

Comments
 (0)