{"id":3367,"date":"2022-08-01T14:31:04","date_gmt":"2022-08-01T14:31:04","guid":{"rendered":"https:\/\/robotica-facil-con-ros2.es\/?p=3367"},"modified":"2022-09-09T19:01:13","modified_gmt":"2022-09-09T19:01:13","slug":"usando-archivos-mesh-en-nuestro-modelo-urdf","status":"publish","type":"post","link":"https:\/\/robotica-facil-con-ros2.es\/?p=3367","title":{"rendered":"Usando archivos mesh en nuestro modelo URDF"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"3367\" class=\"elementor elementor-3367\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-91fc704 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"91fc704\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c65b51a\" data-id=\"c65b51a\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f97b2e0 elementor-widget elementor-widget-text-editor\" data-id=\"f97b2e0\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h3>Introducci\u00f3n<\/h3><p>En este art\u00edculo aprender\u00e1s a usar archivos <span style=\"color: #0170b9;\"><i><b>mesh <\/b><\/i><\/span>en los modelos URDF y c\u00f3mo evitar problemas con la visualizaci\u00f3n debidos a errores al indicar la ruta a los mismos lo cual, al menos a m\u00ed, me ha dado m\u00e1s de un dolor de cabeza cuando estaba aprendiendo.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-686c0af elementor-widget elementor-widget-text-editor\" data-id=\"686c0af\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Aunque para familiarizarnos con los archivos URDF empezamos utilizando figuras b\u00e1sicas (cajas, cilindros y esferas) tarde o temprano querremos emplear archivos de malla o\u00a0<i>mesh<\/i> para crear formas complejas y dotar as\u00ed a nuestro modelo de un mayor realismo.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-770df7b elementor-widget elementor-widget-text-editor\" data-id=\"770df7b\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Los archivos de malla describen la geometr\u00eda de la superficie de un objeto tridimensional mediante el uso de tri\u00e1ngulos.\u00a0<span style=\"background-color: var(--ast-global-color-4); color: var(--ast-global-color-3);\">Los formatos<\/span><span style=\"background-color: var(--ast-global-color-4); color: var(--ast-global-color-3);\">\u00a0admitidos son <\/span><span style=\"color: #0170b9;\"><i style=\"background-color: var(--ast-global-color-4);\"><b>.stl <\/b><\/i><\/span><span style=\"background-color: var(--ast-global-color-4); color: var(--ast-global-color-3);\">y <\/span><span style=\"color: #0170b9;\"><i style=\"background-color: var(--ast-global-color-4);\"><b>.dae<\/b><\/i><\/span><span style=\"background-color: var(--ast-global-color-4); color: var(--ast-global-color-3);\"><i> (Collada)<\/i>, siendo preferible el uso del segundo ya que el formato <i>.stl<\/i> solo incluye informaci\u00f3n geom\u00e9trica, mientras que el formato <i>.dae<\/i> permite incluir informaci\u00f3n adicional como colores y texturas.<\/span><\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b3d5fce elementor-widget elementor-widget-text-editor\" data-id=\"b3d5fce\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h3>Modificando el c\u00f3digo URDF<\/h3>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d3f61bd elementor-widget elementor-widget-text-editor\" data-id=\"d3f61bd\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h4>Usando la etiqueta &lt; mesh &gt;<\/h4><p>Para utilizar un archivo de malla se usa la etiqueta <span style=\"color: #0170b9;\"><i><b>&lt; mesh &gt;<\/b><\/i><\/span> en del c\u00f3digo URDF de nuestro modelo, dentro del elemento <span style=\"color: #0170b9;\"><i><b>geometry<\/b><\/i><\/span>, pudiendo emplearse tanto para establecer su representaci\u00f3n visual como para definir el modelo de colisi\u00f3n:<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bdc58c2 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"bdc58c2\" data-element_type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-bdc58c2\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-xonokai\"\n            data-dark-theme=\"mdp-theme-xonokai\"\n        >\n            \n                <pre class=\"language-markup copy-to-clipboard\"data-previewers=\"\"><code>&lt;visual&gt;\n    &lt;geometry&gt;\n        &lt;mesh filename=&quot;path_to_mesh_file&quot; scale=&quot;1 1 1&quot; \/&gt;\n    &lt;\/geometry&gt;\n&lt;\/visual&gt;\n\n&lt;collision&gt;\n    &lt;geometry&gt;\n        &lt;mesh filename=&quot;path_to_mesh_file&quot; scale=&quot;1 1 1&quot; \/&gt;\n    &lt;\/geometry&gt;\n&lt;\/collision&gt;\n<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_bdc58c2 = 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_bdc58c2();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_bdc58c2 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8460d34 elementor-widget elementor-widget-text-editor\" data-id=\"8460d34\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Como puede verse en el c\u00f3digo la etiqueta mesh admite dos atributos:<\/p><p style=\"padding-left: 40px;\"><span style=\"color: #0170b9;\"><em><strong>filename:<\/strong><\/em><\/span> indica la ruta del archivo mesh.<\/p><p style=\"padding-left: 40px;\"><span style=\"color: #0170b9;\"><strong><em>scale:<\/em><\/strong><\/span> permite realizar un escalado aplicando coeficientes en las direcciones x, y, z.\u00a0<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-04b1b5d elementor-widget elementor-widget-text-editor\" data-id=\"04b1b5d\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h4>Indicando la ruta del archivo de malla<\/h4><p>Supongamos que, como es habitual, hemos incluido en nuestro paquete una <b>carpeta <i>meshes<\/i><\/b> donde ubicar los archivos de malla de nuestro modelo y que en la misma tenemos uno al que hemos llamado <i>mesh_file<\/i>. Entonces tendremos una estructura de archivos como la siguiente:<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3673e61 elementor-widget elementor-widget-image\" data-id=\"3673e61\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"849\" height=\"533\" src=\"https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3367-package-installation-tree.png\" class=\"attachment-large size-large wp-image-3445\" alt=\"Arbol de instalaci\u00f3n del paquete\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ed002be elementor-widget elementor-widget-text-editor\" data-id=\"ed002be\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Por tanto la ruta de instalaci\u00f3n dentro de nuestro espacio de trabajo al archivo <i>mesh<\/i> ser\u00e1:<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-81a9f23 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"81a9f23\" data-element_type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-81a9f23\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-xonokai\"\n            data-dark-theme=\"mdp-theme-xonokai\"\n        >\n            \n                <pre class=\"language-bash\"data-previewers=\"\"><code>my_workspace\/install\/my_package\/share\/my_package\/meshes\/mesh_file<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_81a9f23 = 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_81a9f23();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_81a9f23 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d36ab4e elementor-widget elementor-widget-text-editor\" data-id=\"d36ab4e\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Para indicar en el atributo <em><b>filename<\/b><\/em> de la etiqueta <i><b>&lt;\u00a0mesh\u00a0&gt;<\/b><\/i> la ruta al archivo de malla tenemos dos posibilidades: usar una ruta absoluta o una ruta relativa.\u00a0<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2178cb1 elementor-widget elementor-widget-text-editor\" data-id=\"2178cb1\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h5>Usando una ruta absoluta<\/h5><p>Prefijando <span style=\"color: #0170b9;\"><strong><em>file:\/\/<\/em><\/strong><\/span> a la ruta del archivo <em>mesh<\/em> indicamos que se trata de una ruta absoluta.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c8c1934 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"c8c1934\" data-element_type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-c8c1934\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-xonokai\"\n            data-dark-theme=\"mdp-theme-xonokai\"\n        >\n            \n                <pre class=\"language-markup\"data-previewers=\"\"><code>&lt;mesh filename=&quot;file:\/\/absolute_path_to_mesh_file&quot;\/&gt;<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_c8c1934 = 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_c8c1934();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_c8c1934 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1052c33 elementor-widget elementor-widget-text-editor\" data-id=\"1052c33\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>El siguiente c\u00f3digo muestra una forma de indicar la ruta con la que no tendremos problemas, dado que al final lo que se obtiene una vez evaluada la expresi\u00f3n es una ruta absoluta al archivo <i>mesh<\/i>, y funcionar\u00e1 tanto en <b><i>Gazebo<\/i><\/b> como en <b><i>Rviz<\/i><\/b>. Pero por contra tendremos que usar el lenguaje de macros <span style=\"color: #0170b9;\"><i><b>xacro<\/b><\/i><\/span> en nuestro archivo URDF.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-557cd9e elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"557cd9e\" data-element_type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-557cd9e\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-xonokai\"\n            data-dark-theme=\"mdp-theme-xonokai\"\n        >\n            \n                <pre class=\"language-markup copy-to-clipboard\"data-previewers=\"\"><code>&lt;mesh filename=&quot;file:\/\/$(find my_package)\/meshes\/mesh_file&quot;\/&gt;<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_557cd9e = 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_557cd9e();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_557cd9e );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-aab49e0 elementor-widget elementor-widget-text-editor\" data-id=\"aab49e0\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<h5>Usando una ruta relativa<\/h5><p>Prefijando <span style=\"color: #0170b9;\"><i><b>package:\/\/<\/b><\/i><\/span> a la ruta del archivo <i>mesh<\/i> indicamos que se trata de una ruta relativa.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-05fd5d5 elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"05fd5d5\" data-element_type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-05fd5d5\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-xonokai\"\n            data-dark-theme=\"mdp-theme-xonokai\"\n        >\n            \n                <pre class=\"language-markup\"data-previewers=\"\"><code>&lt;mesh filename=&quot;package:\/\/relative_path_to_mesh_file&quot;\/&gt;<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_05fd5d5 = 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_05fd5d5();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_05fd5d5 );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-52988ae elementor-widget elementor-widget-text-editor\" data-id=\"52988ae\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>En este caso hay tener en cuenta algunas consideraciones.<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c8256b0 elementor-widget elementor-widget-text-editor\" data-id=\"c8256b0\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p><i><b>Rviz<\/b><\/i>\u00a0interpreta que la ruta indicada es relativa a la carpeta share existente en el directorio de instalaci\u00f3n del paquete:<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dc568cd elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"dc568cd\" data-element_type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-dc568cd\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-xonokai\"\n            data-dark-theme=\"mdp-theme-xonokai\"\n        >\n            \n                <pre class=\"language-bash\"data-previewers=\"\"><code>my_workspace\/install\/my_package\/share\/<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_dc568cd = 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_dc568cd();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_dc568cd );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-27c87fa elementor-widget elementor-widget-text-editor\" data-id=\"27c87fa\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Por tanto, para que sea capaz de encontrar el archivo en nuestro c\u00f3digo URDF tendremos que usar:<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8883b6c elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"8883b6c\" data-element_type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-8883b6c\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-xonokai\"\n            data-dark-theme=\"mdp-theme-xonokai\"\n        >\n            \n                <pre class=\"language-markup\"data-previewers=\"\"><code>&lt;mesh filename=&quot;package:\/\/my_package\/meshes\/mesh_file&quot;\/&gt;<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_8883b6c = 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_8883b6c();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_8883b6c );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-977395d elementor-widget elementor-widget-text-editor\" data-id=\"977395d\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p><strong><em>Gazebo<\/em><\/strong> por su parte busca la ubicaci\u00f3n del archivo en alguna de las rutas (separadas mediante &#8220;:&#8221;) almacenadas en la variable de entorno <span style=\"color: #0170b9;\"><strong><em>GAZEBO_MODEL_PATH<\/em><\/strong><\/span>.\u00a0<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-757ccd7 elementor-widget elementor-widget-text-editor\" data-id=\"757ccd7\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Para que nuestro archivo URDF cargue correctamente los archivos <i>mesh<\/i> tanto en<i> <b>Rviz<\/b><\/i>\u00a0como en <strong><em>Gazebo<\/em><\/strong> tenemos que a\u00f1adir a esta variable de entorno la ruta absoluta a la carpeta <span style=\"color: #0170b9;\"><strong><i>share<\/i><\/strong><\/span>. Para ello podemos insertar en nuestro archivo <span style=\"color: #0170b9;\"><strong><i>launch<\/i><\/strong><\/span> el siguiente c\u00f3digo:<\/p>\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1fd667e elementor-widget elementor-widget-mdp-coder-elementor\" data-id=\"1fd667e\" data-element_type=\"widget\" data-widget_type=\"mdp-coder-elementor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t        <!-- Start Coder for Elementor WordPress Plugin -->\n        <div\n            id=\"mdp-coder-1fd667e\"\n            class=\"mdp-coder-elementor-box\"\n            data-theme=\"mdp-theme-xonokai\"\n            data-dark-theme=\"mdp-theme-xonokai\"\n        >\n            \n                <pre class=\"language-python\"data-previewers=\"\"><code>import os\nfrom ament_index_python import get_package_prefix\n\npkg_share_path = os.pathsep + os.path.join(get_package_prefix(package_name), &#039;share&#039;)\nif &#039;GAZEBO_MODEL_PATH&#039; in os.environ:\n    os.environ[&#039;GAZEBO_MODEL_PATH&#039;] += pkg_share_path\nelse:\n    os.environ[&#039;GAZEBO_MODEL_PATH&#039;] =  pkg_share_path<\/code><\/pre>\n                    <\/div>\n                <script>\n            \"use strict\";\n\n            \/** Handler when the DOM is fully loaded. *\/\n            let callback_1fd667e = 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_1fd667e();\n            } else {\n                document.addEventListener( \"DOMContentLoaded\", callback_1fd667e );\n            }\n\n        <\/script>\n                <!-- End Coder for Elementor WordPress Plugin -->\n\n        \t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-60c8f86 elementor-widget elementor-widget-text-editor\" data-id=\"60c8f86\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<p>Donde la funci\u00f3n <span style=\"color: #0170b9;\"><em><strong>get_package_prefix<\/strong><\/em><\/span> empleada devuelve la siguiente ruta:\u00a0 <span style=\"color: #0170b9;\">\/home\/&#8230;.\/my_workspace\/install\/my_package<\/span>.<\/p>\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>Dota a tus modelos de un mayor realismo utilizando geometr\u00edas de malla mediante archivos mesh.<\/p>\n","protected":false},"author":1,"featured_media":3505,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[5,10],"tags":[12,24,25,11],"class_list":["post-3367","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ros2","category-simulacion","tag-gazebo","tag-mesh","tag-rviz","tag-urdf"],"aioseo_notices":[],"rttpg_featured_image_url":{"full":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3367p-mesh-model.png",1252,739,false],"landscape":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3367p-mesh-model.png",1252,739,false],"portraits":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3367p-mesh-model.png",1252,739,false],"thumbnail":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3367p-mesh-model-150x150.png",150,150,true],"medium":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3367p-mesh-model-300x177.png",300,177,true],"large":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3367p-mesh-model-1024x604.png",1024,604,true],"1536x1536":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3367p-mesh-model.png",1252,739,false],"2048x2048":["https:\/\/robotica-facil-con-ros2.es\/wp-content\/uploads\/2022\/08\/id3367p-mesh-model.png",1252,739,false]},"rttpg_author":{"display_name":"Jose Enrique Cabrera","author_link":"https:\/\/robotica-facil-con-ros2.es\/?author=1"},"rttpg_comment":8,"rttpg_category":"<a href=\"https:\/\/robotica-facil-con-ros2.es\/?cat=5\" rel=\"category\">ROS2<\/a> <a href=\"https:\/\/robotica-facil-con-ros2.es\/?cat=10\" rel=\"category\">SIMULACI\u00d3N<\/a>","rttpg_excerpt":"Dota a tus modelos de un mayor realismo utilizando geometr\u00edas de malla mediante archivos mesh.","_links":{"self":[{"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/posts\/3367","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=3367"}],"version-history":[{"count":232,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/posts\/3367\/revisions"}],"predecessor-version":[{"id":5636,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/posts\/3367\/revisions\/5636"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=\/wp\/v2\/media\/3505"}],"wp:attachment":[{"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/robotica-facil-con-ros2.es\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}