Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

1

08.06.2015, 21:18

Drohnensteuerung

Hi,

ich soll die Steuerung für eine virtuelle Drohne programmieren. Dabei ist nicht alles vorgegeben, wichtig ist nur dass das Ergebnis halbwegs glaubwürdig ist. Das ganze muss in Java programmiert werden.
Meine Drohne, die ich mir als Quadrokopter vorstelle, sieht bis jetzt so aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Drone{
    public static final int RADIUS = 10;
    public static final float MAX_H_SPEED = 20;
    public static final float MAX_V_SPEED = 14;
    public static final float H_ACCELERATION = 10;
    public static final float V_ACCELERATION = 2;
    
    private Point position = new Point();
    private Point speed = new Point();
    private Point accelerate = new Point(); // Motordrehzahl 0.0 bis 1.0
    private float altitute;
    private Point targetLocation;

// ...
}

Als Einflussfaktoren möchte ich erstmal die Gravitation und den Wind berücksichtigen. Wie die vier Motoren genau angesteuert werden ist unwichtig, wichtig ist jedoch wie stark in welche Richtung gesteuert wird um ans Ziel zu kommen. Die Drohne muss dafür starten, fliegen und Objekten ausweichen und landen. Das Starten und Landen ist senkrecht wohl am sinnvollsten.

Nun zum Problem: bei der Steuerung muss ich beschleunigen und auch wieder abbremsen. Wie rechne ich z.B. aus wann und wie lange beschleunigt werden muss um die Flughöhe zu erreichen und zu halten?
Wenn ich z.B. 20m als Flughöhe einstelle, soll die Drohne beschleunigen und bevor sie 20m erreicht so viel langsamer steigen dass sie optimalerweise nicht (oder nicht weit) über die 20m hinausschießt.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »DeKugelschieber« (08.06.2015, 23:00)


2

08.06.2015, 21:33

Für Gravitation & Wind DGL aufstellen und numerisch lösen.

Für die Regelung kann ich dir http://de.wikipedia.org/wiki/Regler empfehlen.

3

08.06.2015, 21:56

Bin mir nicht 100% Sicher ob nen Quadcopter genauso die Bewegung wie ein Normaler Hubschrauber kann, aber wenn ja, fehlen dir die Daten für die Hochachse.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

4

08.06.2015, 21:57

Puuh, ich weiß wirklicht nicht wie ich das damit anpacken soll. Angefangen dabei welchen Regler man nimmt.

Ich hab für die Koordinaten mal ne Punktklasse eingebaut. Das ganze soll so simpel wie möglich bleiben, aber halbwegs brauchbar steuern...
Ob das nun wirklich ein Quadrokopter ist oder nicht ist egal, sagen wir mal er kann senkrecht starten und ohne sich zu drehen in alle Richtungen fliegen.

5

08.06.2015, 22:24

Puuh, ich weiß wirklicht nicht wie ich das damit anpacken soll. Angefangen dabei welchen Regler man nimmt.


Regler PID! Puhhh schon wieder 4 Jahre her das ganze und nichts mehr Kopf :P

Ich schau mal ob ich meine Unterlagen dazu noch finde. Ansonsten mal im Wiki artikel einlesen beim PID-Regler die ganze Thematik ist eigentlich gar nicht so wild.

Edit: Wenn ich nochmal drüber nachdenke sollte das auch ohne Regelungstechnik gehen. Bei einem Schwebe Flug muss permanent mit 9,81 m/s² Nach oben beschleunigt werden. Die Geschwindigkeit ist dann 0. Wenn die Vertikalgeschwindigkeit Größer 0 ist und ich die Beschleunigung auf 9,81 m/s² drossele dann ist es doch ganz normal Physik Rechnung den "Bremsweg" zu berechnen.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Koschi« (08.06.2015, 22:38)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

6

08.06.2015, 22:56

Naja gut, vertikaler Wind ist ja nicht ausgeschlossen :)
Daher kann es schon Sinn machen zu sagen man nimmt einen Regler. Für Mathematik bin ich heute nicht mehr zu haben. Aber einen ganz stumpfen Regler, der sich auf einen Schwebeflug einpendelt habe ich schon mal hinbekommen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    private void start(){
        if(position.z < altitute){
            accelerate.z = 1;
            
            if(speed.z > 0){
                accelerate.z = Math.min(1, (altitute-position.z)/speed.z);
            }
        }
        else if(position.z > altitute){
            accelerate.z = -1;
            
            if(speed.z < 0){
                accelerate.z = Math.max(-1, (altitute-position.z)/speed.z);
            }
        }
    }

Die Ausgabe läuft dann (bei 20m eingestellt) bis 24, wieder runter auf 13 (durch die Gravitation so weit) und pendelt sich nach 20-30 Sekunden bei +/- 20cm ein, was mir reichen würde. Eine kleine Optimierung die mir jetzt gerade auffällt wäre es natürlich beim übersteigen der Zielhöhe die 9,81 wieder aufzurechnen, damit der nicht mit Vollgas nach unten korrigiert.
Alternativ probiere ich morgen mal eine PID Klasse zu schreiben oder rauszusuchen und einzubauen. Was nimmt man dann eigentlich als P, I und D Wert? Ausprobieren oder gibts da ein System?
Schade dass Mathe und Physik nicht zu meinen Stärken gehören^^ Formeln lesen ist auch schwer...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »DeKugelschieber« (08.06.2015, 23:05)


7

08.06.2015, 23:16

Was nimmt man dann eigentlich als P, I und D Wert?

Wir hatten die Werte immer anhand von Diagrammen ermittelt. Die Werte sind für jeden Regelkreis anders.

Naja gut, vertikaler Wind ist ja nicht ausgeschlossen :)
Daher kann es schon Sinn machen zu sagen man nimmt einen Regler.

Du müsstet eh für jede Bewegungs achse einen eigenen Regelkeis machen.

pendelt sich nach 20-30 Sekunden bei +/- 20cm ein

Wahrscheinlich Osziliert er um den Punkt, deshalb sollte da eine Hysterese rein.

Eine kleine Optimierung die mir jetzt gerade auffällt wäre es natürlich beim übersteigen der Zielhöhe die 9,81 wieder aufzurechnen, damit der nicht mit Vollgas nach unten korrigiert.

Gute Idee.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

8

08.06.2015, 23:23

Wahrscheinlich Osziliert er um den Punkt, deshalb sollte da eine Hysterese rein.

Genau das habe hiermit versucht:

Quellcode

1
2
3
if(speed.z > 0){
                accelerate.z = Math.min(1, (altitute-position.z)/speed.z);
            }

Vielleicht wird es effizienter wenn ich noch mit der Beschleunigung multipliziere... aber für heute höre ich auf ^^

9

08.06.2015, 23:44

Quellcode

1
2
3
4
if(speed.z > 0)
{
    accelerate.z = Math.min(1, (altitute-position.z)/speed.z);
}


Ich würde sagen du willst hier den falschen Parameter Regeln, letzt endlich möchtest du eine höhe halten, also solltest du auch diesen Parameter Regeln.

Quellcode

1
2
3
4
5
6
if(position.z > altitute + 0,1 m) 
     dann Beschleunigung senken
else if(position.z < altitute - 0,1 m)
     dann Beschleunigung erhöhen
else
     Beschleunigung beibehalten(9,81 m/s²)


Edit: habe gerade gesehen im Groben ist dein Code ja so, nur das du immer gleich regelst sobald du die Höhe verlässt und das ist eben keine Hysterese.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Koschi« (08.06.2015, 23:58)


DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

10

09.06.2015, 21:57

So, ohne Repo fühle ich mich einfach nicht mehr wohl.

Der "Regler" ist jetzt gut genug fürs erst:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void start(){
        if(position.z < altitute){
            accelerate.z = 1;
            
            if(speed.z > 0){
                accelerate.z = Math.min(1, (altitute-position.z)/speed.z);
            }
        }
        else if(position.z > altitute){
            accelerate.z = -1;
            
            if(speed.z-Simulation.GRAVITY < 0){
                accelerate.z = Math.max(-1, (altitute-position.z)/speed.z);
            }
        }
    }

Die Hysterese kommt zu stande, wenn der Abstand klein genug ist.
Hier mal ein Video, jetzt mit Wind:



Oben rechts sieht man ab welcher Höhe der Wind minimal/maximal greift, wie schnell er maximal wird (4 m/s) und wie schnell er aktuell ist. Die Linie visualisiert das zusätzlich.
An der Drohne seht ihr die Koordinaten, v-acc für verticale acceleration und vertical speed. Durch die kleine Optimierung und eine geringere maximal Steigrate hält das Teil jetzt mit ~30cm Schwankung.
Als nächstes kommt das Fliegen.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »DeKugelschieber« (09.06.2015, 22:22)


Werbeanzeige