PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : künstlicher Horizont



fat tony
30.03.2009, 20:50
Ich habe die letzten Tage mal versucht einen künstlichen Horizont zu programmieren.
Leider ohne Erfolg. Hab keine Ahnung wie ich das Bild um 2 Achsen drehen kann (Schräglage und Neigung).
Für die Schräglage könnte man das Bild ja einfach drehen , aber wie kann ich es dann bei Neigung zusätzlich verschieben ?

Ach ja , programmieren möchte ich das ganze in VB.

dennisstrehl
30.03.2009, 21:17
Die vertikale Skale ist i.d.R. linear. Das Bild wird dann erstmal vertikal verschoben und anschließend (um den neuen Mittelpunkt) gedreht. Nix mit 2 mal drehen oder so. Zumindest wäre es so wohl am einfachsten...

Hast du schon die passende Sensorik dafür?

mare_crisium
31.03.2009, 15:47
Tony,

wie willst Du denn das Bild des künstlichen Horizonts erzeugen? Willst Du eine fertige Bitmap verwenden oder das Bild bei jeder Veränderung neu zeichnen?

Eine fertige Bitmap zu drehen und zu verschieben kostet viel Rechenzeit, weil Du bei jeder Veränderung jeden Bildpunkt einzeln neu ausrechnen musst. Wenn Du nur die Linien, Skalen und Zahlen darstellen willst, ist Neuzeichnen viel schneller.

Ciao,

mare_crisium

fat tony
31.03.2009, 18:49
@dennisstrehl
Sensorik hab ich schon , ein 3 Achsen Accelerometer.

@mare_crisium
Ob ich das Bild drehe bzw verschiebe oder neu erzeuge ist mir eigentlich egal , was weniger Aufwand mit sich bringt.

dennisstrehl
01.04.2009, 00:55
Ich hab von VB an sich keine große Ahnung.
Nur vom Prinzip her:
Mal dir vielleicht erstmal einen einfachen künstlichen Horizont auf, der nur aus ein paar Linien besteht, der Einfachheit halber.
Mach dir dann eine Liste (Array?), die alle Linien enthält, die zu zeichnen sind, also mit Anfangs- und Endpunkten mit den jwlg. x- und y- Koordinaten.
Anschließend kannst du die Koordinaten im Array umrechnen. Für die Vertikale Verschiebung müssen nur alle x-Werte um einen bestimmten Betrag verändert werden.
Die Drehung wird etwas schwieriger, ich werd das aus Zeitgründen hier nicht ausführlich ausführen. http://de.wikipedia.org/wiki/Rotation_(Mathematik)#Rotation_in_kartesischen_Koo rdinaten könnte hilfreich sein, aber wahrscheinlich ist dir dasschon wieder zu kompliziert?
Man könnte auch die x-y-Werte in Polarkoordinaten umwandeln, dann ist die Drehung nicht mehr so kompliziert, anschließend in x-y-Werte zurücktransformieren.
Anschließend müsste die grafische Ausgabe folgen. Wie das in VB funktioneirt kann ich dir nicht sagen.

Ich hoffe du willst mit den Beschleunigungssensoren nicht in einem Flugzeug oder anderen 6DOF-Objekten die Lage messen. Das funktioniert nicht. Wenn du das willst, such mal nach "IMU", "INS", "Inertiales Navigationssystem", bei Google und im Forum...

Gruß

mare_crisium
01.04.2009, 15:03
@dennisstrehl

ja, genauso so geht's.

@tony,

im pdf-Anhang ist genauer beschrieben, was dennisstrehl meint. In der Tabellenkalkulation ist das Beispiel aus dem Text zum 'Rumspielen nochmal dargestellt (wie immer bei mir: Hellgelb unterlegte Felder können gefahrlos verändert werden, alle anderen lieber nicht!).

Ich fürchte, VB ist für so eine Aufgabe zu langsam und zu umständlich. Ich programmiere solche Sachen in Delphi oder Free Pascal; mit C++ geht's aber auch. Vielleicht unterschätze ich VB aber auch nur ;-) !

Ciao,

mare_crisium

Edit: Anhänge gelöscht wg. Upload-Quota

fat tony
01.04.2009, 18:00
Ich hatte eigentlich vor den Horizont aus einzelnen Images zusammen zu setzen und dieses dann in VB entsprechend zu drehen.
Werde aber die andere Methode mal versuchen umzusetzen, eventuell geht das ja besser.

holzi
02.04.2009, 05:29
Guten morgen,
ist so etwas gemeint?
http://www.youtube.com/watch?v=eHUivDM77gg

VB ist in keinster Weise dafür zu langsam. Das ganze Cockpit ist in VB6 programmiert und funktioniert hervorragend.

Peter

mare_crisium
02.04.2009, 17:41
@ holzi,

das sieht aber schick aus :-) ! Ist das das Cockpit Deines Bodeneffekt-Fahrzeugs?

Du hast recht, offensichtlich ist VB nicht zu langsam. Ich nehme an, Du zeichnest die beweglichen Elemente bei jedem neuen Messwert neu?

Ciao,

mare_crisium

holzi
02.04.2009, 18:18
Hi,
genau das ist das Cockpit meines Groundeffect-Fahrzeuges. Ich setze ein Shape in die Ausgangsposition 0. Die Daten kommen per RS232 vom Neigungssensor ins Programm. Ich lege die Lage des Shapes ensprechend jeden Wertes neu an. Am Anfang dachte ich auch nicht, dass das so gut funktioniert. Ich habe da auch an Performance-Probleme gedacht. Aber wie jeder sehen kann, funktioniert das hervorragend. Dazu kommt ja nun auch noch, dass gleichzeitig der Kompass, Nick und Roll und dann noch das Radar hinzukommt. Der Rechner ist jedenfalls nicht überfordert. Es klappt.

Peter

holzi
02.04.2009, 18:20
Hi,
genau das ist das Cockpit meines Groundeffect-Fahrzeuges. Ich setze ein Shape in die Ausgangsposition 0. Die Daten kommen per RS232 vom Neigungssensor ins Programm. Ich lege die Lage des Shapes ensprechend jeden Wertes neu an. Am Anfang dachte ich auch nicht, dass das so gut funktioniert. Ich habe da auch an Performance-Probleme gedacht. Aber wie jeder sehen kann, funktioniert das hervorragend. Dazu kommt ja nun auch noch, dass gleichzeitig der Kompass, Nick und Roll und dann noch das Radar hinzukommt. Der Rechner ist jedenfalls nicht überfordert. Es klappt.

Peter

fat tony
03.04.2009, 12:14
@Holzi
Jup das ist genau das was ich suche.
Hab leider keinen Schimmer wie ich sowas realisieren kann.
Bin absoluter VB Neuling.

Goblin
05.04.2009, 18:24
Du könntest das ganze sehr effizient mit OpenGL machen, das ist nicht nur für 3D-Sachen nützlich. Vor allem gibt es da schon fertige Translations-und Rotationsfunktionen.
Aber der Standardumfang von VB sollte für dein Vorhaben reichen, wenn du nicht unbedingt Eyecandy willst. Ich hab dir mal ein paar Links rausgesucht:

Allgemein zu Grafik in VB (http://de.wikibooks.org/wiki/Visual_Basic_6:_Grafik)

Kreise und Linien in VB (http://www.vb-fun.de/cgi-bin/loadframe.pl?ID=vb/tipps/tip0010.shtml)

2D-Rotation in VB (einfache Mathematik) (http://www.vb-fun.de/cgi-bin/loadframe.pl?ID=vb/tipps/tip0060.shtml)

Wenn du noch Fragen hast dann kannst du dich auch gern per ICQ oder PN bei mir melden.

Achso, wenn du nicht VB 6 benutzt sondern .NET oder sowas, dann werden die meisten Codes in den Tipps nicht direkt funktionieren, weil die ganze Grafiksache ein wenig umgestellt wurde. Vom Prinzip her ist es allerdings noch das gleiche. Komplizierter geworden ist es nicht wirklich, nicht dass du jetzt abgeschreckt bist :)

Willa
05.04.2009, 18:47
Ich programmiere auch manchmal Zeugs in VB.NET (wegen der Ähnlichkeit zu BASCOM) und denke, daß es weitaus schneller ist als sein Ruf. Jedenfalls wird es wohl in fast allen Fällen schneller Dinge berechnen als man per RS232 neue Daten reinschicken kann.

Goblin
05.04.2009, 19:15
Das stimmt, besonders für diese Gui-Geschichten benutze ich VB ganz gern. Ist halt schnell mal zusammengeklickt. Momentan beschäftige ich mich allerdings eher mit Java, das hängt aber mit der Plattformunabhängigkeit zusammen. Für die meisten Gui-Sachen reicht VB, sogar für einfache 3D-Engines. Aber von Grafikverarbeitung mit Echtzeitansprüchen rate ich in VB echt ab :)

MikeJ
19.05.2009, 13:27
Hi

ich bin heute zufällig über den Beitrag gestolpert und habe mir die Frage gestellt welche Sensorik zur Bestimmung der Lage eines Flugzeugs verwendet werden müsste?!
Ich muss gestehen, ich habe von der Sensorik recht wenig Ahnung, daher stellen sich mir einige Fragen:
1.) ein Gyroskop und ein Kreisel sind doch das gleiche, oder?! Kreisel mechanisch, Gyro "elektrisch"?!
2.) wenn ich so einen Kreisel/Gyro ganz langsam drehe, zeigt der mir das trotzdem an oder benötige ich eine Mindestgeschwindigkeit damit er das erkennt?
3.) in Flugzeugen gibt es so genannte "Kugellibellen" (http://de.wikipedia.org/wiki/Wendezeiger), wie könnte man das was dieses Instrument anzeigt digital erfassen?! Bei einer "Idealkurve" bleibt diese Kugel in der Mitte, weil sich der Winkel des Flugzeugs und die Fliehkraft irgendwie ausgleichen. Im sog. "Schmierflug" überwiegt die Fliehkraft und die Kugel rollt "nach Außen"...

nicht das dieses Wissen Überlebensnotwendig wäre, aber vielleicht weiß ja doch jemand was dazu :-)


Zu Deiner ursprünglich Frage mit der Anzeige (Falls Du sie noch nicht realisiert hast): Ich würde mir mal das Thema WPF etwas genauer anschauen. Der Vorteil von WPF liegt darin, dass Du einen Großteil der Grafik auf die GPU auslagern kannst und damit die CPU nicht belastest. z.B. könntest Du eine Änderung des Wertes als Animation definieren und einfach starten. Um die Abarbeitung brauchst Du Dich dann nicht mehr zu kümmern.
Einfaches Beispiel:
Dein Horizont soll von -20° auf +20° gedreht werden.
Standard VB: Abarbeitung in einer For Schleife -20 to +20 Step 1 = Dein PC ist permanent mit dem Abarbeiten von Schleifen beschäftigt, Spätestens wenn Du 3-4 solche Anzeigen hast, fängt es zu ruckeln an.
WPF: Starte eine Animation auf den Wert +20. Das war´s - Die Animation startet automatisch am aktuellen Wert und endet an der Vorgabe. Während die Animation läuft, hat die CPU Zeit für andere Dinge.


Viele Grüße
Mike

dennisstrehl
19.05.2009, 14:18
Zu 1.) Die messen im Grunde das gleiche, ja. Die Funktionsweise unterscheidet sich aber völlig.

Zu 2.) Kommt drauf an von welchen Größenordnungen du da redest, wenn du "ganz langsam" sagst ;) Die Messauflösung ist natürlich beschränkt und liegt z.B. beim ADIS16355 bei 0.07326°/s. Es gibt sogenannte Laserkreisel (teuer, aber sehr genau), die haben auch eine physikalisch bedingte sog. Lock-In-Schwelle.

Zu 3.) Ein Beschleunigungssensor, der die Beschleunigung in Richtung der Querachse misst reicht dafür schon. Das Ding hat nichts mit dem Wendezeiger an sich zu tun.