Brainstorming: Physik beim Drohnenflug und dessen Implementierung..
- corpsman
- Lazarusforum e. V.
- Beiträge: 1617
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Brainstorming: Physik beim Drohnenflug und dessen Implementierung..
Servus miteinander,
Ich bin in des FPV-Drohnenfliegen eingestiegen und habe mir gedacht es wäre doch cool einen eigenen Simulator zu schreiben (ich weis das ist unsinnig weil es schon viele gibt, einige sogar umsonst. Aber es geht ja um das Verständnis dahinter [und den Spass]).
Aktuell habe ich bereits erfolgreich erledigt:
-Auslesen der Funkfernsteuerung
-Mathematik die Notwendig ist um alle Bewegungsvektoren zu Berechnen (Pitch, Roll, Yaw, Throttle)
-Berechnen / Darstellen von Landschaften
-Bewegung der Kamera entsprechend der Bewegungsvektoren
-Kollision zwischen Drohne und Landschaft
Wie das ganze ausschaut könnt ihr hier sehen: Offen ist noch:
-Die Flugphysik
Hierzu mal folgende Gedanken:
Meine Drohne ist ein Punkt im Raum, dieser wird durch folgende Größen beeinfluss:
-Propeller (Auftrieb in Kamera Hoch[/ Runter bei inverted props] Richtung [ohne den CAM-Nick Offset mit dem die CAM auf der Drohne Montiert ist])
-Schwerkraft (Sinken Absolut nach Unten)
-Massenträgheit
-Luftreibung ?
-???
Meine Bisherige Idee:
Die Drohne hat Position / Geschwindigkeit (alles 3D-Vektoren)
* Alle X ms versetze ich die Position um die Geschwindigkeit scalliert mit X
* Alle X ms addiere ich auf die Geschwindigkeit den "G-Vektor"scalliert mit X nach unten
* Alle x ms Scalliere ich den Geschwindigkeitsvektor mit einem Wert >0 und <1 um den Luftwiderstand zu realisieren (Irgendwie kommt mir das falsch vor steigt der Luftwiderstand nicht mit der Geschwindigkeit..)?
* Alle X ms Addiere ich auf die Geschwindigkeit den Schubkraftvektor scalliert mit X (transformiert entsprechend der Kamera Richtung)
=> Damit wäre Geschwindigkeit meine Massenträgheit
1. Würde das Funktionieren / macht das halbwegs Sinn ?
2. Ich würde ganz gerne Dinge wie das Drohnen Gewicht / Maximale Schubkraft der Propellor berücksichtigen. Im Obigen Beispiel würde meine Drohne bei Vollgas ja unendlich beschleunigen, das ist natürlich unrealistisch, oder reicht die Dämpfung des Luftwiderstand aus um das zu begrenzen ?
3. Wie realisiert man also das die Propellor die Drohne nur maximal beschleunigen können ?
Ihr seht fragen über Fragen.
Wie seht ihr das, passt mein Ansatz ist das kompletter Unsinn (und wenn ja wie macht man es besser)...
Ich bin in des FPV-Drohnenfliegen eingestiegen und habe mir gedacht es wäre doch cool einen eigenen Simulator zu schreiben (ich weis das ist unsinnig weil es schon viele gibt, einige sogar umsonst. Aber es geht ja um das Verständnis dahinter [und den Spass]).
Aktuell habe ich bereits erfolgreich erledigt:
-Auslesen der Funkfernsteuerung
-Mathematik die Notwendig ist um alle Bewegungsvektoren zu Berechnen (Pitch, Roll, Yaw, Throttle)
-Berechnen / Darstellen von Landschaften
-Bewegung der Kamera entsprechend der Bewegungsvektoren
-Kollision zwischen Drohne und Landschaft
Wie das ganze ausschaut könnt ihr hier sehen: Offen ist noch:
-Die Flugphysik
Hierzu mal folgende Gedanken:
Meine Drohne ist ein Punkt im Raum, dieser wird durch folgende Größen beeinfluss:
-Propeller (Auftrieb in Kamera Hoch[/ Runter bei inverted props] Richtung [ohne den CAM-Nick Offset mit dem die CAM auf der Drohne Montiert ist])
-Schwerkraft (Sinken Absolut nach Unten)
-Massenträgheit
-Luftreibung ?
-???
Meine Bisherige Idee:
Die Drohne hat Position / Geschwindigkeit (alles 3D-Vektoren)
* Alle X ms versetze ich die Position um die Geschwindigkeit scalliert mit X
* Alle X ms addiere ich auf die Geschwindigkeit den "G-Vektor"scalliert mit X nach unten
* Alle x ms Scalliere ich den Geschwindigkeitsvektor mit einem Wert >0 und <1 um den Luftwiderstand zu realisieren (Irgendwie kommt mir das falsch vor steigt der Luftwiderstand nicht mit der Geschwindigkeit..)?
* Alle X ms Addiere ich auf die Geschwindigkeit den Schubkraftvektor scalliert mit X (transformiert entsprechend der Kamera Richtung)
=> Damit wäre Geschwindigkeit meine Massenträgheit
1. Würde das Funktionieren / macht das halbwegs Sinn ?
2. Ich würde ganz gerne Dinge wie das Drohnen Gewicht / Maximale Schubkraft der Propellor berücksichtigen. Im Obigen Beispiel würde meine Drohne bei Vollgas ja unendlich beschleunigen, das ist natürlich unrealistisch, oder reicht die Dämpfung des Luftwiderstand aus um das zu begrenzen ?
3. Wie realisiert man also das die Propellor die Drohne nur maximal beschleunigen können ?
Ihr seht fragen über Fragen.
Wie seht ihr das, passt mein Ansatz ist das kompletter Unsinn (und wenn ja wie macht man es besser)...
--
Just try it
Just try it
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: Brainstorming: Physik beim Drohnenflug und dessen Implementierung..
Hi!
Der Luftwiderstand geht zum Quadrat der Geschwindigkeit.
Deshalb möchten die Designer immer am liebsten Karosserien ohne Außenspiegel bauen.
Und deshalb sind manche Karosserien denkbar ungeeignet für hohe Geschwindigkeiten, wie z.B. der ,VW-Bus: "Luftwiderstand wie ein Kleiderschrank" heisst es in Designerkreisen.
Winni
Der Luftwiderstand geht zum Quadrat der Geschwindigkeit.
Deshalb möchten die Designer immer am liebsten Karosserien ohne Außenspiegel bauen.
Und deshalb sind manche Karosserien denkbar ungeeignet für hohe Geschwindigkeiten, wie z.B. der ,VW-Bus: "Luftwiderstand wie ein Kleiderschrank" heisst es in Designerkreisen.
Winni
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Brainstorming: Physik beim Drohnenflug und dessen Implementierung..
Ivch vermute, das ist wesentlich komplexer.
Ich würde erst einmal anfangen einen freien Fall (Parabel) zu realisieren
v+= dv,
dvx=dvy= 0,
dvz += ddvz ,
ddvz = G (Erdbeschleunigung).
Dann könntest Du den Luftwiderstand / Einfluss einrechnen:
dv+= v² * L (alle Richtungen, angenommen, das Ding ist eine Kugel, bei einem Flugzeug mit Flügeln natürlich ganz anders, weil Vortrieb in Auftrieb umgewandelt wird. Bei Erreichen der Schallgeschwindigkeit ändert sich da auch noch einiges.)
Der motorische Auf- und Vortrieb hängt natürlich von der Bauart, aktueller Motor(en)-Einstellung(en) und der Lage im Raum ab.
-Michael
Ich würde erst einmal anfangen einen freien Fall (Parabel) zu realisieren
v+= dv,
dvx=dvy= 0,
dvz += ddvz ,
ddvz = G (Erdbeschleunigung).
Dann könntest Du den Luftwiderstand / Einfluss einrechnen:
dv+= v² * L (alle Richtungen, angenommen, das Ding ist eine Kugel, bei einem Flugzeug mit Flügeln natürlich ganz anders, weil Vortrieb in Auftrieb umgewandelt wird. Bei Erreichen der Schallgeschwindigkeit ändert sich da auch noch einiges.)
Der motorische Auf- und Vortrieb hängt natürlich von der Bauart, aktueller Motor(en)-Einstellung(en) und der Lage im Raum ab.
-Michael
- kupferstecher
- Beiträge: 431
- Registriert: Do 17. Nov 2016, 11:52
Re: Brainstorming: Physik beim Drohnenflug und dessen Implementierung..
Normal berechnet man das über das Kräftegleichgewicht, Summe aller Kräfte = 0;
Kräfte ergeben sich aus
- der Erdbeschleunigung
- den Antrieben* und
- der Reibung.
Die Summe dieser Kräfte ist die Beschleunigungskraft. Alles vektoriell natürlich. Die Beschleunigungskraft ergibt über das Gewicht deine Beschleunigung (F=m*a), aber das brauch ich dir nicht sagen
.
*Bei den Antrieben spielt der Kippwinkel mit rein, je nachdem bekommst du einen Vertikal- und Horizontalanteile.
Kräfte ergeben sich aus
- der Erdbeschleunigung
- den Antrieben* und
- der Reibung.
Die Summe dieser Kräfte ist die Beschleunigungskraft. Alles vektoriell natürlich. Die Beschleunigungskraft ergibt über das Gewicht deine Beschleunigung (F=m*a), aber das brauch ich dir nicht sagen

*Bei den Antrieben spielt der Kippwinkel mit rein, je nachdem bekommst du einen Vertikal- und Horizontalanteile.
Kannst du was dazu schreiben, wie stellst du die Lage im Raum dar? Ist nämlich nicht ganz einfach, wenn man die Position in absoluten Koordinaten mitführen möchte, was in der Simulation ja nötig ist.corpsman hat geschrieben: Do 30. Apr 2020, 10:37 -Mathematik die Notwendig ist um alle Bewegungsvektoren zu Berechnen (Pitch, Roll, Yaw, Throttle)
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Brainstorming: Physik beim Drohnenflug und dessen Implementierung..
Grundlegend ist die Physik ein Hund. Weil die Reibung = Luftwiderstand der Drohne je nach Vektor verschieden ist. Alleine die wirksame Fläche ändert sich.
Die Frage ist wie gut soll die Simulation sein
BTW: Ich habe das bei einer blöden Simulation beim Radfahren erfahren müssen. Siehe auch http://www.kreuzotter.de/deutsch/speed.htm
Die Frage ist wie gut soll die Simulation sein

BTW: Ich habe das bei einer blöden Simulation beim Radfahren erfahren müssen. Siehe auch http://www.kreuzotter.de/deutsch/speed.htm
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 6910
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Brainstorming: Physik beim Drohnenflug und dessen Implementierung..
Deine Landschaft sieht genial aus, hast du die mit OpenGL gemacht ?-Berechnen / Darstellen von Landschaften
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
- corpsman
- Lazarusforum e. V.
- Beiträge: 1617
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: Brainstorming: Physik beim Drohnenflug und dessen Implementierung..
Hallo Alle Zusammen,
Danke erst mal für eure Hinweise ich versuche diese mal auf zu arbeiten
=> gerade bin ich noch in der Phase, das man sieht das es unrealistisch ist. Ich würde ganz gerne wenigstens soweit kommen dass es halbwegs glaubwürdig wirkt *g*.
Wenn man aber mal weis wie es geht ist es echt einfach und das will ich euch natürlich nicht vor enthalten (wie es dazu kam, kann man hier nachlesen: https://delphigl.com/forum/viewtopic.php?f=30&t=11700 )
Zur Mathematik ein paar Details:
In OpenGL gibt es keinen Unteschied zwischen Welt Koordinaten und Kamera Koordinaten (deswegen heist es auch ModelView Matrix)
=> entweder man bewegt die Welt um die Kamera oder die Kamera um die Welt, macht keinen Unterschied, außer das eben alles Negativ wird.
Ich Rendere also meine Welt in Absolut Koordinaten und Drehe vorher die Kamera:
Der Fürs Rendern Relevante Teil ist dann wie Folgt:
Man Beachte den "CAMAngle" dieser ist unabhängig, das ist deswegen so weil ich damit eine für alle Berechnungen "unsichtbare" Rotation der Kamera machen kann (siehe CAM-Angle on Real Drone
).
FMatrix ist also das Ding das das Geheimnis macht. In der Mathematik nennt man so ein Ding Basiswechselmatrix
=> Das Ding Rechnet also Weltkoordinaten in Kamerakoordinaten um.
Will ich nun die Kamera drehen kann ich das entweder von Hand Berechnen, oder lasse es OpenGL machen und das geht dann so:
Ich habe auch eine eigene Mathe Library die das genauso machen kann, nur so geht es halt "schneller"
Man kann so auch die Kamera bewegen:
Der bisherige Code hat auch so funktioniert => die Kamera wird aus sicht dieser nach Oben Versetzt.
=> Dieses Verfahren hat aber 2 Nachteile
1. Ich kann die Physik nicht sauber rein Rechnen
2. Ich weis nicht wo ich bin
das 2. ist, wenn man die Eigenschaften der Matrix Kennt leicht zu erledigen, man braucht nur die Inverse Matrix und kann so Kamera Koordinaten wieder zurück Rechnen in Absolute:
Und damit kann man dann auch "leicht" das 1. Lösen. Denn Wenn meine Drohne Gas gibt muss ich ja wissen wie sich die Beschleunigung in Absolut Koordinaten Auswirkt und das geht ganz einfach wenn für V nicht die Werte Aus der Matrix nimmt sondern Result wird dann zu den Nach Achsen Separierten Anteilen umgerechnet
.
So viel zur Mathematik, wem das nicht Reicht einfach noch mal Konkreter Nachfragen
.
So nun aber zu meinen Themen:
Folgendes habe ich gemacht und es schaut schon mal deutlich besser aus (leider kann ich hier keine Filme hochladen, sonst könntet ihr es auch sehen *g*).
- Driften geht schon
- Achtung wer den Code Nachvollziehen Will bei mir ist x nach Links, y nach Oben und z nach Vorne
=> Es fehlt also noch der Luftwiderstand, wie mache ich das ?
=> Es fehlt noch die Geschwindigkeitsbegrenzung (das dürfte doch dann der Luftwiderstand erledigen)?
=> Es fehlt noch die Masse der Drohne (oder macht man das in dem man einfach Throttle anpasst)?
-\
-/ So siehts schon mal deutlich besser aus, ich musste G aber um Faktor 10 Reduzieren und auch mein Throttle ist irgendwie nur geraten
Danke erst mal für eure Hinweise ich versuche diese mal auf zu arbeiten
Danke für die Blumen, natürlich ist das OpenGL. Das ist auch Recht unspektakulär gemacht ist einfach nur ein Trianglestrip im Wireframe Mode Ohne Wireframe sieht es noch nicht so gut aus, weil mein Textur erzeugungsalgorithmus 1:1 skalliert (das kriege ich besser hin aber vorerst reicht es)Deine Landschaft sieht genial aus, hast du die mit OpenGL gemacht ?
Das ist ein Spass Projekt, in der Regel fange ich irgendwie an und iteriere dann so lange bis ich entweder nicht mehr weiter weis oder es gut genug aussieht.Die Frage ist wie gut soll die Simulation sein.
=> gerade bin ich noch in der Phase, das man sieht das es unrealistisch ist. Ich würde ganz gerne wenigstens soweit kommen dass es halbwegs glaubwürdig wirkt *g*.
Ja das war zu Anfangs etwas Kniffelig, vor allem weil ich auch noch die Richtung der Z-Achse gedreht habe (ein Rein Persöhnliches Feature hat nichts mit der Mathe zu tun).Kannst du was dazu schreiben, wie stellst du die Lage im Raum dar? Ist nämlich nicht ganz einfach, wenn man die Position in absoluten Koordinaten mitführen möchte, was in der Simulation ja nötig ist.
Wenn man aber mal weis wie es geht ist es echt einfach und das will ich euch natürlich nicht vor enthalten (wie es dazu kam, kann man hier nachlesen: https://delphigl.com/forum/viewtopic.php?f=30&t=11700 )
Zur Mathematik ein paar Details:
In OpenGL gibt es keinen Unteschied zwischen Welt Koordinaten und Kamera Koordinaten (deswegen heist es auch ModelView Matrix)
=> entweder man bewegt die Welt um die Kamera oder die Kamera um die Welt, macht keinen Unterschied, außer das eben alles Negativ wird.
Ich Rendere also meine Welt in Absolut Koordinaten und Drehe vorher die Kamera:
Code: Alles auswählen
Procedure TForm1.OpenGLControl1Paint(Sender: TObject);
Var
Delta, t: uint64;
Begin
If Not Initialized Then Exit;
// Render Szene
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT Or GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
t := GetTickCount64();
delta := t - fLastTick;
fLastTick := t;
fDrone.Move(delta);
fDrone.Render(); // Die Drohne besteht im Prinzip nur aus einer sich Bewegenden Kamera
fmap.Render();
OpenGLControl1.SwapBuffers;
End;
Code: Alles auswählen
Procedure TCam.CamToOpenGL();
Begin
If fCamAngle <> 0 Then Begin
glRotatef(-fCamAngle, 1, 0, 0);
End;
glMultMatrixf(@fMatrix);
End;

FMatrix ist also das Ding das das Geheimnis macht. In der Mathematik nennt man so ein Ding Basiswechselmatrix
=> Das Ding Rechnet also Weltkoordinaten in Kamerakoordinaten um.
Will ich nun die Kamera drehen kann ich das entweder von Hand Berechnen, oder lasse es OpenGL machen und das geht dann so:
Code: Alles auswählen
Procedure TCam.Roll(Angle: Single);
Begin
glPushMatrix();
glLoadIdentity();
glRotatef(-Angle, 0, 0, 1);
glMultMatrixf(@fMatrix);
glGetFloatv(GL_MODELVIEW_MATRIX, @fMatrix);
glPopMatrix();
End;
Man kann so auch die Kamera bewegen:
Code: Alles auswählen
Procedure TCam.StrafeUpWay(delta: Single);
Begin
glPushMatrix();
glLoadIdentity();
glTranslatef(0, -delta, 0);
glMultMatrixf(@fMatrix);
glGetFloatv(GL_MODELVIEW_MATRIX, @fMatrix);
glPopMatrix();
End;
=> Dieses Verfahren hat aber 2 Nachteile
1. Ich kann die Physik nicht sauber rein Rechnen
2. Ich weis nicht wo ich bin
das 2. ist, wenn man die Eigenschaften der Matrix Kennt leicht zu erledigen, man braucht nur die Inverse Matrix und kann so Kamera Koordinaten wieder zurück Rechnen in Absolute:
Code: Alles auswählen
Function TCam.GetPosition: TVector3;
Var
m: TMatrix4x4;
v, p: TVector4;
Begin
v := v4(fMatrix[3, 0], fMatrix[3, 1], fMatrix[3, 2], 0); // Die Position in Kamera-Space
m := TransposeMatrix(fMatrix); // Da es sich um eine Ortohonalmatrix Handelt ist die Inverse die Transponierte
p := m * v; // Rückprojektion der Kamera Position in das Absolute Koordinatensystem
result := v3(-p.x, -p.y, -p.z); // Typconvertierung
End;
Code: Alles auswählen
v := v4(0,Thrust,0);

So viel zur Mathematik, wem das nicht Reicht einfach noch mal Konkreter Nachfragen

So nun aber zu meinen Themen:
Folgendes habe ich gemacht und es schaut schon mal deutlich besser aus (leider kann ich hier keine Filme hochladen, sonst könntet ihr es auch sehen *g*).
- Driften geht schon

- Achtung wer den Code Nachvollziehen Will bei mir ist x nach Links, y nach Oben und z nach Vorne
Code: Alles auswählen
Const
Gravity = 9.8 / 10; // Die musste ich doch drastisch "kürzen"
Throttle: Single = Gravity * 2; // Die Drohne muss stärker als die Gravitation sein, sonst fliegt sie nicht (Typisch ist normalerweise Faktor 4-8)
Procedure TDrone.MoveAcro();
Var
f: Single;
Begin
// Throttle
f := Input.Throttle(); // [-1..1]
If fPropMode = pmNormal Then Begin // Normal Fliegen
f := (f + 1) / 2; //Umrechnen nach [0..1]
fActualForce := fActualForce + fcam.ConvertCamCoordToWorldCoord(V3(0, -Throttle * f, 0));
End
Else Begin // Inverted Flugmodus
fActualForce := fActualForce + fcam.ConvertCamCoordToWorldCoord(V3(0, -Throttle * f, 0));
End;
// Yaw
fcam.Yaw(Turn * Input.Yaw());
// Roll
fcam.Roll(Turn * Input.Roll());
// Pitch
fcam.Pitch(Turn * Input.Pitch());
If assigned(Map) Then Begin
// Schwerkraft
fActualForce := fActualForce + v3(0, -Gravity, 0);
End;
End;
Procedure TDrone.Move(Delta_ms: Integer);
Var
p: TVector3;
Begin
If Not assigned(Input) Then exit;
fActualForce := v3(0, 0, 0);
Case fFlightMode Of
fmAcro: MoveAcro();
fmArcade: MoveArcade();
End;
fVelocity := fVelocity + fActualForce * Delta_ms / 1000;
p := fCam.Position;
p := p + fVelocity;
fcam.Position := p;
// Kollisionen ..
If assigned(Map) Then Begin
If fCam.CollideWithGround(map.GetHeightAtPosition(p.x, p.z)) Then Begin
fVelocity := v3(0, 0, 0);
End;
End;
End;
=> Es fehlt noch die Geschwindigkeitsbegrenzung (das dürfte doch dann der Luftwiderstand erledigen)?
=> Es fehlt noch die Masse der Drohne (oder macht man das in dem man einfach Throttle anpasst)?
-\
-/ So siehts schon mal deutlich besser aus, ich musste G aber um Faktor 10 Reduzieren und auch mein Throttle ist irgendwie nur geraten
--
Just try it
Just try it
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Brainstorming: Physik beim Drohnenflug und dessen Implementierung..
In der Schule hatten wir damals im Physik Unterricht Finite Difference Time Domain benutzt um Simulationen von kräften zu beschreiben (https://www.wikiwand.com/de/Finite_Diff ... ime_Domain)
Die idee dabei ist das man die Zeitachse diskretisiert und die änderungen zwischen den Zeitschritten als linear animmt (Wenn ich jetzt ne ahnung von Numerik hätte wüsste ich wie diese art von Integral approximation heißen würde).
So machen das übrigens auch PC spiele, daher werden Spiele Engine gerne für Simulationen benutzt, z.b. Nutzt das US militär die Cry-Engine um simulationen zu bauen.
Ich bastel mir ganz gerne mal so kleinere Physik simulationen mit dieser technik, geht ganz einfach:
Du legst dir ne Liste mit Forces an, und in jedem Zeitschritt berechnest du dann
Ich hab vielleicht irgendwo auf der Platte noch eine kleine Simulation rumfliegen, falls ich sie finde poste ich sie hier mal
Die idee dabei ist das man die Zeitachse diskretisiert und die änderungen zwischen den Zeitschritten als linear animmt (Wenn ich jetzt ne ahnung von Numerik hätte wüsste ich wie diese art von Integral approximation heißen würde).
So machen das übrigens auch PC spiele, daher werden Spiele Engine gerne für Simulationen benutzt, z.b. Nutzt das US militär die Cry-Engine um simulationen zu bauen.
Ich bastel mir ganz gerne mal so kleinere Physik simulationen mit dieser technik, geht ganz einfach:
Du legst dir ne Liste mit Forces an, und in jedem Zeitschritt berechnest du dann
Code: Alles auswählen
// compute forces
Forces[0] := G*m1*m2/r^2 *direction // gravity
// compute sum of forces as acceleration
Acceleration := 0;
for force in Forces do
Acceleration += force * mass;
// apply forces
Position := Position + Velocity * delta;
Velocity := Velocity + Acceleration * delta;
- corpsman
- Lazarusforum e. V.
- Beiträge: 1617
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: Brainstorming: Physik beim Drohnenflug und dessen Implementierung..
@Warf,
Was du da beschreibst ist ja genau was ich gemacht habe, nur das du in der Gravity noch eine Masse multipliziert hast.
Ich habe auch Diskrete Zeitschritte (delta), damit müsste ich genau die Beschriebene Methode haben,
Das Flugbild sieht ja auch schon echt Toll aus. Die Frage war ja wie ergänze ich meine Berechnungen um den Luftwiderstand.
mschnell hatte das mit
Was du da beschreibst ist ja genau was ich gemacht habe, nur das du in der Gravity noch eine Masse multipliziert hast.
Ich habe auch Diskrete Zeitschritte (delta), damit müsste ich genau die Beschriebene Methode haben,
Das Flugbild sieht ja auch schon echt Toll aus. Die Frage war ja wie ergänze ich meine Berechnungen um den Luftwiderstand.
mschnell hatte das mit
beschrieben, nur hatte ich nicht verstanden wie ich das mit einbauen kann ...dv+= v² * L
--
Just try it
Just try it
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Brainstorming: Physik beim Drohnenflug und dessen Implementierung..
mschnell schrieb aber was von einer Kugel, das hast du ja nicht.
Dumme Frage, hast du vor dein bisheriges Modell mit der Natur abzugleichen ?
Dumme Frage, hast du vor dein bisheriges Modell mit der Natur abzugleichen ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
- corpsman
- Lazarusforum e. V.
- Beiträge: 1617
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: Brainstorming: Physik beim Drohnenflug und dessen Implementierung..
Er schrieb das der Luftwiderstand bei einer Kugel Gleichförmig ist, ich also eigentlich die Lage der Drohne bei der Berechnung des Luftwiderstands berücksichtigen müsste, dies kann ich vernachlässigen, wenn wenn ich eine Kugelform annehme (was auch mein Plan gewesen wäre, ich wills ja nicht übertreiben..)
Und nein ich habe nicht vor es gegen die Natur zu testen, ich selbst fliege aber fast Täglich mehrere Akkus mit meiner Minidrohne durchs Haus und wo es die Situation zuläst auch draußen. Daher versuche ich schon die Simulation so realistisch wie möglich zu machen.
Ich denke wenn ich den Luftwiderstand mit einberechne kriege ich ein gutes Mittel hin die Maximale Geschwindigkeit zu Begrenzen (ja ich weis ich könnte auch einfach die Beschleunigung kappen) aber ich denke das Versuche ich noch bevor ich auf diesen Letzten Weg zurückgreife.
Wenn ich das Speedlimit habe, wollte ich mich noch an einem "Propwash" genannten Effekt versuchen und dann bin ich zufrieden. Hab ja noch ein paar andere sachen mit meiner Simulation vor
.
Und nein ich habe nicht vor es gegen die Natur zu testen, ich selbst fliege aber fast Täglich mehrere Akkus mit meiner Minidrohne durchs Haus und wo es die Situation zuläst auch draußen. Daher versuche ich schon die Simulation so realistisch wie möglich zu machen.
Ich denke wenn ich den Luftwiderstand mit einberechne kriege ich ein gutes Mittel hin die Maximale Geschwindigkeit zu Begrenzen (ja ich weis ich könnte auch einfach die Beschleunigung kappen) aber ich denke das Versuche ich noch bevor ich auf diesen Letzten Weg zurückgreife.
Wenn ich das Speedlimit habe, wollte ich mich noch an einem "Propwash" genannten Effekt versuchen und dann bin ich zufrieden. Hab ja noch ein paar andere sachen mit meiner Simulation vor

--
Just try it
Just try it
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Brainstorming: Physik beim Drohnenflug und dessen Implementierung..
Du hast mich grad ein kleines bisschen generdsniped, ich habe zwar meinen alten Code nicht mehr gefunden, aber hatte grade lust mal selbst wieder ne kleine Simulations-engine zu bauen. Hab den code mal angehängt.
Simuliert die Bahnen des Mondes um die Erde, und man kann Luftwiederstand hinzufügen. Habe an den entsprechenden Stellen die Wikipediaartikel mit den Formeln verlinkt.
Simuliert die Bahnen des Mondes um die Erde, und man kann Luftwiederstand hinzufügen. Habe an den entsprechenden Stellen die Wikipediaartikel mit den Formeln verlinkt.
- Dateianhänge
-
Simulation.zip
- (6.17 KiB) 118-mal heruntergeladen
- kupferstecher
- Beiträge: 431
- Registriert: Do 17. Nov 2016, 11:52
Re: Brainstorming: Physik beim Drohnenflug und dessen Implementierung..
Danke für die ausführliche Beschreibung zur Vektorgeometrie.
dv ist ja die Geschwindigkeitsänderung, also Beschleunigung.
a = v²*L
oder
F/m = v²*L
oder
F_reib = v²*L*m
oder
F_reib = v²*L_2
Diskretisiert kommst du wieder auf die += Schreibweise.
Hattest oder hast?corpsman hat geschrieben: Do 30. Apr 2020, 19:03 mschnell hatte das mitbeschrieben, nur hatte ich nicht verstanden wie ich das mit einbauen kann ...dv+= v² * L
dv ist ja die Geschwindigkeitsänderung, also Beschleunigung.
a = v²*L
oder
F/m = v²*L
oder
F_reib = v²*L*m
oder
F_reib = v²*L_2
Diskretisiert kommst du wieder auf die += Schreibweise.
- corpsman
- Lazarusforum e. V.
- Beiträge: 1617
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: Brainstorming: Physik beim Drohnenflug und dessen Implementierung..
@Kupferstecher
Manchmal hat man Tomaten vor den Augen, ich habe immer noch nicht:
Aus dem Beispiel von Warf habe ich nun gesehen, dass ich alle Kräfte durch die Masse Teilen muss, wenn ich Masse Simulieren will.
Aber der Luftwiderstand äergert mich immer noch, evtl kannst du es mir ja in den unten stehenden "Zusammengefassten" Code integrieren.
Mit dem hier Funktioniert die Simulation schon gar nicht schlecht, es fehlt leider immer noch
-Der Luftwiderstand (der Obige Code erzeugt einen Luftwiderstand von immer 0
-Die Korrekte Simulation/ Berechnung von Throttle (Wenn meine Drohne x Gramm wiegt, jeder Motor y-Gramm Schub erzeugen kann, ist dann Throttle tatsächlich 4*y/x und gut ?)
[Edit]
Meine Mathelibrary hat einen Bug, wenn ich V3*V3 Mache kommt da kein Scalar sondern das Kreuzprodukt raus, deswegen war das recht Strange.
Die Neue Formel macht es deutlich "intuitiver", aber warum brauche ich hier die Masse ?
Manchmal hat man Tomaten vor den Augen, ich habe immer noch nicht:
Aus dem Beispiel von Warf habe ich nun gesehen, dass ich alle Kräfte durch die Masse Teilen muss, wenn ich Masse Simulieren will.
Aber der Luftwiderstand äergert mich immer noch, evtl kannst du es mir ja in den unten stehenden "Zusammengefassten" Code integrieren.
Code: Alles auswählen
Procedure TDrone.Move(Delta: Integer);
Const
cw: Single = 0.45; // CW-Wert einer Kugel ( https://de.wikipedia.org/wiki/Str%C3%B6mungswiderstandskoeffizient )
A: Single = 0.3 * 0.3; // Ungefähre Fläche einer 30cm*30cm großen Drohne
Var
d, p: TVector3;
Begin
fActualForce := v3(0, 0, 0);
// Aufsummieren aller Kräfte die auf die Drohne wirken können
// Steuerbefehle
f := Input.Throttle(); // [-1..1]
If fPropMode = pmNormal Then Begin // Normal Fliegen
f := (f + 1) / 2; // Umrechnen nach [0..1]
fActualForce := fActualForce + fcam.ConvertCamCoordToWorldCoord(V3(0, -Throttle * f, 0))/fmass;
End
Else Begin // Inverted Flugmodus
fActualForce := fActualForce + fcam.ConvertCamCoordToWorldCoord(V3(0, -Throttle * f, 0))/fmass;
End;
(*
* Code der die Drohne dreht ..
*)
// Schwerkraft
fActualForce := fActualForce + v3(0, -Gravity / fmass, 0);
fVelocity := fVelocity + fActualForce * (Delta / 1000);
// Versuch den Luftwiderstand zu Berechnen
//d := cw * A * 0.5 * fVelocity * fVelocity; -- Alt
d := cw * A * 0.5 * DotV3(fVelocity, fVelocity) * fMass * fVelocity; // Warum brauche ich hier die Masse ?
form1.caption := format('%0.2f / %0.2f / %0.2f', [d.x, d.y, d.z]); // Zum Debuggen
fVelocity := fVelocity - d;
p := fCam.Position;
p := p + fVelocity;
fcam.Position := p;
end;
-Der Luftwiderstand (der Obige Code erzeugt einen Luftwiderstand von immer 0
-Die Korrekte Simulation/ Berechnung von Throttle (Wenn meine Drohne x Gramm wiegt, jeder Motor y-Gramm Schub erzeugen kann, ist dann Throttle tatsächlich 4*y/x und gut ?)
[Edit]
Meine Mathelibrary hat einen Bug, wenn ich V3*V3 Mache kommt da kein Scalar sondern das Kreuzprodukt raus, deswegen war das recht Strange.
Die Neue Formel macht es deutlich "intuitiver", aber warum brauche ich hier die Masse ?
--
Just try it
Just try it
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Brainstorming: Physik beim Drohnenflug und dessen Implementierung..
Formel für drag: https://www.wikiwand.com/en/Drag_(physi ... es_of_drag
F = 1/2 * roh * v² * koeffizient * A
Beschleunigung:
F = m *a <=> a = F / m
Also ist die Beschleunigung
a = 1/2 * roh * v² * koeffizient * A / Masse
Wobei roh die dichte von luft ist (etwa 1), A der drag-koeffizient ist (du nimmst eine kugel an, drohnen sind eher windschnittig gestaltet, also ist ein wert zwischen 0.05 und 0.1 eher angebracht https://www.wikiwand.com/en/Drag_coefficient) A ist der die Projezierte Fläche gegen den wind (https://www.wikiwand.com/en/Cross_section_(geometry)).
Also wenn man die werte einsetzt kommt da 1/2 * v² * 0.1 * A / Masse.
Du musst also durch die Masse teilen und nicht damit multiplizieren. Am ende multiplizierst du auch nochmal mit dem Vektor fVelocity, wahrscheinlich um das ganze zu nem richtungsvektor zu machen, doch da musst du 1. den negativen vektor nehmen (immerhin ist drag in die entgegengesetzte richtung) und zum anderen den vektor normalisieren, damit der nicht die stärke der kraft beinflusst.
Das gesagt berechnest du mit dem drag eine kraft, in der zeile drüber:
Berechnest du die geschwindigkeitsänderung aus der kraft. Warum fügst du den wert nicht zu totalForce hinzu und bevor du totalForce für die berechnung von Velocity benutzt?
PS: TotalForce ist eine Beschleunigung, also totalAcceleration, nicht ne Kraft, da du bereits schon durch die masse geteilt hast, der Name ist verwirrend
F = 1/2 * roh * v² * koeffizient * A
Beschleunigung:
F = m *a <=> a = F / m
Also ist die Beschleunigung
a = 1/2 * roh * v² * koeffizient * A / Masse
Wobei roh die dichte von luft ist (etwa 1), A der drag-koeffizient ist (du nimmst eine kugel an, drohnen sind eher windschnittig gestaltet, also ist ein wert zwischen 0.05 und 0.1 eher angebracht https://www.wikiwand.com/en/Drag_coefficient) A ist der die Projezierte Fläche gegen den wind (https://www.wikiwand.com/en/Cross_section_(geometry)).
Also wenn man die werte einsetzt kommt da 1/2 * v² * 0.1 * A / Masse.
Du musst also durch die Masse teilen und nicht damit multiplizieren. Am ende multiplizierst du auch nochmal mit dem Vektor fVelocity, wahrscheinlich um das ganze zu nem richtungsvektor zu machen, doch da musst du 1. den negativen vektor nehmen (immerhin ist drag in die entgegengesetzte richtung) und zum anderen den vektor normalisieren, damit der nicht die stärke der kraft beinflusst.
Das gesagt berechnest du mit dem drag eine kraft, in der zeile drüber:
Code: Alles auswählen
fVelocity := fVelocity + fActualForce * (Delta / 1000);
PS: TotalForce ist eine Beschleunigung, also totalAcceleration, nicht ne Kraft, da du bereits schon durch die masse geteilt hast, der Name ist verwirrend