Jump to content

Recommended Posts

Guten Morgen und Hallo.

 

Da mein IMU inzwischen abgeschickt wurde will ich mal meine Projektidee vorstellen.

Wie unschwer an meinem Avatarbild zu sehen, beschäftige ich mich mit der Fliegerrei. Habe selbst eine Sportpilotenlizens.

 

Da ich schon lange auf der Suche nach einem Lagesensor war, war der IMU genau das Richtige für mich.

Beruflich arbeite ich als Programmierer.

 

Meine Idee ist ein leichtes (Bei UL kommt es auf jedes "Gramm" an) HUD herzustellen.

 

Die Software wird nicht das größte Problem darstellen.

Das größte Problem wird die Projezierung des Bildes auf das eigenliche HUD.

Meine Idee ist dazu einen Picobeamer zu benutzen.

Leider habe ich noch keinen zum Testen in die Hand bekommen um zu schauen ob meine Idee funktioniert.

Es soll ja auch bei Sonneneinstrahlung gut lesbar sein.

Vielleicht hat jemand von euch schon einen und kann mal testen ob die Darstellung auf einer Glasscheibe ausreichend ist?

Es gibt ja die verschiedensten Typen. Große Lichtstärke (Lummen) wäre von Vorteil.

 

Was ich als Computerplatform benutze weiß ich jetzt noch nicht.

Am besten einen

Raspberry Pi oder ähnliches. Muß ich wegen der Leistung schauen.

Share this post


Link to post
Share on other sites

Erkläre uns doch bitte HUD, nicht jeder möchte gleich die Websuche anschmeißen, noch hat jeder eine Fluglizenz... (Ausnahme natürlich bei den Modellbaufliegern  ;D

Share this post


Link to post
Share on other sites

Head up display.

 

Da werden quasi irgendwelche relevanten Informationen direkt auf die Windschutzscheibe geworfen, so muss man den Blick nicht vom wichtigen (die echte Welt) abwenden um die Geschwindigkeit/Neigung/usw zu sehen.

Share this post


Link to post
Share on other sites

Wie mein Vorschreiber schon schrieb.

 

Head Up Display

 

Beispiele

HUD%20M1.jpg

F-18-HUD.jpg

 

Mir geht es um die Darstellung von relevanten Daten wie, Fluglage,Indicated Airspeed,Flughöhe,Kurs e.t.c

 

Share this post


Link to post
Share on other sites

Wie wird denn bei einem professionellen HUD das Bild erstellt? Vom aussehen her, sieht das nach Laser o.ä. aus. Ein Pico Beamer wird da glaube ich schwerlich reichen. Die, die ich bis jetzt gesehen habe, bzw. über die ich gelesen habe, reichten gerade mal aus, um in einem abgedunkelten Raum ein kleines Bild gerade so anzuzeigen.

Share this post


Link to post
Share on other sites

Es gibt schon Picobeamer die mit Laser arbeiten.

Ausserdem muß man auch sehen das die Entfernung zur "Leinwand" ziehmlich klein ist in so einem Cockpit.

 

Bei herkömlichen HUD werden die Informationen via CRT Bildschirm projiziert.

 

Hab das ganze scon mal in meinem Auto mit meinem Galaxy S2 getestet.

Funktionierte ziehmlich gut wenn es etwas dunkler war.

Aber das ist kein Vergleich. Hat ja nur ein OLED Display.

 

Die Anfänger vom HUD gab es schon im 1. WW. Waren dann im 2.WW richtig verbreitet und nannten sich damals Reflexvisier.

Damals wurde nur ein Fadenkreuz ins Blickfeld projiziert.

 

Strahlengang eines deutschen Revi C12/A, Baujahr 1937

659px-Revi_C12-A.jpg

 

weitere Informationen unter

bei wikipedia

Share this post


Link to post
Share on other sites

Die Projektionsfläche wird eine extra Scheibe sein.

Sie soll nicht das gesamte Frontfeld belegen.

Muß ich schauen. Schätze mal so Breite zwischen 20 und 30 cm.

Höhe muß ich dann auch schauen.

Share this post


Link to post
Share on other sites

So. Will mal den aktuellen Stand meines Projektes vorstellen.

Hab inzwischen Verbindung zum IMU aufgenommen und bekomme meine gewünschten Daten.

 

Hab das Beispiel etwas modifiziert.

 

Beim Start verbindet sich das Programm zum Brick. Fragt die vorhandenen Brick's (in meinem Fall nur der IMU) ab und connectetd automatisch zum gefundenem IMU (falls vorhanden)

Ausserdem kann man in der Kommandozeile verschiedene Argumente angeben.

 

-Host  Rechnername oder IP

-Port  XXX Port auf dem der Deamon hört (falls einanderer eingestellt)

-Period XXX  Peridode für die Callbackmethode

? Ausgabe einer Kurzen Hilfe

 

Mann selber muss nicht mehr die UID eingeben. Diese erfragt das Programm selber.

 

Jetzt versuche ich die grafische Ausgabe zu Erzeugen. Also das eigentliche HUD.

Will dazu die Grafische Benutzerschnittstellen GTKmm benutzen.

Bekomme aber diese Verf...... nicht eingebunden.

Sagt mir schon beim Compilieren das die Datei gtkmm.h nicht gefunden wird.

 

P.S.

F-Secure identifiziert den Demon immer noch als Keylogger.

 

#include <gtkmm.h> 

 

Obwohl schon im Projektverzeichnis enthalten. motzi.gif

#include <stdio.h>
#include <math.h>

#include "ip_connection.h"
#include "brick_imu.h"

#include <string.h>
#include <mbstring.h>
#include <malloc.h>

#define MAX_STRING 255

char*	Programmpath= NULL;
char*	HOST		= NULL;
int		PORT		= 4223; // Demon Standardport
int		Periode		= 100;

int16_t		pitch		= 0;
int16_t		roll		= 0;
int16_t		yaw			= 0;
int16_t		heading		= 0;

IPConnection*	ipcon	= NULL;
IMU*			imu		= NULL;
char*			UID		= NULL;

void cb_quaternion(float x, float y, float z, float w)
{
/****************************************************************************/
/*						Antwort auf	Quaternionabfrage  						*/
/****************************************************************************/
float roll  = atan2(2*y*w - 2*x*z, 1 - 2*y*y - 2*z*z);
float pitch = atan2(2*x*w - 2*y*z, 1 - 2*x*x - 2*z*z);
float yaw   = asin(2*x*y + 2*z*w);
printf("x: %f\ty: %f\tz: %f\tw: %f\t\n", x, y, z, w);
printf("roll: %f\tpitch: %f\tyaw: %f\t\n\n", roll, pitch, yaw);
/*
pi = math.atan2(2.0*(y*z - w*x), 1.0 - 2.0*(x*x + y*y));
ro = math.atan2(2.0*(x*z + w*y), 1.0 - 2.0*(x*x + y*y));
ya = math.atan2(2.0*(x*y + w*z), 1.0 - 2.0*(x*x + z*z));

di = app.dir.get();
if (di == 0)
{
	pi = -pi,
}
if(di == 1)
{
	pi, ro = -ro, -pi;
}
if(di == 2)
{
	ro = -ro;
}
if(di == 3)
{
	pi, ro = ro, pi;
}
*/
}

void cb_alldata(int16_t acc_x, int16_t acc_y, int16_t acc_z, int16_t mag_x, int16_t mag_y, int16_t mag_z, int16_t ang_x, int16_t ang_y, int16_t ang_z, int16_t temperature)
{
/****************************************************************************/
/*						Antwort auf	Abfrage aller Daten 					*/
/****************************************************************************/
float Temp = (float)temperature/100;
printf("acc_x: %d\nacc_y: %d\nacc_z: %d\nmag_x: %d\nmag_x: %d\nmag_z: %d\nang_x: %d\nang_y: %d\nang_z: %d\ntemperature: %f\n\n", acc_x, acc_y, acc_z, mag_x, mag_y, mag_z, ang_x, ang_y, ang_z,Temp);
}

void cb_orientation(int16_t vroll, int16_t vpitch, int16_t vyaw)
{
printf("cb_orientation\n");
/****************************************************************************/
/*						Antwort auf	Orientationabfrage  					*/
/****************************************************************************/
roll	= vroll	/100;
pitch	= vpitch/100;
yaw		= vyaw	/100;

printf("roll: %d\tpitch: %d\tyaw: %d\n\n", roll, pitch, yaw);
}

void cb_enumerate(char* device_uid, char* device_name, uint8_t device_stack_id, bool is_new)
{
/****************************************************************************/
/*				Antwort auf	Komponentenabfrage (Bricks,Bricklets) 			*/
/****************************************************************************/
printf("device_uid: %s\tdevice_name: %s\tdevice_stack_id: %d\t is_new: %d\n\n", device_uid, device_name, device_stack_id,is_new);

/****************************************************************************/
/*						Testen ob IMU Brick gefunden						*/
/****************************************************************************/
unsigned char* Test1;
unsigned char* Test2;
Test2 = (unsigned char*)"IMU Brick";
Test1 = (unsigned char*)device_name;
if(_mbsnbcmp(Test1,Test2,9)==0)
{
	printf("IMU gefunden\n");
	/****************************************************************************/
	/*							IMU Brick einbinden								*/
	/****************************************************************************/
	UID = (char *)malloc((strlen(device_uid)-1) * sizeof(char));
	size_t n =	 (strlen(device_uid)-1) * sizeof(char);
	if(UID)
	{
		_strset( UID, 0 ); 
//			strncpy(UID, device_uid, strlen(device_uid)-1);
//			_strset_s( UID,n, 0 ); 
		strncpy_s(UID,strlen(device_uid),  device_uid, strlen(device_uid)-1);
		/****************************************************************************/
		/*							IMU Brick erstellen								*/
		/****************************************************************************/
		if(!imu)
		{
			imu = new IMU();
		}
		imu_create(imu, UID); 

		/****************************************************************************/
		/*				IMU Brick zur IP Connection hinzufügen						*/
		/****************************************************************************/
		if(ipcon_add_device(ipcon, imu) < 0)
		{
			fprintf(stderr, "Could not connect to Brick\n");
			exit(1);
		}

		/****************************************************************************/
		/*					Ausgabegeschwindigkeit einstellen in ms					*/
		/****************************************************************************/
//			printf("Periode %d\n",Periode);
		imu_set_quaternion_period(	imu, Periode);
		imu_set_all_data_period(	imu, Periode);
			imu_set_orientation_period(	imu, Periode);
		/****************************************************************************/
		/*						IMU Brick Callback erstellen						*/
		/****************************************************************************/
//			imu_register_callback(imu,IMU_CALLBACK_ALL_DATA		, cb_alldata);
//			imu_register_callback(imu,IMU_CALLBACK_QUATERNION	, cb_quaternion);
		imu_register_callback(imu,IMU_CALLBACK_ORIENTATION	, cb_orientation);
	}
}
}

int main( int argc, char *argv[] )
{
Programmpath = (char *)malloc((MAX_STRING) * sizeof(char));
strcpy(Programmpath, argv[0]);

HOST = (char *)malloc((MAX_STRING) * sizeof(char));
strcpy(HOST, "localhost");

    if( argc > 1 )
    {
	for( int i = 1; i < argc; i++ )
	{
		_strlwr( argv[i] ); 
		unsigned char* Test1;
		Test1 = (unsigned char*)argv[i];
		unsigned char* Test2 = (unsigned char*)"?";
		if(_mbsnbcmp(Test1,Test2,1)==0)
		{
			fprintf(stderr, "\nTest.exe -Host Hostname -Port XXX -Periode XXX\"\n\n\t-Host Hostname\tIP or computername on that of the BRICK Demaon runs ( Default localhost )\n\t-Port XXX\tPort with that of the BRICK Demaon runs ( Default 4223 )\n\t-Periode XXX\tCycle period ( Default 100 )\n");
			exit( 1 );
		}

		Test2 = (unsigned char*)"-host";
		if(_mbsnbcmp(Test1,Test2,5)==0)
		{
			strcpy(HOST, argv[i+1]);
		}
		Test2 = (unsigned char*)"-port";
		if(_mbsnbcmp(Test1,Test2,5)==0)
		{
			PORT = atoi(argv[i+1]);
		}
		Test2 = (unsigned char*)"-period";
		if(_mbsnbcmp(Test1,Test2,5)==0)
		{
			Periode = atoi(argv[i+1]);
		}
	}
}
/****************************************************************************/
/*							IPConnection erstellen							*/
/****************************************************************************/

if(!ipcon)
{
	ipcon = new IPConnection();
}
if(ipcon_create(ipcon, HOST, PORT) < 0)
{
	fprintf(stderr, "Could not create connection\n");
	exit(1);
}
//	printf("Test %s\t %d\n",HOST, PORT);
/****************************************************************************/
/*					Komponenten (Bricks,Bricklets) abfragen					*/
/****************************************************************************/
ipcon_enumerate(ipcon,cb_enumerate);

printf("Press ctrl+c to close\n");
ipcon_join_thread(ipcon); // Join mainloop of ip connection
}

Share this post


Link to post
Share on other sites

probiermal

anstatt

 

#include <gtkmm.h> 

 

ein

#include "gtkmm.h" 

 

wenn ich mich recht erinnere sind die <> Zeichen für systembibliotheken

Share this post


Link to post
Share on other sites

Hatte ich auch schon probiert. Der selbe Effekt.

1>z:\software\visual studio 2008\projects\imutest\gtkmm.h(87) : fatal error C1083: Datei (Include) kann nicht geöffnet werden: "glibmm.h": No such file or directory

Share this post


Link to post
Share on other sites

ugly_gruebel.gif

 

facepalm.png

 

Danke. Glatt übersehen.

 

Hmmm. Aber diese Meldung kommt auch wenn die geforderte Datei + Verzeichnis im Projektordner ist.

 

QT?

Hmmm. Gleich mal beschnüffeln.

Share this post


Link to post
Share on other sites

So. Hab mich mal mit QT beschäftigt.

Gibts ja auch als MS Visualstudio AddOn. (Da ich beruflich damit arbeite)

 

Hab jetzt die graphische Anzeige für die Horizontlage, also Rollen und Nick, implemetiert.

Funktioniert schon. Noch unter Windows.

Als nächstes der Kompass und die Höhe.

Share this post


Link to post
Share on other sites

So. Mal ein kleiner Screenshot vom aktuellem Stand.

Die 3 Zahlen links sind nur die Werte für mich im Moment um die Werte lesen zu können.

 

HUD.jpg

Share this post


Link to post
Share on other sites

Das liegt daran dsa die Flugsimulatoren sich an der Realität orientieren. ;)

HUD kommen ja ursprünglich aus der Militärluftfahrt.

Share this post


Link to post
Share on other sites

Mal ne einfache und kurze Frage zum IMU.

Wo ist Norden also vorn und wo ist oben.

Das solltet ihr vielleicht mit auf die Platine drucken.

Share this post


Link to post
Share on other sites

So. Hab mir gestern mal nen einfachen Kompass für knapp 10 Euro geholt um zu vergleichen.

Feststellung.

USB Stecker liegt Richtung West. ;)

Share this post


Link to post
Share on other sites

Nö, kann ich nicht bestätigen:

 

Die Y-Achse zeigt nach Norden, x-Achse nach Osten, und damit USB-Buchse nach Süden. Also eigentlich wie bei Real_Black, aber ich schaue auf die LEDs !

Share this post


Link to post
Share on other sites

Eigentlich sollte das doch bei allen IMU-Bricks gleich sein, oder?

Ich hab jetzt schon öfters gelesen, dass der USB-Stecker nach Süden zeigt.

@FlyingDoc: Kannst du denn störende Einflüsse auschließen?

 

Wäre beim Fliegen ja schon relevant, dass es in die richtige Richtung geht :-D

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...