{"id":3282,"date":"2022-08-05T12:44:12","date_gmt":"2022-08-05T12:44:12","guid":{"rendered":"https:\/\/robotica-facil-con-ros2.es\/?p=3282"},"modified":"2022-08-19T18:59:58","modified_gmt":"2022-08-19T18:59:58","slug":"gazebo-como-mostrar-tu-modelo-urdf","status":"publish","type":"post","link":"https:\/\/robotica-facil-con-ros2.es\/?p=3282","title":{"rendered":"GAZEBO. C\u00f3mo a\u00f1adir un modelo URDF a una simulaci\u00f3n"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"3282\" class=\"elementor elementor-3282\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-660e6f5 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"660e6f5\" 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-1f117fa\" data-id=\"1f117fa\" 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-dd4eae7 elementor-widget elementor-widget-text-editor\" data-id=\"dd4eae7\" 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>\n<p>En este art\u00edculo vas a aprender c\u00f3mo hacer aparecer (spawn) un modelo URDF en GAZEBO.<\/p>\n<p>B\u00e1sicamente hay dos formas de hacerlo:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Usando el servicio <b style=\"font-style: italic;\">\/spawn_entity <\/b>del paquete <i>gazebo_msgs<\/i>.<\/li>\n<li>Usando el nodo <strong><em>spawn_entity.py<\/em><\/strong>&nbsp; del paquete <i>gazebo_ros.<\/i><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>En los siguientes apartados vamos a ver como a\u00f1adir a nuestra simulaci\u00f3n un modelo URDF muy simple, consistente \u00fanicamente en una esfera, empleando ambos m\u00e9todos.<\/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-eee71d2 elementor-widget elementor-widget-text-editor\" data-id=\"eee71d2\" 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 Mostrar el modelo URDF usando el servicio \/spawn_entity<\/h3><p>Este servicio, que forma parte del paquete <em>gazebo_msgs<\/em>, permite mostrar una entidad en Gazebo. La entidad no tiene por qu\u00e9 ser necesariamente el modelo de un objeto o un robot, pudiendo ser otros elementos de Gazebo, por ejemplo una fuente de luz.<\/p><p>En la siguiente imagen se muestra la informaci\u00f3n que hay que pasarle al servicio y c\u00f3mo es su respuesta.\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-876bc37 elementor-widget elementor-widget-image\" data-id=\"876bc37\" 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=\"975\" height=\"533\" src=\"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3828-spawn_entity-service.png\" class=\"attachment-full size-full wp-image-3720\" alt=\"gazebo spawn_entity service\" \/>\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-4ce2c9e elementor-widget elementor-widget-text-editor\" data-id=\"4ce2c9e\" 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>2.1 Desde la l\u00ednea de comando<\/h4><p>Desde el terminal podemos llamar al servicio \/spawn_entity mediante el comando ros2 service call.<\/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-f3c9d0d elementor-widget elementor-widget-text-editor\" data-id=\"f3c9d0d\" 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>Para ello primero lanzamos Gazebo si no lo hemos hecho:<\/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-c343de8 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"c343de8\" 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-c343de8\"\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-bash copy-to-clipboard\"data-previewers=\"\"><code>ros2 launch gazebo_ros gazebo.launch.py<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_c343de8 = 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_c343de8();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_c343de8 );\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-14d54d9 elementor-widget elementor-widget-text-editor\" data-id=\"14d54d9\" 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 a continuaci\u00f3n llamamos al servicio:<\/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-4064f88 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"4064f88\" 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-4064f88\"\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-bash copy-to-clipboard\"data-previewers=\"\"><code>ros2 service call \/spawn_entity &#039;gazebo_msgs\/SpawnEntity&#039; &#039;{name: &quot;urdf_ball&quot;, xml: &quot;&lt;?xml version=\\&quot;1.0\\&quot; ?&gt;&lt;robot name=\\&quot;will_be_ignored\\&quot;&gt;&lt;link name=\\&quot;link\\&quot;&gt;&lt;visual&gt;&lt;geometry&gt;&lt;sphere radius=\\&quot;0.5\\&quot;\/&gt;&lt;\/geometry&gt;&lt;\/visual&gt;&lt;collision&gt;&lt;geometry&gt;&lt;sphere radius=\\&quot;0.5\\&quot;\/&gt;&lt;\/geometry&gt;&lt;\/collision&gt;&lt;inertial&gt;&lt;mass value=\\&quot;1\\&quot;\/&gt;&lt;inertia ixx=\\&quot;1\\&quot; ixy=\\&quot;0.0\\&quot; ixz=\\&quot;0.0\\&quot; iyy=\\&quot;1\\&quot; iyz=\\&quot;0.0\\&quot; izz=\\&quot;1\\&quot;\/&gt;&lt;\/inertial&gt;&lt;\/link&gt;&lt;\/robot&gt;&quot;, robot_namespace: &quot;ball_namespace&quot;, initial_pose: {position: {x: 0.0, y: 0.0, z: 0.5}, orientation: {x: 0.0, y: 0.0, z: 0.0, w: 0.0}}, reference_frame: &quot;world&quot;}&#039;<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_4064f88 = 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_4064f88();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_4064f88 );\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-0fe0479 elementor-widget elementor-widget-text-editor\" data-id=\"0fe0479\" 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>2.2 Desde un nodo ROS2<\/h4><p>El siguiente c\u00f3digo muestra un ejemplo de c\u00f3mo llamar al servicio \/spawn_entity desde un nodo.<\/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-1c4aec9 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"1c4aec9\" 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-1c4aec9\"\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 gazebo_msgs.srv import SpawnEntity\nimport rclpy\nfrom rclpy.node import Node\n\n\nclass ServiceClientAsync(Node):\n\n    def __init__(self):\n        super().__init__(&#039;service_client_async&#039;)\n        self.client = self.create_client(SpawnEntity, &#039;spawn_entity&#039;)\n        while not self.client.wait_for_service(timeout_sec=1.0):\n            self.get_logger().info(&#039;service not available, waiting again...&#039;)\n\n\n    def send_request(self, request_data):\n        self.future = self.client.call_async(request_data)\n        rclpy.spin_until_future_complete(self, self.future)\n        return self.future.result()\n\n\ndef main(args=None):\n    rclpy.init(args=args)\n\n    request = SpawnEntity.Request()\n    request.name = &quot;urdf_ball&quot;\n    request.xml = &quot;&lt;?xml version=\\&quot;1.0\\&quot; ?&gt;&lt;robot name=\\&quot;will_be_ignored\\&quot;&gt;&lt;link name=\\&quot;link\\&quot;&gt;&lt;visual&gt;&lt;geometry&gt;&lt;sphere radius=\\&quot;0.5\\&quot;\/&gt;&lt;\/geometry&gt;&lt;\/visual&gt;&lt;collision&gt;&lt;geometry&gt;&lt;sphere radius=\\&quot;0.5\\&quot;\/&gt;&lt;\/geometry&gt;&lt;\/collision&gt;&lt;inertial&gt;&lt;mass value=\\&quot;1\\&quot;\/&gt;&lt;inertia ixx=\\&quot;1\\&quot; ixy=\\&quot;0.0\\&quot; ixz=\\&quot;0.0\\&quot; iyy=\\&quot;1\\&quot; iyz=\\&quot;0.0\\&quot; izz=\\&quot;1\\&quot;\/&gt;&lt;\/inertial&gt;&lt;\/link&gt;&lt;\/robot&gt;&quot;\n    request.robot_namespace = &quot;ball_namespace&quot;\n    request.reference_frame = &quot;world&quot;\n    request.initial_pose.position.x = 0.0\n    request.initial_pose.position.y = 0.0\n    request.initial_pose.position.z = 0.0\n    request.initial_pose.orientation.x = 0.0\n    request.initial_pose.orientation.y = 0.0\n    request.initial_pose.orientation.z = 0.0\n    request.initial_pose.orientation.w = 0.0\n\n    service_client = ServiceClientAsync()\n    response = service_client.send_request(request)\n\n    service_client.get_logger().info(\n        &#039;Result of spawing service: %s , %s&#039; %\n        (response.success, response.status_message))\n\n    service_client.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_1c4aec9 = 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_1c4aec9();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_1c4aec9 );\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-11a01c9 elementor-widget elementor-widget-text-editor\" data-id=\"11a01c9\" 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 Mostrar el modelo URDF usando el nodo spawn_entity<\/h3><p>Como ya hemos indicado, otra forma de a\u00f1adir nuestro modelo URDF a una simulaci\u00f3n de Gazebo es mediante el nodo <strong><em>spawn_entity.py<\/em><\/strong> que forma parte del paquete <em>gazebo_ros<\/em>.<\/p><p>Este nodo admite los argumentos que se indican en la siguiente tabla los cuales, entre otras cosas, permiten definir el origen del c\u00f3digo XML que define nuestro modelo (admite tanto URDF como SDF) y su pose inicial.<\/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-25c107c elementor-widget elementor-widget-image\" data-id=\"25c107c\" 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<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"1024\" height=\"878\" src=\"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/Gazebo-spawn_entity-arguments-1024x878.png\" class=\"attachment-large size-large wp-image-3688\" alt=\"Gazebo argumentos de spawn_entity\" \/>\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Argumentos admitidos por el nodo spawn_entity.py<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\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-042b895 elementor-widget elementor-widget-text-editor\" data-id=\"042b895\" 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 Desde la l\u00ednea de comando<\/h4><p>A continuaci\u00f3n se muestran algunos ejemplos de c\u00f3mo a\u00f1adir un modelo a la simulaci\u00f3n usando el nodo <strong><em>spawn_entity.py<\/em><\/strong>\u00a0 con diferentes or\u00edgenes desde donde tomar la descripci\u00f3n XML del mismo.<\/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-9146c42 elementor-widget elementor-widget-text-editor\" data-id=\"9146c42\" 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<h6>Cargando los datos del modelo desde un archivo<\/h6>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3461f70 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"3461f70\" 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-3461f70\"\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-bash copy-to-clipboard\"data-previewers=\"\"><code>ros2 run gazebo_ros spawn_entity.py -entity myentity -x 0 -y 0 -z 0 -R 0 -P 0 -Y 0 -file \/path\/to\/entity\/file<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_3461f70 = 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_3461f70();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_3461f70 );\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-3db35af elementor-widget elementor-widget-text-editor\" data-id=\"3db35af\" 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<h6>Cargando los datos del modelo usando la entrada stdin del terminal.<\/h6>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-35cac5e elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"35cac5e\" 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-35cac5e\"\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-bash copy-to-clipboard\"data-previewers=\"\"><code>cat \/path\/to\/entity\/file | ros2 run gazebo_ros spawn_entity.py -entity new_model -x 0 -y 0 -z 0 -stdin<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_35cac5e = 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_35cac5e();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_35cac5e );\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-bf1174f elementor-widget elementor-widget-text-editor\" data-id=\"bf1174f\" 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<h6>Cargando los datos del modelo desde la base de datos de Gazebo.<\/h6>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4100dc6 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"4100dc6\" 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-4100dc6\"\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-bash copy-to-clipboard\"data-previewers=\"\"><code>ros2 run gazebo_ros spawn_entity.py -entity TheArm -x 0 -y 0 -z 0 -R 0 -P 0 -Y 0 -database simple_arm<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_4100dc6 = 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_4100dc6();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_4100dc6 );\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-cd76818 elementor-widget elementor-widget-text-editor\" data-id=\"cd76818\" 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<h6>Cargando desde un topic los datos del modelo.<\/h6>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0d00af0 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"0d00af0\" 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-0d00af0\"\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-bash copy-to-clipboard\"data-previewers=\"\"><code>ros2 run gazebo_ros spawn_entity.py -entity a_ball -topic \/robot_description<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_0d00af0 = 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_0d00af0();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_0d00af0 );\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-d0c6142 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"d0c6142\" 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-d0c6142\"\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-bash copy-to-clipboard\"data-previewers=\"\"><code>ros2 topic pub -1 --qos-durability transient_local \/robot_description &#039;std_msgs\/String&#039; &#039;{data: &quot;&lt;?xml version=\\&quot;1.0\\&quot; ?&gt;&lt;robot name=\\&quot;will_be_ignored\\&quot;&gt;&lt;link name=\\&quot;link\\&quot;&gt;&lt;visual&gt;&lt;geometry&gt;&lt;sphere radius=\\&quot;0.5\\&quot;\/&gt;&lt;\/geometry&gt;&lt;\/visual&gt;&lt;collision&gt;&lt;geometry&gt;&lt;sphere radius=\\&quot;0.5\\&quot;\/&gt;&lt;\/geometry&gt;&lt;\/collision&gt;&lt;inertial&gt;&lt;mass value=\\&quot;1\\&quot;\/&gt;&lt;inertia ixx=\\&quot;1\\&quot; ixy=\\&quot;0.0\\&quot; ixz=\\&quot;0.0\\&quot; iyy=\\&quot;1\\&quot; iyz=\\&quot;0.0\\&quot; izz=\\&quot;1\\&quot;\/&gt;&lt;\/inertial&gt;&lt;\/link&gt;&lt;\/robot&gt;&quot;}&#039;<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_d0c6142 = 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_d0c6142();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_d0c6142 );\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-1959059 elementor-widget elementor-widget-text-editor\" data-id=\"1959059\" 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 Desde un archivo launch en ROS2<\/h4><p>A continuaci\u00f3n se muestra un ejemplo de c\u00f3digo a incluir en un archivo launch para mostrar un modelo URDF en Gazebo, el cual realiza las siguientes acciones:<\/p><ol><li style=\"list-style-type: none;\"><ol><li style=\"list-style-type: none;\"><ol><li>Obtiene la ruta a nuestro archivo con la informaci\u00f3n URDF de nuestro modelo.<\/li><li>Crea un objeto <i>launch.ros_action.node<\/i> para ejecutar <span style=\"color: #0170b9;\"><i><b>robot_state publisher<\/b><\/i><\/span> al cual le pasamos mediante\u00a0 su\u00a0 par\u00e1metro <i>robot_description<\/i>\u00a0 el\u00a0 c\u00f3digo\u00a0 URDF, que obtenemos\u00a0 ejecutando &#8220;xacro &lt; urdf_file &gt;&#8221; mediante el uso de <i>Command<\/i>. El nodo <i>robot_state_publisher<\/i> se encarga de resolver la cinem\u00e1tica directa del modelo.<\/li><li>Crea un objeto <i>launch.ros_action.node<\/i> para ejecutar <span style=\"color: #0170b9;\"><i><b>spawn_entity.py<\/b><\/i><\/span>, que forma parte del paquete <i>gazebo_ros<\/i>. Este script lee el c\u00f3digo URDF que publica el nodo <i>robot_state_publisher<\/i> y lo muestra en Gazebo.<\/li><li>Crea un objeto <i>IncludeLaunchDescription<\/i> para incluir la ejecuci\u00f3n del archivo <i>launch<\/i> <span style=\"color: #0170b9;\"><i><b>gazebo.launch.py<\/b><\/i><\/span>, del paquete <i>gazebo_ros<\/i>, que lanza la ejecuci\u00f3n de Gazebo.<\/li><\/ol><\/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-3863a11 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"3863a11\" 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-3863a11\"\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 xacro, os\nfrom launch import LaunchDescription\nfrom launch.actions import IncludeLaunchDescription\nfrom launch.launch_description_sources import PythonLaunchDescriptionSource\nfrom launch.substitutions import Command, PathJoinSubstitution\nfrom launch_ros.substitutions import FindPackageShare\nfrom launch_ros.actions import Node\nfrom ament_index_python import get_package_prefix, get_package_share_directory\n\n\ndef generate_launch_description():\n\n    # Establece los nombres de nuestro paquete y del archivo con el modelo.\n    package_name = &#039;my_package&#039;\n    urdf_file_name = &#039;my_model.urdf&#039;\n\n\n    # DESCOMENTAR si el codigo URDF utiliza archivos mesh donde la ruta al\n    # archivo de malla es relativa, indicandose de la forma: \n    # &lt;mesh filename =&quot;package:\/\/mi_paquete\/....\/archivo_mesh&quot; \/&gt;\n    # --------------------------------------------------------------------------\n    #gazebo_model_path = os.path.join(get_package_prefix(package_name), &#039;share&#039;)\n\n\n    # DESCOMENTAR si el codigo URDF utiliza archivos mesh donde la ruta al\n    # archivo de malla es relativa a la ubicaci&oacute;n del archivo setup.py, \n    # indicandose de la forma: &lt;mesh filename =&quot;package:\/\/....\/archivo_mesh&quot; \/&gt;\n    # --------------------------------------------------------------------------\n    #gazebo_model_path = get_package_share_directory(package_name)\n\n\n    # DESCOMENTAR si el codigo URDF utiliza archivos mesh donde la ruta al\n    # archivo de malla se indica de forma relativa.\n    # --------------------------------------------------------------------------\n    #if &#039;GAZEBO_MODEL_PATH&#039; in os.environ:\n    #    os.environ[&#039;GAZEBO_MODEL_PATH&#039;] += os.pathsep + gazebo_model_path\n    #else:\n    #    os.environ[&#039;GAZEBO_MODEL_PATH&#039;] =  gazebo_model_path\n\n\n    # Obtiene la ruta al archivo que contiene la informaci&oacute;n de nuestro modelo.\n    urdf_file_path = os.path.join(\n        get_package_share_directory(package_name), &#039;urdf&#039;, urdf_file_name)\n\n\n    # Crea y configura el nodo ROBOT_STATE_PUBLISHER, el cual lee el c&oacute;digo URDF \n    # del modelo y resuelve la cinem&aacute;tica directa del robot a partir de la \n    # informaci&oacute;n que proporciona el nodo JOINT_STATE_PUBLISHER_GUI. \n    # Utiliza Command para ejecutar xacro y obtener el c&oacute;digo URDF.\n    node_robot_state_publisher = Node(\n        package=&#039;robot_state_publisher&#039;,\n        executable=&#039;robot_state_publisher&#039;,\n        name=&#039;robot_state_publisher&#039;,\n        parameters=[{&#039;robot_description&#039;: Command([&#039;xacro &#039;, urdf_file_path])}],\n        arguments=[&#039;--ros-args&#039;, &#039;--log-level&#039;, &#039;error&#039;],\n        output=&#039;screen&#039;)\n    \n\n    # Crea y configura el nodo SPAWN_ENTITY, que es el que va a cargar y mostrar\n    # el modelo en Gazebo.\n    node_spawn_entity = Node(\n        package=&#039;gazebo_ros&#039;, \n        executable=&#039;spawn_entity.py&#039;,\n        arguments=[\n            &#039;-entity&#039;, urdf_file_name,\n            &#039;-topic&#039;, &#039;robot_description&#039;,\n            &#039;-x&#039;, &#039;0.0&#039;,\n            &#039;-y&#039;, &#039;0.0&#039;,\n            &#039;-z&#039;, &#039;0.0&#039;,\n            &#039;-R&#039;, &#039;0.0&#039;,\n            &#039;-P&#039;, &#039;0.0&#039;,\n            &#039;-Y&#039;, &#039;0.0&#039;],\n        output=&#039;screen&#039;)\n\n\n    # Incluye la ejecuci&oacute;n del archivo launch gazebo.launch.py, que forma parte\n    # del paquete gazebo_ros.\n    gazebo = IncludeLaunchDescription(\n                PythonLaunchDescriptionSource([PathJoinSubstitution(\n                    [FindPackageShare(&#039;gazebo_ros&#039;), &#039;launch&#039;, &#039;gazebo.launch.py&#039;])]),\n             )\n\n\n    # Devuelve un objeto LaunchDescription con las acciones a realizar.\n    return LaunchDescription([\n        gazebo,\n        node_robot_state_publisher,\n        node_spawn_entity,\n    ])\n<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_3863a11 = 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_3863a11();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_3863a11 );\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-063a952 elementor-widget elementor-widget-text-editor\" data-id=\"063a952\" 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 Ejemplo<\/h3><p>Puedes descargar el paquete <a href=\"https:\/\/github.com\/joseecm-github\/py_gazebo_spawn_example\">py_gazebo_spawn_example<\/a> de Github que contiene un ejemplo de c\u00f3mo hacer aparecer un modelo en nuestra simulaci\u00f3n en Gazebo usando un archivo<em> launch<\/em> o usando el servicio <em>spawn_entity<\/em> desde un nodo de ROS2.<\/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-21c91a5 elementor-widget elementor-widget-text-editor\" data-id=\"21c91a5\" 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>Para ello, en el terminal, ve a la carpeta src de tu espacio de trabajo y ejecuta la siguiente instrucci\u00f3n:<\/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-62a1de2 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"62a1de2\" 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-62a1de2\"\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-bash copy-to-clipboard\"data-previewers=\"\"><code>git clone https:\/\/github.com\/joseecm-github\/py_gazebo_spawn_example<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_62a1de2 = 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_62a1de2();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_62a1de2 );\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-03ea7d4 elementor-widget elementor-widget-text-editor\" data-id=\"03ea7d4\" 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 a continuaci\u00f3n compila el paquete:<\/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-6d42f85 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"6d42f85\" 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-6d42f85\"\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-bash copy-to-clipboard\"data-previewers=\"\"><code>cd ..\ncolcon build --packages-select py_gazebo_spawn_example\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_6d42f85 = 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_6d42f85();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_6d42f85 );\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-5fb3231 elementor-widget elementor-widget-text-editor\" data-id=\"5fb3231\" 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>Para hacer aparecer el modelo usando un archivo <em>launch<\/em> ejecuta 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-1bcf165 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"1bcf165\" 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-1bcf165\"\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-bash copy-to-clipboard\"data-previewers=\"\"><code>ros2 launch py_gazebo_spawn_example spawn.launch.py\n<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_1bcf165 = 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_1bcf165();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_1bcf165 );\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-7dc0625 elementor-widget elementor-widget-text-editor\" data-id=\"7dc0625\" 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>Para ver como funciona usando el servicio primero cerramos Gazebo pulsando en el terminal CTRL+C y lo volvemos a arrancar ejecutando:<\/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-570a6ed elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"570a6ed\" 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-570a6ed\"\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-bash copy-to-clipboard\"data-previewers=\"\"><code>ros2 launch gazebo_ros gazebo.launch.py\n<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_570a6ed = 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_570a6ed();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_570a6ed );\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-e09e277 elementor-widget elementor-widget-text-editor\" data-id=\"e09e277\" 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 desde otro terminal lanzamos el nodo que llama al servicio:<\/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-5915896 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"5915896\" 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-5915896\"\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-bash copy-to-clipboard\"data-previewers=\"\"><code>ros2 run py_gazebo_spawn_example spawn_urdf\n<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_5915896 = 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_5915896();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_5915896 );\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\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 este art\u00edculo vas a aprender c\u00f3mo hacer aparecer (spawn) un modelo URDF en GAZEBO. B\u00e1sicamente hay dos formas de hacerlo: Usando el servicio \/spawn_entity del paquete gazebo_msgs. Usando el nodo spawn_entity.py&nbsp; del paquete gazebo_ros. En los siguientes apartados vamos a ver como a\u00f1adir a nuestra simulaci\u00f3n un modelo URDF muy simple, consistente [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4142,"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,10],"tags":[12,11],"class_list":["post-3282","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ros2","category-simulacion","tag-gazebo","tag-urdf"],"aioseo_notices":[],"rttpg_featured_image_url":{"full":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3828p-gazebo-spawn-urdf.png",1850,1055,false],"landscape":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3828p-gazebo-spawn-urdf.png",1850,1055,false],"portraits":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3828p-gazebo-spawn-urdf.png",1850,1055,false],"thumbnail":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3828p-gazebo-spawn-urdf-150x150.png",150,150,true],"medium":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3828p-gazebo-spawn-urdf-300x171.png",300,171,true],"large":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3828p-gazebo-spawn-urdf-1024x584.png",1024,584,true],"1536x1536":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3828p-gazebo-spawn-urdf-1536x876.png",1536,876,true],"2048x2048":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3828p-gazebo-spawn-urdf.png",1850,1055,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> <a href=\"https:\/\/robotica-facil-con-ros2.es\/?cat=10\" rel=\"category\">SIMULACI\u00d3N<\/a>","rttpg_excerpt":"1. Introducci\u00f3n En este art\u00edculo vas a aprender c\u00f3mo hacer aparecer (spawn) un modelo URDF en GAZEBO. B\u00e1sicamente hay dos formas de hacerlo: Usando el servicio \/spawn_entity del paquete gazebo_msgs. Usando el nodo spawn_entity.py&nbsp; del paquete gazebo_ros. En los siguientes apartados vamos a ver como a\u00f1adir a nuestra simulaci\u00f3n un modelo URDF muy simple, consistente&hellip;","_links":{"self":[{"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/posts\/3282","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=3282"}],"version-history":[{"count":293,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/posts\/3282\/revisions"}],"predecessor-version":[{"id":4144,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/posts\/3282\/revisions\/4144"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/media\/4142"}],"wp:attachment":[{"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3282"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3282"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3282"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}