{"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":"2022-09-15T15:32:27","modified_gmt":"2022-09-15T15:32:27","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\">\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\">\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-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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 &#8220;<i>topic&#8221;<\/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<\/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-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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<\/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-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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<\/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-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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<\/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-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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<\/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-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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<\/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-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h4>3.1 Usando una clase<\/h4>\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-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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-xonokai\"\n            data-dark-theme=\"mdp-theme-xonokai\"\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<\/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-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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<\/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-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h4>3.2 Usando una funci\u00f3n local<\/h4>\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-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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-xonokai\"\n            data-dark-theme=\"mdp-theme-xonokai\"\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<\/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-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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<\/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-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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<\/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-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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<\/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-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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<\/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-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h4>4.1 Usando una clase<\/h4>\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-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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-xonokai\"\n            data-dark-theme=\"mdp-theme-xonokai\"\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<\/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-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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<\/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-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h4>4.2 Usando una funci\u00f3n local<\/h4>\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-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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-xonokai\"\n            data-dark-theme=\"mdp-theme-xonokai\"\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<\/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-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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<\/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-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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<\/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-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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-xonokai\"\n            data-dark-theme=\"mdp-theme-xonokai\"\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<\/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-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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<\/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-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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-xonokai\"\n            data-dark-theme=\"mdp-theme-xonokai\"\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<\/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-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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<\/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-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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<\/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-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Seguidamente ejecutamos el subscriptor mediante el siguiente comando:<\/p>\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-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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<\/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-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Y finalmente abrimos otro terminal y ejecutamos el publicador:<\/p>\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-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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<\/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-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\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<\/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-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<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\" \/>\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-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<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\" \/>\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":""}},"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":[],"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":221,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/posts\/3821\/revisions"}],"predecessor-version":[{"id":8095,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/posts\/3821\/revisions\/8095"}],"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}]}}