Skip to content

Commit defc7da

Browse files
Merge pull request #32 from Association-INTech/backend
Backend
2 parents 5c646df + 18e94fa commit defc7da

19 files changed

Lines changed: 1528 additions & 43 deletions

pyproject.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ authors = [
1414
]
1515

1616
dependencies = [
17+
1718
]
1819

1920
[project.optional-dependencies]
@@ -64,4 +65,9 @@ rpi = [
6465
"matplotlib>=3.10.5",
6566
"opencv-python>=4.12.0.88",
6667
"scipy>=1.15.3",
68+
"websockets>=16.0",
69+
"fastapi>=0.128.0",
70+
"uvicorn>=0.40.0",
71+
"websocket>=0.2.1",
72+
"websockets>=16.0",
6773
]

scripts/commande_PS4.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def envoie_donnee(Voiture): #si utilisation de la voiture directement
1818
bus = smbus.SMBus(1)
1919
while True:
2020
try :
21-
data = struct.pack('<ff', float(round(Voiture.vitesse_mms)), float(round(Voiture.direction_d)))
21+
data = struct.pack('<ff', float(round(Voiture.vitesse_mms)), float(round(Voiture.direction)))
2222
bus.write_i2c_block_data(SLAVE_ADDRESS, 0, list(data))
2323
#time.sleep(0.00005)
2424
except Exception as e:
@@ -64,20 +64,20 @@ def kill(self):
6464
self.running = False
6565

6666
@property
67-
def vitesse_d(self):
67+
def target_speed(self):
6868
return self.controller.vitesse_mms
6969

7070
@property
71-
def direction_d(self):
72-
return self.controller.direction_d
71+
def direction(self):
72+
return self.controller.direction
7373

7474
class MyController(Controller):
7575

7676
def __init__(self, **kwargs):
7777
super().__init__(**kwargs)
7878
self.log = logging.getLogger(__name__)
7979
self.vitesse_mms = 0 # vitesse initiale en métre par milliseconde
80-
self.direction_d = 0 # angle initiale des roues en degrés
80+
self.direction = 0 # angle initiale des roues en degrés
8181
self.filtered = 0
8282
self.alpha = 0.3
8383
self.running = 0
@@ -120,12 +120,12 @@ def on_R1_release(self):
120120
def on_L3_right(self,value):
121121
# print("x_r :", value, "degré : ",map_range(value,-32767, 32767, 60, 120))
122122
dir = map_range(value, 0, 32767, 0, MAX_ANGLE)
123-
self.direction_d = dir
123+
self.direction = dir
124124

125125
def on_L3_left(self,value):
126126
#print("x_r :", value, "degré : ",map_range(value,-32767, 0, -MAX_ANGLE, 0 ))
127127
dir = self.stable_direction(value)
128-
self.direction_d = dir
128+
self.direction = dir
129129

130130

131131
def on_L2_press(self, value):

scripts/remote_control_controller.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@
1010
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1111

1212
def envoie_donnee():
13-
global vitesse_m, direction_d
13+
global vitesse_m, direction
1414
while True:
15-
packet = struct.pack("ff", vitesse_m, direction_d)
15+
packet = struct.pack("ff", vitesse_m, direction)
1616
sock.sendto(packet, ("192.168.1.10", 5556))
1717
time.sleep(0.05)
1818

1919
###################################################
2020
# Paramètres véhicule
2121
###################################################
22-
direction_d = 0
22+
direction = 0
2323
vitesse_m = 0
2424

2525
vitesse_max_m_s_soft = 2
@@ -30,9 +30,9 @@ def map_range(x, in_min, in_max, out_min, out_max):
3030
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
3131

3232
def set_direction_degre(angle_degre):
33-
global direction_d
34-
direction_d = angle_degre
35-
print(direction_d, vitesse_m)
33+
global direction
34+
direction = angle_degre
35+
print(direction, vitesse_m)
3636

3737
def set_vitesse_m_ms(vit):
3838
global vitesse_m

src/HL/Autotech_constant.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
TEXT_LEFT_OFFSET = 3 # Offset from the left of the screen to ensure no cuttoff
4343

4444

45+
4546
script_dir = os.path.dirname(os.path.abspath(__file__))
4647
MODEL_PATH = os.path.join(script_dir, "model_CNN1D.onnx") # Allows the model to be loaded from the same directory as the script regardless of the current working directory (aka where the script is run from)
4748

@@ -59,4 +60,9 @@
5960
# In our case Higher temperature means less agressive driving and lower temperature means more aggressive driving.
6061

6162

62-
LOGGING_LEVEL = logging.DEBUG # can be either NOTSET, DEBUG, INFO, WARNING, ERROR, CRITICAL
63+
LOGGING_LEVEL = logging.DEBUG # can be either NOTSET, DEBUG, INFO, WARNING, ERROR, CRITICAL
64+
65+
#Startup
66+
CAMERA_STREAM_ON_START = True #If True the camera stream will start at the launch of the car
67+
BACKEND_ON_START = True #If True the backend will start at the launch of the car
68+
LIDAR_STREAM_ON_START = True #If True the lidar stream will start at the launch of the car

src/HL/Serveur_mq.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
from src.HL.actionneur_capteur.Camera import ProgramStreamCamera
3434
from src.HL.programme.module_initialisation import Initialisation
3535
from src.HL.programme.Car import Ai_Programme
36+
from backend import BackendAPI
3637

3738
from Autotech_constant import I2C_NUMBER_DATA_RECEIVED, I2C_SLEEP_RECEIVED, I2C_SLEEP_ERROR_LOOP, TEXT_HEIGHT, TEXT_LEFT_OFFSET
3839

@@ -77,7 +78,14 @@ def __init__(self):
7778

7879
self.initialisation_module = Initialisation(self,Camera,Lidar,ToF, I2c_arduino)
7980

80-
self.programme = [SshProgramme(), self.initialisation_module, Ai_Programme(self), PS4ControllerProgram(), RemoteControl(), ProgramStreamCamera(self), Poweroff()]
81+
self.programme = [SshProgramme(),
82+
self.initialisation_module,
83+
Ai_Programme(self),
84+
PS4ControllerProgram(),
85+
RemoteControl(),
86+
ProgramStreamCamera(self),
87+
BackendAPI(self, host="0.0.0.0", port=8001, site_dir="/home/intech/CoVAPSy/src/HL/site_controle"),
88+
Poweroff()]
8189
self.log.debug("Programmes chargés: %s", [type(p).__name__ for p in self.programme])
8290

8391
# donnée de l'écran
@@ -101,6 +109,15 @@ def tof(self):
101109
@property
102110
def arduino_I2C(self):
103111
return self.initialisation_module.arduino_I2C
112+
113+
@property
114+
def target_speed(self):
115+
return self.programme[self.last_programme_control].target_speed
116+
117+
@property
118+
def direction(self):
119+
return self.programme[self.last_programme_control].direction
120+
104121
#-----------------------------------------------------------------------------------------------------
105122
# affichage de l'écrans
106123
#-----------------------------------------------------------------------------------------------------

src/HL/actionneur_capteur/Camera.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def outputframe(self, frame, keyframe=True):
4141

4242
from src.HL.programme.Camera_serv import StreamServer, StreamHandler, StreamOutput, frame_buffer
4343
from src.HL.programme.programme import Program
44-
from src.HL.Autotech_constant import PORT_STREAMING_CAMERA, SIZE_CAMERA_X, SIZE_CAMERA_Y, FRAME_RATE, CAMERA_QUALITY, STREAM_PATH
44+
from src.HL.Autotech_constant import PORT_STREAMING_CAMERA, SIZE_CAMERA_X, SIZE_CAMERA_Y, FRAME_RATE, CAMERA_QUALITY, STREAM_PATH, CAMERA_STREAM_ON_START
4545

4646
class ProgramStreamCamera(Program):
4747
def __init__(self,serveur):
@@ -50,6 +50,10 @@ def __init__(self,serveur):
5050
self.serveur = serveur
5151
self.running = False
5252
self.controls_car = False
53+
54+
if CAMERA_STREAM_ON_START:
55+
self.start()
56+
5357

5458
@property
5559
def camera(self):

src/HL/actionneur_capteur/masterI2C.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class I2c_arduino:
99
def __init__(self,serveur):
1010
self.log = logging.getLogger(__name__)
1111
self.serveur = serveur
12-
self.vitesse_r = 0
12+
self.current_speed = 0
1313
self.send_running = True
1414
self.receive_running = True
1515

@@ -21,19 +21,21 @@ def __init__(self,serveur):
2121
self.bus = smbus.SMBus(1) # 1 indicates /dev/i2c-1
2222
self.log.info("I2C: bus ouvert sur /dev/i2c-1")
2323

24-
time.sleep(0.5) # Give some time for the bus to settle
24+
2525

2626
#initialization of i2c send and received
2727
threading.Thread(target=self.start_send, daemon=True).start()
2828
threading.Thread(target=self.start_received, daemon=True).start()
2929

3030
def start_send(self):
3131
"""Envoie vitesse/direction régulièrement au microcontroleur. (toute les frames actuellement)"""
32+
time.sleep(1) # Give some time for the target_speed and direction to be set
3233
self.log.info("Thread I2C loop démarré")
3334
while self.send_running:
3435
try :
35-
data = struct.pack('<ff', float(round(self.serveur.programme[self.serveur.last_programme_control].vitesse_d)), float(round(self.serveur.programme[self.serveur.last_programme_control].direction_d)))
36+
data = struct.pack('<ff', float(self.serveur.target_speed), float(self.serveur.direction))
3637
self.bus.write_i2c_block_data(SLAVE_ADDRESS, 0, list(data))
38+
time.sleep(1e-5) # Short delay to prevent overwhelming the bus
3739
except Exception as e:
3840
self.log.error("Erreur I2C write: %s", e, exc_info=True)
3941
time.sleep(I2C_SLEEP_ERROR_LOOP)
@@ -52,7 +54,7 @@ def start_received(self):
5254
# on enregistre les valeur
5355
self.voltage_lipo = list_valeur[0]
5456
self.voltage_nimh = list_valeur[1]
55-
self.vitesse_r = list_valeur[2]
57+
self.current_speed = list_valeur[2]
5658
else:
5759
self.log.warning("I2C: taille inattendue (%d au lieu de %d)", len(data), length)
5860
time.sleep(I2C_SLEEP_RECEIVED)

0 commit comments

Comments
 (0)