Bonjour!
J'ai malheureusement pris un cours de deuxième année et me voilà un peu dans le trouble. Même si je connais niveau débutant l'orienté objet, je n'ai pas eu l'occasion de suivre un cours sur les Threads. J'ai cherché sur le net et il me semble avoir saisi le principe. Toutefois, on m'a demandé d'implémenter un régulateur PID pour qu'une voiture atteigne une vitesse donnée. Mon problème est qu'ils nous on fournit un .jar avec la classe (je l'ai décompilé) CarSimulator qui implémente Runnable. Comme suit :
Du coup moi j'ai implémenté ma classe "static" PID et tout et tout. MAIS ils nous ont aussi demandé de faire un small GUI que j'ai fait comme suit:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 package CarSimulator; import java.util.Random; public class CarSimulator implements Runnable { Random randomGenerator = new Random(); double airCoefficient = 0.001D; double gravitationAcceleration = 9.81D; double currentSlope = 0.0D; final double maxSlopeChange = 0.5D; double speed = 0.0D; double acceleration = 0.0D; double totalAcceleration = 0.0D; boolean stop = false; long oldTime = System.currentTimeMillis(); long measuredTime = System.currentTimeMillis(); long time = System.currentTimeMillis(); public CarSimulator() { } public void run() { while(!this.stop) { this.totalAcceleration = this.acceleration - Math.signum(this.speed) * this.airCoefficient * this.speed * this.speed - this.gravitationAcceleration * Math.sin(Math.atan(this.currentSlope / 100.0D)); this.time = System.currentTimeMillis(); this.speed += this.totalAcceleration * (double)(this.time - this.oldTime) / 1000.0D; this.oldTime = this.time; if (System.currentTimeMillis() - this.measuredTime > 1000L) { this.currentSlope = this.currentSlope + this.randomGenerator.nextDouble() * 2.0D - 1.0D; if (this.currentSlope > 15.0D) { this.currentSlope = 15.0D; } else if (this.currentSlope < -15.0D) { this.currentSlope = -15.0D; } this.measuredTime = System.currentTimeMillis(); } } } public void stop() { this.stop = true; } public void setAcceleration(double paramDouble) { this.acceleration = paramDouble; } public double getSpeed() { return this.speed; } }
Le souci comme vous le verrez, c'est que quand j'appuie sur le bouton start simul, le programme fait bien ce que je veux. Cependant il n'y a aucun moyen de sortir de là!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 import CarSimulator.CarSimulator; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class CruiseControl { private JButton startSimulButton; private JPanel panel; private CarSimulator car = new CarSimulator(); Thread simul = new Thread(car,"tutu"); public CruiseControl() { startSimulButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { PID.set(1,1,0); PID.setTarget(30); simul.start(); while (true){ car.setAcceleration(PID.calculate(car.getSpeed(),0)); System.out.println(car.getSpeed()); try { Thread.sleep(500); } catch (InterruptedException e1) { e1.printStackTrace(); } } } }); } public static void main(String[] args) { JFrame frame = new JFrame(); frame.setContentPane(new CruiseControl().panel); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }Il y a clairement quelque-chose que je ne saisit pas avec les threads car je ne vois pas comment injecter une vitesse non-stop sans passer par une boucle du style. Notez que je vous demande pas de me faire l'exo, car autant les threads comme le gui ne sont pas sur quoi porte le cours mais des notions que mes collègues ont déjà vues. Le truc important c'est le PID. Mais voilà c'est embêtant.
J’espère que vous pourrez me donner qques indications, merci d'avance![]()
Partager