... | @@ -3,6 +3,7 @@ title: Benutzerdefinierte Erweiterungen |
... | @@ -3,6 +3,7 @@ title: Benutzerdefinierte Erweiterungen |
|
---
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
|
|

|
|

|
|
|
|
|
|
|
|
|
... | @@ -14,7 +15,7 @@ Wenn das Interface erweitert werden soll, zum Beispiel durch die Integration ein |
... | @@ -14,7 +15,7 @@ Wenn das Interface erweitert werden soll, zum Beispiel durch die Integration ein |
|
<br/>
|
|
<br/>
|
|
<br/>
|
|
<br/>
|
|
|
|
|
|
1. **Erweiterung der `TrainParams.msg` Datei**
|
|
### 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:
|
|
Fügen Sie den folgenden Code in die Datei `TrainParams.msg` ein, um einen Lichtzustand als Parameter hinzuzufügen:
|
|
```plaintext
|
|
```plaintext
|
|
# Status des Lichts (Aktiv oder Inaktiv)
|
|
# Status des Lichts (Aktiv oder Inaktiv)
|
... | @@ -22,11 +23,11 @@ Wenn das Interface erweitert werden soll, zum Beispiel durch die Integration ein |
... | @@ -22,11 +23,11 @@ Wenn das Interface erweitert werden soll, zum Beispiel durch die Integration ein |
|
bool LIGHT_ACTIVE=1 # Licht ist aktiv
|
|
bool LIGHT_ACTIVE=1 # Licht ist aktiv
|
|
bool LIGHT_INACTIVE=0 # Licht ist inaktiv
|
|
bool LIGHT_INACTIVE=0 # Licht ist inaktiv
|
|
```
|
|
```
|
|
2. **Anpassung der `CMakeLists.txt`:**
|
|
### 2. Anpassung der `CMakeLists.txt`:
|
|
```bash
|
|
```bash
|
|
find_package(package_name REQUIRED)
|
|
find_package(package_name REQUIRED)
|
|
```
|
|
```
|
|
3. **Ergänzung der `package.xml`: **
|
|
### 3. Ergänzung der `package.xml`:
|
|
```bash
|
|
```bash
|
|
<exec_depend>package_name</exec_depend>)
|
|
<exec_depend>package_name</exec_depend>)
|
|
```
|
|
```
|
... | @@ -41,7 +42,7 @@ Die Klasse `Train.py` bildet das zentrale Element des Zuges. Sie wird in die jew |
... | @@ -41,7 +42,7 @@ Die Klasse `Train.py` bildet das zentrale Element des Zuges. Sie wird in die jew |
|
<br/>
|
|
<br/>
|
|
<br/>
|
|
<br/>
|
|
|
|
|
|
1. **Einbindung einer neuen Methode**
|
|
### 1. Einbindung einer neuen Methode
|
|
Füge eine neue Methode in die `/include/train.py ` Datei ein.
|
|
Füge eine neue Methode in die `/include/train.py ` Datei ein.
|
|
```python
|
|
```python
|
|
def toggle_light(self):
|
|
def toggle_light(self):
|
... | @@ -50,7 +51,7 @@ Die Klasse `Train.py` bildet das zentrale Element des Zuges. Sie wird in die jew |
... | @@ -50,7 +51,7 @@ Die Klasse `Train.py` bildet das zentrale Element des Zuges. Sie wird in die jew |
|
return self.light
|
|
return self.light
|
|
```
|
|
```
|
|
|
|
|
|
2. **Erweitern der Test-Datei `UT_03_TrainConfiguration_test`:**
|
|
### 2. Erweitern der Test-Datei `UT_03_TrainConfiguration_test`:
|
|
```python
|
|
```python
|
|
class Train:
|
|
class Train:
|
|
def __init__(self):
|
|
def __init__(self):
|
... | @@ -95,7 +96,7 @@ Zur Verbesserung der Übersichtlichkeit wurde für jede Control-Node eine eigene |
... | @@ -95,7 +96,7 @@ Zur Verbesserung der Übersichtlichkeit wurde für jede Control-Node eine eigene |
|
<br/> <br/>
|
|
<br/> <br/>
|
|
|
|
|
|
Beispiel für die Erweiterung der `aruco_control.py`:
|
|
Beispiel für die Erweiterung der `aruco_control.py`:
|
|
1. **Einbindung einer neuen Methode in eine `/include/aruco_original.py`**
|
|
### 1. Einbindung einer neuen Methode in eine `/include/aruco_original.py`
|
|
|
|
|
|
```python
|
|
```python
|
|
def __init__(self, **kwargs):
|
|
def __init__(self, **kwargs):
|
... | @@ -105,13 +106,13 @@ Beispiel für die Erweiterung der `aruco_control.py`: |
... | @@ -105,13 +106,13 @@ Beispiel für die Erweiterung der `aruco_control.py`: |
|
if msg.id == self.specific_tag:
|
|
if msg.id == self.specific_tag:
|
|
self.train.horn_activate()
|
|
self.train.horn_activate()
|
|
```
|
|
```
|
|
2. **Aufruf der Methode in `aruco_control.py`**
|
|
### 2. Aufruf der Methode in `aruco_control.py`
|
|
|
|
|
|
```python
|
|
```python
|
|
def marker_array_callback(self, msg):
|
|
def marker_array_callback(self, msg):
|
|
self.toggle_horn_by_tag(msg) # Aufruf der neuen Methode
|
|
self.toggle_horn_by_tag(msg) # Aufruf der neuen Methode
|
|
```
|
|
```
|
|
3.**Einbindung der neuen Methode in die Tests**
|
|
### 3. Einbindung der neuen Methode in die Tests
|
|
```python
|
|
```python
|
|
self.marker1 = Marker()
|
|
self.marker1 = Marker()
|
|
self.marker1.id = 1
|
|
self.marker1.id = 1
|
... | @@ -128,7 +129,46 @@ Beispiel für die Erweiterung der `aruco_control.py`: |
... | @@ -128,7 +129,46 @@ Beispiel für die Erweiterung der `aruco_control.py`: |
|
</details>
|
|
</details>
|
|
|
|
|
|
<details><summary>Erweiterung einer neuen Klasse</summary>
|
|
<details><summary>Erweiterung einer neuen Klasse</summary>
|
|
Jede Klasse erfüllt bestimmte funktionen, ob es das dedektieren und steuerun von und durch arcuo-tags sind oder einfach nur das Steuern mittels Gaming-Controller. Die Klassen sind jeweils so aufgebaut das sie je nach funktion eine Instanz der TrainContol-Node (train.py) besitzen um auf die Methoden des zuges zu zu greifen.
|
|
|
|
Die erstellte klasse besteht dann aus generalisierten Methoden und Attribute welche in einer oder mehrerer ROS2 Node aufgerufen und verknüft werden.
|
|
|
|
|
|
|
|
EIn Beispiel für eine neue Klasse könnte ein weiterer Sensor sein. |
|
Jede Klasse in unserem System erfüllt spezifische Funktionen, sei es das Detektieren und Steuern von Objekten mithilfe von Arcuo-Tags oder die Steuerung über Gaming-Controller. Die Struktur der Klassen ist so konzipiert, dass sie je nach Funktionalität eine Instanz der TrainControl-Node (`train.py`) enthalten, um auf die Methoden des Zuges zuzugreifen.
|
|
\ No newline at end of file |
|
|
|
|
|
Die neu zu erstellende Klasse wird aus generalisierten Methoden und Attributen bestehen, die in einer oder mehreren ROS2-Nodes aufgerufen und verknüpft werden können.
|
|
|
|
|
|
|
|
Ein Beispiel für eine neue Klasse könnte die Integration eines weiteren Sensors darstellen.
|
|
|
|
|
|
|
|
Für eine einheitliche Implementierung ist es wichtig, die vorgegebene Ordnerstruktur zu beachten:
|
|
|
|
|
|
|
|
```
|
|
|
|
train_control/
|
|
|
|
├── config/
|
|
|
|
├── images/
|
|
|
|
├── launch/
|
|
|
|
├── resource/
|
|
|
|
├── test/
|
|
|
|
└── train_control/
|
|
|
|
├── include/
|
|
|
|
```
|
|
|
|
|
|
|
|
### 1. Erstellung der Klassen-Datei
|
|
|
|
- Erstellen Sie eine neue Python-Datei mit der Endung `.py` im Ordner `include/`. Achten Sie darauf, alle benötigten Bibliotheken zu importieren.
|
|
|
|
- Importieren Sie ebenfalls die `Train`-Klasse aus der Datei `train.py`, um auf deren Funktionalitäten zugreifen zu können.
|
|
|
|
|
|
|
|
### 2. Hinzufügen von Methoden
|
|
|
|
- Definieren Sie eine Klasse in der neuen Datei und fügen Sie generalisierte Methoden hinzu, die auf die Anforderungen der Steuerungs-Node abgestimmt sind.
|
|
|
|
- Beachten Sie hierbei die gängigen [**Python-Codierstandards (PEP 8)**](https://peps.python.org/pep-0008/), um eine saubere und wartbare Struktur zu gewährleisten.
|
|
|
|
|
|
|
|
### 3. Erstellen einer neuen Node
|
|
|
|
- Erstellen Sie eine neue Node im Ordner `traincontrol/` oder erweitern Sie eine vorhandene Node. Importieren Sie dabei Ihre neu erstellte Klasse.
|
|
|
|
- Die Node sollte die in der Klasse definierten Methoden aufrufen und zur Steuerung des Zuges dienen.
|
|
|
|
|
|
|
|
### 4. Erstellen neuer Tests
|
|
|
|
- Erstellen Sie eine neue Unit-Test-Datei im Ordner `test/` und benennen Sie diese gemäß den Namenskonventionen (z. B. `test_<classname>.py`).
|
|
|
|
- Orientieren Sie sich an der Vorgehensweise der bereits bestehenden Tests, um eine konsistente Struktur sicherzustellen.
|
|
|
|
- Ergänzen Sie sowohl **Unittests**, als auch **Integrationstests** und **Systemtests**, abhängig vom erforderlichen Testlevel. Halten Sie sich an die Vorgaben der **DIN EN 50716** für die Strukturierung und Ausführung von Tests.
|
|
|
|
- Fügen Sie Ihre Integrationstests im Ordner `/integration_tests` hinzu und richten Sie diese an den bestehenden Tests aus.
|
|
|
|
|
|
|
|
### 5. Einbindung in die CI/CD-Pipeline
|
|
|
|
- Integrieren Sie Ihre Tests in die entsprechenden Stages der CI/CD-Pipeline, einschließlich Unittests, Integrationstests und Systemtests.
|
|
|
|
- Je nach Art der Klasse kann eine unterschiedliche Einbindung in die CI/CD-Pipeline notwendig sein. Stellen Sie sicher, dass alle relevanten Tests (Unit-, Integration-, Systemtests) in der Pipeline korrekt ausgeführt werden.
|
|
|
|
|
|
|
|
</details> |
|
|
|
\ No newline at end of file |