You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
**Node** - Ein Knoten ist Teilnehmer im ROS-Graphen. ROS-Knoten verwenden eine ROS-Clientbibliothek, um mit anderen Knoten zu kommunizieren. Knoten können ein *Subject* veröffentlichen oder abonnieren. *Nodes* können auch einen Dienst bereitstellen oder verwenden. Einem Knoten sind konfigurierbare Parameter zugeordnet. Verbindungen zwischen Knoten werden durch einen verteilten Erkennungsprozess hergestellt. Knoten können sich im selben Prozess, in unterschiedlichen Prozessen oder auf unterschiedlichen Rechnern befinden.
245
245
246
+
**Messages** - To enable the communication of data packets between the nodes, their structure and content format must be specified. Which data formats are used, where is the sending sensor located, which units of measurement represent the information? ROS defines abstract message types for this purpose.
*Screenshot der Knoten eines umfangreicheren Projektes. Die Ellipsen repräsentieren die Knoten, die rechteckigen Boxen die "Datenkanäle" dazwischen.*
248
250
@@ -666,8 +668,7 @@ Auf der ROS2 Seite nutzen wir nun das [image_tools](https://github.com/ros2/demo
666
668
#ros2 run image_tools showimage # zum testen
667
669
```
668
670
669
-
Im folgenden wird ein Knoten aus dem Paket [opencv_app](http://wiki.ros.org/opencv_apps) aktiviert, dass für die Erkennung der Gesichter verantwortlich ist. Diese ist
670
-
bisher nicht für ROS2 verfügbar.
671
+
Im folgenden wird ein Knoten aus dem Paket [opencv_app](http://wiki.ros.org/opencv_apps) aktiviert, dass für die Erkennung der Gesichter verantwortlich ist. Diese war für die verwendete Version `foxy` im November 2021 nicht für ROS2 verfügbar.
> Frage: Was hat es mit dem folgenden Befehl auf sich, den Sie in den Übungen verwenden?
35
+
36
+
```bash
37
+
export ROS_DOMAIN_ID=5
38
+
```
39
+
40
+
{{1-2}}
41
+
********************************************
42
+
43
+
> This number will be used as the DDS Domain ID, which is a number that identifies the DDS domain to which the nodes belong. Nodes in the same domain can communicate with each other, while nodes in different domains cannot. The default value is 0, which means that all nodes belong to the same domain. This is fine if you are running all nodes on the same machine, but if you want to run nodes on different machines, you need to use different domain IDs for each machine.
44
+
45
+
34
46
Während die Organisation von Anwendungen über mehreren Rechnern unter ROS1 aufwändiger war, ist die Realsierung in ROS2 außerordentlich einfach.
vgl. Beschreibung der Einrichtung einer Verbindung zwischen einem RaspberryPi und einem Entwicklungsrechner [Link](https://roboticsbackend.com/ros2-multiple-machines-including-raspberry-pi/)
49
+
37
50
51
+
********************************************
38
52
39
53
## Konzept
40
54
41
-
ROS1 und 2 sind in Pakten organisiert, diese kann man als Container für zusammengehörigen Code betrachten.
55
+
ROS1 und 2 sind in Paketen organisiert, diese kann man als Container für zusammengehörigen Code betrachten.
42
56
43
57
Softwareengineering Ziele:
44
58
@@ -127,7 +141,7 @@ Für ein ganzes Set von Paketen ist deutlich mehr Aufwand erforderlich:
127
141
128
142
+ Voraussetzungen:
129
143
130
-
+ Verfügbarkeit von System-Abhängigkeiten (abhängige Pakete)[rosdep](http://wiki.ros.org/rosdep/Tutorials/How%20to%20add%20a%20system%20dependency)
144
+
+ Verfügbarkeit von System-Abhängigkeiten (abhängige Pakete)
131
145
+ Setzen der notwendigen Umgebungsvariablen
132
146
133
147
+ Eingabe: Code und Konfigurationsdateien der Pakete
@@ -141,13 +155,13 @@ Für ein ganzes Set von Paketen ist deutlich mehr Aufwand erforderlich:
141
155
142
156
> **Merke:** ROS / ROS2 umfasst eine Fülle von Tools für die Organisation dieses Prozesses.
143
157
144
-
## Realisierung eines eigenen Paketes
158
+
## Realisierung eigener Pakete
145
159
146
160
Wir wollen die Funktionalität der `minimal_subscriber`/`minimal_publisher` Beispiel erweitern und einen neuen Knoten implementieren, der den Zählwert nicht als Bestandteil eines strings kommuniziert sondern als separaten Zahlenwert.
147
161
148
162
Sie finden den Beispielcode im Repository dieses Kurses unter [Link](https://github.com/TUBAF-IfI-LiaScript/VL_SoftwareprojektRobotik/tree/master/examples/07_ROS_Pakete/src)
Einen guten Überblick zur Behandlung von eigenen Datentypen im originären Paket oder aber in einem anderen bietet:
248
+
249
+
https://github.com/ros2/rosidl
250
+
251
+
### Schritt 2: Integration in einen C++ Knoten
234
252
235
253
Nunmehr wollen wir die neu definierte Nachricht auch in einem Node verwenden.
236
254
Entsprechend nutzen wir den `minimal_publisher` Beispiel aus der vergangenen Vorlesung und ersetzen die `String` Message gegen unsere `My_Msg` Implementierung. Dafür muss für den Knoten eine Abhängigkeit zum Paket `my_msg_package` spezifiziert werden. Dies kann während der Inititalisierung des Paketes oder im Anschluss anhand der 'package.xml' und 'CMakeList.txt' erfolgen. Schauen Sie sich noch mal die Definition der Abhängigkeiten in unserem `my_msg_package` an.
@@ -337,7 +355,7 @@ class MinimalPublisher : public rclcpp::Node
@@ -364,12 +382,100 @@ class MinimalPublisher : public rclcpp::Node
364
382
}
365
383
```
366
384
367
-
Nach einem weiteren Build-Prozess können wir das Paket nun im erwarteten Funktionsumfang starten.
368
-
Einen guten Überblick zur Behandlung von eigenen Datentypen im originären Paket oder aber in einem anderen bietet:
385
+
### Schritt 3: Integration in einen Python Knoten
386
+
387
+
Die Integration in einen Python Knoten ist analog zu der C++ Implementierung. Wir nutzen das `minimal_subscriber` Beispiel aus der vergangenen Vorlesung und ersetzen die `String` Message gegen unsere `My_Msg` Implementierung. Dafür muss für den Knoten eine Abhängigkeit zum Paket `my_msg_package` spezifiziert werden. Dies kann während der Inititalisierung des Paketes oder im Anschluss anhand der 'package.xml' und 'CMakeList.txt' erfolgen. Schauen Sie sich noch mal die Definition der Abhängigkeiten in unserem `my_msg_package` an.
> In dem wir den Node-Namen explizit angeben, wird dieser auch in der `setup.py` Datei integriert. Dies ist notwendig, da Python Pakete nicht über einen `main` Eintrag gestartet werden.
Die Aufzeichnung von ganzen Datensätzen ist einer der zentralen Debug-Techniken
@@ -441,31 +547,6 @@ Unter anderem sollten zwei Fehlkonfigurationen vermieden werden:
441
547
442
548
Ein Lösungsansatz ist die zeitliche Filterung der Informationen, in dem zum Beispiel nur jede 10te Nachricht gespeichert wird. Dies wiederum kann dann aber einen Einfluss auf das Verhalten des Algorithmus haben!
443
549
444
-
An dieser Stelle wird schon deutlich, wie der unter ROS1 erreichte
445
-
Komfort noch nicht unter ROS2 realisiert ist. Das `rosbag` Tool unter ROS1 erreicht
Beispiel des Einsatzes eines Bagfiles anhand der Scan-Daten im deutschen Museum in München [Link](https://google-cartographer-ros.readthedocs.io/en/latest/demos.html).
Das Loggingsystem unter ROS2 bildet folgende Makros ab, die in der rclcpp API enthalten sind ([Link](http://docs.ros2.org/latest/api/rclcpp/logging_8hpp.html)). Dabei zielt die Neuimplementierung aber darauf ab, ein Interface zu definieren, das es erlaubt Logging-Bibliotheken allgemein einzubetten:
686
+
Das Loggingsystem unter ROS2 bildet folgende Makros ab, die in der rclcpp API enthalten sind ([Link](http://docs.ros2.org/latest/api/rclcpp/logging_8hpp.html)). Dabei zielt die Neuimplementierung aber darauf ab, ein Interface zu definieren, das es erlaubt Logging-Bibliotheken allgemein einzubetten:
Für die Interaktion mit einem *managed node* stehen Ihnen unterschiedlichen Möglichkeiten offen. Auf der Kommandozeile kann zwischen den States mittels
647
728
648
729
```
649
730
ros2 lifecycle set /nodename X #State Id
650
731
```
651
732
652
-
gewechselt werden. Komfortabler ist die Spezifikation in den launch-Files. Ein Beispiel für die entsprechend Realisierung findet sich unter folgendem [Link](https://www.stereolabs.com/docs/ros2/lifecycle/#the-life-cycle-state-machine)
733
+
gewechselt werden. Komfortabler ist die Spezifikation in den launch-Files.
0 commit comments