Pick & Place: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
(Kategroie hinzugefügt) |
||
(9 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
[[Kategorie:Bildverarbeitung]] | |||
'''Autor:''' [[Benutzer:Daniel_Block| Daniel Block]] <br/> | '''Autor:''' [[Benutzer:Daniel_Block| Daniel Block]] <br/> | ||
'''Betreuer:''' [[Benutzer:Ulrich_Schneider| Prof. Schneider]] | '''Betreuer:''' [[Benutzer:Ulrich_Schneider| Prof. Schneider]] | ||
[[Datei:Lego Roboterarm.jpg|200px|thumb|right| | [[Datei:Lego Roboterarm.jpg|200px|thumb|right|www.lego.de]] | ||
== Motivation == | == Motivation == | ||
Zeile 8: | Zeile 9: | ||
== Ziel == | == Ziel == | ||
Programmieren Sie einen Roboterarm so, dass er sich ein Zuckerstück von einem Haufen nimmt und dieses in eine HSHL-Tasse fallen lässt. | |||
== Aufgabe == | == Aufgabe == | ||
# Erkennen Sie mit einer Webcam einen Zuckerwürfel. | # Erkennen Sie mit einer Webcam einen Zuckerwürfel. | ||
# Konstruieren Sie den | # Konstruieren Sie den Standard Lego Roboterarm so, dass er den Zuckerwürfel greifen kann. | ||
# Analysieren Sie die Videoszene und steuern Sie den Roboterarm, so dass er den Zucker Greift und diesen kollisionsfrei in die Tasse fallen lässt. | # Analysieren Sie die Videoszene und steuern Sie den Roboterarm, so dass er den Zucker Greift und diesen kollisionsfrei in die Tasse fallen lässt. | ||
< | == Vorbereitungen == | ||
Vor der Bearbeitung der Aufgabe sind einige Vorbereitungen zu treffen. Zum einen wird ein Grundverständnis für die Bildverarbeitung und die Koordinatentransformation vorausgesetzt. Dieses wurde im Rahmen der Veranstaltung ''Digitale Signal- und Bildverarbeitung'' während des Sommersemesters 2014 im Studiengang Mechatronik der HSHL erlangt. Eine weitere Recherche in Literatur und im Internet erwies sich jedoch als sehr zielführend. Besonders zur Umsetzung in MATLAB konnten hier einige hilfreiche Hinweise gefunden werden. Zum anderen sind einige Hardware- und Softwarekomponenten erforderlich. Diese werden im Folgenden kurz dargestellt. | |||
=== Erforderliches Equipment === | |||
* Lego NXT Roboter | |||
** Lego Mindstorms Basisset 9797 | |||
** Lego Mindstorms Ergänzungsset 9648/9695 | |||
* Webcam (z. B. Logitech C310) | |||
* HSHL-Tasse | |||
* Zuckerstücke | |||
* Tesafilm | |||
* Notebook oder Rechner mit MATLAB | |||
=== Erforderliche Software === | |||
* MATLAB (es wird die Version 2014a empfohlen aufgrund der [http://www.mathworks.de/products/image/whatsnew.html ''Image Processing Toolbox'']) | |||
* [http://www.mindstorms.rwth-aachen.de/trac/wiki/Download RWTH - Mindstorms NXT Toolbox für MATLAB ] | |||
* [http://www.lego.com/en-us/mindstorms/downloads/nxt/nxt-fantom-driver/ LEGO Mindstorms NXT Treiber ''Fantom''] | |||
* [http://www.lego.com/en-us/mindstorms/downloads/nxt/nxt-firmware/ NXT Firmware Version 1.28 oder höher] | |||
* [http://bricxcc.sourceforge.net/utilities.html NeXTTool] | |||
* [http://www.vision.caltech.edu/bouguetj/calib_doc/ Camera Calibration Toolbox für MATLAB] | |||
Die Hyperlinks führen jeweils zur Download-Seite. MATLAB ist über das ZfW (Zentrum für Wissensmanagement) der HSHL zu bekommen. | |||
=== Installation der Treiber === | |||
Diese Schritt-für-Schritt-Anleitung orientiert sich an der Beschreibung der RTWH Aachen <ref>[http://www.mindstorms.rwth-aachen.de/trac/wiki/Download4.08 Homepage] der RTWH Aachen zur Mindstorms NXT Toolbox (letzter Aufruf 19.6.2014)</ref>. | |||
#'''Toolbox der RWTH Aachen''' | |||
##Toolbox der RWTH Aachen herunterladen. | |||
##Heruntergeladene Datei extrahieren. | |||
##Toolbox als MATLAB-Pfad hinzufügen. | |||
###''Set Path'' in MATLAB aufrufen. | |||
###''Add with subfolders'' aufrufen und Verzeichnis der Toolbox auswählen. | |||
###Speichern nicht vergessen. | |||
#'''Firmware des NXT''' | |||
##Version der Firmware auf dem NXT überprüfen. Die Version lässt sich im Menü des NXT einsehen. | |||
##Wenn die Version älter ist als 1.28 bzw. 1.29, die Firmware herunterladen. | |||
##Die Firmware auf den NXT laden, z. B. mit der Funktion ''FlashNXTWithFirmware1.29.bat'' in ''/tools/MotorControl'' im Verzeichnis der Toolbox. | |||
#'''Laden von ''MotorControl'' auf NXT | |||
##''NeXTool'' herunterladen und im Verzeichnis ''/tools/MotorControl'' der Toolbox speichern. | |||
##In Windows-Systemen nun die Funktion '''TransferMotorControlBinaryToNXT.bat''' aufrufen, um mit ''NeXTool'' die ''MotorControl*.rxe'' auf den NXT zu laden. | |||
##Den Schritten im Command-Fenster folgen. | |||
#'''Treiber''' Wird beispielhaft für Windows 32 bit mit USB-Verbindung erklärt. Das Vorgehen für andere Betriebssysteme oder die Bluetooth-Verbindung kann auf der Internetseite der RWTH Aachen<ref>[http://www.mindstorms.rwth-aachen.de/trac/wiki/Download4.08 Internetseite der RWTH Aachen]</ref> nachgesehen werden unter ''Check other software requirements''. | |||
##NXT ''Fantom''-Treiber herunterladen und installieren. | |||
##Treiber auf den NXT laden mit ''TransferMotorControlBinaryToNXT'' | |||
#'''Funktionstext''' | |||
##USB-Verbindung zwischen NXT und Rechner bzw. Notebook herstellen. | |||
##NXT einschalten. | |||
##MATLAB starten. | |||
##Im ''Command Window'' von MATLAB ''COM_OpenNXT'' ausführen (einfach eintippen und mit Enter ausführen). | |||
##Wird der Aufruf ohne Fehler ausgeführt, ist die Installation erfolgreich abgeschlossen. | |||
=== Installation der ''Camera Calibration Toolbox'' === | |||
Diese Beschreibung ist angelehnt an die Erläuterungen von Jean-Yves Bouguet <ref>Jean-Yves Bouguet: ''Camera Calibration Toolbox for MATLAB''. ([http://www.vision.caltech.edu/bouguetj/calib_doc/ Homepage], letzter Aufruf 19.6.2014)</ref>. | |||
#Toolbox herunterladen. | |||
#Heruntergeladene Datei extrahieren. | |||
#Den Ordner ''TOOLBOX_calib'' als MATLAB-Pfad hinzufügen (Vorgehen vgl. RWTH-Toolbox s. o.). | |||
#Starten mit ausführen von ''calib_gui'' in MATLAB. | |||
Die genaue Vorgehensweise bei der Kalibrierung der Kamera wird an dieser Stelle nicht erläutert. Ich verweise an dieser Stelle auf die Homepage zur Toolbox und den Artikel von Herrn Deitel zu diesem Thema <ref>Deitel, M.: ''Extrinsische und Intrinsische Kameraparameter''. Lippstadt, Bericht Seminarvortrag, 2013. [http://193.175.248.171/wiki/images/b/b7/SDE_Seminar_Michael_Deitel.pdf Link]</ref>. | |||
== Hardware == | |||
Der Aufbau des Roboters erfolgt mit den Komponenten der ''Lego Mindstorms'' Kästen. Die Teile entsprechen dem ''Lego Technik'' Sortiment. Die wesentlichen Komponenten sind der intelligente Stein Brick, drei Motoren und die Webcam. Desweiteren werden diverse Konstruktions-, Verbindungs- und Getriebe-Teile benötigt. Da mit dem NXT nur drei Motoren betrieben werden können, wurde die Bewegung des Roboters auf folgende drei Dimensionen festgelegt: | |||
*Drehen des Roboterarms auf dem Unterbau | |||
*Heben und Senken des Greifers | |||
*Öffnen und Schließen des Greifers | |||
Der drehbare Arm wird von einem Drehkranz getragen, der von einem Motor angetrieben wird. Der Motor für das Heben und Senken ist zugleich tragendes Element des Armes auf dem Drehkranz. Der Greifer ist so konstruiert, dass ein Schenkel fest montiert ist und der zweite von einem weiteren Motor angetrieben wird. Für das Öffnen des Greifers und für das Drehen des Armes werden mehrstufige Übersetzungs-Getriebe eingesetzt. Dies ermöglicht langsame Bewegungen bei zugleich hohem Drehmoment. Der intelligente Stein ist am Rahmen montiert und bildet somit einen Teil des Gegengewichtes für den Roboterarm. Der Aufbau im Einzelnen ist in den Fotos zu sehen, die im Projekt-Ordner im SVN gespeichert sind. Desweiteren ist dort ein Lego-Designer-Modell des Roboters hinterlegt, dass dem Aufbau sehr nahe kommt. Die Abweichungen ergeben sich durch Verwendung etwas anderer Teile oder die Montage von Zahnrädern in den genannten Getrieben, die im Modell nicht möglich ist. Desweiteren ist ein Verbindungsstein im Modell nicht integriert, weil die Lage vom Lego-Standard abweicht. Diese Teile können aber in den Fotos des Roboters gut wiedererkannt werden. Der Vollständigkeit halber sind diese Teile im Lego-Designer-Modell als lose Teile beigefügt. | |||
== Software == | |||
Im Folgenden wird die Implementierung in MATLAB zur Erkennung der Zuckerstücke und der Tasse sowie die Ansteuerung der Motoren dargestellt. | |||
=== Bilderkennung === | |||
Zu aller Erst wird die Kamera initialisert. Dazu wird eine Objekt-Variable erstellt, auf die im Programmverlauf zugegriffen werden kann. | |||
% Kamera-Verbindung | |||
cam = webcam(1); | |||
Vor dem Beginn der Bilderkennung wird der Roboterarm an die linke Grenze des Arbeitsbereiches gedreht. Dazu wird er angehoben, um nicht mit Gegenständen zu kollidieren und der Greifer geöffnet. Die Suche der Zuckerstücke erfolgt in einer ''while-Schleife'', die bei gefundenem Zuckerstück abgebrochen wird. Von der zuvor angefahrenen Position beginnt der Roboter den Arm langsam nach rechts zu drehen. Währenddessen wird zyklisch die Kamera abgefragt und das aktuelle Bild in einer Variablen gespeichert. | |||
%Bild einlesen | |||
img=snapshot(cam); | |||
Zur Minimierung der Daten wird nun ein Graustufenbild erzeugt. | |||
%in Graustufen umwandeln | |||
img_gray=rgb2gray(img); | |||
Der Kontrast des Graustufenbildes wird erhöht durch eine einfache Justierung und durch die adaptive Histrogrammlinearisierung. | |||
%Kontrast erhöhen | |||
img_contrast=imadjust(img_gray); | |||
% mit Adaptiver Histogrammlinearisierung | |||
img_adapth_contrast=adapthisteq(img_contrast); | |||
Das so vorbereite Bild wird als Grundlage für die Kantenerkennung mit dem ''Sobel-Algorithmus'' verwendet. | |||
% Kantenerkennung mit Sobel | |||
img_sobel=edge(img_adapth_contrast,'sobel'); | |||
Für das Kantenbild wird nun ein Labeling durchgeführt, sodass zusammenhängende Regionen erfasst werden. Hierfür bietet MATLAB die Funktion ''regionprobs'', was für ''region properties'' steht. Die gefunden Regionen werden nun nach ihrer Lage und Größe gefiltert. Es werden nur Regionen mit der Größe 30 bis 100 Pixel berücksichtigt. Desweiteren wird das obere Drittel sowie der linke und der rechte äußerste Rand abgeschnitten. Diese Filterung wurde im Test als sehr zielführend und zuverlässig erfunden. | |||
size_i=size(img_sobel); | |||
regions=regionprops(img_sobel); | |||
k=1; | |||
% Filtern nach Größe und Lage | |||
for m=1:length(regions) | |||
if regions(m).Area>30 && regions(m).Area<100 && regions(m).BoundingBox(2)>(0.3*size_i(1)) && regions(m).BoundingBox(1)>10 && regions(m).BoundingBox(1)<620 | |||
regions_filt(k)=regions(m); | |||
k=k+1; | |||
end | |||
end | |||
Um Fehler auszuschließen wird darauf die Anzahl der gefundenen Regionen untersucht. Liegt diese im Bereich von 3 bis 19, werden die Punktpaare der Mittelpunkte der Regionen nach ihrer Höhe sortiert. Somit kann das oberste Zuckerstück des Haufens lokalisiert werden. An dieser Stelle ist die Suche nach Zuckerstücken beendet. Die Lokalisierung der Tasse erfolgt nach dem gleichen Verfahren. Es werden jedoch nur Regionen berücksichtigt, die größer sind als 150 Pixel. Die Überprüfung der Anzahl wird mit dem Wert 5 als Obergrenze durchgeführt. | |||
=== Hardware-Ansteuerung === | |||
Bevor der NXT angesteuert werden kann, ist eine Initialisierung einer entsprechenden Objekt-Variablen notwendig. | |||
% Verbindung aufbauen und Globalsetzung NXT | |||
handle = COM_OpenNXT(); | |||
COM_SetDefaultNXT(handle); | |||
Das Ansteuern der Motoren geschieht immer nach dem gleichen Prinzip. Es werden die Geschwindigkeit, die Länge der Bewegung in Grad der Motorumdrehung und einge Parameter de finiert und auf den NXT gesendet. Es wird nun ein Beispiel gezeigt. | |||
% Anlegen des Motor-Objektes; Definition des Ports (hier B) und der Geschwindigkeit, das Vorzeichen bestimmt die Richtung | |||
motorB = NXTMotor('B', 'Power', -50);%>0 = runter, <0 = hoch | |||
% Festlegen der Bewegungslänge, hier 60 Grad | |||
motorB.TachoLimit = 60; %60 passt für Höhe der HSHL-Tasse | |||
% Option, was nach Erreichen der Grenze geschehen soll: 'Holdbrake' - Position halten, 'Coast' - sanft abbremsen | |||
motorB.ActionAtTachoLimit = 'Holdbrake'; | |||
% Sanfter Start, verhindert Bornout, führt zu Abweichungen | |||
motorB.SmoothStart = false; | |||
% Ein-/Ausschalten der geregelten Geschwindigkeitssteuerung über ein dynamisches Drehmoment | |||
motorB.SpeedRegulation = false; | |||
% Senden der Daten | |||
motorB.SendToNXT(); | |||
% Program bis zur Beendigung der Motoransteuerung anhalten | |||
motorB.WaitFor(); | |||
% Stoppen des Motors | |||
motorB.Stop('off'); | |||
Desweiteren gibt es die Möglichkeit die aktuelle Motor-Position als Nullpunkt festzulegen. Dies ist besonders hilfreich, um an definierte Stellen zurückzukehren. | |||
motorA.ResetPosition(); | |||
%Motorposition soll bei 0 beginnen | |||
Außerdem können Motordaten wie die aktuelle Position ausgelesen werden. | |||
dataB = motorB.ReadFromNXT(); | |||
%auslesen der Motordaten des NXT | |||
Mit Hilfe dieser Befehle können sämtliche Bewegungen realisiert werden.<br> | |||
Die Parameter wurden in einigen Versuchen an den Aufbau angepasst. Dabei spielen zum Beispiel verwendete Übersetzungen und die erforderliche Kraft eine entscheidende Rolle. Der Drehantrieb wurde mit einer zweistufigen Übersetzung mit dem Verhältnis 1:2.8 realisiert.<br> | |||
Die Koordinatentransformation konnte vereinfacht werden, da die Länge des Roboterarmes fest ist. Sie erstreckt sich somit nur auf die Rotation um einen entsprechenden Winkel. Dieser ergibt sich aus der Summe der Bildkoordinate multipliziert mit der Entsprechung eines Pixels in Weltkoordinaten und der Verschiebung von Kamera zu Greifer. Für diesen Roboter wurde für die Pixel festgestellt, dass eine Pixelbreite 0.05 Grad in Weltkoordinaten entsprechen. Die Verschiebung wurde mit 20 Grad ermittelt. Bei der Motoransteuerung darf die Übersetzung nicht vergessen werden. | |||
== Video == | |||
Das Video des Funktionsnachweises findet sich auf [http://www.youtube.com/watch?v=cKmSFWycxjQ&list=PLoyKJifb3ROe_sKfT3y3paswSyiQ8xqm1&feature=share&index=3 YouTube]. | |||
== Reflexion - Lessons Learned == | |||
Es konnten einige Verfahren und Algorithmen der Bildverarbeitung angewendet werden. Jedoch zeigte sich die fehlende Präzision des Lego-Systems. Die Aufgabe konnte aber zufriedenstellend gelöst werden. | |||
== Einzelnachweise == | |||
<references /> | |||
== Siehe auch == | == Siehe auch == | ||
* [[Objekterkennung mit Kamera]] | |||
* [[Camera Calibration Toolbox]] | |||
* [[RWTH Aachen Toolbox meets NXT]] | |||
* [[Lego Mindstorms]] | |||
* Tönnies, Klaus D.: ''Grundlagen der Bildverabeitung''. Pearson Studium, München, 2005. ISBN 3-8273-7155-4 | |||
<!-- <ref>Reif, Konrad (Hrsg.): ''Batterien, Bordnetze und Vernetzung''. Vieweg+Teubner, Wiesbaden, 2010. S. 120ff. ISBN 978-3-8348-1310-7</ref> --> | |||
== Weblinks == | == Weblinks == | ||
--> | * [http://www.vision.caltech.edu/bouguetj/calib_doc/ Beschreibung, Tutorial und Downlod der Camera Calibration Toolbox für MATLAB von Jean-Yves Bouguet] | ||
* [http://www.mindstorms.rwth-aachen.de/documents/downloads/doc/version-4.03/motor_control.html Beschreibung der Klasse ''NXTmotor'' der RWTH Aachen] | |||
* [http://www.mathworks.de/products/image/whatsnew.html MATLAB-Seite zur ''Image Processing Toolbox''] | |||
* [http://www.mindstorms.rwth-aachen.de/ Homepage der RWTH Aachen zur Mindstorms NXT Toolbox für MATLAB] | |||
* [http://www.lego.com/en-us/mindstorms/downloads/nxt/nxt-software/ Downloadseite von Lego] | |||
<!--Das ist ein Kommentar--> | |||
---- | ---- | ||
→ zurück zum Hauptartikel: [[DSB_SoSe2014| Digitale Signal- und Bildverarbeitung SoSe2014]] | → zurück zum Hauptartikel: [[DSB_SoSe2014| Digitale Signal- und Bildverarbeitung SoSe2014]] |
Aktuelle Version vom 23. Januar 2015, 14:02 Uhr
Autor: Daniel Block
Betreuer: Prof. Schneider
Motivation
Ein Roboterarm ist ein tolles Anschauungsobjekt, um etwas über Koordinatentransformation zu lernen.
Ziel
Programmieren Sie einen Roboterarm so, dass er sich ein Zuckerstück von einem Haufen nimmt und dieses in eine HSHL-Tasse fallen lässt.
Aufgabe
- Erkennen Sie mit einer Webcam einen Zuckerwürfel.
- Konstruieren Sie den Standard Lego Roboterarm so, dass er den Zuckerwürfel greifen kann.
- Analysieren Sie die Videoszene und steuern Sie den Roboterarm, so dass er den Zucker Greift und diesen kollisionsfrei in die Tasse fallen lässt.
Vorbereitungen
Vor der Bearbeitung der Aufgabe sind einige Vorbereitungen zu treffen. Zum einen wird ein Grundverständnis für die Bildverarbeitung und die Koordinatentransformation vorausgesetzt. Dieses wurde im Rahmen der Veranstaltung Digitale Signal- und Bildverarbeitung während des Sommersemesters 2014 im Studiengang Mechatronik der HSHL erlangt. Eine weitere Recherche in Literatur und im Internet erwies sich jedoch als sehr zielführend. Besonders zur Umsetzung in MATLAB konnten hier einige hilfreiche Hinweise gefunden werden. Zum anderen sind einige Hardware- und Softwarekomponenten erforderlich. Diese werden im Folgenden kurz dargestellt.
Erforderliches Equipment
- Lego NXT Roboter
- Lego Mindstorms Basisset 9797
- Lego Mindstorms Ergänzungsset 9648/9695
- Webcam (z. B. Logitech C310)
- HSHL-Tasse
- Zuckerstücke
- Tesafilm
- Notebook oder Rechner mit MATLAB
Erforderliche Software
- MATLAB (es wird die Version 2014a empfohlen aufgrund der Image Processing Toolbox)
- RWTH - Mindstorms NXT Toolbox für MATLAB
- LEGO Mindstorms NXT Treiber Fantom
- NXT Firmware Version 1.28 oder höher
- NeXTTool
- Camera Calibration Toolbox für MATLAB
Die Hyperlinks führen jeweils zur Download-Seite. MATLAB ist über das ZfW (Zentrum für Wissensmanagement) der HSHL zu bekommen.
Installation der Treiber
Diese Schritt-für-Schritt-Anleitung orientiert sich an der Beschreibung der RTWH Aachen [1].
- Toolbox der RWTH Aachen
- Toolbox der RWTH Aachen herunterladen.
- Heruntergeladene Datei extrahieren.
- Toolbox als MATLAB-Pfad hinzufügen.
- Set Path in MATLAB aufrufen.
- Add with subfolders aufrufen und Verzeichnis der Toolbox auswählen.
- Speichern nicht vergessen.
- Firmware des NXT
- Version der Firmware auf dem NXT überprüfen. Die Version lässt sich im Menü des NXT einsehen.
- Wenn die Version älter ist als 1.28 bzw. 1.29, die Firmware herunterladen.
- Die Firmware auf den NXT laden, z. B. mit der Funktion FlashNXTWithFirmware1.29.bat in /tools/MotorControl im Verzeichnis der Toolbox.
- Laden von MotorControl auf NXT
- NeXTool herunterladen und im Verzeichnis /tools/MotorControl der Toolbox speichern.
- In Windows-Systemen nun die Funktion TransferMotorControlBinaryToNXT.bat aufrufen, um mit NeXTool die MotorControl*.rxe auf den NXT zu laden.
- Den Schritten im Command-Fenster folgen.
- Treiber Wird beispielhaft für Windows 32 bit mit USB-Verbindung erklärt. Das Vorgehen für andere Betriebssysteme oder die Bluetooth-Verbindung kann auf der Internetseite der RWTH Aachen[2] nachgesehen werden unter Check other software requirements.
- NXT Fantom-Treiber herunterladen und installieren.
- Treiber auf den NXT laden mit TransferMotorControlBinaryToNXT
- Funktionstext
- USB-Verbindung zwischen NXT und Rechner bzw. Notebook herstellen.
- NXT einschalten.
- MATLAB starten.
- Im Command Window von MATLAB COM_OpenNXT ausführen (einfach eintippen und mit Enter ausführen).
- Wird der Aufruf ohne Fehler ausgeführt, ist die Installation erfolgreich abgeschlossen.
Installation der Camera Calibration Toolbox
Diese Beschreibung ist angelehnt an die Erläuterungen von Jean-Yves Bouguet [3].
- Toolbox herunterladen.
- Heruntergeladene Datei extrahieren.
- Den Ordner TOOLBOX_calib als MATLAB-Pfad hinzufügen (Vorgehen vgl. RWTH-Toolbox s. o.).
- Starten mit ausführen von calib_gui in MATLAB.
Die genaue Vorgehensweise bei der Kalibrierung der Kamera wird an dieser Stelle nicht erläutert. Ich verweise an dieser Stelle auf die Homepage zur Toolbox und den Artikel von Herrn Deitel zu diesem Thema [4].
Hardware
Der Aufbau des Roboters erfolgt mit den Komponenten der Lego Mindstorms Kästen. Die Teile entsprechen dem Lego Technik Sortiment. Die wesentlichen Komponenten sind der intelligente Stein Brick, drei Motoren und die Webcam. Desweiteren werden diverse Konstruktions-, Verbindungs- und Getriebe-Teile benötigt. Da mit dem NXT nur drei Motoren betrieben werden können, wurde die Bewegung des Roboters auf folgende drei Dimensionen festgelegt:
- Drehen des Roboterarms auf dem Unterbau
- Heben und Senken des Greifers
- Öffnen und Schließen des Greifers
Der drehbare Arm wird von einem Drehkranz getragen, der von einem Motor angetrieben wird. Der Motor für das Heben und Senken ist zugleich tragendes Element des Armes auf dem Drehkranz. Der Greifer ist so konstruiert, dass ein Schenkel fest montiert ist und der zweite von einem weiteren Motor angetrieben wird. Für das Öffnen des Greifers und für das Drehen des Armes werden mehrstufige Übersetzungs-Getriebe eingesetzt. Dies ermöglicht langsame Bewegungen bei zugleich hohem Drehmoment. Der intelligente Stein ist am Rahmen montiert und bildet somit einen Teil des Gegengewichtes für den Roboterarm. Der Aufbau im Einzelnen ist in den Fotos zu sehen, die im Projekt-Ordner im SVN gespeichert sind. Desweiteren ist dort ein Lego-Designer-Modell des Roboters hinterlegt, dass dem Aufbau sehr nahe kommt. Die Abweichungen ergeben sich durch Verwendung etwas anderer Teile oder die Montage von Zahnrädern in den genannten Getrieben, die im Modell nicht möglich ist. Desweiteren ist ein Verbindungsstein im Modell nicht integriert, weil die Lage vom Lego-Standard abweicht. Diese Teile können aber in den Fotos des Roboters gut wiedererkannt werden. Der Vollständigkeit halber sind diese Teile im Lego-Designer-Modell als lose Teile beigefügt.
Software
Im Folgenden wird die Implementierung in MATLAB zur Erkennung der Zuckerstücke und der Tasse sowie die Ansteuerung der Motoren dargestellt.
Bilderkennung
Zu aller Erst wird die Kamera initialisert. Dazu wird eine Objekt-Variable erstellt, auf die im Programmverlauf zugegriffen werden kann.
% Kamera-Verbindung cam = webcam(1);
Vor dem Beginn der Bilderkennung wird der Roboterarm an die linke Grenze des Arbeitsbereiches gedreht. Dazu wird er angehoben, um nicht mit Gegenständen zu kollidieren und der Greifer geöffnet. Die Suche der Zuckerstücke erfolgt in einer while-Schleife, die bei gefundenem Zuckerstück abgebrochen wird. Von der zuvor angefahrenen Position beginnt der Roboter den Arm langsam nach rechts zu drehen. Währenddessen wird zyklisch die Kamera abgefragt und das aktuelle Bild in einer Variablen gespeichert.
%Bild einlesen img=snapshot(cam);
Zur Minimierung der Daten wird nun ein Graustufenbild erzeugt.
%in Graustufen umwandeln img_gray=rgb2gray(img);
Der Kontrast des Graustufenbildes wird erhöht durch eine einfache Justierung und durch die adaptive Histrogrammlinearisierung.
%Kontrast erhöhen img_contrast=imadjust(img_gray); % mit Adaptiver Histogrammlinearisierung img_adapth_contrast=adapthisteq(img_contrast);
Das so vorbereite Bild wird als Grundlage für die Kantenerkennung mit dem Sobel-Algorithmus verwendet.
% Kantenerkennung mit Sobel img_sobel=edge(img_adapth_contrast,'sobel');
Für das Kantenbild wird nun ein Labeling durchgeführt, sodass zusammenhängende Regionen erfasst werden. Hierfür bietet MATLAB die Funktion regionprobs, was für region properties steht. Die gefunden Regionen werden nun nach ihrer Lage und Größe gefiltert. Es werden nur Regionen mit der Größe 30 bis 100 Pixel berücksichtigt. Desweiteren wird das obere Drittel sowie der linke und der rechte äußerste Rand abgeschnitten. Diese Filterung wurde im Test als sehr zielführend und zuverlässig erfunden.
size_i=size(img_sobel); regions=regionprops(img_sobel); k=1; % Filtern nach Größe und Lage for m=1:length(regions) if regions(m).Area>30 && regions(m).Area<100 && regions(m).BoundingBox(2)>(0.3*size_i(1)) && regions(m).BoundingBox(1)>10 && regions(m).BoundingBox(1)<620 regions_filt(k)=regions(m); k=k+1; end end
Um Fehler auszuschließen wird darauf die Anzahl der gefundenen Regionen untersucht. Liegt diese im Bereich von 3 bis 19, werden die Punktpaare der Mittelpunkte der Regionen nach ihrer Höhe sortiert. Somit kann das oberste Zuckerstück des Haufens lokalisiert werden. An dieser Stelle ist die Suche nach Zuckerstücken beendet. Die Lokalisierung der Tasse erfolgt nach dem gleichen Verfahren. Es werden jedoch nur Regionen berücksichtigt, die größer sind als 150 Pixel. Die Überprüfung der Anzahl wird mit dem Wert 5 als Obergrenze durchgeführt.
Hardware-Ansteuerung
Bevor der NXT angesteuert werden kann, ist eine Initialisierung einer entsprechenden Objekt-Variablen notwendig.
% Verbindung aufbauen und Globalsetzung NXT handle = COM_OpenNXT(); COM_SetDefaultNXT(handle);
Das Ansteuern der Motoren geschieht immer nach dem gleichen Prinzip. Es werden die Geschwindigkeit, die Länge der Bewegung in Grad der Motorumdrehung und einge Parameter de finiert und auf den NXT gesendet. Es wird nun ein Beispiel gezeigt.
% Anlegen des Motor-Objektes; Definition des Ports (hier B) und der Geschwindigkeit, das Vorzeichen bestimmt die Richtung motorB = NXTMotor('B', 'Power', -50);%>0 = runter, <0 = hoch % Festlegen der Bewegungslänge, hier 60 Grad motorB.TachoLimit = 60; %60 passt für Höhe der HSHL-Tasse % Option, was nach Erreichen der Grenze geschehen soll: 'Holdbrake' - Position halten, 'Coast' - sanft abbremsen motorB.ActionAtTachoLimit = 'Holdbrake'; % Sanfter Start, verhindert Bornout, führt zu Abweichungen motorB.SmoothStart = false; % Ein-/Ausschalten der geregelten Geschwindigkeitssteuerung über ein dynamisches Drehmoment motorB.SpeedRegulation = false; % Senden der Daten motorB.SendToNXT(); % Program bis zur Beendigung der Motoransteuerung anhalten motorB.WaitFor(); % Stoppen des Motors motorB.Stop('off');
Desweiteren gibt es die Möglichkeit die aktuelle Motor-Position als Nullpunkt festzulegen. Dies ist besonders hilfreich, um an definierte Stellen zurückzukehren.
motorA.ResetPosition(); %Motorposition soll bei 0 beginnen
Außerdem können Motordaten wie die aktuelle Position ausgelesen werden.
dataB = motorB.ReadFromNXT(); %auslesen der Motordaten des NXT
Mit Hilfe dieser Befehle können sämtliche Bewegungen realisiert werden.
Die Parameter wurden in einigen Versuchen an den Aufbau angepasst. Dabei spielen zum Beispiel verwendete Übersetzungen und die erforderliche Kraft eine entscheidende Rolle. Der Drehantrieb wurde mit einer zweistufigen Übersetzung mit dem Verhältnis 1:2.8 realisiert.
Die Koordinatentransformation konnte vereinfacht werden, da die Länge des Roboterarmes fest ist. Sie erstreckt sich somit nur auf die Rotation um einen entsprechenden Winkel. Dieser ergibt sich aus der Summe der Bildkoordinate multipliziert mit der Entsprechung eines Pixels in Weltkoordinaten und der Verschiebung von Kamera zu Greifer. Für diesen Roboter wurde für die Pixel festgestellt, dass eine Pixelbreite 0.05 Grad in Weltkoordinaten entsprechen. Die Verschiebung wurde mit 20 Grad ermittelt. Bei der Motoransteuerung darf die Übersetzung nicht vergessen werden.
Video
Das Video des Funktionsnachweises findet sich auf YouTube.
Reflexion - Lessons Learned
Es konnten einige Verfahren und Algorithmen der Bildverarbeitung angewendet werden. Jedoch zeigte sich die fehlende Präzision des Lego-Systems. Die Aufgabe konnte aber zufriedenstellend gelöst werden.
Einzelnachweise
- ↑ Homepage der RTWH Aachen zur Mindstorms NXT Toolbox (letzter Aufruf 19.6.2014)
- ↑ Internetseite der RWTH Aachen
- ↑ Jean-Yves Bouguet: Camera Calibration Toolbox for MATLAB. (Homepage, letzter Aufruf 19.6.2014)
- ↑ Deitel, M.: Extrinsische und Intrinsische Kameraparameter. Lippstadt, Bericht Seminarvortrag, 2013. Link
Siehe auch
- Objekterkennung mit Kamera
- Camera Calibration Toolbox
- RWTH Aachen Toolbox meets NXT
- Lego Mindstorms
- Tönnies, Klaus D.: Grundlagen der Bildverabeitung. Pearson Studium, München, 2005. ISBN 3-8273-7155-4
Weblinks
- Beschreibung, Tutorial und Downlod der Camera Calibration Toolbox für MATLAB von Jean-Yves Bouguet
- Beschreibung der Klasse NXTmotor der RWTH Aachen
- MATLAB-Seite zur Image Processing Toolbox
- Homepage der RWTH Aachen zur Mindstorms NXT Toolbox für MATLAB
- Downloadseite von Lego
→ zurück zum Hauptartikel: Digitale Signal- und Bildverarbeitung SoSe2014