Anmeldung im ROS-Programm

Guten Tag, liebe Leser! Ich spreche weiterhin über verschiedene interessante und nützliche Funktionen der Roboterplattform Robot Operation System (ROS). In diesem kurzen Tutorial werde ich über die Möglichkeiten der Protokollierung mit ROS beim Programmieren in C ++ sprechen. Ich denke, viele werden zustimmen, dass die Ausgabe von Nachrichten während der Programmausführung bei der Entwicklung von Programmen von großer Bedeutung ist, insbesondere beim Debuggen. ROS bietet eine praktische API für die Ausgabe verschiedener Nachrichtentypen an das Terminal mit der Möglichkeit, Nachrichten in speziellen ROS-Tools zu visualisieren und zu filtern. Fangen wir an!

Verwenden der Bibliotheksmethoden console.h zum Anzeigen von Nachrichten in einem Knoten


Schreiben wir also einen einfachen Knoten, den wir logging_tutorial nennen:

catkin_create_pkg logging_tutorial roscpp std_msgs 

Zu CMakeLists.txt hinzufügen:

 add_executable(logging_node src/main.cpp) target_link_libraries(logging_node ${catkin_LIBRARIES} ) 

Beginnen wir nun mit dem Schreiben des main.cpp-Codes. Wir importieren im Dateikopf eine spezielle Header-Dateikonsole.h mit der Definition der Protokollierungsfunktionen:

 #include <ros/console.h> 

Fügen Sie der Hauptmethode eine einfache Nachricht hinzu:

 int main(int argc, char** argv) { ros::init(argc, argv, "logging_node"); ros::NodeHandle n; ROS_INFO("logging_node start"); return 0; } 

Kompilieren Sie das Paket und führen Sie es aus:

 cd ~/catkin_ws catkin_make source devel/setup.bash rosrun logging_tutorial logging_node 

Die Ausgabe sieht folgendermaßen aus:

 [ INFO] [1492194213.009783103]: logging_node start 

Zu Beginn der Nachricht wird eine „Ebene“ oder ein Typ und ein Zeitstempel in Sekunden und Nanosekunden ab dem 1. Januar 1970 hinzugefügt. In diesem Fall haben wir eine Nachricht mit einer INFO-Ebene.

Wir können Parameter ähnlich wie bei der printf-Methode an die Nachricht übergeben:

 int val = 5; ROS_INFO("message with argument: %d", val); 

Sie können eine Nachricht als Standard-Stream wie std :: cout erstellen:

 ROS_INFO_STREAM("message with argument: " << val); 

ROS unterstützt die folgenden „Detailebenen“ (in aufsteigender Reihenfolge der Relevanz):

  • DEBUG
  • INFO
  • WARNUNG
  • Fehler
  • Tödlich

Um eine Nachricht einer bestimmten Ebene anzuzeigen, wird die entsprechende Funktion im folgenden Format verwendet: ROS _ \ <LEVEL \>. Nachrichten verschiedener Typen werden mit einer bestimmten Farbe angezeigt: DEBUG - Grün, INFO - Weiß, WARN - Gelb, FEHLER - Rot, FATAL - Lila. Der Zweck jedes Nachrichtentyps lässt sich leicht anhand seines Namens erraten. Beispielsweise sind DEBUG-Nachrichten zum Debuggen nützlich.

Fügen Sie ein paar verschiedene Nachrichten hinzu und führen Sie alles in einer Schleife aus. Ich habe folgende Datei erhalten:

 #include <ros/ros.h> #include <ros/console.h> int main(int argc, char** argv) { ros::init(argc, argv, "logging_node"); ros::NodeHandle n; ros::Rate rate (1); while(ros::ok()) { ROS_DEBUG("debug message"); ROS_INFO("logging_node start"); int val = 5; ROS_INFO("message with argument: %d", val); ROS_INFO_STREAM("stream message with argument: " << val); ROS_WARN("My warning"); ROS_ERROR("Some error"); ROS_FATAL("Fatal error"); ros::spinOnce(); rate.sleep(); } return 0; } 

Standardmäßig werden Meldungen aller Art außer DEBUG während der Programmausführung angezeigt. Dies wird durch die Mindeststufe, die sogenannte „Wichtigkeitsstufe“, unter Verwendung des Parameters ROSCONSOLE_MIN_SEVERITY bestimmt. Der Parameter ROSCONSOLE_MIN_SEVERITY begrenzt die Ausgabe von Nachrichten so, dass alle Nachrichten mit einer Stufe angezeigt werden, die gleich oder höher als das Minimum ist. Standardmäßig ist der Mindestpegel auf DEBUG eingestellt. Sie können die Mindeststufe ändern, indem Sie ROSCONSOLE_MIN_SEVERITY mit dem Makro am Anfang der Knotendatei auf eine der Nachrichtenebenen (ROSCONSOLE_SEVERITY_DEBUG, ROSCONSOLE_SEVERITY_INFO usw.) oder auf keine von ihnen (ROSCONSOLE_SEVERITY_NONE) setzen:

 #define ROSCONSOLE_MIN_SEVERITY ROSCONSOLE_SEVERITY_DEBUG 

Sie können auch den Schweregrad für alle Knoten im Paket in der Datei CMakeLists.txt festlegen:

 add_definitions(-DROSCONSOLE_MIN_SEVERITY=ROSCONSOLE_SEVERITY_ERROR) 

Diese Methode hat eine Einschränkung: Es werden nur Nachrichten mit einer höheren Ebene als DEBUG angezeigt, auch wenn wir ROSCONSOLE_SEVERITY_DEBUG direkt angeben. Dieses Problem kann mit einer speziellen Konfigurationsdatei gelöst werden. Erstellen Sie einen Konfigurationsordner und darin eine Datei custom_rosconsole.conf mit folgendem Inhalt:

 log4j.logger.ros.logging_tutorial=DEBUG 

Erstellen Sie als Nächstes die Datei launch logging.launch und geben Sie den Pfad zur Datei custom_rosconsole.conf in der Variablen ROSCONSOLE_CONFIG_FILE an:

 <launch> <env name="ROSCONSOLE_CONFIG_FILE" value="$(find logging_tutorial)/config/custom_rosconsole.conf"/> <node pkg="logging_tutorial" type="logging_node" name="logging_node" output="screen"/> </launch> 

Hier haben wir den Parameter output = "screen" hinzugefügt, mit dem Level-Nachrichten beginnend mit INFO ausgegeben werden können.

Kompilieren Sie unseren Launcher und führen Sie ihn aus:

 cd ~/catkin_ws catkin_make roslaunch logging_tutorial logging.launch 

Wir kommen zu einem ähnlichen Ergebnis:

Bild

ROS kann Nachrichten benennen. Standardmäßig erhalten Nachrichten den Hostnamen. Benutzer können verschiedenen Nachrichten über die Funktion ROS _ \ <LEVEL \> [_ STREAM] _NAMED Namen geben:

 ROS_INFO_STREAM_NAMED("named_msg", "named info stream message with argument: " << val); 


Mit Namen können Sie jeder benannten Nachricht in der Konfigurationsdatei unterschiedliche Mindeststufen zuweisen und diese einzeln ändern. Der Nachrichtenname wird nach dem Paketnamen angezeigt:

 log4j.logger.ros.logging_tutorial.named_msg = ERROR 


Bedingte Nachrichten, die unter einer bestimmten Bedingung ausgeführt werden, können ebenfalls nützlich sein. Verwenden Sie dazu die ROS-Funktion _ \ <LEVEL \> [_ STREAM] _COND [_NAMED]:

 ROS_INFO_STREAM_COND(val < 2, "conditional stream message shown when val (" << val << ") < 2"); 


Nachrichten können mit der Funktion ROS _ \ <LEVEL \> [_ STREAM] _THROTTLE [_NAMED] mit einer bestimmten Frequenz ausgegeben werden. Der erste Parameter legt die Frequenz in Sekunden fest:

 ROS_INFO_THROTTLE(3, "throttled message with period 3 seconds"); 


Verwenden von rqt_console zum Anzeigen von Nachrichten


Führen Sie das Dienstprogramm rqt_console aus:

 rosrun rqt_console rqt_console 

Und starten Sie unseren Knoten mit launch:

 roslaunch logging_tutorial logging.launch 

Das Fenster rqt_console sieht folgendermaßen aus:

Bild

Hier in der Tabelle wird für jede Nachricht die Ebene, der Knotenname, der Dateiname und die Codezeile angezeigt, in der sie generiert wird.

Durch Doppelklicken auf eine Nachricht erhalten Sie detaillierte Informationen dazu:

Bild

Sie können Nachrichten filtern, indem Sie alle Fehlermeldungen ausschließen. Fügen Sie dazu einen Filter hinzu, indem Sie auf das Pluszeichen neben der Tabelle "Nachrichten ausschließen" klicken und die Option "... enthalten" auswählen:

Bild

Oder schließen Sie Nachrichten mit der Info-Ebene aus:

Bild

Außerdem können Nachrichten einer bestimmten Ebene mithilfe der Filter im Abschnitt Nachrichten hervorheben unter allen unterschieden werden:

Bild

Auf diese Weise können Sie mit rqt_console die Anzeige von Nachrichten von verschiedenen Knoten flexibel konfigurieren und Debugging-Programme in ROS vereinfachen.

Ich hoffe, dieser Leitfaden wird sich bei der Arbeit als nützlich erweisen und die Lösung auftretender Probleme während der Programmierung vereinfachen. Ich wünsche Ihnen viel Erfolg bei der Arbeit mit ROS und bis bald!

Source: https://habr.com/ru/post/de403191/


All Articles