PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Koordianten aus Video auf Servos übertragen



robotpat
02.12.2012, 21:04
Hi,

Vorweg: Ich war mir nicht sicher in welches Forum ich das posten soll, also bitte den Post einfach verschieben falls ihr meint das er anderswo besser passt...Danke .

B2T:

Ich bastle gerade an einer Auto-Pan-Tilt Geschichte. Ich will eine Kamera mit 2 Servos steuern. Die Servos sollen wiederum durch eine andere Kamera gesteuert werden, die sich bewegende Objekte erkennt und deren Koordinaten an die Servos weiter gibt. Im Endefekt soll die Kamera also den Dingen die sie aufnimmt folgen. Warum das Ganze mit Kameras ? Damit man auch andere Sachen als eine Kamera draufstecken kann. Taschenlampe, Mikrophone oder sonstiges.

Ich habe folgendes Setup:

1x Webcam, 75° FOV, 640x480 Pixel
2x Servo, 180°
1x Pololu Micro Maestro 6 Kanal USB-Servocontroller

Das Ansteuern der Servos funktioniert derzeit über ein kleines Stück Software, das ich in Python geschrieben habe. Ich kann den Servos Werte von 0-255 senden, was die 180° abdecken sollte (nehm ich mal an)
Ein derzeit noch seperates Stück Software, das auch in Python geschriegen ist (nicht von mir), erkennt sich bewegende Objekte und errechnet deren Mittelpunkt, von welchem ich dann die Koordinaten habe.

Mein Problem ist jetzt, das ich keinen Plan habe wie ich diese Koordinaten umrechne in Werte zwischen 0-255 die ich dann an meine Servos schicken kann.

Angenommen der Mittelpunkt liegt by 320x100. Was würde ich dann an meine Servos für x und y schicken ?

Ich hoffe ihr könnt und wollt mir helfen :)

Che Guevara
02.12.2012, 22:59
Hi,

also wenns nur um die Koordinaten geht, ist es wohl denkbar einfach. Dein Bild hat eine Auflösung von 640x480 (X-Y). Ein Pan-Servo-Wert(X) von 0 lässt also die Kamera in X-Richtung auf den X-Wert von 0 blicken, ein Wert von 255 lässt die Kamera auf den X-Wert 640 blicken. Das selbe gilt auch für die Y-Richtung, nur mit anderen Werten.
Somit erhält man eine einfache Formel:
ServoX = (MittelpunktX/AuflösungX)*AuflösungServo
ServoY = (MittelpunktY/AuflösungY)*AuflösungServo

Bei deinem Beispiel:
ServoX = (320/640)*255 = 127.5
ServoY = (100/480)*255 = 53.125

Hoffe das hilft dir.
Gruß
Chris

EDIT:
Hab gerade gesehen, dass die Kamera ja nur einen Bereich von 75° abdeckt. Da du keine Angabe gemacht hast, wie sich die Winkel der Servos und der Kamera zueinander verhalten, kann ich dir leider keine Antwort darauf geben.
Ergo ist obiges zwar nicht falsch, aber für deine Situation nicht zutreffend.

robotpat
03.12.2012, 05:27
Hab gerade gesehen, dass die Kamera ja nur einen Bereich von 75° abdeckt. Da du keine Angabe gemacht hast, wie sich die Winkel der Servos und der Kamera zueinander verhalten, kann ich dir leider keine Antwort darauf geben.
Ergo ist obiges zwar nicht falsch, aber für deine Situation nicht zutreffend.

Danke für deine Antwort, das hilft schon weiter. Hast recht, soweit ist es denkbar einfach ;). Ich bin normalerweise zwar ein ganz anständiger Entwickler aber bei solchen Sachen stellt mein Hirn auf stur ^^. Die Auflösung die du angenommen hast, hatte ich übrigens eh in meinem Post angegeben :)
Ich bin mir nicht sicher ob es das ist was du wissen willst, aber der Winkel der Servos umschließt im Prinzip den Winkel der Kamera. Sprich der Servo hätte rechts, links, oben und unten noch mehr "Platz" bzw könnte sich noch weiter Bewegen. Ich müsste also den Bewegungsbereich irgendwie einschränken. Bin mir wieder nicht sicher wie ich das in die Formel oben einbauen soll O_o

Hier meine Theorie:

Für x:
180/255 = 0,7 Dann weis ich wie viel Grad in einem "Schritt" stecken.
75 / 0,7 = 107 Dann sollte ich die Schritte zur verfügung haben die ich innerhlab der 75° gehen kann. Dann muss ich noch fixe Anfangnswert, also praktisch ein neues 0 festlegen, ab dem ich dann 107 Schritte gehen kann.

Macht das irgendwie Sinn ?

Geistesblitz
03.12.2012, 08:39
Ja, das macht Sinn. So in der Art wäre ich wohl auch vorgegangen. Am besten wird es wohl sein, wenn du wir irgendeine Möglichkeit überlegst, wie du testen kannst, ob alles richtig eingestellt ist und auch, um deinen Nullpunkt zu finden.
Was mir noch zu denken gibt: du sagst, du hast eine Kamera auf dem Gestell und eine, die das Beld zur Referenz der Lage aufzeichnet, richtig? Dadurch wird die zweite Kamera wohl außerhalb des Drehpunkts deines Gestells sein und somit werden sich wohl auch keine Koordinaten direkt auf eine Servostellung zuordnen lassen, da es im Raum unter einem Winkel steht. Wenn eine Kamera eh auf dem Gestell montiert ist, wieso machst du das dann nicht so, dass diese das Bild aufnimmt und abhängig davon, wie weit der Mittelpunkt des Objekts vom Bildmittelpunkt entfernt ist, werden die Servos entsprechend nachgestellt? Sowas hätte ich da jedenfalls im Sinn.

robotpat
03.12.2012, 09:10
Ja, das macht Sinn. So in der Art wäre ich wohl auch vorgegangen. Am besten wird es wohl sein, wenn du wir irgendeine Möglichkeit überlegst, wie du testen kannst, ob alles richtig eingestellt ist und auch, um deinen Nullpunkt zu finden.
Was mir noch zu denken gibt: du sagst, du hast eine Kamera auf dem Gestell und eine, die das Beld zur Referenz der Lage aufzeichnet, richtig? Dadurch wird die zweite Kamera wohl außerhalb des Drehpunkts deines Gestells sein und somit werden sich wohl auch keine Koordinaten direkt auf eine Servostellung zuordnen lassen, da es im Raum unter einem Winkel steht. Wenn eine Kamera eh auf dem Gestell montiert ist, wieso machst du das dann nicht so, dass diese das Bild aufnimmt und abhängig davon, wie weit der Mittelpunkt des Objekts vom Bildmittelpunkt entfernt ist, werden die Servos entsprechend nachgestellt? Sowas hätte ich da jedenfalls im Sinn.

Wenn es wirklich nur darum ginge 1 Kamera dazuzubringen einem Object zu folgen, würde ich natürlich gleich diese Kamera verwenden. Nachdem es aber möglich sein soll alles mögliche draufzustecken brauch ich eine 2te Kamera. Natürlich macht es für das Beispiel mit der Kamera wirklich wenig Sinn. Vor allem sollte hier die Kamera die für die Bewegungserkennung verwendet wird einen größeren Winkel haben.

Ich bin gerade am überlegen ob meine Webcam wirklich horizontal und vertikal den gleichen Winkel hat. Finde leider keine Specs dazu...weis das zufällig jemand für das PS3 Eye ? :)

Vielen Dank auf jeden Fall für die Hilfe, jetzt kann ich mal versuchen das Ganze zum Laufen zu kriegen.