PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Roboter Steuerung in Visual C#



linuxjohnny
04-09-2008, 18:23
Hi,

Wir haben begonnen Visual C# zu programmieren um damit dann eine Roboterspinne anzusteuern.
Jetzt zu meiner Frage: (es werden evtl. noch weitere folgen :P)

Am Anfang gibt es eine Funktion um den Seriellen Port zu öffnen um damit mit dem Servocontroller Board zu kommunizieren.
Ich möchte jetzt gerne eine Funktion sprich if-Abfrage einbauen bei der eine MsgBox angezeigt wird wenn der Serial Anschluss nicht belegt ist, also wenn der USB zu Seriell Adapter nicht angeschlossen ist.


if(_port.PortName="COM4" != )
{
MessageBox.Show("Bitte Seriell Adapter anschliessen");
}
ARANEA.ConnectionProperties config = ARANEA.ConnectionProperties.getInstance();
_port = new SerialPort();
_port.PortName = "COM4";
_port.BaudRate = 9600;
_port.Handshake = Handshake.None;
_port.Parity = Parity.None;
_port.StopBits = StopBits.One;
_port.DataBits = 8;


Wie könnte hier nun die If-Abfrage aussehen? damit dies geprüft wird?

MFG

Kevin Haag

Beatkiller
14-09-2008, 16:44
Ich lehn mich jetzt mal aus dem Fenster und empfehle einen Blick in die Doku der Klasse SerialPort. Hier wird beschrieben, wie man prüfen kann, ob eine Verbindung zu einem externen Gerät besteht:



sp = new SerialPort();
sp.Open();

/* ... hier sonstiger code */

if(sp.IsOpen)
{
// Der Port ist geöffnet
}


Ansonsten besuch mal diese Seite: http://www.mycsharp.de/wbb2/thread.php?threadid=15117

linuxjohnny
23-09-2008, 17:01
Hi,
Danke dir für die Antwort, aber ich konnte dies nun folgendermasen lösen


if(!_port.IsOpen)
{
MessageBox.Show(Bitte Seriel Adapter anschliessen)
}

Wir sind nun ein grosses Stück weitergekommen da wir gestern gemerkt haben das die Servoboard nicht kaskadierbar sind. D.h. es können nicht alle Servos auf den 3 verschiedenen Servoboard einzeln angesteurt werden :D
naja Shit happens...
Wir haben nun einen neuen Controller bestellt dieser kann nun 16 verschiedene Servos ansteueren.

Jetzt habe ich noch einen weitere Frage:
Der VLC Player kann ja ein Aufnahmegerät öffnen. Wir haben nun im Kopf des Roboters eine Kamera eingebaut die die Video Signale Kabellos zu einem Empfänger schickt dieser widerum leitet das Signal weiter an einen Video zu USB Konverter. Diesen kann ich mit dem VLC Player öffnen und mir das Bild der Kamera anschauen. Gibt es nun auch eine Möglichkeit denn VLC Player in C# zu integrieren? Damit ich das Kamerabild in die GUI einbinen kann?

MFG
Kevin Haag

Beatkiller
25-09-2008, 08:26
Es gibt ne API für das Ansteuern des VLC in .NET, allerdings keine Ahnung, ob das auch das liefert, was du brauchst. Schau es dir halt mal an:

http://wiki.videolan.org/.Net_Interface_to_VLC

linuxjohnny
06-11-2008, 18:03
Hi,

Sorry das ich erst jetzt zurück schreibe. Aber danke dir für deinen Tipp ich konnte es zwar noch nicht programmieren da mir die Zeit fehlte :P

Jetzt habe ich noch eine Frage:

Die Spinne wird jetzt mittels Command Buttons gesteuert, sprich man drückt auf forward und dann wird die funktion legMoveForward() ausgelöst.
Ich habe mich nun gefragt ob es möglich ist den Joystick so in das Programm einzubinden das wenn der Joystick vorne ist die Funktion legMoveForward(), oder wenn er hinten ist legMoveBack() etc., ausgelöst werden kann?
Wenn ja, kennt jemand einen Tutorial oder kann es mir beschreiben?

Ich habe schon bei MSND etwas über die Joystick einbindung gelesen wurde aber leider nicht schlau daraus :(

Mit freundlichen Grüssen

Kevin Haag

jeebee
06-11-2008, 19:19
hast du das (http://www.codeproject.com/KB/directx/joystick.aspx) schon gesehen (1. google hit mit "c# joystick")

linuxjohnny
06-11-2008, 23:05
Das sieht schon gut aus ist aber mit DirectX gelöst, soviel ich verstanden habe. Gibt es da auch eine Lösung ohne?

jeebee
07-11-2008, 00:13
Da kenn ich mich zu wenig aus. Kommt eine DirectX-Lösung nicht in Frage?

linuxjohnny
07-11-2008, 04:50
Ich habe eben noch nie damit gearbeitet und die Präsentation ist schon am 3.Dezember. Aber ich werde das Beispiel mal genau studieren. Vielleicht hat ja noch jemand eine weitere Idee.
Ich habe da mal was über die Funktion joyGetPos() gelesen, aber kein gutes Beispiel in C# dafür gefunden, weiss da jemand etwas darüber?

linuxjohnny
08-11-2008, 12:33
So ich habe eine "Lösung" mit Directx gefunden.

Ich habe auch den Source code zu Hand als Klasse :D nur weiss ich nicht wie man eine Klasse in C# .net einbinden kann :confused:

Ich habe es folgendermasen versucht:

private ProjektSpinne.joystick jst;

Aber da sagt der Compiler:

Fehler 1 Der Typ- oder Namespacename "ProjektSpinne" konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?) C:\Dokumente und Einstellungen\Kevin Haag\Eigene Dateien\Projekt Spinne\Software\Spinne\16.08.08 Spinne\Hauptfenster.cs 10 17 ProjektSpinne


Könnt Ihr mir weiterhelfen?

MFG
Kevin Haag

linuxjohnny
08-11-2008, 12:50
Ok jetzt habe ich das ganze Projekt ein bisschen aufgeräumt und das Projekt JoystickInterface zu meinem hinzugefügt. In diesem Projekt gibt es nun eine Datei Namens joystick.cs, wie kann ich diese nun im Projekt ProjektSpinne einbinden?

[CODE]Fehler 1 Der Typ- oder Namespacename "JoystickInterface" konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?) C:\Dokumente und Einstellungen\Kevin Haag\Eigene Dateien\Projekt Spinne\Software\Spinne\ProjektSpinne\Hauptfenster. cs 10 17 ProjektSpinne[\CODE]

jeebee
08-11-2008, 13:20
Annahmen:
IDE=VisualStudio
Workspace enthält dein Projekt und das Joystick-Projekt

Du musst nun bei deinem Projekt mit "Verweis hinzufügen" einen Verweis auf das Joystick-Projekt angeben. (siehe http://msdn.microsoft.com/de-de/library/wkze6zky(VS.80).aspx für Details)

Dann sollte der Namespace JoystickInterface gefunden werden und du kannst die Joystick-Lib verwenden.

HTH jeebee

PS: was ich noch zu joyGetPos() gefunden habe:
http://docs.taoframework.com/Tao.Platform.Windows/Tao.Platform.Windows.Winmm.html
http://docs.taoframework.com/Tao.Platform.Windows/Tao.Platform.Windows.Winmm.joyGetPos.html

linuxjohnny
08-11-2008, 17:03
Danke dir für den Tipp damit konnte ich die Klasse eintragen.
Jetzt habe ich nur noch ein Verständnis Problem wegen der Obiektorientierung, und zwar:

Ich binde die Klasse oben im Programm ein:

private JoystickInterface.Joystick jst;

Was bedeutet hirbei das "jst", damit muss ich doch Objekte erzeugen :S leider weiss ich nicht genau wie und für was. Könntest du mir das Vielleicht "Kurz" erleutern?

MFG
Kevin Haag

linuxjohnny
08-11-2008, 21:53
Oder besser frage ich anders. Wenn ich die Klasse eingebunden habe, wie kann ich dann auf ihre Funktionen zugreifen?

ContainerDriver
08-11-2008, 22:18
Oder besser frage ich anders. Wenn ich die Klasse eingebunden habe, wie kann ich dann auf ihre Funktionen zugreifen?

Normalerweise legst du eine Instanz der Klasse an und rufst dann die jeweiligen Methoden auf, es sei denn die Klasse ist static, dann musst du keine Instanz anlegen sondern kannst direkt über klasse.methode() auf die Methode zugreifen.


Zur Zeile


private JoystickInterface.Joystick jst;
: wo steht die in deinem Programm? Innerhalb einer Klasse? Kannst du mal ein bisschen Code posten?

linuxjohnny
09-11-2008, 08:13
Also ich habe mir die das Programm mit der Klasse JoystickInterface von der folgenden Seite heruntergeladen:

http://www.codeproject.com/KB/directx/joystick.aspx

Bei diesem Programm hatte es ein Test Programm für den Joystick dabei in dem habe ich die Zeile:

private JoystickInterface.Joystick jst;

Da dachte ich mir das ich diese Zeile in mein Programm übernehmen kann um die in der Klasse enthaltenen Methoden zu benutzen.

P.S.

Ich habe mitlerweile noch mehr Klassen gefunden:

http://www.mycsharp.de/wbb2/thread.php?postid=286490
http://www.idi.ntnu.no/~fredrior/files/Joystick.NET/Joystick.cs
http://www.forestmoon.com/Software/AX12ArmSample/

Aber im Prinzip sollte das ja mit jeder Klasse funktionieren, vorausgesetzt das die Klasse richtig programmiert ist.

Wenn du willst kann ich dir auch noch den Code der Spinne posten.

jeebee
09-11-2008, 10:09
lies halt mal den Artikel im ersten Link. Da ist eigentlich erklärt, was du alles tun musst, um den Joystick anzusprechen.

linuxjohnny
09-11-2008, 15:04
Aber wie kann ich die c# klasse in mein Hauptprogramm einbinden und deren Methoden verwenden?

jeebee
09-11-2008, 16:43
Hast du den Link in diesem (http://www.mrunix.de/forums/showpost.php?p=280671&postcount=12) Beitrag angeschaut? Dort wird erklärt, wie du die Klasse ins Projekt einbindest.
Dann kannst Instanzen der eingebundenen Klassen erstellen und verwenden.

linuxjohnny
10-11-2008, 10:20
Ja das habe ich soweit begriffen nur wie müsste der Code in meinem Projekt aussehen?
Also ich habe das ganze Projekt JoystickInterface in meine Projektmappe eingebunden, danach habe ich in meinem Hauptprojekt einen Verweis auf das Joystick Projekt festgelegt.
Und wie kann ich jetzt die im JoystickInterface programmierten Methoden in dem Hauptprojekt verwenden?
Ich muss doch irgendwie ein Objekt erzeugen, oder verstehe ich da was vollkommen falsch?

Es tut mir Leid wenn ich so frage aber das Problem ist das ich vorhin noch nie Objektorientiert Programmiert habe.
In PHP kann man ja neue Funktionen einfach per include irgendwas.php oder require irgendwas einbinden.
Aber anscheinend geht das in C# nicht so einfach.


MFG
Kevin Haag

jeebee
10-11-2008, 12:37
Also du brauchst:
eine Variable für den Joystick

private JoystickInterface.Joystick jst;
Dann musst du den Joystick finden und initialisieren:

// Joystick-Objekt erzeugen
jst = new JoystickInterface.Joystick(this.Handle);
// alle angeschlossenen Sticks finden
string[] sticks = jst.FindJoysticks();
// den ersten gefundenen Stick verwenden
jst.AcquireJoystick(sticks[0]);

Danach kannst du mit jst.UpdateStatus() die aktuellen Werte lesen und mit jst.Axis[A-F] auf die Achsen zugreifen und im Array jst.Buttons die Werte für die Buttons abfragen.

linuxjohnny
11-11-2008, 21:20
hei Danke dir Viel mal genau das habe ich gesucht ich werde jetzt mal versuchen das für mein Programm anzupassen. Uns sonst melde ich mich wieder ;)
Hast du evtl. ein HowTo, Anleitung wo das Allgemein erklärt? Sodas ich das auch mit einer anderen Klasse machen könnte?

MFG
Kevin Haag

jeebee
12-11-2008, 10:17
http://www.developer.com/net/net/article.php/1445631 hab ich jetzt mit google mal gefunden, ist halt wieder Englisch... Sonst solltest du dich mal nach einem guten Buch über Objektorientierung umschauen.

linuxjohnny
14-11-2008, 05:09
Danke jeebee für deine Antwort wenn ich mal Zeit finde werde ich mir es durchlesen;)

MFG
Kevin Haag

linuxjohnny
20-11-2008, 20:45
Hallo zusammen, ich bins mal wieder ;)

Ich habe nochmals eine Frage:
Wie kann ich eine Funktion solange ausführen bis ich den Button denn ich drücke um die Funktion zu starten loslasse?

MFG
Kevin Haag

jeebee
23-11-2008, 13:24
Evtl. einen Thread mit Endlosschleife in der sowas wie
while(button.Pressed) { tu_was(); } ausgeführt wird.

linuxjohnny
23-11-2008, 15:00
Danke dir, ich werde das auprobieren sobald ich wieder bei der Spinne bin :D

Jetzt noch ne Frage :P

Und zwar ich will die grauen Buttons durch Bilder ersetzen und habe nun in der Eigenschaft des Buttons ein Image festgelegt. Dieses erscheint ja auch aber wenn ich das Programm ausführe erscheinen die Bilder nicht. Gibt es da irgendeine Einstellung die man vornehmen muss?

Beatkiller
23-11-2008, 18:41
Sieht für mich so aus, als wären die Buttons disabled. Dann könnte man auch nicht darauf klicken. Die Bilder und evtl vorhandene Schrift wären dann ausgegraut.

linuxjohnny
23-11-2008, 20:16
Die Buttons sind enabled den ich kann auch darauf klicken. Oder was genau meinst du damit?

linuxjohnny
27-11-2008, 20:17
Niemand eine Idee?