-
Notifications
You must be signed in to change notification settings - Fork 0
/
fitness_walk_balanced(1).js
99 lines (85 loc) · 3.63 KB
/
fitness_walk_balanced(1).js
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
//--------FITNESS_STEP_1_BALANCED_LOCOMOTION--------------
{
// Variables de suivi
distances: [],
imuReadings: {
pitch: []
},
pitchPenalty: 0,
energySpent: 0,
steps: 0,
// Fonction de configuration
setupSimulation: function() {
this.startPos = this.getRobot().getCoreComponent().getRootPosition();
this.imuReadings.pitch = [];
this.pitchPenalty = 0;
this.energySpent = 0;
this.steps = 0;
return true;
},
// Fonction appelée après chaque étape de simulation
afterSimulationStep: function() {
this.steps += 1; // Compter le nombre d'étapes de simulation
var sensors = this.getRobot().getSensors();
var motors = this.getRobot().getMotors();
// Calcul de l'énergie dépensée par les moteurs
for (var i = 0; i < motors.length; i++) {
var motor = motors[i];
var torque = motor.getTorque();
var velocity = motor.getVelocity();
var energy = torque * velocity * 0.005; // Calcul simplifié de l'énergie
this.energySpent += energy;
}
// Récupération des lectures de l'IMU pour l'axe Y (Pitch)
for (var i = 0; i < sensors.length; i++) {
var sensor = sensors[i];
if (sensor.getType() == "ImuSensorElement") {
var pitchValue = sensor.read();
this.imuReadings.pitch.push(pitchValue);
// Pénalité pour l'angle de pitch
var pitchThreshold = 20; // Seuil en degrés
if (Math.abs(pitchValue) > pitchThreshold) {
this.pitchPenalty += 1; // Comptabiliser le dépassement du seuil
}
}
}
return true;
},
// Fonction appelée à la fin de la simulation
endSimulation: function() {
var maxFitness = -Number.MAX_VALUE;
var coreComponent = this.getRobot().getCoreComponent();
var bodyParts = this.getRobot().getBodyParts();
var blockCount = bodyParts.length;
var xDiff = coreComponent.getRootPosition().x - this.startPos.x;
var yDiff = coreComponent.getRootPosition().y - this.startPos.y;
var zDiff = coreComponent.getRootPosition().z - this.startPos.z;
// Calcul de la fitness
var xComponent = (xDiff > 0 ? -Math.abs(xDiff) * 10 : Math.abs(xDiff) * 10);
var yComponent = (Math.abs(yDiff) > 0 ? -4 * Math.abs(yDiff) : 0);
var zComponent = (Math.abs(zDiff) > 0 ? 15 * Math.abs(yDiff) : 0);
var fitness = xComponent + yComponent + zComponent;
// Mise à jour de la fitness maximale
if (fitness > maxFitness) {
maxFitness = fitness;
}
// Normalisation de l'énergie dépensée par le nombre de blocs
var normalizedEnergy = this.energySpent / blockCount;
// Normalisation de la pénalité de pitch par le nombre de dépassements et le nombre d'étapes
var normalizedPitchPenalty = (this.pitchPenalty / this.steps) * 10;
// Calcul de la fitness finale
var finalFitness = maxFitness - normalizedPitchPenalty - normalizedEnergy;
this.distances.push(finalFitness);
return true;
},
// Fonction de calcul de la fitness
getFitness: function() {
var fitness = this.distances[0];
for (var i = 1; i < this.distances.length; i++) {
if (this.distances[i] > fitness) {
fitness = this.distances[i];
}
}
return fitness;
},
}