SDE Systementwicklung WS25/26: Spurverfolgung mit Kamera


| Autoren: | Jan Steffens & Lukas Berkemeier |
| Dozent: | Prof. Dr.-Ing. Schneider |
| Modul | Mechatronik, Systementwicklung (Wahlpflichtprofil „Systems Design Engineering“), Sommersemester |
| Modulbezeichnung: | MTR-B-2-6.11 |
| Modulverantwortung: | Ulrich Schneider |
| Lehrveranstaltung: | Praktikum Systementwurf |
| Sprint 1: | Autonome Fahrbahnvermessung |
| Zeit: | Dienstag, 08:15 - 10:30 Uhr, Selbstlernzeit: TBD |
| Ort: | Labor L3.3-E01-180 (Autonome Systeme) |
Einleitung
Zu Sprint 2 wurde die Fahrbahn vollständig vermessen und als digitale Karte gespeichert (vgl. Abb. 1, 2). Die Position des Prismas kann während der Fahrt gemessen und in die Referenzkarte eingezeichnet werden. Aufgabe dieses Sprints einen Autonomen Mobilen Roboter (AMR) via Kamera und Spurerkennung in der rechten Fahrspur gereglt zu fahren, diese Fahrt zu vermessen und in die Karte zu übertragen.
| Req. | Beschreibung | Priorität |
|---|---|---|
| 1 | Ein AMR muss autonom in der rechten Fahrspur fahren. | 1 |
| 2 | Als Referenzmessystem kommt die Topcon Robotic Total Station zum Einsatz. | 1 |
| 3 | Der AMR muss die Fahrbahndaten via Kamera (Pixy2.1) auswerten, um der Fahrspur zu folgen. | 1 |
| 4 | Die Referenzwerte müssen mit MATLAB® aufgezeichnet werden (x, y, ). | 1 |
| 5 | Messfehler müssen geeignet gefiltert werden. | 1 |
| 6 | Die zweidimensionale digitalen Karte mit der Roboterpose während der Fahrt muss als MATLAB®-Datei (.mat) bereitgestellt werden. |
1 |
| 7 | Das Vorgehen muss am KANBAN-Board geplant und verfolgt werden. | 1 |
| 8 | Lösungsweg und Lösung muss in diesem Wiki-Artikel dokumentiert werden. | 1 |
| 9 | Als AMR muss ein AlphaBot eingesetzt werden. | 1 |
| 10 | Als Software für die Regelung muss MATLAB®/Simulink eingesetzt werden. | 1 |
| AP | Beschreibung | Req. | Zuständigkeit |
|---|---|---|---|
| 2.1 | Spurerkennung mit der Pixy2.1 und aktualisierung der Prismahalterung | 3, 9 | Berkemeier |
| 2.2 | Berechnung der Ist-Ablage zur Solllinie | 1 | Berkemeier |
| 2.3 | Geregelte Fahrt in der rechten Fahrspur anhand der Ist-Ablage. | 1 | Berkemeier |
| 2.4 | Messung der Ist-Position mittels Topcon Robotic Total Station | 2, 4 | Steffens |
| 2.5 | Glättung der Messwerte mittels Kalman-Filter (x, y, vx, vy) | 5 | Steffens |
| 2.6 | Schätzung der Roboterpose | 1 | Steffens |
| 2.7 | Einzeichnen der Messwerte in die digitale Karte und Speicherung der Karte als Rundkurs.mat |
6 | Steffens |
| 2.8 | Überarbeitung/Verbesserung des Artikels Referenzmessung_mit_der_Topcon_Robotic_Total_Station | 8 | Berkemeier |
Planung (Plan)

Ziel-Zustand
Der AlphaBot soll autonom in der rechten Fahrbahn fahren, indem die Außenlinie durch die Linienerkennung der Pixy 2.1 erkannt und darauf geregelt wird. Parallel dazu soll die Position des AlphaBot mit der Topcon-Station gemessen, gefiltert, gespeichert und in den Rundkurs eingezeichnet werden.
Umsetzung (Do)
Die Umsetzung des Sprints ist in zwei parallel verlaufende Aufgaben unterteilt. Eine Aufgabe beinhaltet das Messen der AlphaBot-Position mithilfe der Topcon-Station. Der zweite Aufgabenteil beinhaltet die Spurverfolgung mit dem Kamerasensor Pixy 2.1.
Ist-Position messen, filtern, speichern
Die Ist-Position des AlphaBot wird mit der Topcon-Station gemessen (AP 2.4). Die Messwerte werden via Bluetooth an einen Computer gesendet, auf dem die Daten mit Matlab empfangen werden. Dann werden die Daten in das W-Kos transformiert, mit einem Kalman-Filter gefiltert (AP 2.5), die Roboterpose wird geschätzt (AP 2.6), im Rundkurs eingezeichnet und zuletzt in einer .mat-Datei gespeichert (AP 2.7). Die Aufgaben und Arbeitspakete wurden in mehreren Modulen realisiert und im Modul starteAlphaBotMapping.m zusammengeführt.
SVN-Link: starteAlphaBotMapping.m
starteAlphaBotMapping.m
|
%**************************************************************************
% Hochschule Hamm-Lippstadt *
%**************************************************************************
% Modul : starteAlphaBotMapping.m *
% *
% Datum : 09.12.2025 *
% *
% Funktion : Empfang der Messwerte der Topcon Robotik Station *
% PS-103A via Bluetooth, Umwandlung in W-KOS, *
% Kartografierung von Position und Kurs *
% *
% Implementation : R2025b *
% *
% Toolbox : >= R2020b: Bluetooth Verbindung möglich *
% < R2020b: COM Verbindung *
% *
% Authoren : Prof. Ulrich Schneider *
% Jan Steffens *
% *
% Benötigt : PositionserfassungPrisma.m, KosTrafoTzuWelt.m *
% *
% Letzte Änderung : 07.10.2025 *
% *
%**************************************************************************
% Wiki-Artikel: https://wiki.hshl.de/wiki/index.php/SDE_WS25:_AP_2.4_Messung_der_Ist-Position_mittels_Topcon_Robotic_Total_Station
%**************************************************************************
%% MATLAB Initialisierung
clear all; close all; clc;
KalmanFilter(); % Reset Kalman-Filter
param_AlphaBot; % Parameter des AlphaBot aus der Parameterdatei laden
% Daten aus dem Datenordner laden
stAktuellerOrdner = cd;
stDatenOrdner = [stAktuellerOrdner(1:findstr(stAktuellerOrdner,'AlphaBot')+8),'Daten'];
addpath(stDatenOrdner)
%% Karte laden
load('Rundkurs.mat');
%% Grafik vorbereiten
figure
hold on
% Rundkurs
h1 = plot(LinkeFahrspur_W(1,:),LinkeFahrspur_W(2,:),'k-');
h2 = plot(RechteFahrspur_W(1,:),RechteFahrspur_W(2,:),'k-');
h3 = plot(MittelLinie_W(1,:),MittelLinie_W(2,:),'k--');
axis equal
xlabel('x_W in m')
ylabel('y_W in m')
% Roboter Pose zeichnen
MeinRoboter.x = 2;
MeinRoboter.y = 0.2;
MeinRoboter.Kurs = 0.0;
hRoboter = plot(MeinRoboter.x,MeinRoboter.y,'bo','MarkerSize',10); % Wahrer Wert des Roboters
hRoboterKurs = line([MeinRoboter.x, MeinRoboter.x+0.1*cosd(MeinRoboter.Kurs)],[MeinRoboter.y, MeinRoboter.y+0.1*sind(MeinRoboter.Kurs)],'Color','b'); % Roboter
%% Bluetooth Kommunikation herstellen
bInitBluetooth = false;
if ~exist('hTopCon') % Besteht die Verbindung bereits?
versionInfo = ver('MATLAB'); % Detailed version info
bluetoothSupported = (str2num(versionInfo.Version)>20.1); % ab R2020b
if bluetoothSupported
disp('Bluetooth Verbindung wird aufgebaut....')
hTopCon = bluetooth("PS1031404", 1); % Channel 1 is typical
bInitBluetooth = true;
disp('BT Verbindung erfolgreich hergestellt.')
else
error(['Bluetooth wird von dieser MATLAB Version ',versionInfo.Release,' nicht unterstützt.'])
end
end
%% Referenzpunkte vermessen oder laden
[AT BT] = leseReferenzpunkte(hTopCon); % T-KOS in m
disp('Messung gestartet...')
nIndex = 0;
nNoData = 0;
bMessung = true;
%% Zyklusschleife
t1 = 0; % Zeitmessung initialisieren
tic;
try
i=0;
while (bMessung == true)
% Messung
PT = empfangePrismaPosition(hTopCon); % Messpunkt in Topcon-Koordinaten [xT;yT;zT]
PW = KosTrafoTzuWelt(PT, AT, BT); % Transformation in das Welt-KOS [xW;yW;zW]
% Messwertglättung AP 2.5 - Funktionsaufruf Kalman-Filter
t2 = toc;
dt = t2-t1; % Zeitmessung für KF
i=i+1;
z=PW(1:2); % 2D Position übergeben [xW;yW]
xEst(:,i)=KalmanFilter(z,dt); % [x;y;vx;vy]
% Kursschätzung AP 2.6
%Kurs = Kursschaetzung(xEst(:,i));
Kurs=atan2d(xEst(4,i),xEst(2,i));
% Kurs = rad2deg(unwrap(deg2rad(Kurs)));
% Daten sichern
Pose(:,i) = [xEst(1,i);xEst(2,i);Kurs];
Zeitstempel(i) = t2; % Zeitstempel in s
Messung(:,i) = PW; % Messung in Weltkoordinaten
% Karte aktualisieren
zeichenRoboter(hRoboter,hRoboterKurs,Pose,i);
% dt
t1 = t2;
if mod(i,10)==0
fprintf("%f: [%f ; %f]\n",Zeitstempel(i),xEst(1,i),xEst(2,i));
end
end
catch ME
stDatum = datestr(now,'yyyymmdd_HHMMSS');
stDateiname = sprintf('Messung_%s.mat', stDatum); % Beispiel: 'Messung_20251216_143205.mat'
stDateiname = [stDatenOrdner,'\',stDateiname]; % Datenordner
save(stDateiname, 'Zeitstempel','Messung','Pose','xEst'); % Datei mit Datum und Uhrzeit
disp(['Messung gestoppt, speichere ',stDateiname]);
end
%% Zeichne Pose in Karte AP 2.7
function zeichenRoboter(hRoboter,hRoboterKurs,Pose,i)
% Aktualisiere die Roboterposition in der Grafik
fKursLinienLaenge = 0.2;
set(hRoboter, 'XData', Pose(1,i), 'YData', Pose(2,i));
set(hRoboterKurs, 'XData', [Pose(1,i), Pose(1,i) + fKursLinienLaenge *cosd(Pose(3,i))], ...
'YData', [Pose(2,i), Pose(2,i) + fKursLinienLaenge *sind(Pose(3,i))]);
plot(Pose(1,:),Pose(2,:),'r.-')
drawnow; % Aktualisiere die Grafik
end
|
Spurverfolgung

Die Kamera wird zur Linienerkennung genutzt, die einen Vektor auf die erkannte Linie spannt (AP 2.1). Die Vektordaten werden dann im nächsten Schritt genutzt, um die Ist-Ablage zu Berechnen (AP 2.2), auf die Mithilfe eines PID-Reglers geregelt wird um in der rechten Fahrspur zu fahren (AP 2.3).
Die Ergebnisse der Arbeitspakete wurde zu einem Gesamtsystem, einem Regelkreis, in Simulink realisiert (Abbildung 3).
Als Sollwert wird der Wert 32 genutzt, der aus den Koordinaten des Vektors aus der Linienerkennung hervorgeht. Die aktuelle Spurerkennung erfolgt durch den Kamerasensor aus dem Simulink Support Package for Arduino Hardware. Die Y-Koordinaten des Vektor dienen dem Subsystem Wertevergleich als Eingang. Der jeweils größere Wert wird als Ist-Ablage genutzt um dann die Regelabweichung zu berechnen. Die Regelabweichung ist dann die Eingabe für den PID-Regler, der die Stellgröße berechnet. Die Stellgröße wird als PWM-Wert ausgegeben, der mit dem Standard-PWM-Wert von 100 für die Motorgeschwindigkeit verrechnet wird. Mit dem resultierendem Wert werden die Motoren links und rechts angesteuert. Das HIGH-Signal auf Pin 5 und 6 am Arduino wird lediglich dazu genutzt die Motoren zu "aktivieren".
SVN-Links:
Test und Dokumentation (Check)
Die Ergebnisdokumentation zu den einzelnen Arbeitspaketen ist in Tabelle 2, verlinkt.
Einzeln angefertigten Modultests sind zusätzlich in Tabelle 3 verlinkt.
In Tabelle 4 sind alle Tests gegen die Anforderungen aufgelistet.
Modultests
Nutzen Sie die in Reliability Engineering gelehrten Methoden zum Modultest.
- MATLAB®-Quelltext: MATLAB®-Modultest
- Simulink-Modell: Simulink Test
| # | Modul | Testverfahren | Verantwortung | Testbericht |
|---|---|---|---|---|
| 1 | starteAlphaBotMapping.m |
MATLAB®-Modultest | Jan Steffens | Testbericht |
| 2 | leseReferenzpunkte.m |
MATLAB®-Modultest | Jan Steffens | Testbericht |
| 3 | KosTrafoTzuWelt.m |
MATLAB®-Modultest | Jan Steffens | Testbericht |
| 4 | empfangePrismaPosition.m |
MATLAB®-Modultest | Jan Steffens | Testbericht |
| 5 | KalmanFilter.m] |
MATLAB®-Modultest | Jan Steffens | Testbericht |
| 6 | SpurRegelungAlphaBot.slx → Subsystem Wertevergleich |
Simulink Test | Lukas Berkemeier | Testbericht |
| 7 | SpurRegelungAlphaBot.slx → Subsystem PID-Regler] |
Simulink Test | Lukas Berkemeier | Testbericht |
Späteste Abgabetermin: 06.02.2026
Systemtest gegen die Anforderungen
| Req. | Beschreibung | Testergebnis | Erfüllt |
|---|---|---|---|
| 1 | Ein AMR muss autonom in der rechten Fahrspur fahren. | Abbildung 1 | ✓ |
| 2 | Als Referenzmessystem kommt die Topcon Robotic Total Station zum Einsatz. | AP 2.4 | ✓ |
| 3 | Der AMR muss die Fahrbahndaten via Kamera (Pixy2.1) auswerten, um der Fahrspur zu folgen. | Umsetzung | ✓ |
| 4 | Die Referenzwerte müssen mit MATLAB® aufgezeichnet werden (x, y, ). | AP 2.7 | ✓ |
| 5 | Messfehler müssen geeignet gefiltert werden. | AP 2.5 | ✓ |
| 6 | Die zweidimensionale digitalen Karte mit der Roboterpose während der Fahrt muss als MATLAB®-Datei (.mat) bereitgestellt werden. |
Messung | ✓ |
| 7 | Das Vorgehen muss am KANBAN-Board geplant und verfolgt werden. | Planung (Plan) | ✓ |
| 8 | Lösungsweg und Lösung muss in diesem Wiki-Artikel dokumentiert werden. | Artikel | noch nicht vollständig |
| 9 | Als AMR muss ein AlphaBot eingesetzt werden. | Umsetzung | ✓ |
| 10 | Als Software für die Regelung muss MATLAB®/Simulink eingesetzt werden. | AP 2.3 | ✓ |
Fehlerbehebung (Act)
Alle Anforderungen an den Sprint werden erfüllt. Eine direkte Fehlerbehebung ist nicht notwendig. Mögliche Verbesserungen werden im Abschnitt Ausblick aufgeführt.
Zusammenfassung
Im Rahmen des Sprints "Spurverfolgung mit Kamera" wurden zunächst Arbeitspakete aus den Anforderungen an den Sprint generiert. Die Systematische Abarbeitung der Arbeitspakete wurde dann mit einem Kanban-Board geplant. Die Arbeitspakete selbst wurden systematisch geplant, umgesetzt, getestet und in eigenen Artikeln dokumentiert.
Das Ergebnis des Sprints ist ein AlphaBot, der mithilfe einer Pixy 2.1 und der Linienerkennung, Autonom in der rechten Fahrspur des Strecke fahren kann. Die fahrt wird mithilfe der Topcon-Station aufgezeichnet und gefiltert. Die Daten werden im Rundkurs eingezeichnet und als .mat-Datei abgespeichert.
Insgesamt werden alle Anforderungen an den Sprint erfüllt.
Ausblick
- Die Kugel des AlphaBot verklebt durch die Fahrbahn. Hier wäre eine Stützradlösung wünschenswert.
- Die Kamera sollte möglichst stabil eingebaut werden, sodass sich die Richtung der Kamera und der Neigungswinkel nicht unbeabsichtigt verstellen lassen.
Anhang
Wichtige Links:
- https://docs.pixycam.com/wiki/doku.php?id=wiki:v2:pixy_serial_protocol
- https://www.waveshare.com/UNO-PLUS.htm
- https://www.waveshare.com/wiki/UNO_PLUS
- Einstellung der Kamera: https://docs.pixycam.com/wiki/doku.php?id=wiki:v2:porting_guide
→ zurück zum Hauptartikel: SDE Praktikum Systementwurf SoSe2025
→ zurück zum Artikel: SDE-Team 2025/26