... | @@ -63,110 +63,3 @@ bool HORN_INACTIVE=0 # Horn inactive |
... | @@ -63,110 +63,3 @@ bool HORN_INACTIVE=0 # Horn inactive |
|
|
|
|
|
```
|
|
```
|
|
</details> |
|
</details> |
|
|
|
|
|
<details><summary>Erweiterung des Interfaces</summary>
|
|
|
|
Wenn das Interface erweitert werden soll, zum Beispiel durch die Integration eines zusätzlichen Parameters wie einer Lichtsteuerung, folgen Sie den unten beschriebenen Schritten:
|
|
|
|
|
|
|
|
<br/>
|
|
|
|
<br/>
|
|
|
|
|
|
|
|
1. **Erweiterung der `TrainParams.msg` Datei**
|
|
|
|
Fügen Sie den folgenden Code in die Datei `TrainParams.msg` ein, um einen Lichtzustand als Parameter hinzuzufügen:
|
|
|
|
```plaintext
|
|
|
|
# Status des Lichts (Aktiv oder Inaktiv)
|
|
|
|
bool light 0
|
|
|
|
bool LIGHT_ACTIVE=1 # Licht ist aktiv
|
|
|
|
bool LIGHT_INACTIVE=0 # Licht ist inaktiv
|
|
|
|
```
|
|
|
|
2. **Anpassung der `CMakeLists.txt`:**
|
|
|
|
```bash
|
|
|
|
find_package(package_name REQUIRED)
|
|
|
|
```
|
|
|
|
3. **Ergänzung der `package.xml`: **
|
|
|
|
```bash
|
|
|
|
<exec_depend>package_name</exec_depend>)
|
|
|
|
```
|
|
|
|
</details>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Benutzerdefinierte Erweiterungen
|
|
|
|
|
|
|
|
<details><summary>Erweiterung der train.py Klasse </summary>
|
|
|
|
|
|
|
|
Die Klasse `Train.py` bildet das zentrale Element des Zuges. Sie wird in die jeweils verwendete Node integriert und ihre Methoden werden aufgerufen, um mit dem Zug zu interagieren. Diese Architektur ermöglicht eine modulare und flexible Steuerung der Zugfunktionen, indem sie eine klare Schnittstelle für die Kommunikation mit anderen Komponenten bereitstellt.
|
|
|
|
|
|
|
|
<br/>
|
|
|
|
<br/>
|
|
|
|
|
|
|
|
1. **Einbindung einer neuen Methode**
|
|
|
|
Füge eine neue Methode in die `/include/train.py ` Datei ein.
|
|
|
|
```python
|
|
|
|
def toggle_light(self):
|
|
|
|
"""Wechselt den Status des Lichts zwischen aktiv und inaktiv."""
|
|
|
|
self.light = not self.light # Ändert den Status von True zu False und umgekehrt
|
|
|
|
return self.light
|
|
|
|
```
|
|
|
|
|
|
|
|
2. **Erweitern der Test-Datei `UT_03_TrainConfiguration_test`:**
|
|
|
|
```python
|
|
|
|
class Train:
|
|
|
|
def __init__(self):
|
|
|
|
self.light = False # Standardmäßig ist das Licht aus
|
|
|
|
|
|
|
|
def toggle_light(self):
|
|
|
|
"""Wechselt den Status des Lichts zwischen aktiv und inaktiv."""
|
|
|
|
self.light = not self.light
|
|
|
|
return self.light
|
|
|
|
|
|
|
|
class TestTrain(unittest.TestCase):
|
|
|
|
def setUp(self):
|
|
|
|
"""Initialisiert eine Instanz der Train-Klasse vor jedem Test."""
|
|
|
|
self.train = Train()
|
|
|
|
|
|
|
|
def test_toggle_light_initial_state(self):
|
|
|
|
"""Testet den anfänglichen Zustand des Lichts."""
|
|
|
|
self.assertFalse(self.train.light, "Das Licht sollte initial aus sein.")
|
|
|
|
|
|
|
|
def test_toggle_light_turns_on(self):
|
|
|
|
"""Testet, ob das Licht korrekt eingeschaltet wird."""
|
|
|
|
self.train.toggle_light() # Licht sollte jetzt an sein
|
|
|
|
self.assertTrue(self.train.light, "Das Licht sollte jetzt an sein.")
|
|
|
|
|
|
|
|
def test_toggle_light_turns_off(self):
|
|
|
|
"""Testet, ob das Licht korrekt ausgeschaltet wird."""
|
|
|
|
self.train.toggle_light() # Licht einschalten
|
|
|
|
self.train.toggle_light() # Licht ausschalten
|
|
|
|
self.assertFalse(self.train.light, "Das Licht sollte jetzt aus sein.")
|
|
|
|
```
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|
|
|
|
<details><summary>Erweiterung einer Control-Node </summary>
|
|
|
|
Eine `Control-Node` erbt von oder enthält eine Instanz der Klasse Train.py. Durch die Eingaben der `Control-Node` werden die Methoden der `train.py`-Klasse aufgerufen, um den Zug zu steuern. Diese Architektur ermöglicht eine strukturierte und modulare Implementierung, wobei die `Control-Node` als Schnittstelle fungiert, die Benutzereingaben verarbeitet und die entsprechenden Steuerbefehle an die Zug-Logik weitergibt. Dies fördert die Trennung von Verantwortlichkeiten und verbessert die Wartbarkeit des Systems.
|
|
|
|
|
|
|
|
<br/>
|
|
|
|
<br/>
|
|
|
|
|
|
|
|
Zur Verbesserung der Übersichtlichkeit wurde für jede Control-Node eine eigene Klasse erstellt, in der die entsprechenden Methoden und Parameter definiert und initialisiert sind. Diese Klassenstruktur fördert die Modularität und Wiederverwendbarkeit des Codes. Durch die Kapselung von Funktionen und Attributen innerhalb der Klassen wird die Wartbarkeit und Lesbarkeit des Systems erhöht, was zu einer effizienteren Entwicklung und Implementierung beiträgt.
|
|
|
|
|
|
|
|
<br/> <br/>
|
|
|
|
|
|
|
|
Beispiel für die Erweiterung der `aruco_control.py`:
|
|
|
|
1. **Einbindung einer neuen Methode in eine `/include/aruco_original.py`**
|
|
|
|
|
|
|
|
```python
|
|
|
|
def __init__(self, **kwargs):
|
|
|
|
self.specific_tag = 42
|
|
|
|
|
|
|
|
def toggle_horn_by_tag(self, msg):
|
|
|
|
if msg.id == self.specific_tag:
|
|
|
|
self.train.horn_activate()
|
|
|
|
```
|
|
|
|
2. **Aufruf der Methode in `aruco_control.py`**
|
|
|
|
|
|
|
|
```python
|
|
|
|
def marker_array_callback(self, msg):
|
|
|
|
self.toggle_horn_by_tag(msg) # Aufruf der neuen Methode
|
|
|
|
```
|
|
|
|
</details> |
|
|