{"id":9364,"date":"2023-04-23T15:52:26","date_gmt":"2023-04-23T15:52:26","guid":{"rendered":"https:\/\/www.fambach.net\/?p=9364"},"modified":"2026-10-08T14:49:56","modified_gmt":"2026-10-08T14:49:56","slug":"ros-einfachen-publisher-subscriber-in-c-erstellen","status":"publish","type":"post","link":"https:\/\/www.fambach.net\/en\/ros-einfachen-publisher-subscriber-in-c-erstellen\/","title":{"rendered":"ROS: Create a Simple Publisher\/Subscriber in C++"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_89 ez-toc-wrap-left counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.fambach.net\/en\/ros-catkin\/#Voraussetzung\" >Voraussetzung<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.fambach.net\/en\/ros-catkin\/#Vorbereitung\" >Vorbereitung<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.fambach.net\/en\/ros-catkin\/#Publisher_Knoten\" >Publisher Knoten<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.fambach.net\/en\/ros-catkin\/#Publisher_Knoten_erstellen\" >Publisher Knoten erstellen<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.fambach.net\/en\/ros-catkin\/#Publisher_Code_erklart\" >Publisher Code erkl\u00e4rt<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.fambach.net\/en\/ros-catkin\/#Subscriber_Knoten\" >Subscriber Knoten<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.fambach.net\/en\/ros-catkin\/#Subscriber_Knoten_erstellen\" >Subscriber Knoten erstellen<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.fambach.net\/en\/ros-catkin\/#Subscriber_Code_erklart\" >Subscriber Code erkl\u00e4rt<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.fambach.net\/en\/ros-catkin\/#Bauen\" >Bauen<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.fambach.net\/en\/ros-catkin\/#CMake_anpassen\" >CMake anpassen<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.fambach.net\/en\/ros-catkin\/#Kompilieren\" >Kompilieren<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/www.fambach.net\/en\/ros-catkin\/#Probieren\" >Probieren<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/www.fambach.net\/en\/ros-catkin\/#Publisher_starten\" >Publisher starten<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/www.fambach.net\/en\/ros-catkin\/#Subscriber_starten\" >Subscriber starten<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/www.fambach.net\/en\/ros-catkin\/#Fazit\" >Fazit<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/www.fambach.net\/en\/ros-catkin\/#Verwandte_Beitrage\" >Verwandte Beitr\u00e4ge<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/www.fambach.net\/en\/ros-catkin\/#Quellen\" >Quellen<\/a><\/li><\/ul><\/nav><\/div>\n\n<p class=\"wp-block-paragraph\">Hier soll kurz beschrieben werden, wie ein Publisher (Nachrichten-Erzeuger) und ein Subscriber (Nachrichten-Abonnent) in C++ erstellt werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr eine ausf\u00fchrliche Anleitung sei auf die offizielle Website verwiesen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">http:\/\/wiki.ros.org\/ROS\/Tutorials\/WritingPublisherSubscriber%28c%2B%2B%29<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"voraussetzung\"><span class=\"ez-toc-section\" id=\"Voraussetzung\"><\/span>Voraussetzung<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ihr ben\u00f6tigt einen Workspace und ein Paket, in meinem Fall ist das Workspace test_ws und Paket beginner_tutorial. Weiterhin k\u00f6nnten auch helfen:<\/p>\n\n\n<div class=\"display-posts-listing\"><div class=\"listing-item\"><span class=\"ub-content-link ub-content-link--ok ub-content-link--status-after\"><a class=\"title ub-content-link__anchor\" href=\"https:\/\/www.fambach.net\/en\/ros-einfachen-publisher-subscriber-in-c-erstellen\/\">ROS: Einfachen Publisher\/Subscriber in C++ Erstellen<\/a><span class=\"ub-status ub-status--ok\" title=\"Link status: OK\"><span class=\"ub-status__icon\" aria-hidden=\"true\">\u25cf<\/span><span class=\"screen-reader-text\">Link status: OK<\/span><\/span><\/span><\/div><div class=\"listing-item\"><span class=\"ub-content-link ub-content-link--ok ub-content-link--status-after\"><a class=\"title ub-content-link__anchor\" href=\"https:\/\/www.fambach.net\/en\/ros-service-erstellen\/\">ROS: Service Erstellen<\/a><span class=\"ub-status ub-status--ok\" title=\"Link status: OK\"><span class=\"ub-status__icon\" aria-hidden=\"true\">\u25cf<\/span><span class=\"screen-reader-text\">Link status: OK<\/span><\/span><\/span><\/div><div class=\"listing-item\"><span class=\"ub-content-link ub-content-link--ok ub-content-link--status-after\"><a class=\"title ub-content-link__anchor\" href=\"https:\/\/www.fambach.net\/en\/ros-nachrichten-erstellen\/\">ROS: Nachrichten Erstellen<\/a><span class=\"ub-status ub-status--ok\" title=\"Link status: OK\"><span class=\"ub-status__icon\" aria-hidden=\"true\">\u25cf<\/span><span class=\"screen-reader-text\">Link status: OK<\/span><\/span><\/span><\/div><div class=\"listing-item\"><span class=\"ub-content-link ub-content-link--ok ub-content-link--status-after\"><a class=\"title ub-content-link__anchor\" href=\"https:\/\/www.fambach.net\/en\/ros-catkin\/\">ROS: Catkin<\/a><span class=\"ub-status ub-status--ok\" title=\"Link status: OK\"><span class=\"ub-status__icon\" aria-hidden=\"true\">\u25cf<\/span><span class=\"screen-reader-text\">Link status: OK<\/span><\/span><\/span><\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"vorbereitung\"><span class=\"ez-toc-section\" id=\"Vorbereitung\"><\/span>Vorbereitung<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ins Paketverzeichnis wechseln<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"bash\" class=\"language-bash\">source ~\/test_ws\/devel\/setup.bash\nroscd beginner_tutorial<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Falls noch nicht vorhanden, ein Quellcode-Verzeichnis im Paket erstellen und in das Verzeichnis wechseln.<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"bash\" class=\"language-bash\">mkdir -p src\ncd src<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dieses Verzeichnis wird alle Quelltext-Dateien des Paketes enthalten.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"publisher-knoten\"><span class=\"ez-toc-section\" id=\"Publisher_Knoten\"><\/span>Publisher Knoten<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"publisher-knoten-erstellen\"><span class=\"ez-toc-section\" id=\"Publisher_Knoten_erstellen\"><\/span>Publisher Knoten erstellen<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nun ein Beispiel f\u00fcr einen einfachen Publisher von unten kopieren oder einfach mit folgendem Befehl vom original ROS Tutorial herunterladen.<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"bash\" class=\"language-bash\"> wget https:\/\/raw.github.com\/ros\/ros_tutorials\/kinetic-devel\/roscpp_tutorials\/talker\/talker.cpp\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die Datei sollte im Prinzip folgenden Code enthalten. Ich habe meinen Code nur an der original Datei orientiert und die Texte zur besseren Lesbarkeit weggelassen, <span class=\"ub-content-link ub-content-link--ok ub-content-link--status-after\"><a rel=\"noreferrer noopener\" href=\"https:\/\/raw.github.com\/ros\/ros_tutorials\/kinetic-devel\/roscpp_tutorials\/talker\/talker.cpp\" data-type=\"URL\" data-id=\"https:\/\/raw.github.com\/ros\/ros_tutorials\/kinetic-devel\/roscpp_tutorials\/talker\/talker.cpp\" target=\"_blank\" class=\"ub-content-link__anchor\"> bitte die Copyrights und Disclaimer der Original Datei beachten<\/a><span class=\"ub-status ub-status--ok\" title=\"Link status: OK\"><span class=\"ub-status__icon\" aria-hidden=\"true\">\u25cf<\/span><span class=\"screen-reader-text\">Link status: OK<\/span><\/span><\/span>, solltet ihr diese verwenden. <\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"cpp\" class=\"language-cpp\">\/* Simple Publisher\n*  Based on the example of Morgan Quigley and Willow Garage, Inc. No Garanties for this code. \n*  Basis for this Code can be found:\n*  https:\/\/raw.github.com\/ros\/ros_tutorials\/kinetic-devel\/roscpp_tutorials\/talker\/talker.cpp \n*\/ \n\n#include \"ros\/ros.h\"\n#include \"std_msgs\/String.h\"\n#include  &lt;sstream&gt;\n\nint main(int argc, char **argv)\n{\n\n  ros::init(argc, argv, \"Publizierer\");\n  ros::NodeHandle n;\n  ros::Publisher pub = n.advertise&lt;std_msgs::String&gt;(\"ChatTopic\", 1000);\n\n  ros::Rate loop_rate(10);\n\n  int count = 0;\n  while (ros::ok())\n  {\n    std_msgs::String msg;\n\n    std::stringstream strStream;\n    strStream &lt;&lt; \"Chat Message \" &lt;&lt; count;\n    msg.data = strStream.str();\n\n    ROS_INFO(\"%s\", msg.data.c_str());\n\n    pub.publish(msg);\n\n    ros::spinOnce();\n\n    loop_rate.sleep();\n    ++count;\n  }\n\n  return 0;\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"publisher-code-erklaert\"><span class=\"ez-toc-section\" id=\"Publisher_Code_erklart\"><\/span>Publisher Code erkl\u00e4rt<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wir ben\u00f6tigen die ROS Bibliothek, eine einfache Textnachricht und die Stream Bibliothek f\u00fcr Ausgaben.<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"cpp\" class=\"language-cpp\">#include \"ros\/ros.h\"\n#include \"std_msgs\/String.h\"\n#include &lt;sstream&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Der restliche Code wird in der Main Funktion, die nach Programmstart aufgerufen wird, platziert. Der folgende Befehl initialisiert ROS.  Er bekommt als Argumentliste die Consolen Argumente des Knotens und einen eindeutigen Namen (hier Publizierer). Dieser darf kein \/ enthalten.<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"cpp\" class=\"language-cpp\">int main(int argc, char **argv)\n{\n   ros::init(argc, argv, \"Publizierer\"); \/\/ &lt;--\n...<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nun erstellen wir einen NodeHandle, dies erm\u00f6glicht uns den Zugriff auf den Knotenprozess. Mit der ersten Erstellung wird der Knoten initialisiert. <\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"cpp\" class=\"language-cpp\">ros::NodeHandle n;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Mit dessen Hilfe registrieren wir uns nun als PublishDie Frequenz beschreibt die Anzahl der Schwingungen in einer Zeiteinheit. Frequenz und Wellenl\u00e4nge sind miteinander verkn\u00fcpft. Die Ma\u00dfeinheit der Frequenz ist das Hertz (Hz): 1 Hz = 1 Schwingung pro Sekunde = 1\/s.er. Die Argumente sind der Topic Name (\u201eChatTopic\u201c) und die Gr\u00f6\u00dfe des Nachrichten-Puffers in Anzahl Nachrichten. Wird die Anzahl nicht abgeholter Nachrichten \u00fcberschritten, werden alte Nachrichten verworfen. Der Aufruf gibt ein Publisher-Objekt zur\u00fcck, mit dessen Hilfe wir sp\u00e4ter Nachrichten ver\u00f6ffentlichen k\u00f6nnen.<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"cpp\" class=\"language-cpp\">ros::Publisher pub = n.advertise&lt;std_msgs::String&gt;(\"ChatTopic\", 1000);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Der folgende Befehl gibt an, wie lange gewartet werden soll, nachdem ein sleep aufgerufen wurde. In diesem Fall 10 Hz (10\/Sekunde = 100 ms warten)<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"cpp\" class=\"language-cpp\">ros::Rate loop_rate(10);\n\n\n\/\/ loop_rate.sleep(); \/\/ kommt sp\u00e4ter<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Unsere eigene Logik l\u00e4uft in einer Schleife ab.  Diese wird so lange durchlaufen, bis eines der folgenden Ereignisse eintritt, mit diesem wird ros::ok() dann auf false gesetzt.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Knotenprogramm gestoppt (eg. Control +C )<\/li><li>Aus dem Netzwerk geworfen wegen eines anderen Knoten mit gleichem Namen.<\/li><li>ros::shutdown() wurde aufgerufen<\/li><li>Alle ros::NodeHandles wurden zerst\u00f6rt<\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"cpp\" class=\"language-cpp\">  int count = 0;\n  while (ros::ok())\n  {\n    \/\/ ...\n  }\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nun erzeugen wir eine Nachricht und verschicken diese mit pub.publish(msg). ROS_INFO schreibt die Nachricht noch auf dem Standardoutput.<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"cpp\" class=\"language-cpp\">  std_msgs::String msg;\n  std::stringstream strStream;\n  strStream &lt;&lt; \"Chat Message \" &lt;&lt; count;\n  msg.data = strStream.str();\n\n  ROS_INFO(\"%s\", msg.data.c_str());\n  pub.publish(msg);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">SpinOnce wird hier eigentlich nicht ben\u00f6tigt und wird hier nur der Vollst\u00e4ndigkeit halber angegeben. Es sieht f\u00fcr mich so aus, als w\u00fcrde hier einmal die EventLoop durchlaufen um Nachrichten\/Events \u2026 zu aktualisieren. <\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"cpp\" class=\"language-cpp\"> ros::spinOnce();<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nun warten wir 100 Millisekunden (10Hz) bis zum n\u00e4chsten Durchlauf der Schleife<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"cpp\" class=\"language-cpp\">\/\/ ... ros::Rate loop_rate(10); \/\/ vorher angegeben\nloop_rate.sleep();\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"subscriber-knoten\"><span class=\"ez-toc-section\" id=\"Subscriber_Knoten\"><\/span>Subscriber Knoten<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"subscriber-knoten-erstellen\"><span class=\"ez-toc-section\" id=\"Subscriber_Knoten_erstellen\"><\/span>Subscriber Knoten erstellen<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nun ein Beispiel f\u00fcr einen einfachen Subscriber von unten kopieren oder einfach mit folgendem Befehl vom original ROS Tutorial herunterladen.<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"bash\" class=\"language-bash\">wget https:\/\/raw.github.com\/ros\/ros_tutorials\/kinetic-devel\/roscpp_tutorials\/listener\/listener.cpp\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die Datei sollte im Prinzip folgenden Code enthalten. Ich habe meinen Code an der original Datei orientiert und die Texte zur besseren Lesbarkeit weggelassen, <span class=\"ub-content-link ub-content-link--ok ub-content-link--status-after\"><a rel=\"noreferrer noopener\" href=\"https:\/\/raw.github.com\/ros\/ros_tutorials\/kinetic-devel\/roscpp_tutorials\/talker\/talker.cpp\" data-type=\"URL\" data-id=\"https:\/\/raw.github.com\/ros\/ros_tutorials\/kinetic-devel\/roscpp_tutorials\/talker\/talker.cpp\" target=\"_blank\" class=\"ub-content-link__anchor\"> bitte die Copyrights und Disclaimer der Original Datei beachten<\/a><span class=\"ub-status ub-status--ok\" title=\"Link status: OK\"><span class=\"ub-status__icon\" aria-hidden=\"true\">\u25cf<\/span><span class=\"screen-reader-text\">Link status: OK<\/span><\/span><\/span>, solltet ihr diese verwenden. <\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"cpp\" class=\"language-cpp\">\/* Simple subscriber \n* Based on the example of Morgan Quigley and Willow Garage, Inc. No Garanties for this code. \n*  Basis for this Code can be found:\n*  https:\/\/raw.github.com\/ros\/ros_tutorials\/kinetic-devel\/roscpp_tutorials\/listener\/listener.cpp \n*\/ \n\n#include \"ros\/ros.h\"\n#include \"std_msgs\/String.h\"\n\nvoid chatterCallback(const std_msgs::String::ConstPtr&amp; msg)\n{\n  ROS_INFO(\"I heard: [%s]\", msg-&gt;data.c_str());\n}\n\nint main(int argc, char **argv)\n{\n  ros::init(argc, argv, \"Abbonent\");\n  ros::NodeHandle n;\n\n  ros::Subscriber sub = n.subscribe(\"ChatTopic\", 1000, chatterCallback);\n  ros::spin();\n\n  return 0;\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"subscriber-code-erklaert\"><span class=\"ez-toc-section\" id=\"Subscriber_Code_erklart\"><\/span>Subscriber Code erkl\u00e4rt<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Wir brauchen wieder die ROS Bibliothek und auch die Standard String Nachricht.<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"cpp\" class=\"language-cpp\">#include \"ros\/ros.h\"\n#include \"std_msgs\/String.h\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr den Subscriber brauchen wir eine sogenannte CallBack Funktion, diese wird bei jedem Eintreffen einer Nachricht gerufen. In unserem Fall macht sie nichts anderes als die Nachricht auf der Standardausgabe auszugeben.<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"cpp\" class=\"language-cpp\">void chatterCallback(const std_msgs::String::ConstPtr&amp; msg)\n{\n  ROS_INFO(\"I heard: [%s]\", msg-&gt;data.c_str());\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Auch um einen Subscriber zu erzeugen, muss ROS initialisiert und ein Handle erstellt werden.<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"cpp\" class=\"language-cpp\">int main(int argc, char **argv)\n{\n  ros::init(argc, argv, \"Abbonent\");\n  ros::NodeHandle n;\n..<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nun erstellen wir noch den Subscriber, geben ihm den Topic Namen, die Gr\u00f6\u00dfe des Nachrichtenpuffers, den Namen der CallBack Funktion mit und lassen ROS die Eventloop peitschen.<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"cpp\" class=\"language-cpp\">  ros::Subscriber sub = n.subscribe(\"ChatTopic\", 1000, chatterCallback);\n  ros::spin();<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das war\u2019s.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"bauen\"><span class=\"ez-toc-section\" id=\"Bauen\"><\/span>Bauen<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"cmake-anpassen\"><span class=\"ez-toc-section\" id=\"CMake_anpassen\"><\/span>CMake anpassen<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die erstellten Dateien dem CMakeList.txt mitteilen.<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"bash\" class=\"language-bash\">add_executable(talker src\/talker.cpp)\ntarget_link_libraries(talker ${catkin_LIBRARIES})\nadd_dependencies(talker beginner_tutorials_generate_messages_cpp)\n\nadd_executable(listener src\/listener.cpp)\ntarget_link_libraries(listener ${catkin_LIBRARIES})\nadd_dependencies(listener beginner_tutorials_generate_messages_cpp)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Meine Datei sieht dann wie folgt aus<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"bash\" class=\"language-bash\">cmake_minimum_required(VERSION 3.0.2)\nproject(beginner_tutorial)\n\nfind_package(catkin REQUIRED)\n\n## Find catkin and any catkin packages\nfind_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs genmsg message_generation)\n\nadd_message_files(FILES Num.msg)\nadd_service_files(FILES AddTwoInts.srv)\n\ngenerate_messages(DEPENDENCIES std_msgs)\n\ncatkin_package()\n\ninclude_directories(include ${catkin_INCLUDE_DIRS})\n\nadd_executable(talker src\/talker.cpp)\ntarget_link_libraries(talker ${catkin_LIBRARIES})\nadd_dependencies(talker beginner_tutorial_generate_messages_cpp)\n\nadd_executable(listener src\/listener.cpp)\ntarget_link_libraries(listener ${catkin_LIBRARIES})\nadd_dependencies(listener beginner_tutorial_generate_messages_cpp)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"kompilieren\"><span class=\"ez-toc-section\" id=\"Kompilieren\"><\/span>Kompilieren<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In das Hauptverzeichnis des Workspaces wechseln und catkin_make ausf\u00fchren<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">cd ~\/test_ws\ncatkin_make<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Die Programme sollten ohne Fehler kompilieren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"probieren\"><span class=\"ez-toc-section\" id=\"Probieren\"><\/span>Probieren<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">ROS Kern starten<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Neue Konsole \u00f6ffnen und den Kern starten<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"bash\" class=\"language-bash\">roscore<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Konsolenausgabe<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"bash\" class=\"language-bash\">Press Ctrl-C to interrupt\nDone checking log file disk usage. Usage is &lt;1GB.\n\nstarted roslaunch server http:\/\/ros1:36971\/\nros_comm version 1.14.13\n\n\nSUMMARY\n========\n\nPARAMETERS\n * \/rosdistro: melodic\n * \/rosversion: 1.14.13\n\nNODES\n\nauto-starting new master\nprocess[master]: started with pid [21703]\nROS_MASTER_URI=http:\/\/ros1:11311\/\n\nsetting \/run_id to b388e65a-e1ed-11ed-9402-2cf05d21f9e7\nprocess[rosout-1]: started with pid [21714]\nstarted core service [\/rosout]\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"publisher-starten\"><span class=\"ez-toc-section\" id=\"Publisher_starten\"><\/span>Publisher starten<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Neue Console \u00f6ffnen und den Publisher starten<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">source devel\/setup.bash \nrosrun beginner_tutorial talker<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Konsolenausgabe<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"bash\" class=\"language-bash\">stefan@ros1:~\/test_ws$ rosrun beginner_tutorial talker\n[ INFO] [1682264871.725780407]: Chat Message 0\n[ INFO] [1682264871.825829919]: Chat Message 1\n[ INFO] [1682264871.926003834]: Chat Message 2\n[ INFO] [1682264872.025829924]: Chat Message 3\n[ INFO] [1682264872.125823473]: Chat Message 4\n[ INFO] [1682264872.225830377]: Chat Message 5\n[ INFO] [1682264872.325854816]: Chat Message 6\n[ INFO] [1682264872.425830687]: Chat Message 7\n[ INFO] [1682264872.526317126]: Chat Message 8\n[ INFO] [1682264872.626305447]: Chat Message 9\n[ INFO] [1682264872.725830634]: Chat Message 10\n[ INFO] [1682264872.826306242]: Chat Message 11\n[ INFO] [1682264872.925858434]: Chat Message 12\n[ INFO] [1682264873.025830754]: Chat Message 13\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"subscriber-starten\"><span class=\"ez-toc-section\" id=\"Subscriber_starten\"><\/span>Subscriber starten<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Neue Console \u00f6ffnen und den Subscriber starten<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code class=\"\">source devel\/setup.bash \nrosrun beginner_tutorial listener<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Konsolenausgabe<\/p>\n\n\n\n<pre class=\"wp-block-code has-small-font-size\"><code lang=\"bash\" class=\"language-bash\">stefan@ros1:~\/test_ws$ rosrun beginner_tutorial listener\n[ INFO] [1682264872.026229599]: I heard: [Chat Message 3]\n[ INFO] [1682264872.126169068]: I heard: [Chat Message 4]\n[ INFO] [1682264872.226189402]: I heard: [Chat Message 5]\n[ INFO] [1682264872.326278372]: I heard: [Chat Message 6]\n[ INFO] [1682264872.426155092]: I heard: [Chat Message 7]\n[ INFO] [1682264872.526503319]: I heard: [Chat Message 8]\n[ INFO] [1682264872.626625331]: I heard: [Chat Message 9]\n[ INFO] [1682264872.726196509]: I heard: [Chat Message 10]\n[ INFO] [1682264872.826496384]: I heard: [Chat Message 11]\n[ INFO] [1682264872.926120007]: I heard: [Chat Message 12]\n[ INFO] [1682264873.026085367]: I heard: [Chat Message 13]<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"fazit\"><span class=\"ez-toc-section\" id=\"Fazit\"><\/span>Fazit<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Publisher-\/Subscriber-Ger\u00fcst ist schnell erstellt und dient als Basis f\u00fcr kommende Projekte.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"verwandte-beitraege\"><span class=\"ez-toc-section\" id=\"Verwandte_Beitrage\"><\/span>Verwandte Beitr\u00e4ge<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n<div class=\"display-posts-listing\"><div class=\"listing-item\"><span class=\"ub-content-link ub-content-link--ok ub-content-link--status-after\"><a class=\"title ub-content-link__anchor\" href=\"https:\/\/www.fambach.net\/en\/ros-einfachen-publisher-subscriber-in-c-erstellen\/\">ROS: Einfachen Publisher\/Subscriber in C++ Erstellen<\/a><span class=\"ub-status ub-status--ok\" title=\"Link status: OK\"><span class=\"ub-status__icon\" aria-hidden=\"true\">\u25cf<\/span><span class=\"screen-reader-text\">Link status: OK<\/span><\/span><\/span><\/div><div class=\"listing-item\"><span class=\"ub-content-link ub-content-link--ok ub-content-link--status-after\"><a class=\"title ub-content-link__anchor\" href=\"https:\/\/www.fambach.net\/en\/ros-service-erstellen\/\">ROS: Service Erstellen<\/a><span class=\"ub-status ub-status--ok\" title=\"Link status: OK\"><span class=\"ub-status__icon\" aria-hidden=\"true\">\u25cf<\/span><span class=\"screen-reader-text\">Link status: OK<\/span><\/span><\/span><\/div><div class=\"listing-item\"><span class=\"ub-content-link ub-content-link--ok ub-content-link--status-after\"><a class=\"title ub-content-link__anchor\" href=\"https:\/\/www.fambach.net\/en\/ros-nachrichten-erstellen\/\">ROS: Nachrichten Erstellen<\/a><span class=\"ub-status ub-status--ok\" title=\"Link status: OK\"><span class=\"ub-status__icon\" aria-hidden=\"true\">\u25cf<\/span><span class=\"screen-reader-text\">Link status: OK<\/span><\/span><\/span><\/div><div class=\"listing-item\"><span class=\"ub-content-link ub-content-link--ok ub-content-link--status-after\"><a class=\"title ub-content-link__anchor\" href=\"https:\/\/www.fambach.net\/en\/ros-unified-robot-description-format-urdf\/\">ROS URDF: Projekt aufsetzen<\/a><span class=\"ub-status ub-status--ok\" title=\"Link status: OK\"><span class=\"ub-status__icon\" aria-hidden=\"true\">\u25cf<\/span><span class=\"screen-reader-text\">Link status: OK<\/span><\/span><\/span><\/div><div class=\"listing-item\"><span class=\"ub-content-link ub-content-link--ok ub-content-link--status-after\"><a class=\"title ub-content-link__anchor\" href=\"https:\/\/www.fambach.net\/en\/ros-catkin\/\">ROS: Catkin<\/a><span class=\"ub-status ub-status--ok\" title=\"Link status: OK\"><span class=\"ub-status__icon\" aria-hidden=\"true\">\u25cf<\/span><span class=\"screen-reader-text\">Link status: OK<\/span><\/span><\/span><\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"quellen\"><span class=\"ez-toc-section\" id=\"Quellen\"><\/span>Quellen<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">http:\/\/wiki.ros.org\/melodic\/Installation\/Ubuntu<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">http:\/\/wiki.ros.org\/ROS\/Tutorials\/WritingPublisherSubscriber%28c%2B%2B%29<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n","protected":false},"excerpt":{"rendered":"<p>Hier soll kurz beschrieben werden, wie ein Publisher (Nachrichten-Erzeuger) und ein Subscriber (Nachrichten-Abonnent) in C++ erstellt werden. F\u00fcr eine ausf\u00fchrliche Anleitung sei auf die offizielle Website verwiesen. http:\/\/wiki.ros.org\/ROS\/Tutorials\/WritingPublisherSubscriber%28c%2B%2B%29 Voraussetzung Ihr ben\u00f6tigt einen Workspace und ein Paket, in meinem Fall ist das Workspace test_ws und Paket beginner_tutorial. Weiterhin k\u00f6nnten auch helfen: Vorbereitung Ins Paketverzeichnis wechseln Falls &#8230;<\/p>\n<a href=\"https:\/\/www.fambach.net\/en\/ros-catkin\/\" class=\"read-more-link\">Carry on reading <span class=\"screen-reader-text\">\"ROS: Catkin\"<\/span> <span class=\"meta-nav\">\u2192<\/span><\/a>","protected":false},"author":1,"featured_media":9227,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_lmt_disableupdate":"","_lmt_disable":"","footnotes":""},"categories":[157,254,699],"tags":[678],"class_list":["post-9364","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-atnrob","category-betriebssysteme","category-ros-melody","tag-ros","penguin-post","penguin-post-not-sticky"],"modified_by":"sfambach","_links":{"self":[{"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/posts\/9364","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/comments?post=9364"}],"version-history":[{"count":22,"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/posts\/9364\/revisions"}],"predecessor-version":[{"id":18390,"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/posts\/9364\/revisions\/18390"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/media\/9227"}],"wp:attachment":[{"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/media?parent=9364"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/categories?post=9364"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fambach.net\/en\/wp-json\/wp\/v2\/tags?post=9364"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}