Projekt 54: Mission on Mars (Abschluss): Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(39 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt)
Zeile 1: Zeile 1:
[[Kategorie:Projekte]]
[[Kategorie:Projekte]]
[[Kategorie:Mission on Mars]]


'''Autor:''' [[Benutzer:Stefan Arndt|Stefan Arndt]]  
'''Autor:''' [[Benutzer:Stefan Arndt|Stefan Arndt]]  
Zeile 8: Zeile 9:


Dieser Artikel befasst sich mit dem Projekt 54: Mission on Mars und bringt es zum Abschluss.
Dieser Artikel befasst sich mit dem Projekt 54: Mission on Mars und bringt es zum Abschluss.
Das Projekt wurde in Teilen schon bearbeitet, sodass im Folgendem nicht weiter in Gänze auf die bereits bearbeiteten Themen eingeangen wird.
Das Projekt wurde in Teilen schon bearbeitet, sodass im Folgendem nicht weiter in Gänze auf die bereits bearbeiteten Themen eingegangen wird.


Ich verweiße auf die Artikel:
Ich verweise auf die Artikel:


# [[Projekt 54: Mission on Mars]]
# [[Projekt 54: Mission on Mars]]
Zeile 16: Zeile 17:
# [[Projekt 54: Mission on Mars (Fortsetzung)]]
# [[Projekt 54: Mission on Mars (Fortsetzung)]]
#* Aufbau der Marsoberfläche und Hardwaredokumentation
#* Aufbau der Marsoberfläche und Hardwaredokumentation
# [[Projekt 54b: Mission on Mars]]
#* Aufbau des 2. Roboters


Die Versorgungs-und Kommunikationsplatine (hier: Brückenplatine) wurde in diesem Teil erneut konzipiert, da die Platinen der Vorgänger fehlerbehaftet waren.
Die Versorgungs- und Kommunikationsplatine (hier: Brückenplatine) wurde in diesem Teil erneut konzipiert, da die Platinen der Vorgänger fehlerbehaftet waren.


Zudem wurde eine überarbeitete Bill of Material (BOM) erstellt, da bestimmte Komponenten (z.B. der WLAN-Stick für den Raspberry PI) nicht benötigt wird.
Zudem wurde eine überarbeitete Bill of Material (BOM) erstellt, da bestimmte Komponenten (z.B. der WLAN-Stick für den Raspberry PI) nicht benötigt wird.
Zeile 26: Zeile 29:
* Realisierung des Versuchsaufbaus auf der Marsoberfläche
* Realisierung des Versuchsaufbaus auf der Marsoberfläche
** Kalibrierung der Kamera des Rovers
** Kalibrierung der Kamera des Rovers
** Inbetriebnahme des Computer-Schiedsrichter
** Inbetriebnahme des Videoschiedsrichters
* Erweiterung der Rover um die Sensorik zur Objekterkennung
* Erweiterung der Rover um die Sensorik zur Objekterkennung
* Anpassung der Versorgungs-und Kommunikationsplatine
* Anpassung der Versorgungs- und Kommunikationsplatine


= Verwendete Software =
Verwendete Software:
* Matlab R2019a und Simulink
** MATLAB Support Package for Arduino Hardware
** Simulink Support Package for Arduino Hardware
** MATLAB Support Package for Raspberry Pi Hardware
** Simulink Support Package for Raspberry Pi Hardware
* Ultiboard 14.1
* Multisim 14.1


= Komponenten =
= Komponenten =
Zeile 39: Zeile 52:
Die Objekterkennung erfolgt über einen Sharp Infrarotsensor (GP2Y0A21YK0F) mit einer Reichweite von 10 bis 80 cm.
Die Objekterkennung erfolgt über einen Sharp Infrarotsensor (GP2Y0A21YK0F) mit einer Reichweite von 10 bis 80 cm.


Dieser Sensor wird über eine Montagehalterung an einen Micro Servo Motor (JAMARA 033212) verschraubt um in einem 50° Kegel Objekte zu erkennen.
Dieser Sensor wird über eine Montagehalterung an einen Micro Servomotor (JAMARA 033212) verschraubt, um in einem 50° Kegel Objekte zu erkennen.


[[Datei:P54 Objekterkennung.PNG|none|500px|thumb|Bild 1: Schematische Darstellung der Objekterkennung<ref>Eigene Fotos und [https://store.arduino.cc/arduino-motor-shield-rev3 Arduino Motor Shield]</ref>]]
[[Datei:P54 Objekterkennung.PNG|none|500px|thumb|Bild 1: Schematische Darstellung der Objekterkennung<ref>Eigene Fotos und [https://store.arduino.cc/arduino-motor-shield-rev3 Arduino Motor Shield]</ref>]]


Im Bild 1 ist zu erkennen wie die jeweiligen Anschlüße zu verbinden sind. Hierbei wurde OUT6 für das PWM Signal des Micro Servo Motors und IN2 für das Analog Singal des Infrarotsensors verwendet.
Im Bild 1 ist zu erkennen, wie die jeweiligen Anschlüsse zu verbinden sind. Hierbei wurde OUT6 für das PWM Signal des Micro Servomotors und IN2 für das Analog Signal des Infrarotsensors verwendet.
Das Bild 2 zeigt die fertig montierte Komponente. Es ist darauf zu achten die Montagehalterung, falls zu groß, an der Seite abzufeilen.
Das Bild 2 zeigt die fertig montierte Komponente. Es ist darauf zu achten die Montagehalterung, falls zu groß, an der Seite abzufeilen.


=== Software ===
Die Softwareimplementierung findet sich im Simulink Model unter: ArduinoModel -> RobotModel -> Scanner
==== Micro Servomotor ====
Der Servomotor soll drei Positionen einnehmen können: links (25°), geradeaus (0°) und rechts (-25°). Diese Werte werden im Folgendem unsere Eingabegrößen sein.
Der Servomotor wird zuerst in Nullstellung gebracht, sodass er sich mit genug Spiel zur Seite bewegen kann. Diese Position ist die Mittelstellung und wird zu den Eingabegrößen hinzuaddiert.


Weiterhin wird der "Standard Servo Write" Block der Arduino Toolbox für Simulink verwendet, der als Input einen Stellungswinkel von 0 bis 180 Grad verlangt.
Um die drei Position in Simulink zu realisieren wird Stateflow verwendet, dieser bildet die einzelnen Positionen als Zustände ab. Zwischen den Zuständen wird jeweils zwei Sekunden gewartet.


==== Infrarotsensor ====
[[Datei:P54_distance_table.PNG|400px|thumb|right|Bild 3: Zusammenhang zwischen gemessener Distanz und Spannung des Infrarotsensors (GP2Y0A21YK0F)<ref>[http://www.sharp-world.com/products/device/lineup/data/pdf/datasheet/gp2y0a21yk_e.pdf GP2Y0A21YK0F Datenblatt]</ref>]]
Der Infrarotsensor gibt nicht direkt den gemessen Abstandswert in cm aus, sondern eine Spannung, die abhängig von der Messung ist.
Das Signal wird durch den Analog-Digital-Wandler (ADC) des Arduinos in ein digitales Signal umgewandelt mit dem gerechnet wird.
Um den digitalen Wert (digital_value) in den eigentlichen Spannungswert (<math>V_{IR}</math>) zurückzurechnen nutzt man folgende Formel.
<math>V_{IR} = digtal\_value \cdot \frac{reference\_voltage}{resolution}</math>
In unserem Fall besitzt der Arduino Due eine ADC Auflösung (resolution) von 12 bit, heißt es werden 4096 verschiedene Werte angenommen und eine Bezugsspannung (reference_voltage) von 3,3V.
Die Formel lautet nun:
<math>V_{IR} = digtal\_value \cdot \frac{3,3V}{4096}</math>
Im Datenblatt des Infrarotsensors ist der Graph angegeben, der den Zusammenhang zwischen gemessener Distanz und Spannung angibt (siehe Bild 3). Über das "Curve fitting tool" von Matlab lässt sich die folgende Approximation finden:
<math>distance = 27.86 \cdot V_{IR}^{-1,15}</math>
Aus dieser Rechnung wird die gemessene Distanz in cm berechnet.


== Brückenplatine ==
== Brückenplatine ==


Die Brückenplatine erfüllt mehrere Aufgaben.
Die Brückenplatine erfüllt folgende Aufgaben:
* Umwandeln der 7,4V Versorgungsspannung in 5V Betriebsspannung für den Raspberry Pi
* Umwandeln der 7,4V Versorgungsspannung in 5V Betriebsspannung für den Raspberry Pi
* Verbindung der I²C Schnittstellen des Raspberry Pis und dem Arduino
* Verbindung der I²C Schnittstellen des Raspberry Pis und dem Arduino
* Verbindung der PWM-Signalleitungen des Motor Shields mit den Servo Motoren
* Verbindung der PWM-Signalleitungen des Motor Shields mit den Servomotoren
* Verbindung der Servomotor Encoder Signalleitungen mit dem Arudino
* Verbindung der Servomotor Encoder Signalleitungen mit dem Arudino


Die Schaltung der Platine wurde in NI Multisim konzipiert. Das Layout wurde in NI Ultiboard erstellt und als Gerber-Dateien zur Fertigung übergeben. Im Verlauf des Praktikums kam es zur einer 2. Version des Layouts, welches den TI Spannungswandler (PTH08080W) auf der unteren Seite befestigt, sodass von oben angelötet werden kann.
Die Schaltung der Platine wurde in Multisim konzipiert. Das Layout wurde in Ultiboard erstellt und als Gerber-Dateien zur Fertigung übergeben. Im Verlauf des Praktikums kam es zur einer 2. Version des Layouts, welches den TI Spannungswandler (PTH08080W) auf der unteren Seite befestigt, sodass von oben angelötet werden kann.
 
Brückenplatine Version 1 als 3D Ansicht in Ultiboard:
[[Datei:P54_3d_oben.PNG|300px]] [[Datei:P54_3d_unten.PNG|300px]]
 
Die Pinbelegungen lassen sich in der Netzliste der Ultiboard Datei ablesen.
 
= I²C Kommunikation =
 
Die I²C Kommunikation folgt so ab, dass der Raspberry Pi die ausgewerteten Kameradaten als Master zum Arduino schickt.
Der Arduino ist mit der Adresse 0x12 in den Bus eingebunden und ließt die Daten mithilfe einer S-Funktion aus.
 
Das Programm wird mithilfe des "S-Function Builder" Block erstellt.
 
Es werden die Arduino und Wire Bibliotheken eingebunden.
<source lang="c">
#include <Arduino.h>
#include "../../libraries/Wire/src/Wire.h"
#include "../../libraries/Wire/src/Wire.cpp"
</source>
 
In der Initialisierungsphase tritt der Arduino dem Bus bei (Zeile 3) und gibt eine Funktion zur Bearbeitung von ankommenden Daten (Zeile 4) an.
 
<source line lang="c">
if (xD[0] != 1){
    Wire.begin(0x12); //join i2c bus as slave
    Wire.onReceive(receiveData);
    xD[0] = 1;
}
</source>
 
Die Funktion "receiveData" wird als externe Funktion deklariert. Sie speichert beim Aufruf alle Daten in einen 12 Byte großen Buffer (buf).
<source lang="c">
uint8_t buf[12];
 
extern "C" void receiveData(int bytes){
    int i = 0;
    // Check if Raspberry Pi data is received
    if(bytes == 12) {
        while(Wire.available() != 0) {
            buf[i] = Wire.read();
            i++;
        }
    }
}
</source>
 
Bei jedem erneuten Aufrufen der S-Funktion wird der Buffer in den Output der S-Funktion geschrieben und somit in Simulink verwendbar gemacht.
<source lang="c">
if (xD[0] == 1){
    for(int i = 0; i < 12; i++) {
        y0[i] = buf[i];
    }
}
</source>
 
Die Dateien für die S-Funktion werden dann über "Build" erstellt. Da durch die Wire.cpp Bibliothek C++ Code verwendet wird, muss die generierte "I2C_S_Function_wrapper.c" Datei in "I2C_S_Function_wrapper.cpp" umbenannt und in der Datei vor jeder Funktion " extern "C" " eingefügt werden.
 
= Videoschiedsrichter =
 
Der Videoschiedsrichter hilft dabei eine Mission zu bewertet. Er kontrolliert, ob alle Ziele vom Fahrzeug abgefahren wurden und misst, ob die 3 Sekunden pro Ziel eingehalten werden.
 
Um den Videoschiedsrichter zu verwendet benötigt man das [https://de.mathworks.com/matlabcentral/fileexchange/40445-image-acquisition-toolbox-support-package-for-kinect-for-windows-sensor Image Acquisition Toolbox Support Package for Kinect For Windows Sensor] Packet.
Mit dem Befehl "imaqhwinfo" im Matlab Command Window können die installierten Videogeräte angezeigt werden. Hier sollte die Kinect Kamera aufgeführt werden.
 
Das Stammverzeichnis ist "Video Judge".
 
== Kalibrierung ==
 
Die Kalibrierung muss nur einmal ausgeführt werden und dient dazu die Kontrollfarbe Blau des Roboters und die Kontrollfarbe Grün der Ziele richtig zu erkennen.
 
1. Schließe die Kamera über USB an den Computer an.
Eine Anpassung des Kamerabilds kann im Script judge -> camera -> get_camera.m vorgenommen werden.
 
2. Im Bildbereich der Kamera sollte in einem 2m x 2m Quadrat die grünen Punkte jeweils in den Ecken ausgelegt sein.
[[Datei:P54 judge mars.PNG|500px|none]]
 
3. Führe das Matlab-Script "start_calibration.m" aus. Es sollte folgendes Fenster erscheinen:
[[Datei:P54 Judge 1.PNG|500px|none]]
 
4. Drück den Button "Check camera". Nach einer kurzen Zeit sollte der Text zu "Camera OK!" wechseln. Über "Get image" kann kontrolliert werden, ob die Kontrollpunkte für die Kamera sichtbar sind.
[[Datei:P54 Judge 2.PNG|500px|none]]


TODO Bilder des Layouts und der PIN Beschreibung sowie Realaufnahmen der Version 1
5. Nun wird der Button "Acquire targets" betätigt. Es sollten vier Punkte erkannt werden, falls dies nicht der Fall ist können über die Schieberegler im unteren Bereich die Parameter der Bilderkennung angepasst werden. "Green level" bestimmt die Intensität der Farbe Grün, "Max eccentricity" bestimmt die maximal aktzeptierte Größe der grünen Kreise und über "Noise max size" lässt sich Rauschen im Bild Filtern. Werden alle Kreise richtig erkannt sollte im oberen Feld "Green N = 4" stehen.
[[Datei:P54 Judge 3.PNG|500px|none]]


''Hinweis: Die Version 2 wurde noch nicht gefertigt.''
6. Durch betätigen des Buttons "Validate targets" wird die Eingabe gespeichert. Nun müssen die grünen Punkte durch die blauen Punkte ersetzt werden.


= Software =
7. Wurden die Punkte ersetzt, kann nun "Acquire robots" betätigt werden. Wie auch zuvor kann die Erkennung durch die Schieberegler angepasst werden und über "Validate robots" bestätigt werden.
[[Datei:P54 Judge 4.PNG|500px|none]]


Verwendete Software:
8. Nun sollte es möglich sein den Button "Calibrate!" zu betätigen. Das Eingabefenster wird mit "1" bestätigt.
* Matlab R2019a und Simulink
[[Datei:P54 Judge 5.PNG|500px|none]]
** MATLAB Support Package for Arduino Hardware
 
** Simulink Support Package for Arduino Hardware
9. Zum Abschluss wird die Kalibrierung mit "Save Data" in die Datei "judge_calibration.mat" gespeichert.
** MATLAB Support Package for Raspberry Pi Hardware
[[Datei:P54 Judge 6.PNG|500px|none]]
** Simulink Support Package for Raspberry Pi Hardware
 
== Einstellungen ==
 
In der Datei judge -> arena -> config.txt werden die Einstellungen für den Wettbewerb konfiguriert. Hierbei sind die Parameter "Nsites" und "Teams" die Wichtigsten.
* "Nsites" definiert die Anzahl der Expeditionsziele
* "Teams" definiert die Teamnamen
 
[[Datei:P54 Judge config.PNG|500px|none]]
 
== Bedienung ==
 
Der Videoschiedsrichter lässt sich über das Script "start_judge.m" starten.
 
Als Nächstes folgt die Auswahl des antretenden Teams. Durch betätigen von "Start" beginnt die Zeitmessung. Alle Teams werden am Ende in der Tabelle Rangliste aufgeführt.
[[Datei:P54 Judge main.PNG|500px|none]]
 
= Konfiguration des Raspberry Pis =
 
Die einfachste Methode ist, ein Abbild der SD-Karte eines Marsroboters zu erstellen und auf eine neue SD-Karte zu kopieren. Diese Methode wird ausdrücklich empfohlen!
 
Alternativ kann der komplizierte Weg gegangen werden.
 
1. Führe die Schritte zur Konfiguration des Raspberry Pis aus: [https://www.youtube.com/watch?v=6QVah1dc4pY Installation Raspberry Pi für Simulink]
 
2. Die Kamera, die am Raspberry Pi verbunden ist muss kalibriert werden. Dafür wird ein DIN A3 Papier an den Ecken mit grünen Punkten markiert und mit einem Abstand in die Bildfläche der Kamera gelegt (siehe Bild). Dies kann mehrere Versuche benötigen, da nur eine bestimmte Position verlangt wird.
[[Datei:P54 rpi calibration.jpg|100px]]
 
3. "Deploy" das Simulink-Model: RaspberryPIModel auf die Hardware. Hierbei sollte im Model die Konstante doCalibration auf 1 sein. Die Kalibrierungsdatei landet im Betriebssystem des Raspberry Pis. Über eine SSH-Verbindung zur Hardware kann diese Datei kontrolliert und ausglesen werden (siehe Bild).
[[Datei:P54 rpi file.jpg|100px]]
 
4. War die Kalibrierung erfolgreich, wird die Konstante doCalibration auf 0 geändert und das Model nochmals "Deployed".
 
5. Als Letzter Schritt muss das Simulink-Model noch automatisch mit dem Raspberry Pi starten. Dafür wird die Datei [https://wiki.ubuntuusers.de/rc.local/ /etc/rc.local] im System angepasst und das Model als eintrag hinzugefügt.
 
''Hinweis:'' Standart-Login Daten für den root-Benutzer des Raspberry Pis sind: Benutzername: 'pi' und Password: 'raspberry'
 
= Ausführung der Mission =
Um die Mission zu erledigen, wird zuerst im "SimulationModel" gearbeitet. Das Stammverzeichnis ist "Mission_on_Mars_HSHL".
Zuallererst wird die Projektdatei: Compet.prj gestartet. Diese richtet alle nötigen Pfade und Parameter ein.
 
Im Ordner "doc" befinden sich im "Quick Start Guide"<ref>[[Datei:P54 Quick Start Guide.pdf]]</ref> eine kurze Nutzungsbeschreibung und im "Competition_Mission_On_Mars_Robot_Challenge_2016_English"<ref>[[Datei:P54 Competition Mission On Mars Robot Challenge 2016 English.pdf]]</ref> eine Erläuterung der Aufgabe.


TODO Ultiboard multisim versionen
== Simulation Model ==


= Objekterkennung =
[[Datei:P54 sim bus robot.PNG|frame|Bus: Robot]]


[[Datei:P54 sim bus command.PNG|frame|Bus: Command]]


In diesem Model wird eine Strategie im Vorfeld entwickelt. Dabei ist der Block InputProcessing zu verändern. Hier befindet sich bereits eine triviale Implementierung eines Algorithmus an den sich orientiert werden kann.


= HOW TO =


=== Unterabschnitt ===
Als Eingabe bekommt der Algorithmus wie im Bild zu sehen sechs Werte.
# Nutzen Sie Aufzählungen
#* mit verschiedenen Schachtelungen
#* und so weiter
# zweite Ebene
#* mit erneuter Unterebene


=== Bilder ===
# EncoderCount: Die Daten vom Servomotor Encoder. EncoderCount(1) für den linken Motor und EncoderCount(2) für den rechten Motor.
Bauen Sie Bilder ein, am besten mit darin gekennzeichneten Stellen, die Sie dann im Text erklären.
# Distance: Ein sechs Zahlen großes Array in dem die Distance in cm zu den erkannten grünen Zielen enthalten ist.
[[Datei:RetroGameStation_HSHL_Messe.jpg|rechts|mini|Beispielbild mit Quelle <ref> Eigenes Foto </ref>]]
# Bearing: Das gleiche wie Distance nur gibt dieses Array die Grad Zahl der Ziele an.
# ScannerStatus: Eine Enumeration mit dem möglichen Werten: NO, LEFT, MIDDLE, RIGHT. Sie gibt die Position der Objekterkennung an.
# ScannerValue: Ein drei Zahlen großes Array, dass den jeweiligen Messwert der Objekterkennung enthält.


=== Tabellen ===
Eine tolle Tabelle ist hier dargestellt.
{| class="mw-datatable"
! style="font-weight: bold;" | Spalte 1
! style="font-weight: bold;" | Spalte 2
! style="font-weight: bold;" | Spalte 3
|-
| blabla
| sowieso
| sowieso
|-
| test
| sowieso
| test1
|}


=== Formatierung ===
Nutzen Sie zur Formatierung Beispiele, z. B. aus dem weltbekannten Wikipedia selbst (das ist die gleiche Syntax!) oder anderer Hilfeseiten wie z. B. <ref> [http://meta.wikimedia.org/wiki/Help:Editing/de Hilfeseite des Wikimedia-Projekts] </ref>.


=== Quelltext ===
Die Ausgabe und damit die Steuerbefehle bestehen aus drei Werten.
Details siehe: [[Quelltext_einbinden]].


# Mode: Der Roboter fährt in zwei Modi, die die Bedeutung der Werte "Angle" und "Position" ändern.
## EMode.SPEED: In diesem Modus ist der Wert "Position" die Vorwärtsgeschwindigkeit und der Wert "Angle" die Drehwinkelgeschwindigkeit. Dieser Modus dient dem normalen Fahren durch das Gebiet.
## EMode.DISTANCE: In diesem Modus wird durch den Wert "Postition" eine Zielposition und durch "Angle" ein Zielwinkel eingestellt. Dieser Modus ist für das heranfahren an ein gefundenes Ziel gedacht.


Bei lang= muss die richtige Sprache eingetragen werden (matlab, c,...).
''Hinweis:''Durch die Pacing-Option in Matlab 2019 kann die Simulation auch in Realzeit ausgeführt werden.


<source line lang="matlab" style="font-size:small">
== Arduino Model ==
for i=1:10
Wurde ein Algorithmus konzipiert, kann er nun an der echte Hardware getestet werden. Hierfür wird der Block "InputProcessing" ins Arduino Model kopiert. Und über "Deploy to Hardware" auf den Arduino geladen werden.
%    try
%        image = CAMERA_DumpFrame(s);     
%    catch err
%        error('MATLAB:RWTHMindstormsNXT:Sensor:unknown', 'An unknown Error occured while fetching the image. Please check that the Camera is connected and try again');
%    end
    image = CAMERA_GetImage(com);
    handle = imshow(image);
    %pause(0.1)
    currTime(i) = toc(startTime);
    disp(['Aktuelle Zeit: ',num2str(currTime(i))])
    %imwrite(image,sprintf('NXTCamImage%03d.png',i));
    %imwrite(img,fullfile(workingDir,sprintf('HexBug%03d.png',n)));
    % ca. alle 4.8 Sekunden ein Bild
end;
</source>


== Zusammenfassung ==
== Bedienungshinweise für den Roboter ==
Was ist das Ergbnis?
* Der Akku muss am Ende des Tages vom Roboter getrennt werden!
Das Ergebnis dieses Artikels ist eine Vorlage, mit der Nutzer des Wikis schnell und leicht eigene Artikel verwirklichen können. Diese Vorlage ist Bestandteil der Anleitungen aus [http://193.175.248.171/wiki/index.php/Kategorie:HowTo den How-To's].
* Der linke Hebel aktiviert die Stromzufuhr für den Raspberry Pi. Dieser benötigt einige Zeit zum Booten.
* Der rechte Hebel startet das Simulink Model auf dem Arduino.
* Um den Arduino zu programmieren, wird der linke USB-Port verwendet!


= Verbesserungen und Ausblick =


== Ausblick ==
* Zum einen wie im Kapitel Brückenplatine erklärt sollte die Version 2 der Platine gefertigt und getestet werden.
Was kann/muss noch verbessert werden?
* Der rechte Hebel sollte direkt die Stromzufuhr des Adruinos steuern und nicht wie zurzeit digitale Pins setzen (Anpassung auch im ArduinoModel notwendig).
* Über Bluetooth oder eine SD-Karte kann es dem Arduino möglich gemacht werden Missionsdaten zu übermitteln die bei der Auswertung und Anpassung des Algorithmus von Hilfe sein können.
* Kabelmanagement im Roboter sollte verbessert werden
* Der Akku sollte fest befestigt werden (z.B. durch Klettverschluss)




== Literaturverzeichnis ==
== Literaturverzeichnis ==
<references />
<references />

Aktuelle Version vom 12. Januar 2024, 10:08 Uhr


Autor: Stefan Arndt

Quelle: www.MathWorks.com

Einleitung

Dieser Artikel befasst sich mit dem Projekt 54: Mission on Mars und bringt es zum Abschluss. Das Projekt wurde in Teilen schon bearbeitet, sodass im Folgendem nicht weiter in Gänze auf die bereits bearbeiteten Themen eingegangen wird.

Ich verweise auf die Artikel:

  1. Projekt 54: Mission on Mars
    • 3D-Druck und Hardwareaufbau
  2. Projekt 54: Mission on Mars (Fortsetzung)
    • Aufbau der Marsoberfläche und Hardwaredokumentation
  3. Projekt 54b: Mission on Mars
    • Aufbau des 2. Roboters

Die Versorgungs- und Kommunikationsplatine (hier: Brückenplatine) wurde in diesem Teil erneut konzipiert, da die Platinen der Vorgänger fehlerbehaftet waren.

Zudem wurde eine überarbeitete Bill of Material (BOM) erstellt, da bestimmte Komponenten (z.B. der WLAN-Stick für den Raspberry PI) nicht benötigt wird.

Aufgaben

  • Inbetriebnahme mit Simulink
  • Realisierung des Versuchsaufbaus auf der Marsoberfläche
    • Kalibrierung der Kamera des Rovers
    • Inbetriebnahme des Videoschiedsrichters
  • Erweiterung der Rover um die Sensorik zur Objekterkennung
  • Anpassung der Versorgungs- und Kommunikationsplatine

Verwendete Software

Verwendete Software:

  • Matlab R2019a und Simulink
    • MATLAB Support Package for Arduino Hardware
    • Simulink Support Package for Arduino Hardware
    • MATLAB Support Package for Raspberry Pi Hardware
    • Simulink Support Package for Raspberry Pi Hardware
  • Ultiboard 14.1
  • Multisim 14.1

Komponenten

Objekterkennung

Hardware

Bild 2: Montierte Objekterkennung

Die Objekterkennung erfolgt über einen Sharp Infrarotsensor (GP2Y0A21YK0F) mit einer Reichweite von 10 bis 80 cm.

Dieser Sensor wird über eine Montagehalterung an einen Micro Servomotor (JAMARA 033212) verschraubt, um in einem 50° Kegel Objekte zu erkennen.

Bild 1: Schematische Darstellung der Objekterkennung[1]

Im Bild 1 ist zu erkennen, wie die jeweiligen Anschlüsse zu verbinden sind. Hierbei wurde OUT6 für das PWM Signal des Micro Servomotors und IN2 für das Analog Signal des Infrarotsensors verwendet. Das Bild 2 zeigt die fertig montierte Komponente. Es ist darauf zu achten die Montagehalterung, falls zu groß, an der Seite abzufeilen.

Software

Die Softwareimplementierung findet sich im Simulink Model unter: ArduinoModel -> RobotModel -> Scanner

Micro Servomotor

Der Servomotor soll drei Positionen einnehmen können: links (25°), geradeaus (0°) und rechts (-25°). Diese Werte werden im Folgendem unsere Eingabegrößen sein.

Der Servomotor wird zuerst in Nullstellung gebracht, sodass er sich mit genug Spiel zur Seite bewegen kann. Diese Position ist die Mittelstellung und wird zu den Eingabegrößen hinzuaddiert.

Weiterhin wird der "Standard Servo Write" Block der Arduino Toolbox für Simulink verwendet, der als Input einen Stellungswinkel von 0 bis 180 Grad verlangt. Um die drei Position in Simulink zu realisieren wird Stateflow verwendet, dieser bildet die einzelnen Positionen als Zustände ab. Zwischen den Zuständen wird jeweils zwei Sekunden gewartet.

Infrarotsensor

Bild 3: Zusammenhang zwischen gemessener Distanz und Spannung des Infrarotsensors (GP2Y0A21YK0F)[2]

Der Infrarotsensor gibt nicht direkt den gemessen Abstandswert in cm aus, sondern eine Spannung, die abhängig von der Messung ist. Das Signal wird durch den Analog-Digital-Wandler (ADC) des Arduinos in ein digitales Signal umgewandelt mit dem gerechnet wird. Um den digitalen Wert (digital_value) in den eigentlichen Spannungswert () zurückzurechnen nutzt man folgende Formel.

In unserem Fall besitzt der Arduino Due eine ADC Auflösung (resolution) von 12 bit, heißt es werden 4096 verschiedene Werte angenommen und eine Bezugsspannung (reference_voltage) von 3,3V. Die Formel lautet nun:


Im Datenblatt des Infrarotsensors ist der Graph angegeben, der den Zusammenhang zwischen gemessener Distanz und Spannung angibt (siehe Bild 3). Über das "Curve fitting tool" von Matlab lässt sich die folgende Approximation finden:

Aus dieser Rechnung wird die gemessene Distanz in cm berechnet.

Brückenplatine

Die Brückenplatine erfüllt folgende Aufgaben:

  • Umwandeln der 7,4V Versorgungsspannung in 5V Betriebsspannung für den Raspberry Pi
  • Verbindung der I²C Schnittstellen des Raspberry Pis und dem Arduino
  • Verbindung der PWM-Signalleitungen des Motor Shields mit den Servomotoren
  • Verbindung der Servomotor Encoder Signalleitungen mit dem Arudino

Die Schaltung der Platine wurde in Multisim konzipiert. Das Layout wurde in Ultiboard erstellt und als Gerber-Dateien zur Fertigung übergeben. Im Verlauf des Praktikums kam es zur einer 2. Version des Layouts, welches den TI Spannungswandler (PTH08080W) auf der unteren Seite befestigt, sodass von oben angelötet werden kann.

Brückenplatine Version 1 als 3D Ansicht in Ultiboard:

Die Pinbelegungen lassen sich in der Netzliste der Ultiboard Datei ablesen.

I²C Kommunikation

Die I²C Kommunikation folgt so ab, dass der Raspberry Pi die ausgewerteten Kameradaten als Master zum Arduino schickt. Der Arduino ist mit der Adresse 0x12 in den Bus eingebunden und ließt die Daten mithilfe einer S-Funktion aus.

Das Programm wird mithilfe des "S-Function Builder" Block erstellt.

Es werden die Arduino und Wire Bibliotheken eingebunden.

#include <Arduino.h>
#include "../../libraries/Wire/src/Wire.h"
#include "../../libraries/Wire/src/Wire.cpp"

In der Initialisierungsphase tritt der Arduino dem Bus bei (Zeile 3) und gibt eine Funktion zur Bearbeitung von ankommenden Daten (Zeile 4) an.

if (xD[0] != 1){
    Wire.begin(0x12); //join i2c bus as slave
    Wire.onReceive(receiveData);
    xD[0] = 1;
}

Die Funktion "receiveData" wird als externe Funktion deklariert. Sie speichert beim Aufruf alle Daten in einen 12 Byte großen Buffer (buf).

uint8_t buf[12];

extern "C" void receiveData(int bytes){
    int i = 0;
    // Check if Raspberry Pi data is received
    if(bytes == 12) {
        while(Wire.available() != 0) {
            buf[i] = Wire.read();
            i++; 
        }
    }
}

Bei jedem erneuten Aufrufen der S-Funktion wird der Buffer in den Output der S-Funktion geschrieben und somit in Simulink verwendbar gemacht.

if (xD[0] == 1){
    for(int i = 0; i < 12; i++) {
        y0[i] = buf[i];
    }
}

Die Dateien für die S-Funktion werden dann über "Build" erstellt. Da durch die Wire.cpp Bibliothek C++ Code verwendet wird, muss die generierte "I2C_S_Function_wrapper.c" Datei in "I2C_S_Function_wrapper.cpp" umbenannt und in der Datei vor jeder Funktion " extern "C" " eingefügt werden.

Videoschiedsrichter

Der Videoschiedsrichter hilft dabei eine Mission zu bewertet. Er kontrolliert, ob alle Ziele vom Fahrzeug abgefahren wurden und misst, ob die 3 Sekunden pro Ziel eingehalten werden.

Um den Videoschiedsrichter zu verwendet benötigt man das Image Acquisition Toolbox Support Package for Kinect For Windows Sensor Packet. Mit dem Befehl "imaqhwinfo" im Matlab Command Window können die installierten Videogeräte angezeigt werden. Hier sollte die Kinect Kamera aufgeführt werden.

Das Stammverzeichnis ist "Video Judge".

Kalibrierung

Die Kalibrierung muss nur einmal ausgeführt werden und dient dazu die Kontrollfarbe Blau des Roboters und die Kontrollfarbe Grün der Ziele richtig zu erkennen.

1. Schließe die Kamera über USB an den Computer an. Eine Anpassung des Kamerabilds kann im Script judge -> camera -> get_camera.m vorgenommen werden.

2. Im Bildbereich der Kamera sollte in einem 2m x 2m Quadrat die grünen Punkte jeweils in den Ecken ausgelegt sein.

3. Führe das Matlab-Script "start_calibration.m" aus. Es sollte folgendes Fenster erscheinen:

4. Drück den Button "Check camera". Nach einer kurzen Zeit sollte der Text zu "Camera OK!" wechseln. Über "Get image" kann kontrolliert werden, ob die Kontrollpunkte für die Kamera sichtbar sind.

5. Nun wird der Button "Acquire targets" betätigt. Es sollten vier Punkte erkannt werden, falls dies nicht der Fall ist können über die Schieberegler im unteren Bereich die Parameter der Bilderkennung angepasst werden. "Green level" bestimmt die Intensität der Farbe Grün, "Max eccentricity" bestimmt die maximal aktzeptierte Größe der grünen Kreise und über "Noise max size" lässt sich Rauschen im Bild Filtern. Werden alle Kreise richtig erkannt sollte im oberen Feld "Green N = 4" stehen.

6. Durch betätigen des Buttons "Validate targets" wird die Eingabe gespeichert. Nun müssen die grünen Punkte durch die blauen Punkte ersetzt werden.

7. Wurden die Punkte ersetzt, kann nun "Acquire robots" betätigt werden. Wie auch zuvor kann die Erkennung durch die Schieberegler angepasst werden und über "Validate robots" bestätigt werden.

8. Nun sollte es möglich sein den Button "Calibrate!" zu betätigen. Das Eingabefenster wird mit "1" bestätigt.

9. Zum Abschluss wird die Kalibrierung mit "Save Data" in die Datei "judge_calibration.mat" gespeichert.

Einstellungen

In der Datei judge -> arena -> config.txt werden die Einstellungen für den Wettbewerb konfiguriert. Hierbei sind die Parameter "Nsites" und "Teams" die Wichtigsten.

  • "Nsites" definiert die Anzahl der Expeditionsziele
  • "Teams" definiert die Teamnamen

Bedienung

Der Videoschiedsrichter lässt sich über das Script "start_judge.m" starten.

Als Nächstes folgt die Auswahl des antretenden Teams. Durch betätigen von "Start" beginnt die Zeitmessung. Alle Teams werden am Ende in der Tabelle Rangliste aufgeführt.

Konfiguration des Raspberry Pis

Die einfachste Methode ist, ein Abbild der SD-Karte eines Marsroboters zu erstellen und auf eine neue SD-Karte zu kopieren. Diese Methode wird ausdrücklich empfohlen!

Alternativ kann der komplizierte Weg gegangen werden.

1. Führe die Schritte zur Konfiguration des Raspberry Pis aus: Installation Raspberry Pi für Simulink

2. Die Kamera, die am Raspberry Pi verbunden ist muss kalibriert werden. Dafür wird ein DIN A3 Papier an den Ecken mit grünen Punkten markiert und mit einem Abstand in die Bildfläche der Kamera gelegt (siehe Bild). Dies kann mehrere Versuche benötigen, da nur eine bestimmte Position verlangt wird.

3. "Deploy" das Simulink-Model: RaspberryPIModel auf die Hardware. Hierbei sollte im Model die Konstante doCalibration auf 1 sein. Die Kalibrierungsdatei landet im Betriebssystem des Raspberry Pis. Über eine SSH-Verbindung zur Hardware kann diese Datei kontrolliert und ausglesen werden (siehe Bild).

4. War die Kalibrierung erfolgreich, wird die Konstante doCalibration auf 0 geändert und das Model nochmals "Deployed".

5. Als Letzter Schritt muss das Simulink-Model noch automatisch mit dem Raspberry Pi starten. Dafür wird die Datei /etc/rc.local im System angepasst und das Model als eintrag hinzugefügt.

Hinweis: Standart-Login Daten für den root-Benutzer des Raspberry Pis sind: Benutzername: 'pi' und Password: 'raspberry'

Ausführung der Mission

Um die Mission zu erledigen, wird zuerst im "SimulationModel" gearbeitet. Das Stammverzeichnis ist "Mission_on_Mars_HSHL". Zuallererst wird die Projektdatei: Compet.prj gestartet. Diese richtet alle nötigen Pfade und Parameter ein.

Im Ordner "doc" befinden sich im "Quick Start Guide"[3] eine kurze Nutzungsbeschreibung und im "Competition_Mission_On_Mars_Robot_Challenge_2016_English"[4] eine Erläuterung der Aufgabe.

Simulation Model

Bus: Robot
Bus: Command

In diesem Model wird eine Strategie im Vorfeld entwickelt. Dabei ist der Block InputProcessing zu verändern. Hier befindet sich bereits eine triviale Implementierung eines Algorithmus an den sich orientiert werden kann.


Als Eingabe bekommt der Algorithmus wie im Bild zu sehen sechs Werte.

  1. EncoderCount: Die Daten vom Servomotor Encoder. EncoderCount(1) für den linken Motor und EncoderCount(2) für den rechten Motor.
  2. Distance: Ein sechs Zahlen großes Array in dem die Distance in cm zu den erkannten grünen Zielen enthalten ist.
  3. Bearing: Das gleiche wie Distance nur gibt dieses Array die Grad Zahl der Ziele an.
  4. ScannerStatus: Eine Enumeration mit dem möglichen Werten: NO, LEFT, MIDDLE, RIGHT. Sie gibt die Position der Objekterkennung an.
  5. ScannerValue: Ein drei Zahlen großes Array, dass den jeweiligen Messwert der Objekterkennung enthält.


Die Ausgabe und damit die Steuerbefehle bestehen aus drei Werten.

  1. Mode: Der Roboter fährt in zwei Modi, die die Bedeutung der Werte "Angle" und "Position" ändern.
    1. EMode.SPEED: In diesem Modus ist der Wert "Position" die Vorwärtsgeschwindigkeit und der Wert "Angle" die Drehwinkelgeschwindigkeit. Dieser Modus dient dem normalen Fahren durch das Gebiet.
    2. EMode.DISTANCE: In diesem Modus wird durch den Wert "Postition" eine Zielposition und durch "Angle" ein Zielwinkel eingestellt. Dieser Modus ist für das heranfahren an ein gefundenes Ziel gedacht.

Hinweis:Durch die Pacing-Option in Matlab 2019 kann die Simulation auch in Realzeit ausgeführt werden.

Arduino Model

Wurde ein Algorithmus konzipiert, kann er nun an der echte Hardware getestet werden. Hierfür wird der Block "InputProcessing" ins Arduino Model kopiert. Und über "Deploy to Hardware" auf den Arduino geladen werden.

Bedienungshinweise für den Roboter

  • Der Akku muss am Ende des Tages vom Roboter getrennt werden!
  • Der linke Hebel aktiviert die Stromzufuhr für den Raspberry Pi. Dieser benötigt einige Zeit zum Booten.
  • Der rechte Hebel startet das Simulink Model auf dem Arduino.
  • Um den Arduino zu programmieren, wird der linke USB-Port verwendet!

Verbesserungen und Ausblick

  • Zum einen wie im Kapitel Brückenplatine erklärt sollte die Version 2 der Platine gefertigt und getestet werden.
  • Der rechte Hebel sollte direkt die Stromzufuhr des Adruinos steuern und nicht wie zurzeit digitale Pins setzen (Anpassung auch im ArduinoModel notwendig).
  • Über Bluetooth oder eine SD-Karte kann es dem Arduino möglich gemacht werden Missionsdaten zu übermitteln die bei der Auswertung und Anpassung des Algorithmus von Hilfe sein können.
  • Kabelmanagement im Roboter sollte verbessert werden
  • Der Akku sollte fest befestigt werden (z.B. durch Klettverschluss)


Literaturverzeichnis