{"id":9234,"date":"2026-07-04T12:00:00","date_gmt":"2026-07-04T12:00:00","guid":{"rendered":"https:\/\/robotica-facil-con-ros2.es\/?p=9234"},"modified":"2026-07-05T15:03:18","modified_gmt":"2026-07-05T15:03:18","slug":"sdf-world-anatomy","status":"publish","type":"post","link":"https:\/\/robotica-facil-con-ros2.es\/?p=9234","title":{"rendered":"Anatom\u00eda de un mundo SDF en Gazebo Jetty desde cero"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"9234\" class=\"elementor elementor-9234\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-e88bbdc elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"e88bbdc\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5f55991\" data-id=\"5f55991\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-e402e73 elementor-widget elementor-widget-text-editor\" data-id=\"e402e73\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<p>Cuando lanzas <code>ros2 launch ros_gz_sim gz_sim.launch.py<\/code> con un mundo ya hecho, Gazebo simplemente funciona: aparece el suelo, la luz ya est&aacute; puesta y la c&aacute;mara mira donde esperabas. Pero en cuanto quieres cambiar algo &mdash;otra gravedad, un suelo distinto, una c&aacute;mara que arranque mirando a tu robot&mdash; acabas editando un fichero <code>.sdf<\/code> sin tener claro qu&eacute; etiqueta hace qu&eacute;. Este post desmonta la <strong>anatom&iacute;a de un mundo SDF en Gazebo Jetty<\/strong>: el mapa completo de qu&eacute; elementos existen, c&oacute;mo se organizan y d&oacute;nde encaja cada uno.<\/p>\n<p>Es el primer post de una <strong>serie dedicada a los ficheros SDF<\/strong>: aqu&iacute; construyes el esqueleto m&iacute;nimo funcional y te llevas el mapa; cada elemento tendr&aacute; despu&eacute;s su propio post con todos sus atributos y ejemplos.<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-6ea3f6f elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6ea3f6f\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b650106\" data-id=\"b650106\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5c0dd4e elementor-widget elementor-widget-text-editor\" data-id=\"5c0dd4e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<h4 id=\"que-vas-a-aprender\">Qu&eacute; vas a aprender<\/h4>\n<p>Al terminar tendr&aacute;s un mundo Gazebo Jetty escrito enteramente por ti y el mapa completo de todo lo que puede aparecer en un fichero <code>.sdf<\/code>.<\/p>\n<ul>\n<li>Qu&eacute; puede envolver el elemento ra&iacute;z <code>&lt;sdf&gt;<\/code>: mundos, modelos, luces y actores independientes.<\/li>\n<li>El &aacute;rbol completo de hijos directos de <code>&lt;world&gt;<\/code> y su orden recomendado.<\/li>\n<li>El subconjunto m&iacute;nimo imprescindible para que un mundo funcione de verdad.<\/li>\n<li>Qu&eacute; post de la serie desarrolla cada elemento en detalle.<\/li>\n<\/ul>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-08c6edd elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"08c6edd\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-07d3735\" data-id=\"07d3735\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-42eb707 elementor-widget elementor-widget-text-editor\" data-id=\"42eb707\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<h4 id=\"indice-del-post\">&Iacute;ndice del post<\/h4>\n<ul>\n<li><a href=\"#que-vas-a-aprender\">Qu&eacute; vas a aprender<\/a><\/li>\n<li><a href=\"#requisitos-previos\">Requisitos previos<\/a><\/li>\n<li><a href=\"#el-elemento-raiz-sdf\">El elemento ra&iacute;z &lt;sdf&gt; y los cuatro tipos de fichero<\/a><\/li>\n<li><a href=\"#el-arbol-completo-de-world\">El &aacute;rbol completo de &lt;world&gt;<\/a><\/li>\n<li><a href=\"#un-mundo-minimo-funcional\">Un mundo m&iacute;nimo funcional<\/a><\/li>\n<li><a href=\"#la-serie-post-a-post\">La serie post a post<\/a><\/li>\n<li><a href=\"#codigo-del-ejemplo\">C&oacute;digo del ejemplo<\/a><\/li>\n<li><a href=\"#comprobacion-del-resultado\">Comprobaci&oacute;n del resultado<\/a><\/li>\n<li><a href=\"#experimentos-propuestos\">Experimentos propuestos<\/a><\/li>\n<li><a href=\"#errores-frecuentes\">Errores frecuentes<\/a><\/li>\n<li><a href=\"#resumen-final\">Resumen final<\/a><\/li>\n<\/ul>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-7a35624 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7a35624\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-02ccbc2\" data-id=\"02ccbc2\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-feb1c10 elementor-widget elementor-widget-text-editor\" data-id=\"feb1c10\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<h4 id=\"requisitos-previos\">Requisitos previos<\/h4>\n<p><strong>Software necesario:<\/strong><\/p>\n<ul>\n<li>ROS 2 Lyrical Luth y Gazebo Jetty ya instalados. Si todav&iacute;a no los tienes, sigue primero nuestra gu&iacute;a de instalaci&oacute;n de Gazebo Jetty.<\/li>\n<li>Ning&uacute;n paquete adicional: este ejemplo solo usa <code>rclpy<\/code> y <code>ros_gz_sim<\/code>, ya incluidos con Gazebo Jetty sobre ROS 2.<\/li>\n<\/ul>\n<p><strong>Conocimientos m&iacute;nimos:<\/strong> sintaxis XML b&aacute;sica y haber lanzado al menos un mundo Gazebo desde ROS 2 con <code>ros2 launch<\/code>. No necesitas experiencia previa escribiendo SDF a mano.<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-07d752c elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"07d752c\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b89bb91\" data-id=\"b89bb91\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3a974b6 elementor-widget elementor-widget-text-editor\" data-id=\"3a974b6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<h4 id=\"el-elemento-raiz-sdf\">El elemento ra&iacute;z &lt;sdf&gt; y los cuatro tipos de fichero<\/h4>\n<p>Una idea antes de nada: <strong>absolutamente todo<\/strong> el contenido de un fichero <code>.sdf<\/code> vive dentro de un &uacute;nico elemento ra&iacute;z, <code>&lt;sdf&gt;<\/code> &mdash;nada queda fuera de &eacute;l:<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-027b9ca elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"027b9ca\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-236d00d\" data-id=\"236d00d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-84c3056 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"84c3056\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-84c3056\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-material-dark\"\n            data-dark-theme=\"mdp-theme-material-dark\"\n        >\n            \n                <pre class=\"language-xml line-numbers copy-to-clipboard\"data-previewers=\"\"><code>\n&lt;sdf version=&quot;1.8&quot;&gt;\n  ...\n&lt;\/sdf&gt;<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_84c3056 = 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_84c3056();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_84c3056 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-9d367d5 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"9d367d5\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ec6467f\" data-id=\"ec6467f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b972977 elementor-widget elementor-widget-text-editor\" data-id=\"b972977\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<p>El atributo <code>version<\/code> indica qu&eacute; versi&oacute;n del esquema de SDF usa todo el fichero &mdash;se declara una sola vez, aqu&iacute; arriba&mdash;. Esta serie usa la <code>1.8<\/code>, la que trae Gazebo Jetty. Dentro de <code>&lt;sdf&gt;<\/code> va <strong>exactamente uno<\/strong> de estos cuatro elementos, que definen los cuatro tipos de fichero SDF posibles: <code>&lt;world&gt;<\/code> (un mundo, nuestro caso), <code>&lt;model&gt;<\/code> (un modelo aislado y reutilizable), <code>&lt;light&gt;<\/code> (una luz aislada) o <code>&lt;actor&gt;<\/code> (un personaje animado). Son mutuamente excluyentes: un fichero es una sola de esas cosas.<\/p>\n<p>El ejemplo real de \u00abfichero de modelo\u00bb de este paquete es <code>models\/example_box\/model.sdf<\/code> &mdash;un modelo completo sin ning&uacute;n <code>&lt;world&gt;<\/code> alrededor:<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-43a7045 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"43a7045\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b8a11df\" data-id=\"b8a11df\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-8e501fa elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"8e501fa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-8e501fa\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-material-dark\"\n            data-dark-theme=\"mdp-theme-material-dark\"\n        >\n            \n                <pre class=\"language-xml line-numbers copy-to-clipboard\"data-previewers=\"\"><code>\n&lt;sdf version=&quot;1.8&quot;&gt;\n  &lt;model name=&quot;example_box&quot;&gt;\n    &lt;static&gt;true&lt;\/static&gt;\n    &lt;link name=&quot;link&quot;&gt;\n      &lt;collision name=&quot;collision&quot;&gt;\n        &lt;geometry&gt;&lt;box&gt;&lt;size&gt;0.4 0.4 0.4&lt;\/size&gt;&lt;\/box&gt;&lt;\/geometry&gt;\n      &lt;\/collision&gt;\n      &lt;visual name=&quot;visual&quot;&gt;\n        &lt;geometry&gt;&lt;box&gt;&lt;size&gt;0.4 0.4 0.4&lt;\/size&gt;&lt;\/box&gt;&lt;\/geometry&gt;\n      &lt;\/visual&gt;\n    &lt;\/link&gt;\n  &lt;\/model&gt;\n&lt;\/sdf&gt;<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_8e501fa = 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_8e501fa();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_8e501fa );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-248d138 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"248d138\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5fd51f2\" data-id=\"5fd51f2\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5a96dee elementor-widget elementor-widget-text-editor\" data-id=\"5a96dee\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<p>Los ficheros de luz y de actor siguen el mismo patr&oacute;n &mdash;el elemento en solitario como &uacute;nico hijo de <code>&lt;sdf&gt;<\/code>&mdash;; los veremos en detalle en sus posts de la serie (luces en el post de iluminaci&oacute;n, actores en el de mundos din&aacute;micos). El interior de un <code>&lt;model&gt;<\/code> (<code>&lt;link&gt;<\/code>, <code>&lt;collision&gt;<\/code>, <code>&lt;visual&gt;<\/code>, <code>&lt;geometry&gt;<\/code>) tiene tambi&eacute;n sus dos posts dedicados.<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-d3b3a53 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"d3b3a53\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-16f0d1f\" data-id=\"16f0d1f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2da3903 elementor-widget elementor-widget-text-editor\" data-id=\"2da3903\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<h4 id=\"el-arbol-completo-de-world\">El &aacute;rbol completo de &lt;world&gt;<\/h4>\n<p>Este es el mapa de la serie: todos los hijos directos que puede tener un <code>&lt;world&gt;<\/code>, en el orden recomendado &mdash;el mismo que sigue <code>anatomy_world.sdf<\/code>, el mundo de este post, y los ejemplos oficiales de <code>gz-sim<\/code>:<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-02e0d62 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"02e0d62\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-66d3b8a\" data-id=\"66d3b8a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4887dd5 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"4887dd5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-4887dd5\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-material-dark\"\n            data-dark-theme=\"mdp-theme-material-dark\"\n        >\n            \n                <pre class=\"language-text line-numbers copy-to-clipboard\"data-previewers=\"\"><code>\n&lt;sdf version=&quot;1.8&quot;&gt;\n\u251c\u2500\u2500 &lt;world&gt;                        (nuestro caso: anatomy_world.sdf)\n\u2502   \u251c\u2500\u2500 &lt;physics&gt;\n\u2502   \u251c\u2500\u2500 &lt;plugin&gt;                   (Physics, UserCommands, SceneBroadcaster)\n\u2502   \u251c\u2500\u2500 &lt;gravity&gt;\n\u2502   \u251c\u2500\u2500 &lt;scene&gt;\n\u2502   \u251c\u2500\u2500 &lt;gui&gt;\n\u2502   \u251c\u2500\u2500 &lt;light&gt;\n\u2502   \u251c\u2500\u2500 &lt;atmosphere&gt;\n\u2502   \u251c\u2500\u2500 &lt;magnetic_field&gt;\n\u2502   \u251c\u2500\u2500 &lt;spherical_coordinates&gt;\n\u2502   \u251c\u2500\u2500 &lt;audio&gt;\n\u2502   \u251c\u2500\u2500 &lt;frame&gt;\n\u2502   \u251c\u2500\u2500 &lt;include&gt;                  (uno o varios; Fuel o local)\n\u2502   \u251c\u2500\u2500 &lt;model&gt;                    (inline, o insertado por un &lt;include&gt;)\n\u2502   \u251c\u2500\u2500 &lt;wind&gt;\n\u2502   \u251c\u2500\u2500 &lt;road&gt;\n\u2502   \u2514\u2500\u2500 &lt;actor&gt;\n\u251c\u2500\u2500 &lt;model&gt;                        (fichero de un modelo aislado)\n\u251c\u2500\u2500 &lt;light&gt;                        (fichero de una luz aislada)\n\u2514\u2500\u2500 &lt;actor&gt;                        (fichero de un actor aislado)<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_4887dd5 = 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_4887dd5();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_4887dd5 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-6628829 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6628829\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-fcee7c1\" data-id=\"fcee7c1\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-262f311 elementor-widget elementor-widget-text-editor\" data-id=\"262f311\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<p>SDF no obliga a este orden &mdash;el parser identifica cada elemento por su etiqueta, no por su posici&oacute;n&mdash;, pero mantenerlo siempre hace que cualquier mundo se lea de un vistazo: f&iacute;sica y plugins de sistema primero (la base), apariencia despu&eacute;s, y el contenido (<code>&lt;include&gt;<\/code>\/<code>&lt;model&gt;<\/code>) al final. El fichero <code>anatomy_world.sdf<\/code> del repositorio contiene un ejemplo real de cada uno de estos elementos salvo <code>&lt;wind&gt;<\/code>, <code>&lt;road&gt;<\/code> y <code>&lt;actor&gt;<\/code>, que tienen su propio post en la serie.<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-604d658 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"604d658\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7720ac6\" data-id=\"7720ac6\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f27b027 elementor-widget elementor-widget-text-editor\" data-id=\"f27b027\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<h4 id=\"un-mundo-minimo-funcional\">Un mundo m&iacute;nimo funcional<\/h4>\n<p>Del &aacute;rbol anterior, solo un pu&ntilde;ado de elementos es imprescindible para tener un mundo &uacute;til. Vamos con ese subconjunto, pieza a pieza.<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-69cabea elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"69cabea\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7d74d3a\" data-id=\"7d74d3a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-db85b12 elementor-widget elementor-widget-text-editor\" data-id=\"db85b12\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<h5 id=\"world-y-el-atributo-name\">&lt;world&gt; y el atributo name<\/h5>\n<p>El mundo se declara con un nombre &uacute;nico:<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-d90268e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"d90268e\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6aac15c\" data-id=\"6aac15c\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-9f5f25d elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"9f5f25d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-9f5f25d\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-material-dark\"\n            data-dark-theme=\"mdp-theme-material-dark\"\n        >\n            \n                <pre class=\"language-xml line-numbers copy-to-clipboard\"data-previewers=\"\"><code>\n&lt;sdf version=&quot;1.8&quot;&gt;\n  &lt;world name=&quot;anatomy_world&quot;&gt;\n    ...\n  &lt;\/world&gt;\n&lt;\/sdf&gt;<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_9f5f25d = 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_9f5f25d();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_9f5f25d );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5184768 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"5184768\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-55f5476\" data-id=\"55f5476\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-85fa188 elementor-widget elementor-widget-text-editor\" data-id=\"85fa188\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<p>El atributo <code>name<\/code> aparece en casi todos los elementos de SDF (<code>&lt;world&gt;<\/code>, <code>&lt;light&gt;<\/code>, <code>&lt;model&gt;<\/code>, <code>&lt;plugin&gt;<\/code>, <code>&lt;frame&gt;<\/code>&#8230;) y siempre cumple el mismo papel: dar una identidad &uacute;nica al elemento dentro de su contexto, para que algo externo pueda referirse a &eacute;l. En <code>&lt;world&gt;<\/code>, ese nombre pasa a formar parte de los topics y servicios que expone Gazebo &mdash;por ejemplo, <code>\/world\/anatomy_world\/scene\/info<\/code>, el que consulta el nodo de verificaci&oacute;n de este post&mdash;.<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-20023b4 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"20023b4\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1e456fb\" data-id=\"1e456fb\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a3deec4 elementor-widget elementor-widget-text-editor\" data-id=\"a3deec4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<h5 id=\"physics-minimo\">&lt;physics&gt;: el reloj de la simulaci&oacute;n<\/h5>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5739708 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"5739708\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-bd432cd\" data-id=\"bd432cd\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f3fd737 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"f3fd737\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-f3fd737\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-material-dark\"\n            data-dark-theme=\"mdp-theme-material-dark\"\n        >\n            \n                <pre class=\"language-xml line-numbers copy-to-clipboard\"data-previewers=\"\"><code>\n&lt;physics name=&quot;1ms&quot; type=&quot;ignored&quot;&gt;\n  &lt;max_step_size&gt;0.001&lt;\/max_step_size&gt;\n  &lt;real_time_factor&gt;1.0&lt;\/real_time_factor&gt;\n&lt;\/physics&gt;<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_f3fd737 = 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_f3fd737();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_f3fd737 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-0f5c506 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"0f5c506\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-43f39b2\" data-id=\"43f39b2\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5038cdf elementor-widget elementor-widget-text-editor\" data-id=\"5038cdf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<p><code>max_step_size<\/code> es cu&aacute;ntos segundos simulados avanza la f&iacute;sica en cada iteraci&oacute;n (1&nbsp;ms aqu&iacute;) y <code>real_time_factor<\/code> la velocidad objetivo respecto al tiempo real. Todos los atributos y su efecto real, medidos con un cron&oacute;metro, en el post de f&iacute;sica de la serie.<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-9ceb239 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"9ceb239\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-bfb685a\" data-id=\"bfb685a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a5f4d4a elementor-widget elementor-widget-text-editor\" data-id=\"a5f4d4a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<h5 id=\"plugin-minimo\">&lt;plugin&gt;: los tres sistemas imprescindibles<\/h5>\n<p>Sin plugins de sistema, Gazebo carga el mundo pero no simula nada. Todo mundo funcional necesita estos tres:<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-ce5d366 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"ce5d366\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f49c84d\" data-id=\"f49c84d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-962f00c elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"962f00c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-962f00c\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-material-dark\"\n            data-dark-theme=\"mdp-theme-material-dark\"\n        >\n            \n                <pre class=\"language-xml line-numbers copy-to-clipboard\"data-previewers=\"\"><code>\n&lt;plugin filename=&quot;gz-sim-physics-system&quot;\n        name=&quot;gz::sim::systems::Physics&quot;\/&gt;\n&lt;plugin filename=&quot;gz-sim-user-commands-system&quot;\n        name=&quot;gz::sim::systems::UserCommands&quot;\/&gt;\n&lt;plugin filename=&quot;gz-sim-scene-broadcaster-system&quot;\n        name=&quot;gz::sim::systems::SceneBroadcaster&quot;\/&gt;<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_962f00c = 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_962f00c();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_962f00c );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-e96bb62 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"e96bb62\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-948b8e9\" data-id=\"948b8e9\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2abd5a0 elementor-widget elementor-widget-text-editor\" data-id=\"2abd5a0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<p><code>Physics<\/code> ejecuta el motor de f&iacute;sica; <code>UserCommands<\/code> expone los servicios para pausar, reanudar o crear entidades desde fuera; <code>SceneBroadcaster<\/code> publica el estado de la escena hacia la GUI y hacia la CLI <code>gz<\/code>. Este bloque es siempre el mismo &mdash;c&oacute;pialo tal cual en cada mundo nuevo.<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-2a875cc elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"2a875cc\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-719aea4\" data-id=\"719aea4\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a36ffea elementor-widget elementor-widget-text-editor\" data-id=\"a36ffea\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<h5 id=\"gravity-minimo\">&lt;gravity&gt;: hacia abajo es -Z<\/h5>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-b59113b elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"b59113b\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-dec5016\" data-id=\"dec5016\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4aad033 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"4aad033\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-4aad033\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-material-dark\"\n            data-dark-theme=\"mdp-theme-material-dark\"\n        >\n            \n                <pre class=\"language-xml line-numbers copy-to-clipboard\"data-previewers=\"\"><code>\n&lt;gravity&gt;0 0 -9.8&lt;\/gravity&gt;<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_4aad033 = 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_4aad033();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_4aad033 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-be1f67f elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"be1f67f\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-391f4bc\" data-id=\"391f4bc\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5e85f9e elementor-widget elementor-widget-text-editor\" data-id=\"5e85f9e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<p>Un vector 3D en m\/s&sup2;, y el valor va en el eje <strong>Z, no en Y<\/strong>: SDF usa un sistema de mano derecha con Z apuntando hacia arriba &mdash;el mismo convenio que ROS 2&mdash;. Quien viene de motores como Unity (vertical en Y) suele tropezar aqu&iacute;: copiar una gravedad de otro motor sin adaptar el eje hace que los objetos caigan de lado.<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a81ff41 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"a81ff41\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-606f0ea\" data-id=\"606f0ea\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ec30387 elementor-widget elementor-widget-text-editor\" data-id=\"ec30387\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<h5 id=\"light-minimo\">&lt;light&gt;: el sol<\/h5>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-fdded83 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"fdded83\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7c4605e\" data-id=\"7c4605e\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c2e0739 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"c2e0739\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-c2e0739\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-material-dark\"\n            data-dark-theme=\"mdp-theme-material-dark\"\n        >\n            \n                <pre class=\"language-xml line-numbers copy-to-clipboard\"data-previewers=\"\"><code>\n&lt;light name=&quot;sun&quot; type=&quot;directional&quot;&gt;\n  &lt;cast_shadows&gt;true&lt;\/cast_shadows&gt;\n  &lt;pose&gt;0 0 10 0 0 0&lt;\/pose&gt;\n  &lt;diffuse&gt;0.8 0.8 0.8 1&lt;\/diffuse&gt;\n  &lt;specular&gt;0.2 0.2 0.2 1&lt;\/specular&gt;\n  &lt;direction&gt;-0.5 0.1 -0.9&lt;\/direction&gt;\n&lt;\/light&gt;<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_c2e0739 = 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_c2e0739();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_c2e0739 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5aeb773 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"5aeb773\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-0c388b7\" data-id=\"0c388b7\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b751943 elementor-widget elementor-widget-text-editor\" data-id=\"b751943\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<p>Una luz direccional (rayos paralelos, como el sol real) iluminando hacia abajo. Los tres tipos de luz y todos sus par&aacute;metros, con capturas comparativas, en el post de iluminaci&oacute;n de la serie.<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-be920e6 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"be920e6\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-154e553\" data-id=\"154e553\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-eb595b0 elementor-widget elementor-widget-text-editor\" data-id=\"eb595b0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<h5 id=\"include-minimo\">&lt;include&gt;: el suelo desde Fuel<\/h5>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-7096af4 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7096af4\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ed8a9ca\" data-id=\"ed8a9ca\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-cf13cc2 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"cf13cc2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-cf13cc2\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-material-dark\"\n            data-dark-theme=\"mdp-theme-material-dark\"\n        >\n            \n                <pre class=\"language-xml line-numbers copy-to-clipboard\"data-previewers=\"\"><code>\n&lt;include&gt;\n  &lt;uri&gt;https:\/\/fuel.gazebosim.org\/1.0\/OpenRobotics\/models\/Ground Plane&lt;\/uri&gt;\n&lt;\/include&gt;<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_cf13cc2 = 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_cf13cc2();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_cf13cc2 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-648c3d3 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"648c3d3\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6f3d3d0\" data-id=\"6f3d3d0\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-406e197 elementor-widget elementor-widget-text-editor\" data-id=\"406e197\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<p><code>&lt;include&gt;<\/code> trae un modelo completo definido en otro sitio &mdash;aqu&iacute;, el suelo desde <strong>Fuel<\/strong>, el repositorio p&uacute;blico de modelos de Gazebo (se descarga la primera vez y queda cacheado en <code>~\/.gz\/fuel<\/code>)&mdash;. Tambi&eacute;n puede apuntar a modelos locales tuyos, como el <code>example_box<\/code> de arriba: todo el detalle de composici&oacute;n (Fuel, <code>model:\/\/<\/code>, renombrar instancias, <code>&lt;frame&gt;<\/code>) tiene su propio post en la serie.<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-ee93515 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"ee93515\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-956f35a\" data-id=\"956f35a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c17d56b elementor-widget elementor-widget-text-editor\" data-id=\"c17d56b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<h4 id=\"la-serie-post-a-post\">La serie post a post<\/h4>\n<p>Cada elemento del &aacute;rbol tiene (o tendr&aacute;) su post dedicado, con todos sus atributos y un ejemplo ejecutable. El plan de la serie &mdash;iremos a&ntilde;adiendo los enlaces seg&uacute;n se publiquen:<\/p>\n<ul>\n<li><strong>F&iacute;sica en SDF<\/strong>: <code>&lt;physics&gt;<\/code>, <code>&lt;gravity&gt;<\/code>, <code>&lt;atmosphere&gt;<\/code>, <code>&lt;magnetic_field&gt;<\/code>, <code>&lt;spherical_coordinates&gt;<\/code>.<\/li>\n<li><strong>Luces y escena<\/strong>: <code>&lt;scene&gt;<\/code>, <code>&lt;light&gt;<\/code> (tres tipos), <code>&lt;gui&gt;<\/code>.<\/li>\n<li><strong>Include y frames<\/strong>: <code>&lt;include&gt;<\/code>, <code>&lt;frame&gt;<\/code>, <code>model:\/\/<\/code>, Fuel, <code>model.config<\/code>.<\/li>\n<li><strong>Mundos din&aacute;micos<\/strong>: <code>&lt;wind&gt;<\/code>, <code>&lt;road&gt;<\/code>, <code>&lt;actor&gt;<\/code>, <code>&lt;audio&gt;<\/code>.<\/li>\n<li><strong>El elemento model<\/strong>: <code>&lt;link&gt;<\/code>, <code>&lt;collision&gt;<\/code>, <code>&lt;visual&gt;<\/code>, <code>&lt;inertial&gt;<\/code>.<\/li>\n<li><strong>Fricci&oacute;n y rebote<\/strong>: <code>&lt;surface&gt;<\/code>, <code>&lt;friction&gt;<\/code> y <code>&lt;bounce&gt;<\/code> dentro de <code>&lt;collision&gt;<\/code>.<\/li>\n<li><strong>Geometr&iacute;as<\/strong>: todas las formas de <code>&lt;geometry&gt;<\/code>, de la caja al heightmap.<\/li>\n<li><strong>Joints<\/strong>: <code>&lt;joint&gt;<\/code>, tipos, l&iacute;mites y din&aacute;mica.<\/li>\n<li><strong>Sensores<\/strong>: <code>&lt;sensor&gt;<\/code>, ruido y los sistemas que los despiertan.<\/li>\n<\/ul>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-b8dcbe6 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"b8dcbe6\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2709a50\" data-id=\"2709a50\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-4e1e2f1 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"4e1e2f1\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-40b134e\" data-id=\"40b134e\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1d6198b elementor-widget elementor-widget-text-editor\" data-id=\"1d6198b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<h4 id=\"codigo-del-ejemplo\">C&oacute;digo del ejemplo<\/h4>\n<p>C&oacute;digo completo, listo para descargar, en nuestro repositorio de GitHub &mdash;carpeta <code>src\/temas\/sdf-world-anatomy\/<\/code>. Incluye <code>anatomy_world.sdf<\/code> con un ejemplo real de cada elemento del &aacute;rbol, y un nodo ROS 2 (<code>verify_world_node<\/code>) que comprueba con la CLI <code>gz<\/code> que lo declarado en el fichero es lo que Gazebo carga de verdad:<\/p>\n<p><a href=\"https:\/\/github.com\/joseecm-github\/robotica-facil-con-ros2\" target=\"_blank\" rel=\"noopener\">github.com\/joseecm-github\/robotica-facil-con-ros2<\/a><\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-99650c6 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"99650c6\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-e254aab\" data-id=\"e254aab\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6a193c5 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"6a193c5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-6a193c5\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-material-dark\"\n            data-dark-theme=\"mdp-theme-material-dark\"\n        >\n            \n                <pre class=\"language-bash line-numbers copy-to-clipboard\"data-previewers=\"\"><code>\nmkdir -p ~\/ros2_ws\/src\ncd ~\/ros2_ws\/src\ncurl -L https:\/\/github.com\/joseecm-github\/robotica-facil-con-ros2\/archive\/refs\/heads\/main.tar.gz \\\n  | tar xz --strip-components=3 robotica-facil-con-ros2-main\/src\/temas\/sdf-world-anatomy<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_6a193c5 = 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_6a193c5();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_6a193c5 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-48abb68 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"48abb68\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9e7ba2d\" data-id=\"9e7ba2d\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-44379bd elementor-widget elementor-widget-text-editor\" data-id=\"44379bd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<p>Y para compilarlo y ejecutarlo, desde la ra&iacute;z del workspace:<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-26a6cd8 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"26a6cd8\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-1ecf53a\" data-id=\"1ecf53a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0825100 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"0825100\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-0825100\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-material-dark\"\n            data-dark-theme=\"mdp-theme-material-dark\"\n        >\n            \n                <pre class=\"language-bash line-numbers copy-to-clipboard\"data-previewers=\"\"><code>\ncd ~\/ros2_ws\ncolcon build --packages-select sdf_world_anatomy\nsource install\/setup.bash\nros2 launch sdf_world_anatomy anatomy_world.launch.py<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_0825100 = 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_0825100();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_0825100 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-0adc9b6 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"0adc9b6\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-cd97124\" data-id=\"cd97124\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-e365fe3 elementor-widget elementor-widget-text-editor\" data-id=\"e365fe3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<p>Si est&aacute;s en WSL o sin aceleraci&oacute;n gr&aacute;fica, a&ntilde;ade <code>render_engine:=ogre<\/code> para usar el motor de render ligero en vez de Ogre2:<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-86def5d elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"86def5d\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-408ed91\" data-id=\"408ed91\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c1e7a86 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"c1e7a86\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-c1e7a86\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-material-dark\"\n            data-dark-theme=\"mdp-theme-material-dark\"\n        >\n            \n                <pre class=\"language-bash line-numbers copy-to-clipboard\"data-previewers=\"\"><code>\nros2 launch sdf_world_anatomy anatomy_world.launch.py render_engine:=ogre<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_c1e7a86 = 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_c1e7a86();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_c1e7a86 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-4d98a39 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"4d98a39\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-89f8388\" data-id=\"89f8388\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a1a1fb8 elementor-widget elementor-widget-text-editor\" data-id=\"a1a1fb8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<h4 id=\"comprobacion-del-resultado\">Comprobaci&oacute;n del resultado<\/h4>\n<p>Se abre Gazebo con el mundo cargado &mdash;el suelo, la caja naranja de <code>example_box<\/code>&mdash; y en la terminal aparece el log de <code>verify_world_node<\/code> confirmando cada pieza:<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-af7b998 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"af7b998\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-51da643\" data-id=\"51da643\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1ca32db elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"1ca32db\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-1ca32db\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-material-dark\"\n            data-dark-theme=\"mdp-theme-material-dark\"\n        >\n            \n                <pre class=\"language-text line-numbers copy-to-clipboard\"data-previewers=\"\"><code>\n[verify_world_node]: Declared in anatomy_world.sdf -&gt; gravity: (0.0, 0.0, -9.8)\n[verify_world_node]: Loaded in Gazebo -&gt; models: [&#039;example_box&#039;, &#039;ground_plane&#039;], lights: [&#039;sun&#039;]\n[verify_world_node]: Loaded in Gazebo -&gt; scene ambient: (0.40, 0.40, 0.40)\n[verify_world_node]: Anatomy check -&gt; ground_plane: OK, sun: OK<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_1ca32db = 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_1ca32db();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_1ca32db );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-310a578 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"310a578\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-384a6cd\" data-id=\"384a6cd\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a136894 elementor-widget elementor-widget-text-editor\" data-id=\"a136894\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<p>Las dos primeras l&iacute;neas separan lo declarado (le&iacute;do del <code>.sdf<\/code>) de lo cargado (consultado con la CLI <code>gz<\/code>, los mismos comandos <code>gz topic -l<\/code> y <code>gz service<\/code> que teclear&iacute;as a mano); la &uacute;ltima confirma que coinciden.<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-9a2744e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"9a2744e\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-200fa9b\" data-id=\"200fa9b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-938b7b0 elementor-widget elementor-widget-text-editor\" data-id=\"938b7b0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<h4 id=\"experimentos-propuestos\">Experimentos propuestos<\/h4>\n<ul>\n<li>Cambia <code>&lt;gravity&gt;<\/code> a <code>0 0 -1.62<\/code> (gravedad lunar) y comprueba que <code>verify_world_node<\/code> reporta el nuevo valor declarado.<\/li>\n<li>Renombra el mundo (<code>name=\"my_world\"<\/code>) y observa con <code>gz service -l<\/code> c&oacute;mo cambian todos los servicios &mdash;el atributo <code>name<\/code> en acci&oacute;n.<\/li>\n<li>A&ntilde;ade un segundo <code>&lt;include&gt;<\/code> de Fuel (por ejemplo, un banco) y verif&iacute;calo en el log del nodo.<\/li>\n<\/ul>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5900ce2 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"5900ce2\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6ccc3e4\" data-id=\"6ccc3e4\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5083d76 elementor-widget elementor-widget-text-editor\" data-id=\"5083d76\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<h4 id=\"errores-frecuentes\">Errores frecuentes<\/h4>\n<p><strong>La GUI de Gazebo no abre en WSL.<\/strong> Exporta <code>QT_QPA_PLATFORM=xcb<\/code> antes de lanzar &mdash;ver el post de instalaci&oacute;n de Gazebo Jetty.<\/p>\n<p><strong><code>ground_plane: MISSING<\/code> en <code>verify_world_node<\/code>.<\/strong> Casi siempre falta de red para el <code>&lt;include&gt;<\/code> de Fuel la primera vez; despu&eacute;s usa cach&eacute; local.<\/p>\n<p><strong>Gazebo no encuentra <code>model:\/\/example_box<\/code>.<\/strong> Ese esquema se resuelve contra <code>GZ_SIM_RESOURCE_PATH<\/code>, no contra la carpeta del mundo. El launch file del paquete ya la configura; si lanzas el <code>.sdf<\/code> directamente con <code>gz sim<\/code>, exp&oacute;rtala t&uacute; mismo apuntando a la carpeta <code>models\/<\/code> instalada del paquete.<\/p>\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<section class=\"elementor-section elementor-top-section elementor-element elementor-element-be55050 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"be55050\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-18ce15b\" data-id=\"18ce15b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-573af4e elementor-widget elementor-widget-text-editor\" data-id=\"573af4e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<h4 id=\"resumen-final\">Resumen final<\/h4>\n<p>Ya tienes el mapa completo de un fichero SDF: el elemento ra&iacute;z <code>&lt;sdf&gt;<\/code> con sus cuatro tipos de fichero, el &aacute;rbol entero de hijos de <code>&lt;world&gt;<\/code> en su orden recomendado, y un mundo m&iacute;nimo funcional construido pieza a pieza y verificado en pantalla con un nodo ROS 2. A partir de aqu&iacute;, cada post de la serie coge un grupo de elementos del &aacute;rbol y lo desarrolla a fondo, con todos sus atributos y un ejemplo ejecutable &mdash;el mapa ya lo tienes; ahora toca recorrerlo.<\/p>\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>Aprende a construir un mundo Gazebo Jetty desde cero, entendiendo cada elemento de su fichero SDF.<\/p>\n","protected":false},"author":1,"featured_media":9251,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","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":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_elementor_version":"4.1.4","footnotes":""},"categories":[43],"tags":[49,39,48],"class_list":["post-9234","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gazebo","tag-jetty","tag-sdf","tag-simulacion"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.9 - aioseo.com -->\n\t<meta name=\"description\" content=\"Aprende a construir un mundo Gazebo Jetty desde cero, entendiendo cada elemento de su fichero SDF.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Jose Enrique Cabrera\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/robotica-facil-con-ros2.es\/?p=9234\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.9\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"- Anatom\u00eda de un mundo SDF en Gazebo Jetty desde cero Aprende a construir un mundo Gazebo Jetty desde cero, entendiendo cada elemento de su fichero SDF.\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Anatom\u00eda de un mundo SDF en Gazebo Jetty desde cero -\" \/>\n\t\t<meta property=\"og:description\" content=\"Aprende a construir un mundo Gazebo Jetty desde cero, entendiendo cada elemento de su fichero SDF.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/robotica-facil-con-ros2.es\/?p=9234\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2026\/07\/Imagen-destacada.png\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2026\/07\/Imagen-destacada.png\" \/>\n\t\t<meta property=\"og:image:width\" content=\"1672\" \/>\n\t\t<meta property=\"og:image:height\" content=\"941\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-07-04T12:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-07-05T15:03:18+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@RFconROS2\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Anatom\u00eda de un mundo SDF en Gazebo Jetty desde cero -\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Aprende a construir un mundo Gazebo Jetty desde cero, entendiendo cada elemento de su fichero SDF.\" \/>\n\t\t<meta name=\"twitter:creator\" content=\"@RFconROS2\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2026\/07\/Imagen-destacada.png\" \/>\n\t\t<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t\t<meta name=\"twitter:data1\" content=\"Jose Enrique Cabrera\" \/>\n\t\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura estimado\" \/>\n\t\t<meta name=\"twitter:data2\" content=\"12 minutos\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=9234#blogposting\",\"name\":\"Anatom\\u00eda de un mundo SDF en Gazebo Jetty desde cero -\",\"headline\":\"Anatom\\u00eda de un mundo SDF en Gazebo Jetty desde cero\",\"author\":{\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?author=1#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/#person\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/Imagen-destacada.png\",\"width\":1672,\"height\":941,\"caption\":\"Diagrama explosionado de la anatom\\u00eda de un mundo SDF en Gazebo Jetty, con sus capas de suelo, luz y c\\u00e1mara separadas.\"},\"datePublished\":\"2026-07-04T12:00:00+00:00\",\"dateModified\":\"2026-07-05T15:03:18+00:00\",\"inLanguage\":\"es-ES\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=9234#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=9234#webpage\"},\"articleSection\":\"Gazebo, JETTY, SDF, SIMULACION\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=9234#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es#listItem\",\"position\":1,\"name\":\"Inicio\",\"item\":\"https:\\\/\\\/robotica-facil-con-ros2.es\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?cat=43#listItem\",\"name\":\"Gazebo\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?cat=43#listItem\",\"position\":2,\"name\":\"Gazebo\",\"item\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?cat=43\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=9234#listItem\",\"name\":\"Anatom\\u00eda de un mundo SDF en Gazebo Jetty desde cero\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es#listItem\",\"name\":\"Inicio\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=9234#listItem\",\"position\":3,\"name\":\"Anatom\\u00eda de un mundo SDF en Gazebo Jetty desde cero\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?cat=43#listItem\",\"name\":\"Gazebo\"}}]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/#person\",\"name\":\"Jose Enrique Cabrera\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=9234#personImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7fb8a5b8671a5fde1ab097847642f4ec46f3150e6ef27ed7fe4f7055bb02a052?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Jose Enrique Cabrera\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?author=1#author\",\"url\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?author=1\",\"name\":\"Jose Enrique Cabrera\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=9234#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/7fb8a5b8671a5fde1ab097847642f4ec46f3150e6ef27ed7fe4f7055bb02a052?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Jose Enrique Cabrera\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=9234#webpage\",\"url\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=9234\",\"name\":\"Anatom\\u00eda de un mundo SDF en Gazebo Jetty desde cero -\",\"description\":\"Aprende a construir un mundo Gazebo Jetty desde cero, entendiendo cada elemento de su fichero SDF.\",\"inLanguage\":\"es-ES\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=9234#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?author=1#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?author=1#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/Imagen-destacada.png\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=9234\\\/#mainImage\",\"width\":1672,\"height\":941,\"caption\":\"Diagrama explosionado de la anatom\\u00eda de un mundo SDF en Gazebo Jetty, con sus capas de suelo, luz y c\\u00e1mara separadas.\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/?p=9234#mainImage\"},\"datePublished\":\"2026-07-04T12:00:00+00:00\",\"dateModified\":\"2026-07-05T15:03:18+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/#website\",\"url\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/\",\"description\":\"Rob\\u00f3tica con ROS2\",\"inLanguage\":\"es-ES\",\"publisher\":{\"@id\":\"https:\\\/\\\/robotica-facil-con-ros2.es\\\/#person\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Anatom\u00eda de un mundo SDF en Gazebo Jetty desde cero -","description":"Aprende a construir un mundo Gazebo Jetty desde cero, entendiendo cada elemento de su fichero SDF.","canonical_url":"https:\/\/robotica-facil-con-ros2.es\/?p=9234","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/robotica-facil-con-ros2.es\/?p=9234#blogposting","name":"Anatom\u00eda de un mundo SDF en Gazebo Jetty desde cero -","headline":"Anatom\u00eda de un mundo SDF en Gazebo Jetty desde cero","author":{"@id":"https:\/\/robotica-facil-con-ros2.es\/?author=1#author"},"publisher":{"@id":"https:\/\/robotica-facil-con-ros2.es\/#person"},"image":{"@type":"ImageObject","url":"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2026\/07\/Imagen-destacada.png","width":1672,"height":941,"caption":"Diagrama explosionado de la anatom\u00eda de un mundo SDF en Gazebo Jetty, con sus capas de suelo, luz y c\u00e1mara separadas."},"datePublished":"2026-07-04T12:00:00+00:00","dateModified":"2026-07-05T15:03:18+00:00","inLanguage":"es-ES","mainEntityOfPage":{"@id":"https:\/\/robotica-facil-con-ros2.es\/?p=9234#webpage"},"isPartOf":{"@id":"https:\/\/robotica-facil-con-ros2.es\/?p=9234#webpage"},"articleSection":"Gazebo, JETTY, SDF, SIMULACION"},{"@type":"BreadcrumbList","@id":"https:\/\/robotica-facil-con-ros2.es\/?p=9234#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/robotica-facil-con-ros2.es#listItem","position":1,"name":"Inicio","item":"https:\/\/robotica-facil-con-ros2.es","nextItem":{"@type":"ListItem","@id":"https:\/\/robotica-facil-con-ros2.es\/?cat=43#listItem","name":"Gazebo"}},{"@type":"ListItem","@id":"https:\/\/robotica-facil-con-ros2.es\/?cat=43#listItem","position":2,"name":"Gazebo","item":"https:\/\/robotica-facil-con-ros2.es\/?cat=43","nextItem":{"@type":"ListItem","@id":"https:\/\/robotica-facil-con-ros2.es\/?p=9234#listItem","name":"Anatom\u00eda de un mundo SDF en Gazebo Jetty desde cero"},"previousItem":{"@type":"ListItem","@id":"https:\/\/robotica-facil-con-ros2.es#listItem","name":"Inicio"}},{"@type":"ListItem","@id":"https:\/\/robotica-facil-con-ros2.es\/?p=9234#listItem","position":3,"name":"Anatom\u00eda de un mundo SDF en Gazebo Jetty desde cero","previousItem":{"@type":"ListItem","@id":"https:\/\/robotica-facil-con-ros2.es\/?cat=43#listItem","name":"Gazebo"}}]},{"@type":"Person","@id":"https:\/\/robotica-facil-con-ros2.es\/#person","name":"Jose Enrique Cabrera","image":{"@type":"ImageObject","@id":"https:\/\/robotica-facil-con-ros2.es\/?p=9234#personImage","url":"https:\/\/secure.gravatar.com\/avatar\/7fb8a5b8671a5fde1ab097847642f4ec46f3150e6ef27ed7fe4f7055bb02a052?s=96&d=mm&r=g","width":96,"height":96,"caption":"Jose Enrique Cabrera"}},{"@type":"Person","@id":"https:\/\/robotica-facil-con-ros2.es\/?author=1#author","url":"https:\/\/robotica-facil-con-ros2.es\/?author=1","name":"Jose Enrique Cabrera","image":{"@type":"ImageObject","@id":"https:\/\/robotica-facil-con-ros2.es\/?p=9234#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/7fb8a5b8671a5fde1ab097847642f4ec46f3150e6ef27ed7fe4f7055bb02a052?s=96&d=mm&r=g","width":96,"height":96,"caption":"Jose Enrique Cabrera"}},{"@type":"WebPage","@id":"https:\/\/robotica-facil-con-ros2.es\/?p=9234#webpage","url":"https:\/\/robotica-facil-con-ros2.es\/?p=9234","name":"Anatom\u00eda de un mundo SDF en Gazebo Jetty desde cero -","description":"Aprende a construir un mundo Gazebo Jetty desde cero, entendiendo cada elemento de su fichero SDF.","inLanguage":"es-ES","isPartOf":{"@id":"https:\/\/robotica-facil-con-ros2.es\/#website"},"breadcrumb":{"@id":"https:\/\/robotica-facil-con-ros2.es\/?p=9234#breadcrumblist"},"author":{"@id":"https:\/\/robotica-facil-con-ros2.es\/?author=1#author"},"creator":{"@id":"https:\/\/robotica-facil-con-ros2.es\/?author=1#author"},"image":{"@type":"ImageObject","url":"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2026\/07\/Imagen-destacada.png","@id":"https:\/\/robotica-facil-con-ros2.es\/?p=9234\/#mainImage","width":1672,"height":941,"caption":"Diagrama explosionado de la anatom\u00eda de un mundo SDF en Gazebo Jetty, con sus capas de suelo, luz y c\u00e1mara separadas."},"primaryImageOfPage":{"@id":"https:\/\/robotica-facil-con-ros2.es\/?p=9234#mainImage"},"datePublished":"2026-07-04T12:00:00+00:00","dateModified":"2026-07-05T15:03:18+00:00"},{"@type":"WebSite","@id":"https:\/\/robotica-facil-con-ros2.es\/#website","url":"https:\/\/robotica-facil-con-ros2.es\/","description":"Rob\u00f3tica con ROS2","inLanguage":"es-ES","publisher":{"@id":"https:\/\/robotica-facil-con-ros2.es\/#person"}}]},"og:locale":"es_ES","og:site_name":"- Anatom\u00eda de un mundo SDF en Gazebo Jetty desde cero Aprende a construir un mundo Gazebo Jetty desde cero, entendiendo cada elemento de su fichero SDF.","og:type":"article","og:title":"Anatom\u00eda de un mundo SDF en Gazebo Jetty desde cero -","og:description":"Aprende a construir un mundo Gazebo Jetty desde cero, entendiendo cada elemento de su fichero SDF.","og:url":"https:\/\/robotica-facil-con-ros2.es\/?p=9234","og:image":"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2026\/07\/Imagen-destacada.png","og:image:secure_url":"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2026\/07\/Imagen-destacada.png","og:image:width":1672,"og:image:height":941,"article:published_time":"2026-07-04T12:00:00+00:00","article:modified_time":"2026-07-05T15:03:18+00:00","twitter:card":"summary_large_image","twitter:site":"@RFconROS2","twitter:title":"Anatom\u00eda de un mundo SDF en Gazebo Jetty desde cero -","twitter:description":"Aprende a construir un mundo Gazebo Jetty desde cero, entendiendo cada elemento de su fichero SDF.","twitter:creator":"@RFconROS2","twitter:image":"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2026\/07\/Imagen-destacada.png","twitter:label1":"Escrito por","twitter:data1":"Jose Enrique Cabrera","twitter:label2":"Tiempo de lectura estimado","twitter:data2":"12 minutos"},"aioseo_meta_data":{"post_id":"9234","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":true,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"BlogPosting","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2026-07-05 09:23:55","updated":"2026-07-05 15:03:18","seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/robotica-facil-con-ros2.es\" title=\"Inicio\">Inicio<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/robotica-facil-con-ros2.es\/?cat=43\" title=\"Gazebo\">Gazebo<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tAnatom\u00eda de un mundo SDF en Gazebo Jetty desde cero\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Inicio","link":"https:\/\/robotica-facil-con-ros2.es"},{"label":"Gazebo","link":"https:\/\/robotica-facil-con-ros2.es\/?cat=43"},{"label":"Anatom\u00eda de un mundo SDF en Gazebo Jetty desde cero","link":"https:\/\/robotica-facil-con-ros2.es\/?p=9234"}],"rttpg_featured_image_url":{"full":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2026\/07\/Imagen-destacada.png",1672,941,false],"landscape":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2026\/07\/Imagen-destacada.png",1672,941,false],"portraits":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2026\/07\/Imagen-destacada.png",1672,941,false],"thumbnail":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2026\/07\/Imagen-destacada-150x150.png",150,150,true],"medium":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2026\/07\/Imagen-destacada-300x169.png",300,169,true],"large":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2026\/07\/Imagen-destacada-1024x576.png",1024,576,true],"1536x1536":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2026\/07\/Imagen-destacada-1536x864.png",1536,864,true],"2048x2048":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2026\/07\/Imagen-destacada.png",1672,941,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=43\" rel=\"category\">Gazebo<\/a>","rttpg_excerpt":"Aprende a construir un mundo Gazebo Jetty desde cero, entendiendo cada elemento de su fichero SDF.","_links":{"self":[{"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/posts\/9234","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=9234"}],"version-history":[{"count":9,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/posts\/9234\/revisions"}],"predecessor-version":[{"id":9271,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/posts\/9234\/revisions\/9271"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/media\/9251"}],"wp:attachment":[{"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9234"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9234"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}