Bernhard´s kleine Roboter Homepage


HomeGalerieImpressum

 

Die Inspiration

 

Ausgangspunkt des Projektes war war ein sehr interessanter Link, http://www.users.uswest.net/~kmaxon/page/side/art9_137.htm http://www.users.uswest.net/~kmaxon/page/index.html

Hier beschreibt Ken Maxon, didaktisch sehr gut aufgebaut, das Prinzip der Abstandsmessung mittels Laser und Kamera.

Daraus entstand die Idee, ein derartiges Gerät selbst zu bauen.

Als ich dann bei ELV einen schnuckeligen Roboterarm sah, beschloß ich diesen auch noch mit einzubauen.

Daraus ergab sich die Aufgabe:

  • Ein Objekt wird hingestellt
  • Per Laser Abstandsmesser wird die Position des Objekts bestimmt
  • Der Roboterarm greift das Objekt


Abstandsmessung mit Parallaxe

 

Wie funktionierts?

Ein Laser projeziert eine Line (keinen Punkt wie normal bei Laser !!) und spannt somit eine optische Ebene vor sich auf, parallel zum Untergrund.

Der Strahl schreibt einen Strich auf die Objekte vor sich. Der Strahl wird diffus reflektiert und trifft in die Kamera.

Wie man an dem Bild sehen kann, trifft der Strahl aus dem nahen (blauen) Objekt unter einem anderen Winkel in die Kamera als vom fernem (roten) Objekt.

Dieser Winkel ist ein Maß für den Abstand.

Zur Verdeutlichung hier noch 2 Bilder.

Bild 1 ist aufgenommen aus Sicht des Lasers. Die Laserlinie ist in gleicher Höhe auf allen Objekten.

 

Hier nun die gleiche Szene fotografiert aus der Sicht der Kamera.

Der Laserstrich zerfällt nun in Teilstriche. Die Striche auf nahen Objekten sind im Bild weiter unten als die bei fernen Objekten.

Somit ist die Höhe der Linie im Bild ein Maß für den Abstand (entspricht dem Winkel in der vorherigen Ausführung.

 

 

Der Laser

 

Zum Projezieren der Linie ist ein Laser am besten geeignet.

  • Licht ist parallel -> Die Linie fächert nicht zum Band auf
  • Das Licht ist monochromatisch, d.h. hat nur 1 Wellenlänge. Das wird noch wichtig, siehe unten.

Normalerweise denkt man bei Laser an einen Punkt. Es gibt jedoch auch Laser zu kaufen, die mittels integrierter Optik aus dem punktförmigen Strahl andere Formen erzeugen, z.Bsp Kreuze, Linien, mehrere Linien.

Der hier benötigte Laser mit Linienstrahl wird Laser Liniengenerator genannt. Diese sind leider nicht so einfach zu beschaffen wie die Punktlaser. Meinen Laser habe ich gekauft bei www.elv.de .

Aufgrund des beschränkten Angebots muß man das nehmen, was es gibt. In meinem Fall den "Laserliniengenerator 635nm TIM-230-9". Öffnungswinkel des Strahls ist 90 °.

Es ist der Laser links unten im Bild.

Die Wellenlänge des Lasers liegt bei 635nm, also ein Rot im sichtbaren Bereich:

  • Einstellungs und Kalibrierarbeiten sind stark vereinfacht, da man den Strahl sieht
  • Das Auge schützt sich bei sichtbaren Licht selbst, es schliest sich. Trotzdem ist natürlich Vorsicht geboten

 

Der Filter

 

Leider wird die Kamera nicht nur das gewünschte Signal, die Reflektion des Lasers, aufnehmen, sondern auch jede Menge aus der Umgebung.

Daraus das gewünschte herauszufinden ist schwierig und würde hohen Aufwand bedeuten.

Der Trick ist es, die störenden Signal bereits optisch auszufiltern. Hier gilt, je stärker man den Wellenlängenbereich einschränkt, desto besser. Je mehr "Fremdlicht" aus den anderen Wellenlängen man ausfiltert, desto besser ist das Nutzsignal erkennbar.

Trotz bestem Filtern, 635 nm ist regulärer Bestandteil des Umgebungslichtes. Dieser Umgebungsanteil bleibt enthalten. Deswegen wird bei prallem Sonnenlicht das Prinzip schlechter funktionieren als im Dunklen.

Bei völliger Dunkelheit würde es auch ohne Filter klappen, aber wer will schon im Finstern arbeiten.

Die Filter gibt es nicht an jeder Straßenecke, meiner stammt von www.edmundoptics.de und firmiert unter "narrow bandpass interference filters". Die Breite des Passbandes (FWHM) liegt bei nur 10 nm. Die Mittenfrequenz des Filters muß natürlich zur Wellenlänge des Lasers passen.

Ein Nachteil sei nicht verschwiegen. Der Filter filtert per Interferenz und arbeitet deswegen am besten für Licht das gerade reinkommt.

Für schräg einfallendes Licht verändern sich die effektiven Weglängen und damit die Filterwirkung.

Daraus folgt:

  • Der Öffnungswinkel der Kamera wird durch den vorgesetzten optischen Filter eingeschränkt (habe ich nicht exakt gemessen, aber +/-25 Grad sind wohl möglich, mehr nicht.
  • Fremdlicht von der Seite schirmt man am besten noch mit einem Trichter an der Kamera ab.

 

Die Kamera

 

Um die Szene aufzunehmen reicht eine einfache Schwarzweißkamera (dank filtern). Ich verwende eine CCD Kamera. Eine CMOS Kamera habe ich nicht ausprobiert. Wichtig ist, das die Kamera mit mit niedriger Beleuchtung auskommt und hier scheint CCD empfindlicher zu sein.

Der Öffnungswinkel der Kamera sollte nicht zu hoch sein, der Filter begrenzt den nutzbaren Sichtwinkel. Nimmt man trotzdem eine Kamera mit großem Öffnungswinkel, verschenkt man nutzbare Auflösung am Bildrand.

 

Wie kann man nun die Information aus dem Kamerasignal extrahieren?

Die Kamera tastet das Bild ab wie hier gezeigt mit den schwarzen Pfeilen. Die gelben Linien sind die Laserstriche, die detektiert werden sollen.

 

  • In Zeile 0 links oben beginnt das Abtasten und schwenkt zum rechten Rand
  • Ein verdecker Rücklauf zum linken Rand erfolgt
  • Zeile 1 wird abgetastet.
  • ....
  • wenn ein Laserstrich unter dem Suchstrahl ist, steigt das Helligkeitsignal.
  • ja, ich weiss, daß es heutzutage nicht mehr wirklich ein Abtaststrahl ist.

 

 Die benötigte Information, die Länge der blauen Pfeile, ist leider senkrecht zu den Suchstrahlen und schwierig zu extrahieren.


Deshalb schwenkt man die Kamera um 90° nach links. Nun stellt sich der Ablauf wie folgt dar:

 

  • In Spalte 0 links unten beginnt das Abtasten und schwenkt zum oberen Rand
  • Ein verdecker Rücklauf zum unteren Rand erfolgt
  • Spalte 1 wird abgetastet.
  • ....

 

 Man braucht somit nur in jeder Zeile zu messen den zeitlichen Abstand vom Zeilenanfang bis um Lasersignal. Schon hat man für jede Spalte den Abstand.

 

Das war das optische System, doch wie ist das elektrische?

 

Elektrische Signalverarbeitung

 

Das Kamerasignal ist ein Spannungsverlauf im Bereich von ~ 0.5V bis 2V in meiner Schaltung.

Es gibt Synchronisationspulse von 1V auf 0.5V (siehe Bild). Die echte Helligkeitsinformation ist in der Zeit danach im Spannungsbereich von 1V bis ~ 2V dargestellt.

 

Um das Signal korrekt auszulesen, benötigt man die Synchronisationssignale. Es gibt spezielle ICs für diesen Zweck , hier LM1881N.

 

VID_IN

Eingang für das Video Signal

Vsync

Zeigt an, daß nun ein neues Bild beginnt

Brst

Markiert den Anfang einer neuen Zeile

ODD/EVEN

Video Signal ist interlaced. ODD/EVEN zeigt an, welches der beiden Halbbilder gerade kommt

 


Als nächstes müssen wir noch die Laserreflektion in dem Videosignal erkennen.

Dazu zuerst das Videosignal mittels R2/R3/C11 auf einen DC Normalpegel von 1V legen.

 

 

Das Signal in den Komparator LM311 führen.

Nun wird es einen Puls geben, sobald im Videosignal ein Helligkeitspuls (hoffentlich vom Laser) ist. Der Vergleichswert (Signal Level) wird mit einem DAC vorgegeben und kann so an die Umgebungshelligkeit angepasst werden. Dazu wird während der Initialisierung der Laser abgeschaltet und Level per sukzessiver Approximation auf den tiefsten Wert gestellt, bei dem gerade noch der Komparator nicht auslöst.

Das Lasersignal kann sehr kurz sein. Damit es bei der Weiterverarbeitung eine ordentliche Mindestlänge hat, wird es mit R10/C19/D3 gestreckt. IC17e formt wieder ein sauberes Rechteck und treibt das Signal.

Ohne dieses Strecken des Signals kam es in meiner Schaltung gelegentlich zu Pulsverlusten im Microcontroller.

 

So, nun haben wir die Sync Signale und ein Signal für "Laser gefunden", wie gehts weiter?

Die gesuchte Information ist der zeitliche Abstand zwischen steigender Flanke Burst zu fallender Flanke L_Found.

Diese Zeit ist ein Maß für den Abstand des Objektes, das den Laser reflektiert hat.

 

Der Controller

 

Das Signal ist nun elektrisch aufbereitet. Jetzt beginnt die "logische" Weiterverarbeitung. Dafür sind verschiedene Wege denkbar.

Ken Maxon z.Bsp. wählte den Weg, die Signale mit viel Hardware aufzubereiten, so daß ein relativ leistungsschwacher Mikrocontroller auf die fertig aufbereiteten Abstandsdaten zugreifen kann.

Ich wählte einen anderen Weg.

Wenn man einen leistungstarken 16 Bit Mikrocontroller verwendet, kann man es sich als Entwickler etwas einfacher machen. Man braucht nicht das letzte Quentchen Optimierung mit einzubauen, der Contoller ist flott genug, das RAM reicht dicke, das Flash ROM ist genug.

Die Wahl fiel auf den C164, einem Derivat aus der C167 Familie von Infineon. Da das Löten bei MQFP 80 Gehäusen doch zunehmend schwierig wird, verwende ich den Controller nicht nackt, sondern in einem C-Control II von Conrad Electronic. Hier ist der 164er mit 64K RAM und 256K Flash in einem ziegelsteinartigen Gehäuse vereint. Die C2 Sprache, die Conrad für die Programmierung vorsieht, kann man ja löschen, die verbirgt die meisten der Hardwarefunktionen.

Eigenschaften des C164, die hier benötigt werden:

  • Leistungsfähige Timer, Capture Compare Units. Capcom6 bietet 50ns Zeitauflösung, genau richtig, um das Video Signal auszumessen
  • PWM Signale können bequem generiert werden mit den Capcoms. Brauche ich noch für das Steuern des Roboterarms
  • Interruptfähigkeit für sehr viele Pins
  • Trickreicher PEC Controller, sehr nützlich !!!
  • 10 Bit ADC mit 8 Kanal Multiplex. Brauche ich für den Roboterarm

Wer andere Controller bevorzugt, kann das tun.

 

Die Software

 

Um den hier gezeigten Signalverlauf auszumessen,

 

verwende ich folgenden Ablauf.

Die 3 Signale hängen an interruptfähigen Pins. Bei relevanten Flanken werden die Interruptbehandlungsroutinen angesprungen. Diese führen folgende Aktionen aus:

Vsync Interrupt (zeigt neues Halbbild an)

  • Setze Zeilenzähler auf 1 (Odd) oder 0 (Even), damit die beiden Halbbilder ineinander versetzt gespeichert werden können
  • Aktiviere Interrupt für Burst

Burst Interrupt (an Capture Compare CC60)

  • Speichere per Hardware Zeitpunkt der Flanke in Register CC60
  • Zeile = Zeile +2;
  • Aktiviere Interrupt für L_Found

 L_Found Interrupt (an Capture Compare CC61)

  • Speichere per Hardware Zeitpunkt der Flanke in Register CC61
  • Speichere CC61 - CC60 in Array Abstand[Zeile]
  • Deaktiviere Interrupt für L_Found, damit in jeder Spalte nur ein Laserpuls erkannt wird

Hier das Resultat, das Array Abstand[] nach Empfang von 2 Halbbildern. Wie man sieht standen 3 Objekte im Blickfeld.

Die Messwerte stammen noch von einer frühen Hard- und Software Revision, die den Timer mit 400ns Auflösung verwendete.

Die aktuelle Version verwendet 50ns Auflösung.

 

Die Geometrie

 

Die Abstandsinformation liegt nun vor, jedoch leider erst in Zeiteinheiten (Start Bildzeile bis Laserpuls erkannt). Viel interessanter ist es, das Ergebnis in mm zu haben.

Hier kommt die Geometrie zu Hilfe.

Wie man unschwer sehen kann:

Höhe h = Höhe Bildebene Kamera über der Laserebene

Abstand d = Abstand des Objektes

 

Leider liefert die Software auch keine phi Werte ab, sondern Zählerstände.

Was nun?

  • Objekt plazieren in Abstand d1
  • phi1 berechnen
  • Zählerwerte N1 ausgeben
  • diesen Schritt für mindestens noch einen weiteren Abstand, besser mehr dürchführen
  • Aus diesen Werten die Umrechungsformel bestimmen

Die Formel von N -> phi ist ganz trivial linear.

Die Formel gilt streng genommen nur für gerade Blichrichtung. Für seitlichen Blick müsste man vermultich komplizierter rechnen. Der Fehler erwies sich jedoch als gering genug für meinen Zweck.


Das wars, der Abstandsmesser ist fertig.

Es ist nun möglich, die Postion eines Objektes zu erfassen in Realkoordinaten.

Zeit, sich um den Roboterarm zu kümmern, der das Objekt greifen soll. 


 

 

Der Roboterarm:

 

Den Roboterarm habe ich von ELV gekauft. So sieht er aus.

 

 

 

Der Arm verfügt über diese Freiheitsgrade:

  • Basisgelenk. Damit kann der gesamte Arm geschwenkt werden
  • Schultergelenk
  • Ellbogengelenk
  • Handgelenk. Damit kann man die Zange drehen. Wird hier jedoch nicht verwendet
  • Zange. Damit kann man greifen

 

Steuerung

 

In den Gelenken sitzen Motoren mit Getriebe.

Die Motoren werden vom Controller aus per pulsweiten moduliertem Signal (PWM) in der Geschwindigkeit und der Richtung kontrolliert.

Zum Umsetzen der Logiksignale vom Controller in Leistung verwende ich H-Brücken MC33186. Diese Brücken sind zwar mit diesen Motoren deutlich unterfordert (Motor braucht nur ~0.5A), jedoch kannte ich die Brücken schon aus einer früheren Anwendung.

 

 

 

Damit die Stellung der Gelenke vom Controller aus gelesen werden kann, habe ich Potis angebaut an Basis, Schulter und Ellbogen. Der Wert der Potis wird vom ADC des Controllers ausgelesen.

 

Der Gesamtaufbau

 

Hier sieht man den Aufbau. Rechts ist das Abstandsmessgerät, links der Roboterarm. In der Mitte steht ein Objekt, das gemessen und gegriffen werden soll.

Im Greifbereich des Armes ist ein kariertes Blatt aufgeklebt. Eine Hilfestellung bei der Kalibrierung von Messgerät und Arm.

Ganz offensichtlich:

  • Laser und Arm verwenden verschiedene Koordinatensysteme
  • eine Umrechnung ist notwendig
  • ist aber trivial

 

Die Geometrie des Greifens

 

Um aus der Position P des Objektes in die Winkelstellung der 3 relevanten Gelenke umzurechnen, ist noch etwas Geometrie notwendig.

Yb:

  • Höhe des Schultergelenks in der Basis
  • Da die Zange das Objekt nicht am Boden greifen soll, sondern etwas darüber, verwende ich in der Berechnung dann weniger als die 135 mm

 

Wichtig:

Punkt P (an dem das Objekt gegriffen werden soll), ist nicht unbedingt mittig. Deshalb ist xp bereits als Länge zu berechnen, ab jetzt xyp genannt.

 

Nun berechnet sich die Geometrie wie folgt.

 

 

Winkel phib der Basis:

Dreieck BPE läst sich mit dem Cosinus Satz berechnen

 

 

Das Kalibrieren des Arms (=Umrechnungsformel ADC-Wert eines Gelenkpotis in Winkel) war noch eine ziemlich trickreiche Fleißaufgabe. Viel Spaß dabei ;--)

 

Der Ablauf

 

Die Zange des Arms hat keine Rückkopplung in den Controller

  • Anbringen eines Potis wäre mechanisch schwierig
  • Messen des Motorstromes um daraus das Greifen eines Objektes zu erkennen, wäre auch sehr schwierig
  • Für diese "Spaßanwendung" ist es völlig ausreichend, die Zange manuell zu öffnen und zu schliesen

Der Controller ist per RS232 mit dem Computer verbunden. Per Terminalprogramm können Befehle gegebem werden.

 

Der realisierte Ablauf ist:  

  • Per Befehl (1 Tastendruck) aus Terminal Programm den Arm in Neutral Position fahren. In dieser Position ist der Arm soweit angehoben, daß er das Sichtfeld nicht verstellt. Sonst misst das Messgerät die Zange
  • Zu greifendes Ojekt auf das weiße Blatt im Sichtbereich stellen
  • Per Tastendruck die Zange maximal öffnen lassen
  • Nun per Tastendruck den Greifablauf starten:
    • X/Y Position des Objektes per Laser Messgerät erfassen
    • Position umrechnen in Koordinatensystem des Arms
    • Position umrechnen in notwendige Gelenkwinkel
    • Motortreiber entsprechend aktivieren und Gelenke auf Zielposition fahren
    • Nun ist der Arm beim Objekt. Seine offene Zange umfasst es
  • Per Tastendruck Zange schliesen bis Griff stark genug ist

Dieser Ablauf enthält noch einige manuelle Befehle vom Computer aus, die sich auch noch automatisieren liesen. Die wichtigen Probleme jedoch sind gelöst, und somit ist mein Projekt erfolgreich abgeschlossen.

 

Das Ende

 

Das wars.

Ich hoffe, das Lesen der Seite hat Spaß gemacht.

Vielleicht fühlt der eine oder andere sich auch inspiriert, ähnliches zu machen.

Viel Spaß dabei.

Wer Lust hat, kann mir auch eine Mail dazu schreiben.

Galerie



Copyright 1996-1999 by Namo Interactive Inc.
All Rights Reserved.


Namo WebEditor 3.0