|
|
|

|
|
|
|
|
|
|
|
# Konfiguration
|
|
|
|
|
|
|
|
Das DEFACTO-Projekt bietet eine Vielzahl von Konfigurationsmöglichkeiten für die Nutzung des Zuges und der Simulationsumgebungen. Darüber hinaus besteht die Möglichkeit, das Projekt eigenständig zu erweitern. Eine Anleitung zur Implementierung solcher Anpassungen ist ebenfalls verfügbar. Weitere Informationen finden Sie in der [Dokumentation für Benutzerdefinierte Erweiterungen](#benutzerdefinierte-erweiterungen).
|
|
|
|
---
|
|
|
|
|
|
|
|
### Verwendete Topics
|
|
|
|
|
|
|
|
Die verwendeten Topics der StereoLabs ZED2i Kamera können hier entnommen werden: [**Link**](https://github.com/stereolabs/zed-ros2-interfaces/tree/main/msg).
|
|
|
|
|
|
|
|
Die verwendeten Topics für das Aruco_ROS-Paket sind hier zu finden: [**Link**](https://github.com/pal-robotics/aruco_ros/tree/humble-devel/aruco_msgs/msg).
|
|
|
|
|
|
|
|
Alternativ können Sie für die Verwendung von Aruco_OpenCV die entsprechenden Topics hier einsehen: [**Link**](https://github.com/fictionlab/ros_aruco_opencv/tree/ros2/aruco_opencv_msgs/msg).
|
|
|
|
|
|
|
|
#### Weitere Topics:
|
|
|
|
|
|
|
|
| Topic | Type | Bibliothek | ros2 pkg |
|
|
|
|
|------------------|-----------------|----------------------------------------------------------|--------------|
|
|
|
|
| /train_params | TrainParams | train_interfaces/ TrainParams Message | train_control |
|
|
|
|
| /joy | Joy | [sensor_msgs/Joy Message](http://docs.ros.org/en/noetic/api/sensor_msgs/html/msg/Joy.html) | joy |
|
|
|
|
| /cmd_vel | Twist | [geometry_msgs/Twist Message](http://docs.ros.org/en/noetic/api/geometry_msgs/html/msg/Twist.html) | train_control |
|
|
|
|
|
|
|
|
Diese Tabelle bietet eine Übersicht über die wichtigsten Topics, deren Datentypen, die zugehörigen Bibliotheken und die jeweiligen Pakete, in denen sie definiert sind.
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
### Train Interface
|
|
|
|
|
|
|
|
Der Zug verfügt über ein eigenes Interface, das die Statusinformationen von Motor, Bremse, Horn sowie die aktuelle Geschwindigkeit umfasst. Dieses Interface wird primär von der Klasse `Train` genutzt. Die `Train-Klasse` integriert sicherheitsrelevante Funktionen, wie die Geschwindigkeitsbegrenzung und Notabschaltung, um die Betriebssicherheit des Systems zu gewährleisten.
|
|
|
|
|
|
|
|
Um das Zug-Interface in einem eigenen Paket zu verwenden, muss die Datei package.xml des neuen Pakets wie folgt angepasst werden:
|
|
|
|
|
|
|
|
```bash
|
|
|
|
<exec_depend>train_interfaces</exec_depend>
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
<details><summary>Train Interface</summary>
|
|
|
|
|
|
|
|
```bash
|
|
|
|
# TrainParams.msg
|
|
|
|
|
|
|
|
std_msgs/Header header
|
|
|
|
|
|
|
|
# Velocity of the train
|
|
|
|
float32 velocity 0.0 # Default: 0.0
|
|
|
|
|
|
|
|
# State of the motor (On or Off)
|
|
|
|
bool motor 0
|
|
|
|
bool MOTOR_ON=1 # Motor turned on
|
|
|
|
bool MOTOR_OFF=0 # Motor turned off
|
|
|
|
|
|
|
|
# State of the brake (Active or Inactive)
|
|
|
|
bool brake 1
|
|
|
|
bool BRAKE_ACTIVE=1 # Brake active
|
|
|
|
bool BRAKE_INACTIVE=0 # Brake inactive
|
|
|
|
|
|
|
|
# State of the horn (Active or Inactive)
|
|
|
|
bool horn 0
|
|
|
|
bool HORN_ACTIVE=1 # Horn active
|
|
|
|
bool HORN_INACTIVE=0 # Horn inactive
|
|
|
|
|
|
|
|
```
|
|
|
|
</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/>
|
|
|
|
|
|
|
|
1. **Einbindung einer neuen Methode in eine /`include/x_control.py`**
|
|
|
|
Beispiel für die Erweiterung der `aruco_control.py`:
|
|
|
|
|
|
|
|
```python
|
|
|
|
self.specific_tag = 42
|
|
|
|
def toggle_horn_tag(self, msg):
|
|
|
|
if msg.id == self.specific_tag:
|
|
|
|
self.train.horn_activate()
|
|
|
|
```
|
|
|
|
</details> |
|
|
|
\ No newline at end of file |