Jump to content

Recommended Posts

Geschrieben

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.

  • Replies 125
  • Created
  • Letzte Antwort

Top Posters In This Topic

Top Posters In This Topic

Posted Images

Geschrieben

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.

Geschrieben

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.

Geschrieben

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

  • 3 weeks later...
Geschrieben

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
}

  • 2 weeks later...
Geschrieben

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.

Geschrieben

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 !

Geschrieben

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

 

Join the conversation

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

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.


×
×
  • Neu erstellen...