{"id":3821,"date":"2022-08-15T16:52:30","date_gmt":"2022-08-15T16:52:30","guid":{"rendered":"https:\/\/robotica-facil-con-ros2.es\/?p=3821"},"modified":"2026-07-06T07:13:50","modified_gmt":"2026-07-06T07:13:50","slug":"ros2-publicadores-y-subscriptores","status":"publish","type":"post","link":"https:\/\/robotica-facil-con-ros2.es\/?p=3821","title":{"rendered":"ROS2. Publicadores y Subscriptores"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"3821\" class=\"elementor elementor-3821\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-3c6b921 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"3c6b921\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a1e7b85\" data-id=\"a1e7b85\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3e2ad92 elementor-widget elementor-widget-text-editor\" data-id=\"3e2ad92\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3>1 Introducci\u00f3n<\/h3><p>En ROS los nodos se comunican entre s\u00ed empleando <i>topics<\/i>. El concepto de <strong><em>topic<\/em><\/strong> podr\u00eda asemejarse a un bus de datos al que se le asigna un nombre, pudiendo algunos nodos (denominados <strong><em>publicadores<\/em><\/strong>) conectarse al mismo para escribir mensajes\u00a0 y otros\u00a0 (denominados <strong><em>subscriptores<\/em><\/strong>) para recibirlos.<\/p><p>En este art\u00edculo vamos a crear un nuevo paquete que llamaremos <i>py_pubsub<\/i> al cual incorporaremos un nodo publicador que va a escribir mensajes en un <i>topic<\/i> al que simplemente hemos asignado el nombre de \u00ab<i>topic\u00bb<\/i>, y otro nodo subscriptor que los leer\u00e1 y mostrar\u00e1 la informaci\u00f3n en el terminal.\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4b8a46c elementor-widget elementor-widget-text-editor\" data-id=\"4b8a46c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3>2 Creando un paquete python<\/h3><p>Para crear el paquete vamos a la carpeta <i>src<\/i> de nuestro espacio de trabajo y ejecutamos el siguiente comando:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-04f829c elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"04f829c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-04f829c\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-tomorrow\"\n            data-dark-theme=\"mdp-theme-tomorrow\"\n        >\n            \n                <pre class=\"language-shell-session copy-to-clipboard\"data-previewers=\"\"><code>ros2 pkg create --build-type ament_python py_pubsub<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_04f829c = function() {\n\n                \/** Set theme for coder widget. *\/\n                function setTheme() {\n\n                    \/** Foreach Code Widget. *\/\n                    let coderBoxes = document.querySelectorAll( '.mdp-coder-elementor-box' );\n\n                    for ( let coderBox of coderBoxes ) {\n\n                        let lightTheme = coderBox.dataset.theme;\n                        let darkTheme = coderBox.dataset.darkTheme;\n\n                        coderBox.className = '';\n                        if ( window.matchMedia && window.matchMedia( '(prefers-color-scheme: dark)' ).matches ) {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + darkTheme;\n\n                        } else {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + lightTheme;\n\n                        }\n\n                    }\n\n                }\n                setTheme();\n\n\n                \/** Watch for changes color-scheme. *\/\n                window.matchMedia(\"(prefers-color-scheme: dark)\").addListener( function() {\n                    setTheme();\n                } );\n\n                \n                if ( typeof Prism !== 'undefined' ) {\n\n                    Prism.plugins.autoloader.languages_path = 'https:\/\/robotica-facil-con-ros2.es\/wp-content\/plugins\/coder-elementor\/js\/prism\/components\/';\n                    Prism.highlightAll();\n                    Prism.fileHighlight();\n\n                }\n\n                \n            };\n\n            if (\n                document.readyState === \"complete\" ||\n                ( document.readyState !== \"loading\" && !document.documentElement.doScroll )\n            ) {\n                callback_04f829c();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_04f829c );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d540b2a elementor-widget elementor-widget-text-editor\" data-id=\"d540b2a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3>3 A\u00f1adiendo un nodo Publicador<\/h3><p>El siguiente paso es crear nuestro nodo publicador.<\/p><p>Para ello, en nuestro paquete dentro de la carpeta que tiene su mismo nombre, creamos un archivo al que vamos a llamar <i>publisher.py<\/i>:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c47445c elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"c47445c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-c47445c\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-tomorrow\"\n            data-dark-theme=\"mdp-theme-tomorrow\"\n        >\n            \n                <pre class=\"language-shell-session copy-to-clipboard\"data-previewers=\"\"><code>cd py_pubsub\/py_pubsub\ntouch publisher.py<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_c47445c = function() {\n\n                \/** Set theme for coder widget. *\/\n                function setTheme() {\n\n                    \/** Foreach Code Widget. *\/\n                    let coderBoxes = document.querySelectorAll( '.mdp-coder-elementor-box' );\n\n                    for ( let coderBox of coderBoxes ) {\n\n                        let lightTheme = coderBox.dataset.theme;\n                        let darkTheme = coderBox.dataset.darkTheme;\n\n                        coderBox.className = '';\n                        if ( window.matchMedia && window.matchMedia( '(prefers-color-scheme: dark)' ).matches ) {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + darkTheme;\n\n                        } else {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + lightTheme;\n\n                        }\n\n                    }\n\n                }\n                setTheme();\n\n\n                \/** Watch for changes color-scheme. *\/\n                window.matchMedia(\"(prefers-color-scheme: dark)\").addListener( function() {\n                    setTheme();\n                } );\n\n                \n                if ( typeof Prism !== 'undefined' ) {\n\n                    Prism.plugins.autoloader.languages_path = 'https:\/\/robotica-facil-con-ros2.es\/wp-content\/plugins\/coder-elementor\/js\/prism\/components\/';\n                    Prism.highlightAll();\n                    Prism.fileHighlight();\n\n                }\n\n                \n            };\n\n            if (\n                document.readyState === \"complete\" ||\n                ( document.readyState !== \"loading\" && !document.documentElement.doScroll )\n            ) {\n                callback_c47445c();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_c47445c );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ee827b6 elementor-widget elementor-widget-text-editor\" data-id=\"ee827b6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Abrimos el archivo y pegamos una de las dos versiones de c\u00f3digo que se muestran a continuaci\u00f3n. La diferencia entre ellas es que en una se ha utilizado programaci\u00f3n orientada a objetos y en la otra no.<\/p><p>B\u00e1sicamente ambos realizan las siguientes acciones:<\/p><ol><li style=\"list-style-type: none;\"><ol><li>Crea un nuevo nodo a partir de la clase <i>rclpy.node<\/i>.<\/li><li>Crea un objeto <i>publisher<\/i> mediante la funci\u00f3n <i><b>create_publisher( )<\/b><\/i> de la clase <i>rclpy.node<\/i>, a la que se le pasa como par\u00e1metros la estructura de datos que usar\u00e1n los mensajes, el nombre del\u00a0<i>topic<\/i>\u00a0al que se quiere escribir y el tama\u00f1o de la cola a emplear en el caso de que no se puedan procesar los mensajes lo suficientemente r\u00e1pido.<\/li><li>Crea un temporizador mediante la funci\u00f3n <i><b>create_timer( )<\/b><\/i> de la clase <i>rclpy.node<\/i> a la que se le pasa el nombre de una funci\u00f3n que se ejecutar\u00e1 peri\u00f3dicamente.<\/li><li>Crea la funci\u00f3n que se va a ejecutar peri\u00f3dicamente y en la cual se ejecuta la funci\u00f3n <i><b>publish( )<\/b><\/i> del objeto <i>publisher<\/i> para enviar el mensaje al <i>topic<\/i>.<\/li><li>Llama a la funci\u00f3n <i><b>rclpy.spin( )<\/b><\/i> que mantiene ejecut\u00e1ndose el bucle interno del nodo.<\/li><\/ol><\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-88b9d73 elementor-widget elementor-widget-text-editor\" data-id=\"88b9d73\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h4>3.1 Usando una clase<\/h4>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-51b9921 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"51b9921\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-51b9921\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-material-dark\"\n            data-dark-theme=\"mdp-theme-material-dark\"\n        >\n            \n                <pre class=\"language-python copy-to-clipboard\"data-previewers=\"\"><code>import rclpy\nfrom rclpy.node import Node\n\nfrom std_msgs.msg import String\n\n\nclass MinimalPublisher(Node):\n\n    def __init__(self):\n        super().__init__(&#039;minimal_publisher&#039;)\n        self.publisher_ = self.create_publisher(String, &#039;topic&#039;, 10)\n        timer_period = 0.5  # seconds\n        self.timer = self.create_timer(timer_period, self.timer_callback)\n        self.i = 0\n\n    def timer_callback(self):\n        msg = String()\n        msg.data = &#039;Hello World: %d&#039; % self.i\n        self.publisher_.publish(msg)\n        self.get_logger().info(&#039;Publishing: &quot;%s&quot;&#039; % msg.data)\n        self.i += 1\n\n\ndef main(args=None):\n    rclpy.init(args=args)\n\n    minimal_publisher = MinimalPublisher()\n\n    rclpy.spin(minimal_publisher)\n\n    # Destroy the node explicitly\n    # (optional - otherwise it will be done automatically\n    # when the garbage collector destroys the node object)\n    minimal_publisher.destroy_node()\n    rclpy.shutdown()\n\n\nif __name__ == &#039;__main__&#039;:\n    main()<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_51b9921 = function() {\n\n                \/** Set theme for coder widget. *\/\n                function setTheme() {\n\n                    \/** Foreach Code Widget. *\/\n                    let coderBoxes = document.querySelectorAll( '.mdp-coder-elementor-box' );\n\n                    for ( let coderBox of coderBoxes ) {\n\n                        let lightTheme = coderBox.dataset.theme;\n                        let darkTheme = coderBox.dataset.darkTheme;\n\n                        coderBox.className = '';\n                        if ( window.matchMedia && window.matchMedia( '(prefers-color-scheme: dark)' ).matches ) {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + darkTheme;\n\n                        } else {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + lightTheme;\n\n                        }\n\n                    }\n\n                }\n                setTheme();\n\n\n                \/** Watch for changes color-scheme. *\/\n                window.matchMedia(\"(prefers-color-scheme: dark)\").addListener( function() {\n                    setTheme();\n                } );\n\n                \n                if ( typeof Prism !== 'undefined' ) {\n\n                    Prism.plugins.autoloader.languages_path = 'https:\/\/robotica-facil-con-ros2.es\/wp-content\/plugins\/coder-elementor\/js\/prism\/components\/';\n                    Prism.highlightAll();\n                    Prism.fileHighlight();\n\n                }\n\n                \n            };\n\n            if (\n                document.readyState === \"complete\" ||\n                ( document.readyState !== \"loading\" && !document.documentElement.doScroll )\n            ) {\n                callback_51b9921();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_51b9921 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-11c7a58 elementor-widget elementor-widget-text-editor\" data-id=\"11c7a58\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"text-align: center;\">C\u00f3digo obtenido de: <a href=\"https:\/\/github.com\/ros2\/examples\/\">https:\/\/github.com\/ros2\/examples\/<\/a><\/p><p>\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-17220f3 elementor-widget elementor-widget-text-editor\" data-id=\"17220f3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h4>3.2 Usando una funci\u00f3n local<\/h4>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4966499 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"4966499\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-4966499\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-material-dark\"\n            data-dark-theme=\"mdp-theme-material-dark\"\n        >\n            \n                <pre class=\"language-python copy-to-clipboard\"data-previewers=\"\"><code>\nimport rclpy\n\nfrom std_msgs.msg import String\n\n\ndef main(args=None):\n    rclpy.init(args=args)\n\n    node = rclpy.create_node(&#039;minimal_publisher&#039;)\n    publisher = node.create_publisher(String, &#039;topic&#039;, 10)\n\n    msg = String()\n    i = 0\n\n    def timer_callback():\n        nonlocal i\n        msg.data = &#039;Hello World: %d&#039; % i\n        i += 1\n        node.get_logger().info(&#039;Publishing: &quot;%s&quot;&#039; % msg.data)\n        publisher.publish(msg)\n\n    timer_period = 0.5  # seconds\n    timer = node.create_timer(timer_period, timer_callback)\n\n    rclpy.spin(node)\n\n    # Destroy the timer attached to the node explicitly\n    # (optional - otherwise it will be done automatically\n    # when the garbage collector destroys the node object)\n    node.destroy_timer(timer)\n    node.destroy_node()\n    rclpy.shutdown()\n\n\nif __name__ == &#039;__main__&#039;:\n    main()<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_4966499 = function() {\n\n                \/** Set theme for coder widget. *\/\n                function setTheme() {\n\n                    \/** Foreach Code Widget. *\/\n                    let coderBoxes = document.querySelectorAll( '.mdp-coder-elementor-box' );\n\n                    for ( let coderBox of coderBoxes ) {\n\n                        let lightTheme = coderBox.dataset.theme;\n                        let darkTheme = coderBox.dataset.darkTheme;\n\n                        coderBox.className = '';\n                        if ( window.matchMedia && window.matchMedia( '(prefers-color-scheme: dark)' ).matches ) {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + darkTheme;\n\n                        } else {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + lightTheme;\n\n                        }\n\n                    }\n\n                }\n                setTheme();\n\n\n                \/** Watch for changes color-scheme. *\/\n                window.matchMedia(\"(prefers-color-scheme: dark)\").addListener( function() {\n                    setTheme();\n                } );\n\n                \n                if ( typeof Prism !== 'undefined' ) {\n\n                    Prism.plugins.autoloader.languages_path = 'https:\/\/robotica-facil-con-ros2.es\/wp-content\/plugins\/coder-elementor\/js\/prism\/components\/';\n                    Prism.highlightAll();\n                    Prism.fileHighlight();\n\n                }\n\n                \n            };\n\n            if (\n                document.readyState === \"complete\" ||\n                ( document.readyState !== \"loading\" && !document.documentElement.doScroll )\n            ) {\n                callback_4966499();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_4966499 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1cff982 elementor-widget elementor-widget-text-editor\" data-id=\"1cff982\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"text-align: center;\">C\u00f3digo obtenido de: <a href=\"https:\/\/github.com\/ros2\/examples\/\">https:\/\/github.com\/ros2\/examples\/<\/a><\/p><p>\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-951eae4 elementor-widget elementor-widget-text-editor\" data-id=\"951eae4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3>4 A\u00f1adiendo el nodo Subscriptor<\/h3><p>Creamos mediante el siguiente comando, en la misma ubicaci\u00f3n,\u00a0 el archivo <i>subscriber.py<\/i> que va a contener el c\u00f3digo de nuestro nodo subscriptor.\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bd9cb33 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"bd9cb33\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-bd9cb33\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-tomorrow\"\n            data-dark-theme=\"mdp-theme-tomorrow\"\n        >\n            \n                <pre class=\"language-shell-session copy-to-clipboard\"data-previewers=\"\"><code>touch subscriber.py<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_bd9cb33 = function() {\n\n                \/** Set theme for coder widget. *\/\n                function setTheme() {\n\n                    \/** Foreach Code Widget. *\/\n                    let coderBoxes = document.querySelectorAll( '.mdp-coder-elementor-box' );\n\n                    for ( let coderBox of coderBoxes ) {\n\n                        let lightTheme = coderBox.dataset.theme;\n                        let darkTheme = coderBox.dataset.darkTheme;\n\n                        coderBox.className = '';\n                        if ( window.matchMedia && window.matchMedia( '(prefers-color-scheme: dark)' ).matches ) {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + darkTheme;\n\n                        } else {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + lightTheme;\n\n                        }\n\n                    }\n\n                }\n                setTheme();\n\n\n                \/** Watch for changes color-scheme. *\/\n                window.matchMedia(\"(prefers-color-scheme: dark)\").addListener( function() {\n                    setTheme();\n                } );\n\n                \n                if ( typeof Prism !== 'undefined' ) {\n\n                    Prism.plugins.autoloader.languages_path = 'https:\/\/robotica-facil-con-ros2.es\/wp-content\/plugins\/coder-elementor\/js\/prism\/components\/';\n                    Prism.highlightAll();\n                    Prism.fileHighlight();\n\n                }\n\n                \n            };\n\n            if (\n                document.readyState === \"complete\" ||\n                ( document.readyState !== \"loading\" && !document.documentElement.doScroll )\n            ) {\n                callback_bd9cb33();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_bd9cb33 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-52e8e4d elementor-widget elementor-widget-text-editor\" data-id=\"52e8e4d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Al igual que para el caso del publicador se muestran a continuaci\u00f3n dos versiones de c\u00f3digo por lo que solo tenemos que abrir el archivo que acabamos de crear y copiar en \u00e9l cualquiera de ellas.<\/p><p>Las principales acciones que realiza el c\u00f3digo son:<\/p><ol><li style=\"list-style-type: none;\"><ol><li>Crea un nuevo nodo a partir de la clase <i>rclpy.node<\/i>.<\/li><li>Crea un objeto <i>subscription<\/i>\u00a0mediante la funci\u00f3n <i><b>create_subscription( )<\/b><\/i> de la clase <i>rclpy.node<\/i>, a la que se le pasa como par\u00e1metros la estructura de datos que usar\u00e1n los mensajes, el nombre del <i>topic<\/i> que queremos leer, el tama\u00f1o de la cola que emplear\u00e1 el subscriptor en el caso de que no sea capaz de procesar los mensajes lo suficientemente r\u00e1pido y la funci\u00f3n de <i>callback<\/i> que se llamar\u00e1 cada vez que llegue un mensaje.<\/li><li>Define la funci\u00f3n de <i>callback<\/i>, la cual lee el mensaje recibido y muestra la informaci\u00f3n en el terminal.<\/li><li>Llama a la funci\u00f3n <i><b>rclpy.spin( )<\/b><\/i> que mantiene ejecut\u00e1ndose el bucle interno del nodo.<\/li><\/ol><\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-370fa96 elementor-widget elementor-widget-text-editor\" data-id=\"370fa96\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h4>4.1 Usando una clase<\/h4>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dcc22e8 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"dcc22e8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-dcc22e8\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-material-dark\"\n            data-dark-theme=\"mdp-theme-material-dark\"\n        >\n            \n                <pre class=\"language-python copy-to-clipboard\"data-previewers=\"\"><code>import rclpy\nfrom rclpy.node import Node\n\nfrom std_msgs.msg import String\n\n\nclass MinimalSubscriber(Node):\n\n    def __init__(self):\n        super().__init__(&#039;minimal_subscriber&#039;)\n        self.subscription = self.create_subscription(\n            String,\n            &#039;topic&#039;,\n            self.listener_callback,\n            10)\n        self.subscription  # prevent unused variable warning\n\n    def listener_callback(self, msg):\n        self.get_logger().info(&#039;I heard: &quot;%s&quot;&#039; % msg.data)\n\n\ndef main(args=None):\n    rclpy.init(args=args)\n\n    minimal_subscriber = MinimalSubscriber()\n\n    rclpy.spin(minimal_subscriber)\n\n    # Destroy the node explicitly\n    # (optional - otherwise it will be done automatically\n    # when the garbage collector destroys the node object)\n    minimal_subscriber.destroy_node()\n    rclpy.shutdown()\n\n\nif __name__ == &#039;__main__&#039;:\n    main()<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_dcc22e8 = function() {\n\n                \/** Set theme for coder widget. *\/\n                function setTheme() {\n\n                    \/** Foreach Code Widget. *\/\n                    let coderBoxes = document.querySelectorAll( '.mdp-coder-elementor-box' );\n\n                    for ( let coderBox of coderBoxes ) {\n\n                        let lightTheme = coderBox.dataset.theme;\n                        let darkTheme = coderBox.dataset.darkTheme;\n\n                        coderBox.className = '';\n                        if ( window.matchMedia && window.matchMedia( '(prefers-color-scheme: dark)' ).matches ) {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + darkTheme;\n\n                        } else {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + lightTheme;\n\n                        }\n\n                    }\n\n                }\n                setTheme();\n\n\n                \/** Watch for changes color-scheme. *\/\n                window.matchMedia(\"(prefers-color-scheme: dark)\").addListener( function() {\n                    setTheme();\n                } );\n\n                \n                if ( typeof Prism !== 'undefined' ) {\n\n                    Prism.plugins.autoloader.languages_path = 'https:\/\/robotica-facil-con-ros2.es\/wp-content\/plugins\/coder-elementor\/js\/prism\/components\/';\n                    Prism.highlightAll();\n                    Prism.fileHighlight();\n\n                }\n\n                \n            };\n\n            if (\n                document.readyState === \"complete\" ||\n                ( document.readyState !== \"loading\" && !document.documentElement.doScroll )\n            ) {\n                callback_dcc22e8();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_dcc22e8 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2037b31 elementor-widget elementor-widget-text-editor\" data-id=\"2037b31\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"text-align: center;\">C\u00f3digo obtenido de: <a href=\"https:\/\/github.com\/ros2\/examples\/\">https:\/\/github.com\/ros2\/examples\/<\/a><\/p><p>\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1c7b891 elementor-widget elementor-widget-text-editor\" data-id=\"1c7b891\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h4>4.2 Usando una funci\u00f3n local<\/h4>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6cf200f elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"6cf200f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-6cf200f\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-material-dark\"\n            data-dark-theme=\"mdp-theme-material-dark\"\n        >\n            \n                <pre class=\"language-python copy-to-clipboard\"data-previewers=\"\"><code>\nimport rclpy\n\nfrom std_msgs.msg import String\n\n\ndef main(args=None):\n    rclpy.init(args=args)\n\n    node = rclpy.create_node(&#039;minimal_subscriber&#039;)\n\n    subscription = node.create_subscription(\n        String, &#039;topic&#039;, lambda msg: node.get_logger().info(&#039;I heard: &quot;%s&quot;&#039; % msg.data), 10)\n    subscription  # prevent unused variable warning\n\n    rclpy.spin(node)\n\n    # Destroy the node explicitly\n    # (optional - otherwise it will be done automatically\n    # when the garbage collector destroys the node object)\n    node.destroy_node()\n    rclpy.shutdown()\n\n\nif __name__ == &#039;__main__&#039;:\n    main()<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_6cf200f = function() {\n\n                \/** Set theme for coder widget. *\/\n                function setTheme() {\n\n                    \/** Foreach Code Widget. *\/\n                    let coderBoxes = document.querySelectorAll( '.mdp-coder-elementor-box' );\n\n                    for ( let coderBox of coderBoxes ) {\n\n                        let lightTheme = coderBox.dataset.theme;\n                        let darkTheme = coderBox.dataset.darkTheme;\n\n                        coderBox.className = '';\n                        if ( window.matchMedia && window.matchMedia( '(prefers-color-scheme: dark)' ).matches ) {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + darkTheme;\n\n                        } else {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + lightTheme;\n\n                        }\n\n                    }\n\n                }\n                setTheme();\n\n\n                \/** Watch for changes color-scheme. *\/\n                window.matchMedia(\"(prefers-color-scheme: dark)\").addListener( function() {\n                    setTheme();\n                } );\n\n                \n                if ( typeof Prism !== 'undefined' ) {\n\n                    Prism.plugins.autoloader.languages_path = 'https:\/\/robotica-facil-con-ros2.es\/wp-content\/plugins\/coder-elementor\/js\/prism\/components\/';\n                    Prism.highlightAll();\n                    Prism.fileHighlight();\n\n                }\n\n                \n            };\n\n            if (\n                document.readyState === \"complete\" ||\n                ( document.readyState !== \"loading\" && !document.documentElement.doScroll )\n            ) {\n                callback_6cf200f();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_6cf200f );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ad6df30 elementor-widget elementor-widget-text-editor\" data-id=\"ad6df30\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"text-align: center;\">C\u00f3digo obtenido de: <a href=\"https:\/\/github.com\/ros2\/examples\/\">https:\/\/github.com\/ros2\/examples\/<\/a><\/p><p>\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-165d3fd elementor-widget elementor-widget-text-editor\" data-id=\"165d3fd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3>5 Modificando el archivo package.xml para a\u00f1adir las dependencias<\/h3><p>Abrimos el archivo package.xml del paquete para a\u00f1adir las dependencias empleadas en el c\u00f3digo del publicador y del subscriptor, que son\u00a0 <i><b>rclpy<\/b><\/i> y <i><b>std_msgs<\/b><\/i>.\u00a0<\/p><p>El contenido del archivo nos debe quedar como se muestra a continuaci\u00f3n, en el cual se ha utilizado la etiqueta <i><b>&lt;exec_depend&gt;<\/b><\/i> para indicar las dependencias:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a7f5db5 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"a7f5db5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-a7f5db5\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-material-dark\"\n            data-dark-theme=\"mdp-theme-material-dark\"\n        >\n            \n                <pre class=\"language-markup copy-to-clipboard\"data-previewers=\"\"><code>\n&lt;?xml version=&quot;1.0&quot;?&gt;\n&lt;?xml-model href=&quot;http:\/\/download.ros.org\/schema\/package_format3.xsd&quot; schematypens=&quot;http:\/\/www.w3.org\/2001\/XMLSchema&quot;?&gt;\n&lt;package format=&quot;3&quot;&gt;\n  &lt;name&gt;py_pubsub&lt;\/name&gt;\n  &lt;version&gt;0.0.0&lt;\/version&gt;\n  &lt;description&gt;TODO: Package description&lt;\/description&gt;\n  &lt;maintainer email=&quot;TODO@gmail.com&quot;&gt;ros&lt;\/maintainer&gt;\n  &lt;license&gt;TODO: License declaration&lt;\/license&gt;\n\n  &lt;depend&gt;rclpy,&lt;\/depend&gt;\n  &lt;depend&gt;std_msgs&lt;\/depend&gt;\n\n  &lt;test_depend&gt;ament_copyright&lt;\/test_depend&gt;\n  &lt;test_depend&gt;ament_flake8&lt;\/test_depend&gt;\n  &lt;test_depend&gt;ament_pep257&lt;\/test_depend&gt;\n  &lt;test_depend&gt;python3-pytest&lt;\/test_depend&gt;\n\n  &lt;export&gt;\n    &lt;build_type&gt;ament_python&lt;\/build_type&gt;\n  &lt;\/export&gt;\n&lt;\/package&gt;<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_a7f5db5 = function() {\n\n                \/** Set theme for coder widget. *\/\n                function setTheme() {\n\n                    \/** Foreach Code Widget. *\/\n                    let coderBoxes = document.querySelectorAll( '.mdp-coder-elementor-box' );\n\n                    for ( let coderBox of coderBoxes ) {\n\n                        let lightTheme = coderBox.dataset.theme;\n                        let darkTheme = coderBox.dataset.darkTheme;\n\n                        coderBox.className = '';\n                        if ( window.matchMedia && window.matchMedia( '(prefers-color-scheme: dark)' ).matches ) {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + darkTheme;\n\n                        } else {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + lightTheme;\n\n                        }\n\n                    }\n\n                }\n                setTheme();\n\n\n                \/** Watch for changes color-scheme. *\/\n                window.matchMedia(\"(prefers-color-scheme: dark)\").addListener( function() {\n                    setTheme();\n                } );\n\n                \n                if ( typeof Prism !== 'undefined' ) {\n\n                    Prism.plugins.autoloader.languages_path = 'https:\/\/robotica-facil-con-ros2.es\/wp-content\/plugins\/coder-elementor\/js\/prism\/components\/';\n                    Prism.highlightAll();\n                    Prism.fileHighlight();\n\n                }\n\n                \n            };\n\n            if (\n                document.readyState === \"complete\" ||\n                ( document.readyState !== \"loading\" && !document.documentElement.doScroll )\n            ) {\n                callback_a7f5db5();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_a7f5db5 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9b4542f elementor-widget elementor-widget-text-editor\" data-id=\"9b4542f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3>6 Incorporando los puntos de entrada en setup.py<\/h3><p>El \u00faltimo paso es editar el archivo setup.py para a\u00f1adir al array <strong><em>entry_points<\/em><\/strong> los puntos de entrada para de los scripts del publicador y subscriptor, de modo que puedan ejecutarse mediante <em>ros2 run<\/em>.\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fa5a6f2 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"fa5a6f2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-fa5a6f2\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-material-dark\"\n            data-dark-theme=\"mdp-theme-material-dark\"\n        >\n            \n                <pre class=\"language-python copy-to-clipboard\"data-previewers=\"\"><code>from setuptools import setup\n\npackage_name = &#039;py_pubsub&#039;\n\nsetup(\n    name=package_name,\n    version=&#039;0.0.0&#039;,\n    packages=[package_name],\n    data_files=[\n        (&#039;share\/ament_index\/resource_index\/packages&#039;,\n            [&#039;resource\/&#039; + package_name]),\n        (&#039;share\/&#039; + package_name, [&#039;package.xml&#039;]),\n    ],\n    install_requires=[&#039;setuptools&#039;],\n    zip_safe=True,\n    maintainer=&#039;ros&#039;,\n    maintainer_email=&#039;TODO@gmail.com&#039;,\n    description=&#039;TODO: Package description&#039;,\n    license=&#039;TODO: License declaration&#039;,\n    tests_require=[&#039;pytest&#039;],\n    entry_points={\n        &#039;console_scripts&#039;: [\n              &#039;publisher = py_pubsub.publisher:main&#039;,\n              &#039;subscriber = py_pubsub.subscriber:main&#039;,\n        ],\n    },\n)<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_fa5a6f2 = function() {\n\n                \/** Set theme for coder widget. *\/\n                function setTheme() {\n\n                    \/** Foreach Code Widget. *\/\n                    let coderBoxes = document.querySelectorAll( '.mdp-coder-elementor-box' );\n\n                    for ( let coderBox of coderBoxes ) {\n\n                        let lightTheme = coderBox.dataset.theme;\n                        let darkTheme = coderBox.dataset.darkTheme;\n\n                        coderBox.className = '';\n                        if ( window.matchMedia && window.matchMedia( '(prefers-color-scheme: dark)' ).matches ) {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + darkTheme;\n\n                        } else {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + lightTheme;\n\n                        }\n\n                    }\n\n                }\n                setTheme();\n\n\n                \/** Watch for changes color-scheme. *\/\n                window.matchMedia(\"(prefers-color-scheme: dark)\").addListener( function() {\n                    setTheme();\n                } );\n\n                \n                if ( typeof Prism !== 'undefined' ) {\n\n                    Prism.plugins.autoloader.languages_path = 'https:\/\/robotica-facil-con-ros2.es\/wp-content\/plugins\/coder-elementor\/js\/prism\/components\/';\n                    Prism.highlightAll();\n                    Prism.fileHighlight();\n\n                }\n\n                \n            };\n\n            if (\n                document.readyState === \"complete\" ||\n                ( document.readyState !== \"loading\" && !document.documentElement.doScroll )\n            ) {\n                callback_fa5a6f2();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_fa5a6f2 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e2d4cc7 elementor-widget elementor-widget-text-editor\" data-id=\"e2d4cc7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3>7 Ejecutando los nodos<\/h3><p>Una vez que ya tenemos preparado nuestro paquete lo compilamos desde el directorio ra\u00edz de nuestro espacio de trabajo:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f684480 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"f684480\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-f684480\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-tomorrow\"\n            data-dark-theme=\"mdp-theme-tomorrow\"\n        >\n            \n                <pre class=\"language-shell-session copy-to-clipboard\"data-previewers=\"\"><code>colcon build --packages-select py_pubsub\n. install\/setup.bash<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_f684480 = function() {\n\n                \/** Set theme for coder widget. *\/\n                function setTheme() {\n\n                    \/** Foreach Code Widget. *\/\n                    let coderBoxes = document.querySelectorAll( '.mdp-coder-elementor-box' );\n\n                    for ( let coderBox of coderBoxes ) {\n\n                        let lightTheme = coderBox.dataset.theme;\n                        let darkTheme = coderBox.dataset.darkTheme;\n\n                        coderBox.className = '';\n                        if ( window.matchMedia && window.matchMedia( '(prefers-color-scheme: dark)' ).matches ) {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + darkTheme;\n\n                        } else {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + lightTheme;\n\n                        }\n\n                    }\n\n                }\n                setTheme();\n\n\n                \/** Watch for changes color-scheme. *\/\n                window.matchMedia(\"(prefers-color-scheme: dark)\").addListener( function() {\n                    setTheme();\n                } );\n\n                \n                if ( typeof Prism !== 'undefined' ) {\n\n                    Prism.plugins.autoloader.languages_path = 'https:\/\/robotica-facil-con-ros2.es\/wp-content\/plugins\/coder-elementor\/js\/prism\/components\/';\n                    Prism.highlightAll();\n                    Prism.fileHighlight();\n\n                }\n\n                \n            };\n\n            if (\n                document.readyState === \"complete\" ||\n                ( document.readyState !== \"loading\" && !document.documentElement.doScroll )\n            ) {\n                callback_f684480();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_f684480 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-da4a1d4 elementor-widget elementor-widget-text-editor\" data-id=\"da4a1d4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Seguidamente ejecutamos el subscriptor mediante el siguiente comando:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5b23df4 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"5b23df4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-5b23df4\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-tomorrow\"\n            data-dark-theme=\"mdp-theme-tomorrow\"\n        >\n            \n                <pre class=\"language-shell-session copy-to-clipboard\"data-previewers=\"\"><code>ros2 run py_subpub subscriber<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_5b23df4 = function() {\n\n                \/** Set theme for coder widget. *\/\n                function setTheme() {\n\n                    \/** Foreach Code Widget. *\/\n                    let coderBoxes = document.querySelectorAll( '.mdp-coder-elementor-box' );\n\n                    for ( let coderBox of coderBoxes ) {\n\n                        let lightTheme = coderBox.dataset.theme;\n                        let darkTheme = coderBox.dataset.darkTheme;\n\n                        coderBox.className = '';\n                        if ( window.matchMedia && window.matchMedia( '(prefers-color-scheme: dark)' ).matches ) {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + darkTheme;\n\n                        } else {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + lightTheme;\n\n                        }\n\n                    }\n\n                }\n                setTheme();\n\n\n                \/** Watch for changes color-scheme. *\/\n                window.matchMedia(\"(prefers-color-scheme: dark)\").addListener( function() {\n                    setTheme();\n                } );\n\n                \n                if ( typeof Prism !== 'undefined' ) {\n\n                    Prism.plugins.autoloader.languages_path = 'https:\/\/robotica-facil-con-ros2.es\/wp-content\/plugins\/coder-elementor\/js\/prism\/components\/';\n                    Prism.highlightAll();\n                    Prism.fileHighlight();\n\n                }\n\n                \n            };\n\n            if (\n                document.readyState === \"complete\" ||\n                ( document.readyState !== \"loading\" && !document.documentElement.doScroll )\n            ) {\n                callback_5b23df4();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_5b23df4 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-96a2407 elementor-widget elementor-widget-text-editor\" data-id=\"96a2407\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Y finalmente abrimos otro terminal y ejecutamos el publicador:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b7ff3f7 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"b7ff3f7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-b7ff3f7\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-tomorrow\"\n            data-dark-theme=\"mdp-theme-tomorrow\"\n        >\n            \n                <pre class=\"language-shell-session copy-to-clipboard\"data-previewers=\"\"><code>ros2 run py_subpub publisher<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_b7ff3f7 = function() {\n\n                \/** Set theme for coder widget. *\/\n                function setTheme() {\n\n                    \/** Foreach Code Widget. *\/\n                    let coderBoxes = document.querySelectorAll( '.mdp-coder-elementor-box' );\n\n                    for ( let coderBox of coderBoxes ) {\n\n                        let lightTheme = coderBox.dataset.theme;\n                        let darkTheme = coderBox.dataset.darkTheme;\n\n                        coderBox.className = '';\n                        if ( window.matchMedia && window.matchMedia( '(prefers-color-scheme: dark)' ).matches ) {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + darkTheme;\n\n                        } else {\n\n                            coderBox.className = 'mdp-coder-elementor-box ' + lightTheme;\n\n                        }\n\n                    }\n\n                }\n                setTheme();\n\n\n                \/** Watch for changes color-scheme. *\/\n                window.matchMedia(\"(prefers-color-scheme: dark)\").addListener( function() {\n                    setTheme();\n                } );\n\n                \n                if ( typeof Prism !== 'undefined' ) {\n\n                    Prism.plugins.autoloader.languages_path = 'https:\/\/robotica-facil-con-ros2.es\/wp-content\/plugins\/coder-elementor\/js\/prism\/components\/';\n                    Prism.highlightAll();\n                    Prism.fileHighlight();\n\n                }\n\n                \n            };\n\n            if (\n                document.readyState === \"complete\" ||\n                ( document.readyState !== \"loading\" && !document.documentElement.doScroll )\n            ) {\n                callback_b7ff3f7();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_b7ff3f7 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-182ad44 elementor-widget elementor-widget-text-editor\" data-id=\"182ad44\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Si hemos seguido los pasos correctamente deber\u00edamos ver en un terminal los mensajes enviados por el publicador y en el otro c\u00f3mo los recibe el subscriptor.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-76378a0 elementor-widget elementor-widget-image\" data-id=\"76378a0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"786\" height=\"533\" src=\"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3821-publisher-output.png\" class=\"attachment-large size-large wp-image-4007\" alt=\"publisher output\" srcset=\"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3821-publisher-output.png 786w, https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3821-publisher-output-300x203.png 300w, https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3821-publisher-output-768x521.png 768w\" sizes=\"(max-width: 786px) 100vw, 786px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8722d4d elementor-widget elementor-widget-image\" data-id=\"8722d4d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"786\" height=\"533\" src=\"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3821-subscriber-output.png\" class=\"attachment-large size-large wp-image-4008\" alt=\"subscriber output\" srcset=\"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3821-subscriber-output.png 786w, https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3821-subscriber-output-300x203.png 300w, https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3821-subscriber-output-768x521.png 768w\" sizes=\"(max-width: 786px) 100vw, 786px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>1 Introducci\u00f3n En ROS los nodos se comunican entre s\u00ed empleando topics. El concepto de topic podr\u00eda asemejarse a un bus de datos al que se le asigna un nombre, pudiendo algunos nodos (denominados publicadores) conectarse al mismo para escribir mensajes\u00a0 y otros\u00a0 (denominados subscriptores) para recibirlos. En este art\u00edculo vamos a crear un nuevo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3897,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_elementor_version":"4.1.4","footnotes":""},"categories":[5],"tags":[6,28,26],"class_list":["post-3821","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ros2","tag-publicadores","tag-subscriber","tag-topics"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.9 - aioseo.com -->\n\t<meta name=\"description\" content=\"1 Introducci\u00f3nEn ROS los nodos se comunican entre s\u00ed empleando topics. El concepto de topic podr\u00eda asemejarse a un bus de datos al que se le asigna un nombre, pudiendo algunos nodos (denominados publicadores) conectarse al mismo para escribir mensajes y otros (denominados subscriptores) para recibirlos.En este art\u00edculo vamos a crear un nuevo paquete que\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Jose Enrique Cabrera\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/robotica-facil-con-ros2.es\/?p=3821\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.9\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"- ROS2. Publicadores y Subscriptores\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"ROS2. Publicadores y Subscriptores -\" \/>\n\t\t<meta property=\"og:description\" content=\"1 Introducci\u00f3nEn ROS los nodos se comunican entre s\u00ed empleando topics. El concepto de topic podr\u00eda asemejarse a un bus de datos al que se le asigna un nombre, pudiendo algunos nodos (denominados publicadores) conectarse al mismo para escribir mensajes y otros (denominados subscriptores) para recibirlos.En este art\u00edculo vamos a crear un nuevo paquete que\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/robotica-facil-con-ros2.es\/?p=3821\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/topics.gif\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/topics.gif\" \/>\n\t\t<meta property=\"og:image:width\" content=\"955\" \/>\n\t\t<meta property=\"og:image:height\" content=\"506\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2022-08-15T16:52:30+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-07-06T07:13:50+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@RFconROS2\" \/>\n\t\t<meta name=\"twitter:title\" content=\"ROS2. Publicadores y Subscriptores -\" \/>\n\t\t<meta name=\"twitter:description\" content=\"1 Introducci\u00f3nEn ROS los nodos se comunican entre s\u00ed empleando topics. El concepto de topic podr\u00eda asemejarse a un bus de datos al que se le asigna un nombre, pudiendo algunos nodos (denominados publicadores) conectarse al mismo para escribir mensajes y otros (denominados subscriptores) para recibirlos.En este art\u00edculo vamos a crear un nuevo paquete que\" \/>\n\t\t<meta name=\"twitter:creator\" content=\"@RFconROS2\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/topics.gif\" \/>\n\t\t<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t\t<meta name=\"twitter:data1\" content=\"Jose Enrique Cabrera\" \/>\n\t\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura estimado\" \/>\n\t\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=3821#blogposting\",\"name\":\"ROS2. Publicadores y Subscriptores -\",\"headline\":\"ROS2. Publicadores y Subscriptores\",\"author\":{\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?author=1#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/#person\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/topics.gif\",\"width\":955,\"height\":506,\"caption\":\"topics\"},\"datePublished\":\"2022-08-15T16:52:30+00:00\",\"dateModified\":\"2026-07-06T07:13:50+00:00\",\"inLanguage\":\"es-ES\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=3821#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=3821#webpage\"},\"articleSection\":\"ROS2, PUBLICADORES, SUBSCRIPTORES, TOPICS\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=3821#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es#listItem\",\"position\":1,\"name\":\"Inicio\",\"item\":\"https:\\\/\\\/robotica-facil-con-ros2.es\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?cat=5#listItem\",\"name\":\"ROS2\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?cat=5#listItem\",\"position\":2,\"name\":\"ROS2\",\"item\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?cat=5\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=3821#listItem\",\"name\":\"ROS2. Publicadores y Subscriptores\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es#listItem\",\"name\":\"Inicio\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=3821#listItem\",\"position\":3,\"name\":\"ROS2. Publicadores y Subscriptores\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?cat=5#listItem\",\"name\":\"ROS2\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/#person\",\"name\":\"Jose Enrique Cabrera\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=3821#personImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7fb8a5b8671a5fde1ab097847642f4ec46f3150e6ef27ed7fe4f7055bb02a052?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Jose Enrique Cabrera\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?author=1#author\",\"url\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?author=1\",\"name\":\"Jose Enrique Cabrera\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=3821#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7fb8a5b8671a5fde1ab097847642f4ec46f3150e6ef27ed7fe4f7055bb02a052?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Jose Enrique Cabrera\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=3821#webpage\",\"url\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=3821\",\"name\":\"ROS2. Publicadores y Subscriptores -\",\"description\":\"1 Introducci\\u00f3nEn ROS los nodos se comunican entre s\\u00ed empleando topics. El concepto de topic podr\\u00eda asemejarse a un bus de datos al que se le asigna un nombre, pudiendo algunos nodos (denominados publicadores) conectarse al mismo para escribir mensajes y otros (denominados subscriptores) para recibirlos.En este art\\u00edculo vamos a crear un nuevo paquete que\",\"inLanguage\":\"es-ES\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=3821#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?author=1#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?author=1#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/wp-content\\\/uploads\\\/2022\\\/08\\\/topics.gif\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=3821\\\/#mainImage\",\"width\":955,\"height\":506,\"caption\":\"topics\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=3821#mainImage\"},\"datePublished\":\"2022-08-15T16:52:30+00:00\",\"dateModified\":\"2026-07-06T07:13:50+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/#website\",\"url\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/\",\"description\":\"Rob\\u00f3tica con ROS2\",\"inLanguage\":\"es-ES\",\"publisher\":{\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/#person\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"ROS2. Publicadores y Subscriptores -","description":"1 Introducci\u00f3nEn ROS los nodos se comunican entre s\u00ed empleando topics. El concepto de topic podr\u00eda asemejarse a un bus de datos al que se le asigna un nombre, pudiendo algunos nodos (denominados publicadores) conectarse al mismo para escribir mensajes y otros (denominados subscriptores) para recibirlos.En este art\u00edculo vamos a crear un nuevo paquete que","canonical_url":"https:\/\/robotica-facil-con-ros2.es\/?p=3821","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/robotica-facil-con-ros2.es\/?p=3821#blogposting","name":"ROS2. Publicadores y Subscriptores -","headline":"ROS2. Publicadores y Subscriptores","author":{"@id":"https:\/\/robotica-facil-con-ros2.es\/?author=1#author"},"publisher":{"@id":"https:\/\/robotica-facil-con-ros2.es\/#person"},"image":{"@type":"ImageObject","url":"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/topics.gif","width":955,"height":506,"caption":"topics"},"datePublished":"2022-08-15T16:52:30+00:00","dateModified":"2026-07-06T07:13:50+00:00","inLanguage":"es-ES","mainEntityOfPage":{"@id":"https:\/\/robotica-facil-con-ros2.es\/?p=3821#webpage"},"isPartOf":{"@id":"https:\/\/robotica-facil-con-ros2.es\/?p=3821#webpage"},"articleSection":"ROS2, PUBLICADORES, SUBSCRIPTORES, TOPICS"},{"@type":"BreadcrumbList","@id":"https:\/\/robotica-facil-con-ros2.es\/?p=3821#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/robotica-facil-con-ros2.es#listItem","position":1,"name":"Inicio","item":"https:\/\/robotica-facil-con-ros2.es","nextItem":{"@type":"ListItem","@id":"https:\/\/robotica-facil-con-ros2.es\/?cat=5#listItem","name":"ROS2"}},{"@type":"ListItem","@id":"https:\/\/robotica-facil-con-ros2.es\/?cat=5#listItem","position":2,"name":"ROS2","item":"https:\/\/robotica-facil-con-ros2.es\/?cat=5","nextItem":{"@type":"ListItem","@id":"https:\/\/robotica-facil-con-ros2.es\/?p=3821#listItem","name":"ROS2. Publicadores y Subscriptores"},"previousItem":{"@type":"ListItem","@id":"https:\/\/robotica-facil-con-ros2.es#listItem","name":"Inicio"}},{"@type":"ListItem","@id":"https:\/\/robotica-facil-con-ros2.es\/?p=3821#listItem","position":3,"name":"ROS2. Publicadores y Subscriptores","previousItem":{"@type":"ListItem","@id":"https:\/\/robotica-facil-con-ros2.es\/?cat=5#listItem","name":"ROS2"}}]},{"@type":"Person","@id":"https:\/\/robotica-facil-con-ros2.es\/#person","name":"Jose Enrique Cabrera","image":{"@type":"ImageObject","@id":"https:\/\/robotica-facil-con-ros2.es\/?p=3821#personImage","url":"https:\/\/secure.gravatar.com\/avatar\/7fb8a5b8671a5fde1ab097847642f4ec46f3150e6ef27ed7fe4f7055bb02a052?s=96&d=mm&r=g","width":96,"height":96,"caption":"Jose Enrique Cabrera"}},{"@type":"Person","@id":"https:\/\/robotica-facil-con-ros2.es\/?author=1#author","url":"https:\/\/robotica-facil-con-ros2.es\/?author=1","name":"Jose Enrique Cabrera","image":{"@type":"ImageObject","@id":"https:\/\/robotica-facil-con-ros2.es\/?p=3821#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/7fb8a5b8671a5fde1ab097847642f4ec46f3150e6ef27ed7fe4f7055bb02a052?s=96&d=mm&r=g","width":96,"height":96,"caption":"Jose Enrique Cabrera"}},{"@type":"WebPage","@id":"https:\/\/robotica-facil-con-ros2.es\/?p=3821#webpage","url":"https:\/\/robotica-facil-con-ros2.es\/?p=3821","name":"ROS2. Publicadores y Subscriptores -","description":"1 Introducci\u00f3nEn ROS los nodos se comunican entre s\u00ed empleando topics. El concepto de topic podr\u00eda asemejarse a un bus de datos al que se le asigna un nombre, pudiendo algunos nodos (denominados publicadores) conectarse al mismo para escribir mensajes y otros (denominados subscriptores) para recibirlos.En este art\u00edculo vamos a crear un nuevo paquete que","inLanguage":"es-ES","isPartOf":{"@id":"https:\/\/robotica-facil-con-ros2.es\/#website"},"breadcrumb":{"@id":"https:\/\/robotica-facil-con-ros2.es\/?p=3821#breadcrumblist"},"author":{"@id":"https:\/\/robotica-facil-con-ros2.es\/?author=1#author"},"creator":{"@id":"https:\/\/robotica-facil-con-ros2.es\/?author=1#author"},"image":{"@type":"ImageObject","url":"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/topics.gif","@id":"https:\/\/robotica-facil-con-ros2.es\/?p=3821\/#mainImage","width":955,"height":506,"caption":"topics"},"primaryImageOfPage":{"@id":"https:\/\/robotica-facil-con-ros2.es\/?p=3821#mainImage"},"datePublished":"2022-08-15T16:52:30+00:00","dateModified":"2026-07-06T07:13:50+00:00"},{"@type":"WebSite","@id":"https:\/\/robotica-facil-con-ros2.es\/#website","url":"https:\/\/robotica-facil-con-ros2.es\/","description":"Rob\u00f3tica con ROS2","inLanguage":"es-ES","publisher":{"@id":"https:\/\/robotica-facil-con-ros2.es\/#person"}}]},"og:locale":"es_ES","og:site_name":"- ROS2. Publicadores y Subscriptores","og:type":"article","og:title":"ROS2. Publicadores y Subscriptores -","og:description":"1 Introducci\u00f3nEn ROS los nodos se comunican entre s\u00ed empleando topics. El concepto de topic podr\u00eda asemejarse a un bus de datos al que se le asigna un nombre, pudiendo algunos nodos (denominados publicadores) conectarse al mismo para escribir mensajes y otros (denominados subscriptores) para recibirlos.En este art\u00edculo vamos a crear un nuevo paquete que","og:url":"https:\/\/robotica-facil-con-ros2.es\/?p=3821","og:image":"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/topics.gif","og:image:secure_url":"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/topics.gif","og:image:width":955,"og:image:height":506,"article:published_time":"2022-08-15T16:52:30+00:00","article:modified_time":"2026-07-06T07:13:50+00:00","twitter:card":"summary_large_image","twitter:site":"@RFconROS2","twitter:title":"ROS2. Publicadores y Subscriptores -","twitter:description":"1 Introducci\u00f3nEn ROS los nodos se comunican entre s\u00ed empleando topics. El concepto de topic podr\u00eda asemejarse a un bus de datos al que se le asigna un nombre, pudiendo algunos nodos (denominados publicadores) conectarse al mismo para escribir mensajes y otros (denominados subscriptores) para recibirlos.En este art\u00edculo vamos a crear un nuevo paquete que","twitter:creator":"@RFconROS2","twitter:image":"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/topics.gif","twitter:label1":"Escrito por","twitter:data1":"Jose Enrique Cabrera","twitter:label2":"Tiempo de lectura estimado","twitter:data2":"7 minutos"},"aioseo_meta_data":{"post_id":"3821","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[],"defaultGraph":"","defaultPostTypeGraph":""},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2022-09-08 20:54:24","updated":"2026-07-06 07:28:53","seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/robotica-facil-con-ros2.es\" title=\"Inicio\">Inicio<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/robotica-facil-con-ros2.es\/?cat=5\" title=\"ROS2\">ROS2<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tROS2. Publicadores y Subscriptores\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Inicio","link":"https:\/\/robotica-facil-con-ros2.es"},{"label":"ROS2","link":"https:\/\/robotica-facil-con-ros2.es\/?cat=5"},{"label":"ROS2. Publicadores y Subscriptores","link":"https:\/\/robotica-facil-con-ros2.es\/?p=3821"}],"rttpg_featured_image_url":{"full":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/topics.gif",955,506,false],"landscape":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/topics.gif",955,506,false],"portraits":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/topics.gif",955,506,false],"thumbnail":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/topics-150x150.gif",150,150,true],"medium":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/topics-300x159.gif",300,159,true],"large":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/topics.gif",955,506,false],"1536x1536":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/topics.gif",955,506,false],"2048x2048":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/topics.gif",955,506,false]},"rttpg_author":{"display_name":"Jose Enrique Cabrera","author_link":"https:\/\/robotica-facil-con-ros2.es\/?author=1"},"rttpg_comment":0,"rttpg_category":"<a href=\"https:\/\/robotica-facil-con-ros2.es\/?cat=5\" rel=\"category\">ROS2<\/a>","rttpg_excerpt":"1 Introducci\u00f3n En ROS los nodos se comunican entre s\u00ed empleando topics. El concepto de topic podr\u00eda asemejarse a un bus de datos al que se le asigna un nombre, pudiendo algunos nodos (denominados publicadores) conectarse al mismo para escribir mensajes\u00a0 y otros\u00a0 (denominados subscriptores) para recibirlos. En este art\u00edculo vamos a crear un nuevo&hellip;","_links":{"self":[{"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/posts\/3821","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3821"}],"version-history":[{"count":223,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/posts\/3821\/revisions"}],"predecessor-version":[{"id":9320,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/posts\/3821\/revisions\/9320"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/media\/3897"}],"wp:attachment":[{"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3821"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3821"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3821"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}