Ich wollte mir ja ein Testboard bauen, damit ich erstmal ohne Risiko, den Copter zu schrotten, das Programm ausprobieren kann
Den auch, wenn man im Programm Code keinen Fehler erkennen kann, heißt das noch lange nicht, dass da auch kein Fehler ist...
Hm über die Zeit muss ich mir nochmal Gedanken machen, am besten wird es wohl sein, ein paar Tests zu machen. Trotzdem denke ich, eine etwas kürzere Zeit sollte besser sein, den: Innerhalb von ein paar Sekunden muss der Pilot nicht zwingend nachregeln, was die ganze Methode doch um einiges genauert macht. Folgendes Szenario: Der Pilot steuert beim 1. Test etwas stärker, da sich der Copter zu stark bewegt. Somit beinflusst der Pilot die Fitness sehr negativ. Beim 2. Test muss der Pilot nicht / nur wenig steuern, die Fitness wird somit nicht vom Piloten beeinflusst. Dann kann es passieren, dass die Werte des 2. Tests besser abschneiden als die des 1., obwohl die ersten Werte eigentlich die besseren wären. Stimmt ihr mir zu, oder habe ich hier einen Denkfehler?
Also Speichermäßig sollte auf dem Mega328P (der ist ja auf der shrediquette auch drauf, oder?) doch einiges vorhanden sein. Hab mich gerade mal an einer Lösung probiert, ist zwar noch nicht fertig, aber ich denke, ich habe bis auf ein paar Kleinigkeiten alles wichtige drin (7% Flash Used):
Code:
$regfile = "m328pdef.dat"
$crystal = 16000000
$framesize = 80
$hwstack = 80
$swstack = 80
$baud = 19200
Declare Sub Get_fitness()
Declare Sub Get_new_individuen()
Const Max_time = 50 'maximale Zeit zum Testen
Dim I As Byte 'Zeitpunkt i
Dim Gyro_yaw(max_time) As Integer 'Gyro Wert zum Zeitpunkt i
Dim Gyro_roll(max_time) As Integer 'Gyro Wert zum Zeitpunkt i
Dim Gyro_pitch(max_time) As Integer 'Gyro Wert zum Zeitpunkt i
Dim Gyro_yaw_sqr As Integer 'Gyro Differenz Wert von (i-1) bis i
Dim Gyro_roll_sqr As Integer 'Gyro Differenz Wert von (i-1) bis i
Dim Gyro_pitch_sqr As Integer 'Gyro Differenz Wert von (i-1) bis i
Dim Rnd_p As Single 'Zufallszahl zu Erstellung neuer Individuen
Dim Rnd_i As Single 'Zufallszahl zu Erstellung neuer Individuen
Dim Rnd_d As Single 'Zufallszahl zu Erstellung neuer Individuen
Dim Temperatur As Single 'simulated annealing
Dim Temperatur_int As Integer
Dim T_a As Single
Dim Kp_startup As Single 'Startup P Wert
Dim Ki_startup As Single 'Startup I Wert
Dim Kd_startup As Single 'Startup D Wert
Dim Kp_mom As Single 'momentaner P Wert
Dim Ki_mom As Single 'momentaner I Wert
Dim Kd_mom As Single 'momentaner D Wert
Dim Kp_best As Single 'bester P Wert
Dim Ki_best As Single 'bester I Wert
Dim Kd_best As Single 'bester D Wert
Dim Tmp As Byte
Dim Tmp_int As Integer
Dim Tmp_single As Single
Dim Fitness As Single
Dim Fitness_int As Integer
Dim Best_fitness As Single
Dim Best_fitness_int As Integer
Dim Fp As Single 'Dynamikunterschied
Dim Fi As Single 'Dynamikunterschied
Dim Fd As Single 'Dynamikunterschied
Dim _yawnow As Integer 'aktueller Gyro Wert
Dim _rollnow As Integer 'aktueller Gyro Wert
Dim _pitchnow As Integer 'aktueller Gyro Wert
Temperatur = 1
T_a = 0.95 'Abweichung
Kp_startup = 0.3
Ki_startup = 0.0001
Kd_startup = 0.000007
Fp = 0.2 'Dynamikunterschied
Fi = 0.05 'Dynamikunterschied
Fd = 0.05 'Dynamikunterschied
Tmp_int = Rnd(20) - 10 '-10 < tmp_int < 10
Rnd_p = Tmp_int * 0.1 '-1 < rnd_p < 1
Tmp_int = Rnd(20) - 10 '-10 < tmp_int < 10
Rnd_i = Tmp_int * 0.1 '-1 < rnd_i < 1
Tmp_int = Rnd(20) - 10 '-10 < tmp_int < 10
Rnd_d = Tmp_int * 0.1 '-1 < rnd_d < 1
Do
Call Get_new_individuen()
'teste neue Individuen
For I = 0 To 30
Gyro_yaw(i) = _yawnow
Gyro_roll(i) = _rollnow
Gyro_pitch(i) = _pitchnow
Waitms 1
Next I
Call Get_fitness()
If Fitness < Best_fitness Then
Best_fitness = Fitness
Kp_best = Kp_mom
Ki_best = Ki_mom
Kd_best = Kd_mom
End If
Temperatur = Temperatur * T_a
Tmp_int = Rnd(20) - 10 '-10 < tmp_int < 10
Rnd_p = Tmp_int * 0.1 '-1 < rnd_p < 1
Tmp_int = Rnd(20) - 10 '-10 < tmp_int < 10
Rnd_i = Tmp_int * 0.1 '-1 < rnd_i < 1
Tmp_int = Rnd(20) - 10 '-10 < tmp_int < 10
Rnd_d = Tmp_int * 0.1 '-1 < rnd_d < 1
Loop
Sub Get_new_individuen()
Kp_mom = Temperatur * Fp
Kp_mom = Kp_mom * Rnd_p
Kp_mom = Kp_mom + Kp_startup
Ki_mom = Temperatur * Fi
Ki_mom = Ki_mom * Rnd_i
Ki_mom = Ki_mom + Ki_startup
Kd_mom = Temperatur * Fd
Kd_mom = Kd_mom * Rnd_d
Kd_mom = Kd_mom + Kd_startup
End Sub
Sub Get_fitness()
For I = 1 To 30
Tmp = I - 1
Tmp_int = Gyro_yaw(i) - Gyro_yaw(tmp)
Tmp_int = Tmp_int ^ 2
Gyro_yaw_sqr = Gyro_yaw_sqr + Tmp_int
Tmp_int = Gyro_roll(i) - Gyro_roll(tmp)
Tmp_int = Tmp_int ^ 2
Gyro_roll_sqr = Gyro_roll_sqr + Tmp_int
Tmp_int = Gyro_pitch(i) - Gyro_pitch(tmp)
Tmp_int = Tmp_int ^ 2
Gyro_pitch_sqr = Gyro_pitch_sqr + Tmp_int
Next I
Fitness_int = Gyro_yaw_sqr + Gyro_roll_sqr
Fitness_int = Fitness_int + Gyro_pitch_sqr
Fitness = Fitness_int
End Sub
End
Es ist jetzt aber schon relativ spät, weshalb der Code noch seeeehr im Anfangsstadium ist. Werds mir morgen nochmal genauer ansehen.
Gruß
Chris
Lesezeichen