{"id":5005,"date":"2025-11-17T13:16:24","date_gmt":"2025-11-17T13:16:24","guid":{"rendered":"https:\/\/learnbydoing.dev\/?p=5005"},"modified":"2026-01-10T21:51:49","modified_gmt":"2026-01-10T21:51:49","slug":"create-and-understand-a-urdf-model-in-ros-2","status":"publish","type":"post","link":"https:\/\/learnbydoing.dev\/create-and-understand-a-urdf-model-in-ros-2\/","title":{"rendered":"How to Create and Understand a URDF Model in ROS 2"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"5005\" class=\"elementor elementor-5005\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e28ab35 e-flex e-con-boxed e-con e-parent\" data-id=\"e28ab35\" data-element_type=\"container\" data-e-type=\"container\" id=\"content\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-62ab6e3 e-con-full e-flex e-con e-child\" data-id=\"62ab6e3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-62ab203 elementor-align-center elementor-widget elementor-widget-post-info\" data-id=\"62ab203\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"post-info.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul class=\"elementor-inline-items elementor-icon-list-items elementor-post-info\">\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item elementor-repeater-item-2c98363 elementor-inline-item\" itemprop=\"about\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text elementor-post-info__item elementor-post-info__item--type-terms\">\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-post-info__terms-list\">\n\t\t\t\t<span class=\"elementor-post-info__terms-list-item\">ROS 2<\/span>, <span class=\"elementor-post-info__terms-list-item\">Tutoriales<\/span>\t\t\t\t<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-0650e10 e-con-full e-flex e-con e-child\" data-id=\"0650e10\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ac19582 elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"ac19582\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"75\" height=\"75\" viewbox=\"0 0 75 75\" fill=\"none\"><path d=\"M74.9999 75H13.1889V73.0002H71.5859L0.460938 1.87521L1.87515 0.460999L73.0001 71.586V13.1889H74.9999V75Z\" fill=\"white\"><\/path><\/svg>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-47aa245d e-flex e-con-boxed e-con e-parent\" data-id=\"47aa245d\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-15e80c3 elementor-widget elementor-widget-image\" data-id=\"15e80c3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/11\/URDF--1024x576.webp\" class=\"attachment-large size-large wp-image-5055\" alt=\"\" srcset=\"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/11\/URDF--1024x576.webp 1024w, https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/11\/URDF--300x169.webp 300w, https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/11\/URDF--768x432.webp 768w, https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/11\/URDF--1536x864.webp 1536w, https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/11\/URDF--18x10.webp 18w, https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/11\/URDF-.webp 1920w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4bc31ca3 elementor-widget elementor-widget-text-editor\" data-id=\"4bc31ca3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"271\" data-end=\"835\">When working with ROS 2, sooner or later you reach the point where you must describe the physical structure of your robot in detail.<br \/><br \/><\/p><p>This is a fundamental requirement: every component of the ROS 2 ecosystem\u2014RViz, Gazebo, Nav2, controllers, planning libraries\u2014needs to know the dimensions, connections, and shape of each element that makes up the robot. To achieve this, ROS 2 uses a standard description format: URDF, the Unified Robot Description Format, an XML-based language that represents a robot as a collection of rigid parts connected by mechanical joints.<br \/><br \/><\/p><p data-start=\"837\" data-end=\"1226\">Understanding URDF means understanding how ROS 2 interprets your robot, how it builds its kinematic structure, and how it uses that structure for visualization, simulation, and control.<br \/><br \/><\/p><p>This article walks you through the fundamental concepts behind the URDF format and guides you through the practical creation of a complete robot model, as presented in the associated laboratory activity.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-12a4ca0 elementor-widget elementor-widget-text-editor\" data-id=\"12a4ca0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 data-start=\"1233\" data-end=\"1294\">\ud83e\udde0 <strong data-start=\"1236\" data-end=\"1294\">URDF: describing the robot through links and joints<\/strong><\/h3><p data-start=\"1296\" data-end=\"1715\">At the core of URDF is a model organized as a kinematic tree. Every physical component of the robot is represented by a <strong data-start=\"1416\" data-end=\"1424\">link<\/strong>\u2014a rigid body, a sensor, a wheel, a base, or any geometric element.<br \/><br \/><\/p><p>The connections between these links are defined by <strong data-start=\"1543\" data-end=\"1553\">joints<\/strong>, which specify how two elements are attached to one another. A joint may be fixed, rotational, prismatic, or continuous, depending on the type of motion allowed.<br \/><br \/><\/p><p data-start=\"1717\" data-end=\"2218\">This tree structure always starts from a single origin: the <strong data-start=\"1777\" data-end=\"1790\">root link<\/strong>, the first link defined in the file, from which all other components branch out.<br \/><br \/><\/p><p data-start=\"1717\" data-end=\"2218\">Each link may include multiple types of information: a geometry that defines its shape, a material to control its appearance in RViz, and physical properties required for realistic simulation in Gazebo. Joints, on the other hand, define the transformations between reference frames, specifying positions, orientations, and mechanical constraints.<br \/><br \/><\/p><p data-start=\"2220\" data-end=\"2514\">When transitioning to real robotic systems, URDF becomes indispensable. Every motion controller, every dynamics simulation, every navigation algorithm depends on the correctness of the model. This is why URDF is not a cosmetic detail\u2014it is the structural foundation of any robot built in ROS 2.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8e78d80 elementor-widget elementor-widget-image\" data-id=\"8e78d80\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/11\/URDF-1-1024x576.webp\" class=\"attachment-large size-large wp-image-5045\" alt=\"\" srcset=\"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/11\/URDF-1-1024x576.webp 1024w, https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/11\/URDF-1-300x169.webp 300w, https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/11\/URDF-1-768x432.webp 768w, https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/11\/URDF-1-1536x864.webp 1536w, https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/11\/URDF-1-18x10.webp 18w, https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/11\/URDF-1.webp 1920w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4229593 elementor-widget elementor-widget-text-editor\" data-id=\"4229593\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 data-start=\"2521\" data-end=\"2572\"><strong data-start=\"2524\" data-end=\"2572\">\ud83c\udfd7\ufe0f Building the URDF robot model<\/strong><\/h3><p data-start=\"2574\" data-end=\"3004\">Now let\u2019s move to the practical component.<br data-start=\"2616\" data-end=\"2619\" \/>In the lab we construct a small robot model consisting of a base and a LiDAR sensor mounted on top of it. The example is intentionally simple: the goal is to help you understand the underlying logic of URDF without introducing unnecessary complexity. <br \/>Once you grasp these concepts, you can scale the model to more sophisticated robots\u2014exactly as done in professional robotics projects.<br \/>Below you will find the complete URDF file used in the lab, followed by a detailed breakdown, block by block.<\/p><p data-start=\"1530\" data-end=\"1656\"><code data-start=\"1690\" data-end=\"1695\"><\/code><\/p><p data-start=\"1530\" data-end=\"1656\"><code data-start=\"1690\" data-end=\"1695\"><\/code><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3ca20e2 elementor-widget elementor-widget-text-editor\" data-id=\"3ca20e2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 data-start=\"2521\" data-end=\"2572\"><strong data-start=\"93\" data-end=\"120\" data-is-last-node=\"\">&lt;\/&gt; Here&#8217;s the Complete URDF Code<\/strong><\/h3><p data-start=\"1530\" data-end=\"1656\"><code data-start=\"1690\" data-end=\"1695\"><\/code><\/p><p data-start=\"1530\" data-end=\"1656\"><code data-start=\"1690\" data-end=\"1695\"><\/code><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c39e8e2 elementor-widget elementor-widget-code-highlight\" data-id=\"c39e8e2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-xml line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-xml\">\n\t\t\t\t\t<xmp><?xml version=\"1.0\"?>\r\n<robot name=\"my_robot\">\r\n\r\n  <link name=\"base_link\">\r\n    <visual>\r\n      <geometry>\r\n        <box size=\"0.3 0.3 0.15\"\/>\r\n      <\/geometry>\r\n      <material name=\"blue\"\/>\r\n    <\/visual>\r\n  <\/link>\r\n\r\n  <link name=\"lidar_link\">\r\n    <visual>\r\n      <geometry>\r\n        <cylinder length=\"0.05\" radius=\"0.05\"\/>\r\n      <\/geometry>\r\n      <material name=\"red\"\/>\r\n    <\/visual>\r\n  <\/link>\r\n\r\n  <joint name=\"lidar_joint\" type=\"fixed\">\r\n    <parent link=\"base_link\"\/>\r\n    <child link=\"lidar_link\"\/>\r\n    <origin xyz=\"0 0 0.2\" rpy=\"0 0 0\"\/>\r\n  <\/joint>\r\n\r\n<\/robot>\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-961c2f7 elementor-widget elementor-widget-text-editor\" data-id=\"961c2f7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 data-start=\"2586\" data-end=\"2639\"><strong>\ud83e\udde9\u00a0Breaking Down the Code<\/strong><\/h3><p data-start=\"1530\" data-end=\"1656\"><code data-start=\"1690\" data-end=\"1695\"><\/code><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-79cee2d elementor-widget elementor-widget-text-editor\" data-id=\"79cee2d\" 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<h5 data-start=\"2586\" data-end=\"2639\"><strong>\u00a0Robot Definition<\/strong><\/h5><p data-start=\"1530\" data-end=\"1656\"><code data-start=\"1690\" data-end=\"1695\"><\/code><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-635f0ee elementor-widget elementor-widget-code-highlight\" data-id=\"635f0ee\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-xml line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-xml\">\n\t\t\t\t\t<xmp><?xml version=\"1.0\"?>\r\n<robot name=\"my_robot\">\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-424d237 elementor-widget elementor-widget-text-editor\" data-id=\"424d237\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"4742\" data-end=\"4808\">This opening declares that the file follows XML syntax and introduces the main container for the entire URDF description. The <code data-start=\"455\" data-end=\"464\">&lt;robot&gt;<\/code> tag encapsulates every structural element and assigns a unique name to the model. ROS uses this name to identify the robot within tools such as RViz, Gazebo, and the TF transform system. It is effectively the starting point of the entire model hierarchy.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8840d89 elementor-widget elementor-widget-text-editor\" data-id=\"8840d89\" 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<h5 data-start=\"4742\" data-end=\"4808\"><strong>Definition of the Base Link<\/strong><\/h5>\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-34e2893 elementor-widget elementor-widget-code-highlight\" data-id=\"34e2893\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-xml\">\n\t\t\t\t<code readonly=\"true\" class=\"language-xml\">\n\t\t\t\t\t<xmp><link name=\"base_link\">\r\n  <visual>\r\n    <geometry>\r\n      <box size=\"0.3 0.3 0.15\"\/>\r\n    <\/geometry>\r\n    <material name=\"blue\"\/>\r\n  <\/visual>\r\n<\/link>\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0ed0bb9 elementor-widget elementor-widget-text-editor\" data-id=\"0ed0bb9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"3907\" data-end=\"4070\">This block defines the root link, the foundational element from which the entire robot structure is built.<br \/><br data-start=\"1037\" data-end=\"1040\" \/>Inside the <code data-start=\"1051\" data-end=\"1061\">&lt;visual&gt;<\/code> tag, we specify how the link should appear visually. <br \/><br \/>The <code data-start=\"1119\" data-end=\"1131\">&lt;geometry&gt;<\/code> section represents its shape; in this case, a rectangular box measuring 0.3 \u00d7 0.3 \u00d7 0.15 meters. This is a common simplified representation of the robot\u2019s main body.<br \/><br data-start=\"1297\" data-end=\"1300\" \/>The <code data-start=\"1304\" data-end=\"1316\">&lt;material&gt;<\/code> tag assigns a color to the link, which is extremely useful during RViz visualization to visually distinguish different robot components, even though it does not affect physics or simulation behavior.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9f13b34 elementor-widget elementor-widget-text-editor\" data-id=\"9f13b34\" 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<h5 data-start=\"3907\" data-end=\"4070\"><strong>\u00a0Definition of the LiDAR Link<\/strong><\/h5>\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-fbbfe30 elementor-widget elementor-widget-code-highlight\" data-id=\"fbbfe30\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-xml\">\n\t\t\t\t<code readonly=\"true\" class=\"language-xml\">\n\t\t\t\t\t<xmp><link name=\"lidar_link\">\r\n  <visual>\r\n    <geometry>\r\n      <cylinder length=\"0.05\" radius=\"0.05\"\/>\r\n    <\/geometry>\r\n    <material name=\"red\"\/>\r\n  <\/visual>\r\n<\/link>\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dc28add elementor-widget elementor-widget-text-editor\" data-id=\"dc28add\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"4153\" data-end=\"4283\">This link corresponds to the 2D LiDAR sensor mounted on the robot. The cylindrical geometry matches the shape of many commercial LiDAR units, making the model easier to interpret visually.<br \/><br data-start=\"1930\" data-end=\"1933\" \/>As before, the <code data-start=\"1948\" data-end=\"1958\">&lt;visual&gt;<\/code> section defines how the sensor appears, while the <code data-start=\"2009\" data-end=\"2021\">&lt;material&gt;<\/code> tag assigns a different color to distinguish it from the base. <br \/><br \/>This visual distinction becomes especially valuable when working with more complex models containing multiple sensors or articulated components.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cea4b67 elementor-widget elementor-widget-text-editor\" data-id=\"cea4b67\" 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<h5 data-start=\"4153\" data-end=\"4283\"><strong>\u00a0Connecting the Base and the LiDAR<\/strong><\/h5>\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-7da3562 elementor-widget elementor-widget-code-highlight\" data-id=\"7da3562\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-xml\">\n\t\t\t\t<code readonly=\"true\" class=\"language-xml\">\n\t\t\t\t\t<xmp><joint name=\"lidar_joint\" type=\"fixed\">\r\n  <parent link=\"base_link\"\/>\r\n  <child link=\"lidar_link\"\/>\r\n  <origin xyz=\"0 0 0.2\" rpy=\"0 0 0\"\/>\r\n<\/joint>\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a73b77a elementor-widget elementor-widget-text-editor\" data-id=\"a73b77a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>This block defines the joint that attaches the LiDAR to the robot\u2019s base.<br \/><br data-start=\"2518\" data-end=\"2521\" \/>The joint type <code data-start=\"2536\" data-end=\"2543\">fixed<\/code> indicates that there is no relative motion between the two links: the sensor is rigidly attached to the robot both in visualization and in simulation.<br \/><br data-start=\"2694\" data-end=\"2697\" \/>The <code data-start=\"2701\" data-end=\"2711\">&lt;parent&gt;<\/code> and <code data-start=\"2716\" data-end=\"2725\">&lt;child&gt;<\/code> tags clarify the relationship between the links, explicitly defining which one supports the other.<br \/><br data-start=\"2824\" data-end=\"2827\" \/>The <code data-start=\"2831\" data-end=\"2841\">&lt;origin&gt;<\/code> element specifies the transform applied to the child link relative to the parent. Here, <code data-start=\"2930\" data-end=\"2945\">xyz=\"0 0 0.2\"<\/code> places the LiDAR exactly above the center of the base at a height of 20 cm, while <code data-start=\"3028\" data-end=\"3041\">rpy=\"0 0 0\"<\/code> ensures no rotation is applied. <br \/><br \/>This offset is critical because it determines how the LiDAR frame is positioned within the TF tree used throughout ROS.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4528eab elementor-widget elementor-widget-text-editor\" data-id=\"4528eab\" 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<h5><strong>Closing the Model<\/strong><\/h5>\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-9790003 elementor-widget elementor-widget-code-highlight\" data-id=\"9790003\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-tomorrow copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-xml\">\n\t\t\t\t<code readonly=\"true\" class=\"language-xml\">\n\t\t\t\t\t<xmp><\/robot>\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-09ad431 elementor-widget elementor-widget-text-editor\" data-id=\"09ad431\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p data-start=\"1569\" data-end=\"1754\">This closing tag marks the end of the robot definition. At this point, ROS 2 can fully interpret the URDF model, generate the TF frame hierarchy, display the robot in RViz, and\u2014if needed\u2014simulate it in Gazebo.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-37d278a elementor-widget elementor-widget-text-editor\" data-id=\"37d278a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 data-start=\"3122\" data-end=\"3161\">\ud83d\udc40 <strong data-start=\"3125\" data-end=\"3161\">Visualizing the model in RViz<\/strong><\/h3><p data-start=\"3163\" data-end=\"3515\">After creating the file, the next step is verifying that everything is defined correctly. Loading the URDF into RViz is an excellent way to check frame alignment, link placement, and overall robot structure.<br \/><br \/><\/p><p>This mirrors the logic used in the articles on lifecycle nodes, where visualization was essential to understand the current state of the system.<br \/><br \/><\/p><p data-start=\"3517\" data-end=\"3679\">In real-world projects, this validation step is crucial: even a small mistake in a joint definition can lead to unstable behavior during simulation or navigation.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-078e0ac elementor-widget elementor-widget-text-editor\" data-id=\"078e0ac\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h3 data-start=\"8212\" data-end=\"8228\"><strong>\ud83c\udfafConclusion<\/strong><\/h3><p data-start=\"3705\" data-end=\"3957\">URDF represents the \u201cbody\u201d of the robot inside the ROS 2 ecosystem. In this article, you learned how to construct a complete model, how to interpret it block by block, and how to leverage its geometric and structural information in visualization tools.<br \/><br \/><\/p><p data-start=\"3959\" data-end=\"4257\">However, this is only the first step.<br data-start=\"3996\" data-end=\"3999\" \/>In professional robotic systems, a simple URDF quickly evolves into more advanced Xacro structures, integrates dynamic plugins, incorporates precise physical parameters, and becomes part of a larger workflow that connects simulation, control, and navigation.<br \/><br \/><\/p><p data-start=\"4259\" data-end=\"4545\">If you want to learn how to build complete, professional robotic systems\u2014not just simple lab examples\u2014the full ROS 2 course provides structured lessons, ready-to-use materials, step-by-step guidance, and practical tools that will make you fully autonomous in every stage of development.<br \/><br \/><\/p><p data-start=\"4547\" data-end=\"4653\">\u00a0<\/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\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-c5d20e7 e-con-full e-flex e-con e-parent\" data-id=\"c5d20e7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e8bdddd elementor-bg-transform elementor-bg-transform-move-left elementor-cta--layout-image-left elementor-cta--mobile-layout-image-above elementor-cta--skin-classic elementor-animated-content elementor-widget elementor-widget-call-to-action\" data-id=\"e8bdddd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"call-to-action.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-cta\">\n\t\t\t\t\t<div class=\"elementor-cta__bg-wrapper\">\n\t\t\t\t<div class=\"elementor-cta__bg elementor-bg\" style=\"background-image: url(https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/06\/plan_navigation.webp);\" role=\"img\" aria-label=\"plan_navigation\"><\/div>\n\t\t\t\t<div class=\"elementor-cta__bg-overlay\"><\/div>\n\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-cta__content\">\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<h2 class=\"elementor-cta__title elementor-cta__content-item elementor-content-item\">\n\t\t\t\t\t\tWant to learn more?\t\t\t\t\t<\/h2>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-cta__description elementor-cta__content-item elementor-content-item\">\n\t\t\t\t\t\tIf you want to learn how to design and build professional robotic systems leveraging the full power of ROS 2 Lifecycle Nodes, check out our \"Self Driving and ROS 2 - Learn by doing! Odometry &amp; Control\" course\t\t\t\t\t<\/div>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-cta__button-wrapper elementor-cta__content-item elementor-content-item\">\n\t\t\t\t\t<a class=\"elementor-cta__button elementor-button elementor-size-\" href=\"\" target=\"_blank\">\n\t\t\t\t\t\tEnroll Now\t\t\t\t\t<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t<div class=\"elementor-ribbon elementor-ribbon-right\">\n\t\t\t\t<div class=\"elementor-ribbon-inner\">\n\t\t\t\t\tDISCOUNT\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>When working with ROS 2, sooner or later you reach the point where you must describe the physical structure of your robot in detail. This is a fundamental requirement: every component of the ROS 2 ecosystem\u2014RViz, Gazebo, Nav2, controllers, planning libraries\u2014needs to know the dimensions, connections, and shape of each element that makes up the [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":5055,"comment_status":"closed","ping_status":"open","sticky":false,"template":"elementor_header_footer","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[45,43],"tags":[328,347,349,367,179,66,74,106,319,96,110,343,348,296,371,71,107,365,362,368,370,372,364,72,342,76,73,366,361,363,369],"class_list":["post-5005","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ros-2","category-tutorials","tag-antonio-brandi","tag-brandi","tag-costmaps","tag-create-urdf-ros-2","tag-lbd","tag-learn-by-doing","tag-linux","tag-mapping","tag-maps","tag-nav2","tag-navigation","tag-obstacle","tag-pc","tag-raspberry","tag-robot-modeling-ros-2","tag-ros","tag-ros-2","tag-ros-2-robot-description","tag-ros-2-robot-model","tag-ros-2-rviz-urdf","tag-ros-2-simulation","tag-ros-2-step-by-step-tutorial","tag-ros-2-urdf-guide","tag-ros2","tag-static","tag-step-by-step","tag-ubuntu","tag-urdf-links-and-joints","tag-urdf-ros-2","tag-urdf-tutorial","tag-xacro-vs-urdf"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to Create and Understand a URDF Model in ROS 2 - Learn by Doing!<\/title>\n<meta name=\"description\" content=\"Learn how to create, understand and visualize a full URDF robot model in ROS 2 with a clear step-by-step guide and practical examples.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/learnbydoing.dev\/es\/create-and-understand-a-urdf-model-in-ros-2\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Create and Understand a URDF Model in ROS 2\" \/>\n<meta property=\"og:description\" content=\"Learn by Doing!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/learnbydoing.dev\/es\/create-and-understand-a-urdf-model-in-ros-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Learn by Doing!\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-17T13:16:24+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-10T21:51:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/11\/URDF-.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/learnbydoing.dev\\\/create-and-understand-a-urdf-model-in-ros-2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/learnbydoing.dev\\\/create-and-understand-a-urdf-model-in-ros-2\\\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"How to Create and Understand a URDF Model in ROS 2\",\"datePublished\":\"2025-11-17T13:16:24+00:00\",\"dateModified\":\"2026-01-10T21:51:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/learnbydoing.dev\\\/create-and-understand-a-urdf-model-in-ros-2\\\/\"},\"wordCount\":1106,\"publisher\":{\"@id\":\"https:\\\/\\\/learnbydoing.dev\\\/es\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/learnbydoing.dev\\\/create-and-understand-a-urdf-model-in-ros-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/learnbydoing.dev\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/URDF-.webp\",\"keywords\":[\"antonio brandi\",\"brandi\",\"costmaps\",\"Create URDF ROS 2\",\"lbd\",\"learn by doing\",\"Linux\",\"mapping\",\"Maps\",\"nav2\",\"navigation\",\"obstacle\",\"pc\",\"Raspberry\",\"Robot modeling ROS 2\",\"ROS\",\"ROS 2\",\"ROS 2 robot description\",\"ROS 2 robot model\",\"ROS 2 RViz URDF\",\"ROS 2 simulation\",\"ROS 2 step-by-step tutorial\",\"ROS 2 URDF guide\",\"ROS2\",\"static\",\"step by step\",\"Ubuntu\",\"URDF links and joints\",\"URDF ROS 2\",\"URDF tutorial\",\"Xacro vs URDF\"],\"articleSection\":[\"ROS 2\",\"Tutorials\"],\"inLanguage\":\"es\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/learnbydoing.dev\\\/create-and-understand-a-urdf-model-in-ros-2\\\/\",\"url\":\"https:\\\/\\\/learnbydoing.dev\\\/create-and-understand-a-urdf-model-in-ros-2\\\/\",\"name\":\"How to Create and Understand a URDF Model in ROS 2 - Learn by Doing!\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/learnbydoing.dev\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/learnbydoing.dev\\\/create-and-understand-a-urdf-model-in-ros-2\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/learnbydoing.dev\\\/create-and-understand-a-urdf-model-in-ros-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/learnbydoing.dev\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/URDF-.webp\",\"datePublished\":\"2025-11-17T13:16:24+00:00\",\"dateModified\":\"2026-01-10T21:51:49+00:00\",\"description\":\"Learn how to create, understand and visualize a full URDF robot model in ROS 2 with a clear step-by-step guide and practical examples.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/learnbydoing.dev\\\/create-and-understand-a-urdf-model-in-ros-2\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/learnbydoing.dev\\\/create-and-understand-a-urdf-model-in-ros-2\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/learnbydoing.dev\\\/create-and-understand-a-urdf-model-in-ros-2\\\/#primaryimage\",\"url\":\"https:\\\/\\\/learnbydoing.dev\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/URDF-.webp\",\"contentUrl\":\"https:\\\/\\\/learnbydoing.dev\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/URDF-.webp\",\"width\":1920,\"height\":1080},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/learnbydoing.dev\\\/create-and-understand-a-urdf-model-in-ros-2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/learnbydoing.dev\\\/es\\\/learn-by-doing-es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Create and Understand a URDF Model in ROS 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/learnbydoing.dev\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/learnbydoing.dev\\\/es\\\/\",\"name\":\"Learn by Doing!\",\"description\":\"Learn Robotics the fun way\",\"publisher\":{\"@id\":\"https:\\\/\\\/learnbydoing.dev\\\/es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/learnbydoing.dev\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/learnbydoing.dev\\\/es\\\/#organization\",\"name\":\"Learn by Doing!\",\"url\":\"https:\\\/\\\/learnbydoing.dev\\\/es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/learnbydoing.dev\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/learnbydoing.dev\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-cropped-cropped-Progetto-senza-titolo-6-1.png\",\"contentUrl\":\"https:\\\/\\\/learnbydoing.dev\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-cropped-cropped-Progetto-senza-titolo-6-1.png\",\"width\":512,\"height\":512,\"caption\":\"Learn by Doing!\"},\"image\":{\"@id\":\"https:\\\/\\\/learnbydoing.dev\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/in\\\/antonio-brandi-512166bb\\\/\"]},{\"@type\":\"Person\",\"@id\":\"\",\"url\":\"https:\\\/\\\/learnbydoing.dev\\\/es\\\/author\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Create and Understand a URDF Model in ROS 2 - Learn by Doing!","description":"Learn how to create, understand and visualize a full URDF robot model in ROS 2 with a clear step-by-step guide and practical examples.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/learnbydoing.dev\/es\/create-and-understand-a-urdf-model-in-ros-2\/","og_locale":"es_ES","og_type":"article","og_title":"How to Create and Understand a URDF Model in ROS 2","og_description":"Learn by Doing!","og_url":"https:\/\/learnbydoing.dev\/es\/create-and-understand-a-urdf-model-in-ros-2\/","og_site_name":"Learn by Doing!","article_published_time":"2025-11-17T13:16:24+00:00","article_modified_time":"2026-01-10T21:51:49+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/11\/URDF-.webp","type":"image\/webp"}],"twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"","Tiempo de lectura":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/learnbydoing.dev\/create-and-understand-a-urdf-model-in-ros-2\/#article","isPartOf":{"@id":"https:\/\/learnbydoing.dev\/create-and-understand-a-urdf-model-in-ros-2\/"},"author":{"name":"","@id":""},"headline":"How to Create and Understand a URDF Model in ROS 2","datePublished":"2025-11-17T13:16:24+00:00","dateModified":"2026-01-10T21:51:49+00:00","mainEntityOfPage":{"@id":"https:\/\/learnbydoing.dev\/create-and-understand-a-urdf-model-in-ros-2\/"},"wordCount":1106,"publisher":{"@id":"https:\/\/learnbydoing.dev\/es\/#organization"},"image":{"@id":"https:\/\/learnbydoing.dev\/create-and-understand-a-urdf-model-in-ros-2\/#primaryimage"},"thumbnailUrl":"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/11\/URDF-.webp","keywords":["antonio brandi","brandi","costmaps","Create URDF ROS 2","lbd","learn by doing","Linux","mapping","Maps","nav2","navigation","obstacle","pc","Raspberry","Robot modeling ROS 2","ROS","ROS 2","ROS 2 robot description","ROS 2 robot model","ROS 2 RViz URDF","ROS 2 simulation","ROS 2 step-by-step tutorial","ROS 2 URDF guide","ROS2","static","step by step","Ubuntu","URDF links and joints","URDF ROS 2","URDF tutorial","Xacro vs URDF"],"articleSection":["ROS 2","Tutorials"],"inLanguage":"es"},{"@type":"WebPage","@id":"https:\/\/learnbydoing.dev\/create-and-understand-a-urdf-model-in-ros-2\/","url":"https:\/\/learnbydoing.dev\/create-and-understand-a-urdf-model-in-ros-2\/","name":"How to Create and Understand a URDF Model in ROS 2 - Learn by Doing!","isPartOf":{"@id":"https:\/\/learnbydoing.dev\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/learnbydoing.dev\/create-and-understand-a-urdf-model-in-ros-2\/#primaryimage"},"image":{"@id":"https:\/\/learnbydoing.dev\/create-and-understand-a-urdf-model-in-ros-2\/#primaryimage"},"thumbnailUrl":"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/11\/URDF-.webp","datePublished":"2025-11-17T13:16:24+00:00","dateModified":"2026-01-10T21:51:49+00:00","description":"Learn how to create, understand and visualize a full URDF robot model in ROS 2 with a clear step-by-step guide and practical examples.","breadcrumb":{"@id":"https:\/\/learnbydoing.dev\/create-and-understand-a-urdf-model-in-ros-2\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/learnbydoing.dev\/create-and-understand-a-urdf-model-in-ros-2\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/learnbydoing.dev\/create-and-understand-a-urdf-model-in-ros-2\/#primaryimage","url":"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/11\/URDF-.webp","contentUrl":"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/11\/URDF-.webp","width":1920,"height":1080},{"@type":"BreadcrumbList","@id":"https:\/\/learnbydoing.dev\/create-and-understand-a-urdf-model-in-ros-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/learnbydoing.dev\/es\/learn-by-doing-es\/"},{"@type":"ListItem","position":2,"name":"How to Create and Understand a URDF Model in ROS 2"}]},{"@type":"WebSite","@id":"https:\/\/learnbydoing.dev\/es\/#website","url":"https:\/\/learnbydoing.dev\/es\/","name":"Learn by Doing!","description":"Learn Robotics the fun way","publisher":{"@id":"https:\/\/learnbydoing.dev\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/learnbydoing.dev\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/learnbydoing.dev\/es\/#organization","name":"Learn by Doing!","url":"https:\/\/learnbydoing.dev\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/learnbydoing.dev\/es\/#\/schema\/logo\/image\/","url":"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/06\/cropped-cropped-cropped-Progetto-senza-titolo-6-1.png","contentUrl":"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/06\/cropped-cropped-cropped-Progetto-senza-titolo-6-1.png","width":512,"height":512,"caption":"Learn by Doing!"},"image":{"@id":"https:\/\/learnbydoing.dev\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/in\/antonio-brandi-512166bb\/"]},{"@type":"Person","@id":"","url":"https:\/\/learnbydoing.dev\/es\/author\/"}]}},"_links":{"self":[{"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/posts\/5005","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/comments?post=5005"}],"version-history":[{"count":31,"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/posts\/5005\/revisions"}],"predecessor-version":[{"id":5481,"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/posts\/5005\/revisions\/5481"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/media\/5055"}],"wp:attachment":[{"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/media?parent=5005"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/categories?post=5005"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/tags?post=5005"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}