WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Matlab: mex_file um c++ Code zu nutzen

 

baronsocke
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 21.05.14
Wohnort: Köln
Version: ---
     Beitrag Verfasst am: 25.06.2014, 12:26     Titel: Matlab: mex_file um c++ Code zu nutzen
  Antworten mit Zitat      
Guten Tag!

Ich habe einen Panorama-Schwenkkopf von RODEON. Auf dieses kommt eine Kamera, so dass ich die Winkel verstellen kann.

Den RODEON Head muss ich aus Matlab steuern. Dafür brauche ich ein mex-File.
Um den RODEON Panoramakopf anzusteuern liegt die gesamte API, C-Code, dll, lib usw. bereit. Diese wird von Rodeon mitgeliefert.

Ich habe ein Mex-File angelegt, und den Ansteuerungscode in c++ geschrieben. Mittlerweile bekomme ich über Matlab den RODEON Kopf initialisiert.
Wir haben es als .cpp Datei angelegt und den Compiler auf Microsoft Visual 2008 (oder so ähnlich) geändert.

Jetzt habe ich den ersten Code geschrieben und manchmal bekomme ich sogar den Kopf zum bewegen!
Hier muss ich jetzt feintüfteln.

Der Kopf lässt sich komischerweise nicht immer initialisieren. Warum auch immer. Irgendwann klappt es dann mal wieder.

ZUM CODE:

Anfangs muss ich den Kopf initialisieren:

RCIH hRCI = RODEONcontrol_init(argc, arg)

Über diesen Befehl wird eine Verbindung hergestellt und der Kopf ist startklar. Jetzt meine Frage.
Den Datentyp RCIH hRCI braucht man immer für alle weiteren Ansteuerungen.

Um den Kopf mit bestimmten Winkeln zu füttern rufe ich die Methode:

RODEONcontrol_goto(hRCI, hAngle, vAngle) auf. Wie ihr seht, brauche ich auch hier den Datentyp hRCI.


Jetzt meine eigentliche Frage. Wenn ich das Programm starte, soll der Kopf einmal initialisiert werden. Dann gebe ich einen Winkel durch, der Kopf steuert den Winkel an und bleibt solange da stehen, bis ich ihm einen neuen Winkel übermittele. Dafür braucht er jedes mal wieder den Datentyp hRCI.

Aktuell ist der Methodenaufruf zur Initialisierung und die „goto“ Funktion in einer Mex-funktion. Das bedeutet, dass jedes mal der Kopf neu initialisiert wird, wenn ich einen neuen Winkel übergebe. Das soll aber nicht sein.
Idealerweise hätte ich drei Mex-Funktionen:
1. eine zum Initialisieren (init)
2. eine um die Winkel anzusteuern (goto)
3. eine um den Kopf zu deinitialisieren und ihn in die Parkposition zu fahren. (deInit)

Und genau hier komme ich nicht weiter bzw. stoße ich an meine Programmierfähigkeiten. Um das so zu realisieren wie ich mir vorstelle, muss ich ja aus der 1. Funktion (init) mir den Datentyp hRCI holen und ihn jedes mal der goto-Methode übergeben.

Also: Ich rufe aus Matlab die init-Funktion auf, erhalte als Rückgabewert in Matlab den Datentyp hRCI, übergebe diesen zusammen mit den Winkeln wieder aus Matlab der goto-Methode.


Wie mache ich das? Geht das überhaupt? Oder wie löst man das Problem? Kann ich überhaupt einen solchen spezifischen Datentyp aus c++ in Matlab holen und ihn wieder über Mex an c++ übergeben?

Das gleiche müsste ich dann für die deInit-Funktion machen.
Private Nachricht senden Benutzer-Profile anzeigen


Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 25.06.2014, 14:35     Titel:
  Antworten mit Zitat      
Hallo,

es geht, ist aber recht tricky: man castet (auf den Fransen cer C-Legalität) den Pointer auf ein int32 oder int64 um und gibt den zurück.

Es geht aber deutlich besser: man "merkt" sich über eine statische Variable in der MEX-Datei die Variable hRCI. Dann darf man natürlich nur eine MEX-Datei haben. Dieser verpasst man einen weiteren Inputparameter (der Einfachheit halber eine Zahl) und dann code in etwa
Code:

int action = (int) (mxGetPr(prhs[0]))[0];
if (action==0) {
  // initialisierung
} elseif (action==1) {
  // bewege Kopf
} elseif (...)
 


Hoffe das hilft weiter...

Titus
Private Nachricht senden Benutzer-Profile anzeigen
 
baronsocke
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 21.05.14
Wohnort: Köln
Version: ---
     Beitrag Verfasst am: 26.06.2014, 17:10     Titel:
  Antworten mit Zitat      
Danke für die Hilfe!

Das Prinzip habe ich verstanden, doch leider kann ich das nicht ins Programm umsetzen, da ich einfach nicht gut im Programmieren bin.

Ich rufe aus Matlab das Mex-File mit dem C-Code auf. Der Datentyp RCIH hRCI wird erstellt, wenn ich den RODEON Kopf initialisiere.
Wie bleibt denn nun der Datentyp nach der Initialisierung erhalten, wenn ich die Mex-Funktion wieder verlasse, um sie aus Matlab heraus mit neuen Winkel aufzurufen? dann ist doch der Datentyp auch verschwunden? Sprich ich müsste wieder neu initialisieren? Das soll so nicht sein.

Danke vielmals!
Private Nachricht senden Benutzer-Profile anzeigen
 
baronsocke
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 21.05.14
Wohnort: Köln
Version: ---
     Beitrag Verfasst am: 27.06.2014, 13:00     Titel:
  Antworten mit Zitat      
Ich habe den Datentyp RCIH hRCI als globale Variable in der Mex-Funktion angelegt. So funktioniert es. Ich arbeite zusätzlich wie Titus beschrieben hat mit einem Vergleichsoperator, den ich bei Funktionsaufruf mit übergebe.

Ich möchte jetzt einen Schritt weiter gehen und eben nicht jedes mal den Vergleichsoperator übergeben. Um die Winkel anzufahren will ich nur zwei Winkel übergeben, nicht zwei Winkel und eine Zahl zum Vergleichen.

Ich möchte insgesamt 4 Mex-Funktionen haben:

1. zum Initialisieren (init)
2. um die Winkel einzustellen (goto)
3. um eine bestimmet Position auf 0°/0° zu setzen (setToZero)
4. zum Deinitialisieren und in Parkposition zu fahren (deInit)


Ich habe nun 4 Mex-Funktionen mit jeweils der entsprechenden Methode angelegt und jedes mal eine globale Variable für den Datentyp RCIH angelegt. Das gefällt ihm aber nicht:(
Wenn ich zuerst die Mex-Funktion zum Initialisieren aufrufe und dann die MEX-Funktion um die Winkel einzustellen, meckert er.

Woran kann das liegen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.