SigSys15 Target Tracking: Unterschied zwischen den Versionen
(17 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 22: | Zeile 22: | ||
=== Lösungsansatz === | === Lösungsansatz === | ||
Das vorangestellte Problem teilt sich in 2 Teilproblemen auf. Zum einem muss das Luftballon aus Kamerabildern erkannt werden. Zum anderen muss mit dem | Das vorangestellte Problem teilt sich in 2 Teilproblemen auf. Zum einem muss das Luftballon aus Kamerabildern erkannt werden. Zum anderen muss mit dem Raketenwerfer das erkannte Objekt abgeschossen werden. | ||
=== Erweiterung des Aufbaus === | === Erweiterung des Aufbaus === | ||
Der im Projekt 33 vorgestellte Aufbau wurde noch um ein Webcam erweitert. Das Webcam dient zur Erkennung des Ziels und wurde oben auf dem Aufbau angebracht, sodass das Schussfeld im Blickfeld der Kamera liegt. Dadurch wird die Bildverarbeitung vereinfacht, da so keine Koordinatentransformation zwischen Kamerabild und Ausrichtung des Raketenwerfers benötigt wird. | |||
Als Ziel wurde ein rotes Luftballon verwendet. Um die Lösung einfach zu halten ist in der weiteren Bearbeitung der Aufgabe von der roten Farbe des Ballons ausgegangen. | |||
=== Vorbereitende Maßnahmen === | |||
Als Vorbereitung für die Lösung wurde die Trajektorie direkt auf dem Kamerabild erfasst. Damit hat sich herausgestellt, dass der Scheitelpunkt der Trajektorie sich auf etwa x=175 und y=200, bei einer Bildauflösung von 320x240, befindet. Dieser Punkt wurde dann, um die Lösung einfach zu halten, als Abschusspunkt festgelegt. D.h. das Ballon muss sich im Bereich dieses Punktes befinden um von der Raketen getroffen zu werden. | |||
=== Erkennung des Ballons === | === Erkennung des Ballons === | ||
Zur Erkennung des Ballons wurde ein Webcam eingesetzt. MATLAB stellt im '''Image Prcessing Toolbox''' viele Funktionen bereit, um schnell bildverarbeitende Algorithmen zu entwickeln. | |||
Das Erkennen des Ballons geschieht nach folgenden Schritten: | |||
* Kamerbild erfassen | |||
* Die rote Farbe aus dem RGB-Bild extrahieren. | |||
* Das entstandene Bild filtern (Median-Filter) um Verunreinigungen (Noise) im Bild zu entfernen. | |||
* Bild binarisieren. | |||
Damit das entstandene Bild besser gehandhabt werden kann sind außerdem noch folgende morphologische Operationen benötigt: | |||
* Löcher im Bild befüllen. | |||
* Mit Opening-Operation den inneren Bereich des Ballons freimachen. | |||
Zum Schluss kann eine '''Region-Property'''-Operation benutzt werden, um den Schwerpunkt des Ballons zu finden. Dazu kann in MATLAB den Parameter '''centroid''' genutzt werden. Mit dieser Operation werden die Koordinaten des Schwerpunkts in Pixeln angegeben. | |||
Der Quelltext diese Vorgänge ist im folgenden abgebildet: | |||
<source lang="matlab"> | |||
% neues Bild vom Kamera lesen | |||
I = snapshot(cam); | |||
imshow(I); | |||
% Roter Bereich aus dem Bild extrahieren, filtern und binarisieren | |||
Im_Red = imsubtract(I(:,:,1), rgb2gray(I)); | |||
Im_Red_filtered = medfilt2(Im_Red, [3 3]); | |||
Im_Red_bw = im2bw(Im_Red_filtered, 0.18); | |||
%% Löcher im Bild füllen | |||
Im_filled = imfill(Im_Red_bin, 'holes'); | |||
%% Mit Opening Ballon räumen | |||
SE = strel('disk', 20); | |||
Im_opened = imopen(Im_filled, SE); | |||
%% Schwerpunkt vom Ballon finden | |||
Regions_in_Image = regionprops(Im_opened, 'centroid'); | |||
</source> | |||
=== Verfolgung und Abschuss des Ballons === | === Verfolgung und Abschuss des Ballons === | ||
Die Ansteuerung des Raketenwerfers erfolgt über den EV3. Um diesen in MATLAB anzusteuern wird auf das '''LEGO MINDSTORMS EV3 Support''' zurückgegriffen. | |||
Zuerst muss eine Verbindung zur EV3 über USB hergestellt werden. Dafür wird folgender Befehl ausgeführt | |||
== | <source lang="matlab"> | ||
lego = legoev3('usb'); | |||
</source> | |||
Mit folgendem Befehl wird ein Motor eingerichtet: | |||
<source lang="matlab"> | |||
motor_x = motor(lego, 'C'); | |||
</source> | |||
Um den Motor in Bewegung zu setzen: | |||
<source lang="matlab"> | |||
motor_x.Speed = Speed_x; %Geschwindigkeit zwischen -100 und 100 | |||
start(motor_x); | |||
</source> | |||
Analog stoppt man ein Motor mit: | |||
<source lang="matlab"> | |||
stop(motor_x); | |||
</source> | |||
Für die Verfolgung des Ballons wird der im vorherigen Abschnitt berechneten Schwerpunkt des Ballons herangezogen. Falls der Schwerpunkt sich außerhalb des Schussbereich befindet wird Richtung und Geschwindigkeit der Bewegung berechnet und anschließend der Motor gestartet. Dabei wird die Geschwindigkeit des Motors in Abhängigkeit der Entfernung zu Abschussbereich errechnet. Je kleiner die Entfernung umso kleiner die Geschwindigkeit. | |||
<source lang="matlab"> | |||
% Berechne Drehrichtung und Geschwindigkeit der Bewegung anhand | |||
% des Abstands | |||
if dx > 5 | |||
%Richtung ermitteln | |||
if object_x >= target_x | |||
dir_x = 1; | |||
else | |||
dir_x = -1; | |||
end | |||
%Geschwindigkeit berechnen | |||
Speed_x = dir_x * dx / 5; | |||
motor_x.Speed = Speed_x; | |||
start(motor_x); | |||
end | |||
</source> | |||
Zum Abschießen des Ballons werden analog Befehle wie oben verwendet. Wenn sich der Ballon in vertikale und horizontale Richtung innerhalb des Schussbereichs befindet wird der Abschussmotor aktiviert. Falls der Ballon den Abschussbereich verlässt, wird der Motor gestoppt. Damit soll erreicht werden, dass so viele Abschüsse wie möglich hintereinander auf dem Ballon gefeuert werden. Folgender Abschnitt stellt den Quelltext dar: | |||
<source lang="matlab"> | |||
%falls Ballon im Abschussbereich liegt soll geschossen werden | |||
if dx <= shoot_threshold_x && dy <= shoot_threshold_y | |||
motor_shoot.Speed = 100; | |||
start(motor_shoot) | |||
else | |||
stop(motor_shoot) | |||
end | |||
</source> | |||
==Ausblick == | |||
Folgende Aspekte können zur weiteren Verbesserung der Lösung umgesetzt werden: | |||
* Die Bewegung des Raketenwerfer regeln. D.h. Regler zu verwenden um die Bewegung schneller und sanfter zu gestalten. | |||
* 3 getrennte Programmpfade (Tasks) nutzen: Für die Objekterkennung, das Fokussieren des Objekts und eins für den Abschussvorgang. Damit kann bessere Synchronisation bei der Verfolgung und Abschussgeschwindigkeit erreicht werden. | |||
== Weblinks == | == Weblinks == | ||
*[http://de.mathworks.com/help/images/index.html?s_tid=srchtitle: MATLAB Image Processing Toolbox] | |||
*[http://de.mathworks.com/hardware-support/lego-mindstorms-ev3-matlab.html: LEGO MINDSTORMS EV3 Support from MATLAB] | |||
---- | ---- | ||
→ zurück zum Hauptartikel: [[SigSys_SoSe2015| Signalverarbeitende Systeme SoSe2015]] | → zurück zum Hauptartikel: [[SigSys_SoSe2015| Signalverarbeitende Systeme SoSe2015]] |
Aktuelle Version vom 22. Juni 2015, 12:56 Uhr
Autor: Asaad Al-Suleihi
Betreuer: Prof. Schneider
Motivation
Mechatroniker haben einen USB-Raketenwerfer umgebaut, so dass sich dieser mit Lego Mindstorms ansteuern lässt. Die Methoden der Bildverarbeitung sollen angewendet werden, um ein sich bewegendes Objekt zu verfolgen.
Ziel
Ein roter Luftballon soll in Bewegung vor einem weissen Hintergrund erkannt und vom Raketenwerfer getroffen werden.
Aufgabe
- Erkennen Sie den Luftballon vor seinem Hintergrund mit einer Webcam.
- Fokussieren Sie den Raketenwerfer auf den Luftballonschwerpunkt.
- Treffen Sie den Luftballon in einer Flugsequenz mit 3 von 4 Schüssen.
Lösung
Lösungsansatz
Das vorangestellte Problem teilt sich in 2 Teilproblemen auf. Zum einem muss das Luftballon aus Kamerabildern erkannt werden. Zum anderen muss mit dem Raketenwerfer das erkannte Objekt abgeschossen werden.
Erweiterung des Aufbaus
Der im Projekt 33 vorgestellte Aufbau wurde noch um ein Webcam erweitert. Das Webcam dient zur Erkennung des Ziels und wurde oben auf dem Aufbau angebracht, sodass das Schussfeld im Blickfeld der Kamera liegt. Dadurch wird die Bildverarbeitung vereinfacht, da so keine Koordinatentransformation zwischen Kamerabild und Ausrichtung des Raketenwerfers benötigt wird.
Als Ziel wurde ein rotes Luftballon verwendet. Um die Lösung einfach zu halten ist in der weiteren Bearbeitung der Aufgabe von der roten Farbe des Ballons ausgegangen.
Vorbereitende Maßnahmen
Als Vorbereitung für die Lösung wurde die Trajektorie direkt auf dem Kamerabild erfasst. Damit hat sich herausgestellt, dass der Scheitelpunkt der Trajektorie sich auf etwa x=175 und y=200, bei einer Bildauflösung von 320x240, befindet. Dieser Punkt wurde dann, um die Lösung einfach zu halten, als Abschusspunkt festgelegt. D.h. das Ballon muss sich im Bereich dieses Punktes befinden um von der Raketen getroffen zu werden.
Erkennung des Ballons
Zur Erkennung des Ballons wurde ein Webcam eingesetzt. MATLAB stellt im Image Prcessing Toolbox viele Funktionen bereit, um schnell bildverarbeitende Algorithmen zu entwickeln.
Das Erkennen des Ballons geschieht nach folgenden Schritten:
- Kamerbild erfassen
- Die rote Farbe aus dem RGB-Bild extrahieren.
- Das entstandene Bild filtern (Median-Filter) um Verunreinigungen (Noise) im Bild zu entfernen.
- Bild binarisieren.
Damit das entstandene Bild besser gehandhabt werden kann sind außerdem noch folgende morphologische Operationen benötigt:
- Löcher im Bild befüllen.
- Mit Opening-Operation den inneren Bereich des Ballons freimachen.
Zum Schluss kann eine Region-Property-Operation benutzt werden, um den Schwerpunkt des Ballons zu finden. Dazu kann in MATLAB den Parameter centroid genutzt werden. Mit dieser Operation werden die Koordinaten des Schwerpunkts in Pixeln angegeben.
Der Quelltext diese Vorgänge ist im folgenden abgebildet:
% neues Bild vom Kamera lesen
I = snapshot(cam);
imshow(I);
% Roter Bereich aus dem Bild extrahieren, filtern und binarisieren
Im_Red = imsubtract(I(:,:,1), rgb2gray(I));
Im_Red_filtered = medfilt2(Im_Red, [3 3]);
Im_Red_bw = im2bw(Im_Red_filtered, 0.18);
%% Löcher im Bild füllen
Im_filled = imfill(Im_Red_bin, 'holes');
%% Mit Opening Ballon räumen
SE = strel('disk', 20);
Im_opened = imopen(Im_filled, SE);
%% Schwerpunkt vom Ballon finden
Regions_in_Image = regionprops(Im_opened, 'centroid');
Verfolgung und Abschuss des Ballons
Die Ansteuerung des Raketenwerfers erfolgt über den EV3. Um diesen in MATLAB anzusteuern wird auf das LEGO MINDSTORMS EV3 Support zurückgegriffen.
Zuerst muss eine Verbindung zur EV3 über USB hergestellt werden. Dafür wird folgender Befehl ausgeführt
lego = legoev3('usb');
Mit folgendem Befehl wird ein Motor eingerichtet:
motor_x = motor(lego, 'C');
Um den Motor in Bewegung zu setzen:
motor_x.Speed = Speed_x; %Geschwindigkeit zwischen -100 und 100
start(motor_x);
Analog stoppt man ein Motor mit:
stop(motor_x);
Für die Verfolgung des Ballons wird der im vorherigen Abschnitt berechneten Schwerpunkt des Ballons herangezogen. Falls der Schwerpunkt sich außerhalb des Schussbereich befindet wird Richtung und Geschwindigkeit der Bewegung berechnet und anschließend der Motor gestartet. Dabei wird die Geschwindigkeit des Motors in Abhängigkeit der Entfernung zu Abschussbereich errechnet. Je kleiner die Entfernung umso kleiner die Geschwindigkeit.
% Berechne Drehrichtung und Geschwindigkeit der Bewegung anhand
% des Abstands
if dx > 5
%Richtung ermitteln
if object_x >= target_x
dir_x = 1;
else
dir_x = -1;
end
%Geschwindigkeit berechnen
Speed_x = dir_x * dx / 5;
motor_x.Speed = Speed_x;
start(motor_x);
end
Zum Abschießen des Ballons werden analog Befehle wie oben verwendet. Wenn sich der Ballon in vertikale und horizontale Richtung innerhalb des Schussbereichs befindet wird der Abschussmotor aktiviert. Falls der Ballon den Abschussbereich verlässt, wird der Motor gestoppt. Damit soll erreicht werden, dass so viele Abschüsse wie möglich hintereinander auf dem Ballon gefeuert werden. Folgender Abschnitt stellt den Quelltext dar:
%falls Ballon im Abschussbereich liegt soll geschossen werden
if dx <= shoot_threshold_x && dy <= shoot_threshold_y
motor_shoot.Speed = 100;
start(motor_shoot)
else
stop(motor_shoot)
end
Ausblick
Folgende Aspekte können zur weiteren Verbesserung der Lösung umgesetzt werden:
- Die Bewegung des Raketenwerfer regeln. D.h. Regler zu verwenden um die Bewegung schneller und sanfter zu gestalten.
- 3 getrennte Programmpfade (Tasks) nutzen: Für die Objekterkennung, das Fokussieren des Objekts und eins für den Abschussvorgang. Damit kann bessere Synchronisation bei der Verfolgung und Abschussgeschwindigkeit erreicht werden.
Weblinks
→ zurück zum Hauptartikel: Signalverarbeitende Systeme SoSe2015