Skip to content

Commit 5277605

Browse files
authored
Merge pull request #8 from Association-INTech/Asservissement
Deployment de l'asservisement
2 parents db364b7 + c823995 commit 5277605

5 files changed

Lines changed: 230 additions & 261 deletions

File tree

scripts/commande_PS4.py

Lines changed: 93 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,130 +1,132 @@
11
from pyPS4Controller.controller import Controller
2-
from rpi_hardware_pwm import HardwarePWM
32
import time
3+
from threading import Thread
4+
5+
#Pour le protocole I2C de communication entre la rasberie Pi et l'arduino
6+
import smbus #type: ignore #ignore the module could not be resolved error because it is a linux only module
7+
import numpy as np
8+
import struct
9+
10+
###################################################
11+
#Intialisation du protocole I2C
12+
##################################################
13+
14+
# Create an SMBus instance
15+
bus = smbus.SMBus(1) # 1 indicates /dev/i2c-1
16+
17+
# I2C address of the slave
18+
SLAVE_ADDRESS = 0x08
19+
20+
def write_vitesse_direction(vitesse,direction):
21+
# Convert string to list of ASCII values
22+
data = struct.pack('<ff', float(vitesse), float(direction))
23+
bus.write_i2c_block_data(SLAVE_ADDRESS, 0, list(data))
424

525
###################################################
626
#Intialisation des moteurs
727
##################################################
28+
29+
direction_d = 0 # angle initiale des roues en degrés
30+
vitesse_m = 0 # vitesse initiale en métre par milliseconde
31+
832
#paramètres de la fonction vitesse_m_s, à étalonner
9-
direction_prop = 1# -1 pour les variateurs inversés ou un petit rapport correspond à une marche avant
10-
pwm_stop_prop = 7.37
11-
point_mort_prop = 0.5
12-
delta_pwm_max_prop = 1.1 #pwm à laquelle on atteint la vitesse maximale
13-
14-
vitesse_max_m_s_hard = 8 #vitesse que peut atteindre la voiture
15-
vitesse_max_m_s_soft = 2 #vitesse maximale que l'on souhaite atteindre
16-
17-
direction = -1 #1 pour angle_pwm_min a gauche, -1 pour angle_pwm_min à droite
18-
angle_pwm_min = 6.91 #min
19-
angle_pwm_max = 10.7 #max
20-
angle_pwm_centre= 8.805
33+
vitesse_max_m_s_hard = 8 #vitesse que peut atteindre la voiture en métre
34+
vitesse_max_m_s_soft = 2 #vitesse maximale que l'on souhaite atteindre en métre par seconde
35+
vitesse_min_m_s_soft = -2 #vitesse arriere que l'on souhaite atteindre en métre
36+
2137
angle_degre_max = +18 #vers la gauche
22-
angle_degre=0
2338

24-
pwm_prop = HardwarePWM(pwm_channel=0, hz=50,chip=2) #use chip 2 on pi 5 in accordance with the documentation
25-
pwm_dir = HardwarePWM(pwm_channel=1, hz=50,chip=2) #use chip 2 on pi 5 in accordance with the documentation
26-
print("PWM désactivées")
39+
40+
41+
# fonction naturel map de arduino pour plus de lisibilité
42+
def map_range(x, in_min,in_max, out_min, out_max):
43+
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
44+
45+
2746

2847
def set_direction_degre(angle_degre) :
29-
global angle_pwm_min
30-
global angle_pwm_max
31-
global angle_pwm_centre
32-
angle_pwm = angle_pwm_centre + direction * (angle_pwm_max - angle_pwm_min) * angle_degre /(2 * angle_degre_max )
33-
if angle_pwm > angle_pwm_max :
34-
angle_pwm = angle_pwm_max
35-
if angle_pwm < angle_pwm_min :
36-
angle_pwm = angle_pwm_min
37-
pwm_dir.change_duty_cycle(angle_pwm)
48+
global direction_d
49+
direction_d = angle_degre
50+
print("angle_degré: ",direction_d,"vitesse: ",vitesse_m)
3851

39-
def set_vitesse_m_s(vitesse_m_s):
40-
if vitesse_m_s > vitesse_max_m_s_soft :
41-
vitesse_m_s = vitesse_max_m_s_soft
42-
elif vitesse_m_s < -vitesse_max_m_s_hard :
43-
vitesse_m_s = -vitesse_max_m_s_hard
44-
if vitesse_m_s == 0 :
45-
pwm_prop.change_duty_cycle(pwm_stop_prop)
46-
elif vitesse_m_s > 0 :
47-
vitesse = vitesse_m_s * (delta_pwm_max_prop)/vitesse_max_m_s_hard
48-
pwm_prop.change_duty_cycle(pwm_stop_prop + direction_prop*(point_mort_prop + vitesse ))
49-
elif vitesse_m_s < 0 :
50-
vitesse = vitesse_m_s * (delta_pwm_max_prop)/vitesse_max_m_s_hard
51-
pwm_prop.change_duty_cycle(pwm_stop_prop - direction_prop*(point_mort_prop - vitesse ))
52+
def set_vitesse_m_ms(vitesse_m_ms):
53+
global vitesse_m
54+
vitesse_m = vitesse_m_ms
55+
print("angle_degré: ",direction_d,"vitesse: ",vitesse_m)
5256

53-
def recule():
54-
set_vitesse_m_s(-vitesse_max_m_s_hard)
55-
time.sleep(0.2)
56-
set_vitesse_m_s(0)
57-
time.sleep(0.2)
58-
set_vitesse_m_s(-2)
57+
def recule(): #actuellement ne sert a rien car on peux juste envoyer une vitesse négative
58+
global vitesse_m
59+
vitesse_m = -2000
5960

6061

61-
a_prop = vitesse_max_m_s_soft/(65198)
62-
a_dir=(angle_degre_max)/(-32767)
63-
6462
class MyController(Controller):
6563

6664
def __init__(self, **kwargs):
6765
Controller.__init__(self, **kwargs)
6866

69-
# def on_R2_press(self,value):
70-
# print("La valeur de R2 est: ",value)
71-
# value += 32767
72-
# set_vitesse_m_s(a_prop*value)
73-
74-
def on_R2_release(self):
75-
#print("Arrêt complet")
76-
set_vitesse_m_s(0)
67+
def on_R2_press(self,value):
68+
vit = map_range(value,-32252,32767,0,vitesse_max_m_s_soft*1000)
69+
if (vit < 0):
70+
set_vitesse_m_ms(0)
71+
else:
72+
set_vitesse_m_ms(vit)
73+
def on_R2_release(self): # arrete la voiture lorsque L2 est arrété d'étre préssé.
74+
set_vitesse_m_ms(0)
75+
76+
7777

7878
def on_L3_x_at_rest(self):
7979
set_direction_degre(0)
8080

81-
def on_R1_press(self):
82-
recule()
81+
def on_R1_press(self): #arret d'urgence
82+
set_vitesse_m_ms(0)
8383

8484
def on_R1_release(self):
85-
set_vitesse_m_s(0)
85+
set_vitesse_m_ms(0)
8686

87+
def on_L3_up(self,value):
88+
pass
89+
def on_L3_down(self,value):
90+
pass
91+
92+
8793
def on_L3_right(self,value):
88-
set_direction_degre(a_dir*value)
94+
# print("x_r :", value, "degré : ",map_range(value,-32767, 32767, 60, 120))
95+
dir = map_range(value, 0, 32767, 0, angle_degre_max)
96+
set_direction_degre(dir)
8997

9098
def on_L3_left(self,value):
91-
set_direction_degre(a_dir*value)
92-
93-
# def on_L2_press(self, value):
94-
# set_vitesse_m_s(-vitesse_max_m_s_hard)
95-
96-
# def on_R3_right(self, value):
97-
# set_vitesse_m_s(value*a_prop)
98-
99-
# def on_R3_left(self, value):
100-
# set_vitesse_m_s(-value*a_prop)
101-
def on_share_press(self):
102-
set_vitesse_m_s(vitesse_max_m_s_soft)
103-
104-
def on_share_release(self):
105-
set_vitesse_m_s(0)
106-
107-
def on_L2_release(self):
108-
set_vitesse_m_s(0)
109-
110-
def on_x_press(self):
111-
pwm_prop.stop()
112-
pwm_dir.stop()
113-
print("PWM désactivées")
114-
115-
def on_circle_press(self):
116-
pwm_prop.start(pwm_stop_prop)
117-
pwm_dir.start(angle_pwm_centre)
118-
print("PWM activées")
99+
print("x_r :", value, "degré : ",map_range(value,-32767, 0, -angle_degre_max, 0 ))
100+
dir = map_range(value,-32767, 0, -angle_degre_max, 0 )
101+
set_direction_degre(dir)
102+
119103

104+
def on_L2_press(self, value):
105+
print("x_r :", value, "degré : ",map_range(value,-32767, 32767, 60, 120))
106+
vit = map_range(value,-32252,32767,0,vitesse_min_m_s_soft*1000)
107+
if (vit > 0):
108+
set_vitesse_m_ms(0)
109+
else:
110+
set_vitesse_m_ms(vit)
111+
112+
def on_L2_release(self): #arrete la voiture lorsque L2 est arrété d'étre préssé.
113+
set_vitesse_m_ms(0)
114+
115+
#envoie de la direction et de l'angle toute les millisecondes
116+
def envoie_direction_degre():
117+
while True :
118+
write_vitesse_direction(int(vitesse_m), int(direction_d))
119+
time.sleep(0.001)
120120

121+
122+
# boucle principal
121123
controller = MyController(interface="/dev/input/js0", connecting_using_ds4drv=False)
122124
try:
123-
controller.listen()
125+
Thread(target = envoie_direction_degre, daemon=True).start()
126+
controller.listen(timeout=60)
127+
124128
except KeyboardInterrupt:
125129
print("Arrêt du programme")
126-
pwm_prop.stop()
127-
pwm_dir.stop()
128130
controller.stop()
129131
exit(0)
130132

src/HL/Autotech_constant.py

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import os
22
import numpy as np
33

4-
MAX_SOFT_SPEED = 0.5
5-
MIN_SOFT_SPEED = 0.1
6-
MAX_ANGLE = 14
4+
MAX_SOFT_SPEED = 6000 # en milimetre par secondes
5+
MIN_SOFT_SPEED = -4000
6+
MAX_ANGLE = 30
77
CRASH_DIST = 110
88
REAR_BACKUP_DIST = 100 #mm Distance at which the car will NOT reverse due to the obstacle behind it
99
LIDAR_DATA_AMPLITUDE = 1
@@ -14,20 +14,6 @@
1414
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)
1515

1616

17-
PWM_PROP = {
18-
"direction_prop": 1,
19-
"pwm_stop_prop": 7.37,
20-
"point_mort_prop": 0.5,
21-
"delta_pwm_max_prop": 1.1 # PWM at which the maximum speed is reached
22-
}
23-
24-
PWM_DIR = {
25-
"direction": -1, # 1 for angle_pwm_min to the left, -1 for angle_pwm_min to the right
26-
"angle_pwm_min": 6.91,
27-
"angle_pwm_max": 10.7,
28-
"angle_pwm_centre": 8.805
29-
}
30-
3117
SOCKET_ADRESS = {
3218
"IP": '192.168.0.10',
3319
"PORT": 10940

0 commit comments

Comments
 (0)