Jump to content

C++ IMU daten ausgeben


Recommended Posts

Guten Tag miteinander

Ich bin eher neu in C und in diesem Forum. (Bekommt man mehr Antworten wenn man auf Englisch posted?)

Nun meine eigentliche Frage:

Ich habe ein IMU Brick 2.0 und würde gerne aus dem C code ein dll erstellen wobei der Output der Funktion die Messdaten in Euler Winkel sein sollen.

Wie stellt man das an?

Momentan verwende ich das example_all_data.c file und dort werden die Messdaten über imu_v2_register_callback und darin genested cb_all_data aufgerufen.

Wie bekomme ich nun die Messdaten in die main() Ebene des Programmes (example_all_data). Anders gesagt wie bekomme ich die Eulerangles in der höchsten Ebene des Programms so dass ich diese Messungen als Variable auspucken kann?

 

Gruss

Jeremy

Link zu diesem Kommentar
Share on other sites

Moin,

vielleicht wäre es leichter dir zu helfen, wenn du uns mitteilen würdest, was genau du machen möchtest.

Da du Anfänger bist, würde ich dir empfehlen, erstmal dich an den gegebenen Beispielen und der Hilfe von Tinkerforge  lang zu hangeln. Besonders das example_simple.c ist für den Anfang echt nicht schlecht.  Du bekommst die Daten genau dann wenn du sie abrufst und landen auch an der Stelle wo du sie haben willst.  Allerdings sind das nicht die Eulerwinkel, dazu musst du die Funktion imu_v2_get_orientation verwenden.  Vielleicht reicht dir das dann auch schon für den Anfang.  Von da aus kannst du das dann in eine DLL auslagern, wenn überhaupt nötig.

Wenn du allerdings callbacks verwenden möchtest, schaue dir das Beispiel genauer an.  Das ...register_callback übergibt eine Funktion die die Daten verarbeitet (cb_all_data),   und da stehen die Daten auch zur Verfügung. Die Funktion wird auch ausgeführt wenn deine main() eine pause macht und z.B. auf eine Tasteneingabe wartet. Also vielleicht einfach mal in Threads und Synchronisation einlesen ;) 

MfG,

Nils

Link zu diesem Kommentar
Share on other sites

Hallo Nils

Danke für den Tip. ich werde die mal genauer anschauen. Ich weiss allerdings nicht ob mir die Callback funktion einen Vorteil gibt. Vieleicht kannst Du mich da beraten.

Was ich vor habe:

Ich möchte das IMU über einen Realtime controller von NI auslesen. Diese kann allerdings nicht den Brick Deamon ausführen da darauf kein Windows Betriebssystem sondern PharLaps darauf läuft. Zudem kommt NI Realtime nicht mit .net aus, daher kann ich das Labview API nicht verwenden.

Deswegen habe ich zu dem IMU BRick 2.0 auch einen Masterbrick und Ether extension angeschaft. Somit sollte ich die kommunikation auch ohne den Brick Deamon funktionieren. (Bezüglich DLL: Das dll würde ich dann bei Labview realtime einlesen. )

Nun was ich machen möchte ist die Orientierung des IMU bricks auszulesen und meinen Regelsystem füttern. Dort habe ich einen loop der mir ständig die Messwerte füttert und die Controlgrössen auspuckt.

Daher könnte gut sein das ich die Callback gar nicht brauche. Oder ich hab die Callback Funktionalität einfach nicht verstanden.

 

(Nun nach ausprobieren verwende ich die Qaternionwinkel und wandle sie in XYZ Cardan Winkel um. Daher brauche ich auch die RollGierNick winkel nicht mehr.)

 

Danke für die Auskunft.

Jeremy

 

 

Link zu diesem Kommentar
Share on other sites

Moin Jeremy,

ich selber benutze die callbacks ganz gerne, aber ich habe da auch etwas andere Voraussetzungen, da ich mit c++ und Qt arbeite, und der Vollständigkeit halber, mit Windows habe ich auch nix am Hut.  Bin mit Linux ganz zufrieden ;)

Bei dir sieht das wohl etwas anders aus.  Vielleicht reicht es ja auch einfach eine DLL zu erstellen und die Header mit zur Verfügung zu stellen.

Wie du eine DLL erstellst, kannst du dir vielleicht von Dmitry abschauen: https://stackoverflow.com/questions/31352215/c-makefile-building-multiple-dll-and-project-structuring 

In die DLL sollten wohl die Dateien brick_imu_v2.c und ip_connection.c. Dann die entsprechenden Header mit zur Verfügung stellen.  Wenn das klappt, ist vermutlich die Hälfte schon geschafft.  Dann musst du nur den Code nur noch aufrufen, aber wie das bei deinem System geht, kann ich dir leider nicht sagen.

Ich drück dir die Daumen :)

Nils

Link zu diesem Kommentar
Share on other sites

  • 1 year later...

Hallo Jeremy

Konntest du das Problem Lösen um die Messwerte in die main() Ebene zu bekommen von den Callbacks?

Ich habe momentan das Selbe Problem und kann leider nicht die Simple Lösung mit der Abfrage verwenden, da diese zu langsam ist. Die Funktion, welche Nils erwähnt hat, welche von ...register_callback übergeben wird hilft mir leider auch nicht weiter. Diese gibt ja keinen Wert zurück (return ...) und ich habe auch keinen pointer in der main() Ebene welcher mir den Messwert aufzeigt. Das einzige was die Funktion macht ist, den Messwert in Serial Monitor zu schreiben, was mir nicht viel hilft:

tf_hal_printf("Voltage: %d 1/%d V\n", voltage, 1000);

(Ich verwende den ESP32 Brick und möchte das Industrial dual analog in Bricklet mit mindestens 200 Hz auslesen können)

Kann ich die Funktion welche von ...register_callback übergeben wird irgendwie anpassen, damit der Messwert in der Main() ebene übergeben wird?

Freundliche Grüsse

Fridolin

Link zu diesem Kommentar
Share on other sites

On 1/5/2023 at 8:53 AM, fridolin11 said:

Kann ich die Funktion welche von ...register_callback übergeben wird irgendwie anpassen, damit der Messwert in der Main() ebene übergeben wird?

Dafür gibt es den void *user_data Parameter der Callbacks: Was auch immer du in der ...register_callback-Funktion als user_data übergibst, bekommst du in der Callback-Funktion als user_data-Parameter. Darüber kannst du dir zum Beispiel einen Pointer ins Callback stecken, der dir sagt wo die voltage hingeschrieben werden soll.

Beispielsweise (gekürzt und verändert von hier:)

 

// last_voltage ist hier eine globale Variable, könnte aber auch z.b. ein Struktur-Member sein.
static int32_t last_voltage;

// Callback function for voltage callback
static void voltage_handler(TF_IndustrialDualAnalogInV2 *device, uint8_t channel,
                            int32_t voltage, void *user_data) {
	(void)device; // avoid unused parameter warning
  
	int32_t *write_to = (int32_t *)user_data;  
	*write_to = voltage;
}

static TF_IndustrialDualAnalogInV2 idai;

void example_setup(TF_HAL *hal) {
	//[...]
	// Hier den Pointer übergeben, den das Callback schreiben soll
	tf_industrial_dual_analog_in_v2_register_voltage_callback(&idai, voltage_handler, &last_voltage);
	//[...]
}

 

Link zu diesem Kommentar
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.

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...