{"id":3857,"date":"2025-08-18T11:20:17","date_gmt":"2025-08-18T11:20:17","guid":{"rendered":"https:\/\/learnbydoing.dev\/?p=3857"},"modified":"2026-01-10T21:43:17","modified_gmt":"2026-01-10T21:43:17","slug":"launching-the-complete-robot-simulation-in-ros-2","status":"publish","type":"post","link":"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/","title":{"rendered":"Launching the Complete Robot Simulation in ROS 2"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"3857\" class=\"elementor elementor-3857\" 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\">Tutorials<\/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-1943f30 elementor-widget elementor-widget-image\" data-id=\"1943f30\" 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\/08\/Voice-Interaction-Model-1024x576.webp\" class=\"attachment-large size-large wp-image-3745\" alt=\"\" srcset=\"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/08\/Voice-Interaction-Model-1024x576.webp 1024w, https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/08\/Voice-Interaction-Model-300x169.webp 300w, https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/08\/Voice-Interaction-Model-768x432.webp 768w, https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/08\/Voice-Interaction-Model-1536x864.webp 1536w, https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/08\/Voice-Interaction-Model-18x10.webp 18w, https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/08\/Voice-Interaction-Model.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-261c3d8 elementor-widget elementor-widget-text-editor\" data-id=\"261c3d8\" 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=\"283\" data-end=\"475\">Up to this point, we have built and tested individual parts of our robot: the URDF description, Gazebo simulation, controllers, and even integration with MoveIt and a remote Alexa interface.<\/p><p data-start=\"477\" data-end=\"631\">Now it\u2019s time to bring everything together into a <strong data-start=\"527\" data-end=\"549\">single launch file<\/strong> that runs the complete robot simulation with all components working in harmony.<\/p><p data-start=\"633\" data-end=\"805\">This is a crucial step before deploying the system onto the physical robot, as it allows us to validate the entire software pipeline in a safe and controlled environment.<\/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-e04c0ca elementor-widget elementor-widget-text-editor\" data-id=\"e04c0ca\" 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<h2 data-start=\"812\" data-end=\"848\"><strong>1. Creating the Bringup Package<\/strong><\/h2><p data-start=\"850\" data-end=\"1012\">First, we create a new ROS 2 package called <code data-start=\"894\" data-end=\"914\">arduinobot_bringup<\/code>. This package will serve as the central place to manage launch files for bringing up the robot.<\/p><h3 data-start=\"1014\" data-end=\"1032\">\u00a0<\/h3><h3 data-start=\"1014\" data-end=\"1032\"><strong>Full Command<\/strong><\/h3>\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-b422a3c elementor-widget elementor-widget-code-highlight\" data-id=\"b422a3c\" 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-bash line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>ros2 pkg create arduinobot_bringup\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-1560ace elementor-widget elementor-widget-text-editor\" data-id=\"1560ace\" 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=\"1087\" data-end=\"1118\">Let\u2019s break down the code<\/h3><ul data-start=\"1120\" data-end=\"1377\"><li data-start=\"1120\" data-end=\"1184\"><p data-start=\"1122\" data-end=\"1184\"><code data-start=\"1122\" data-end=\"1139\">ros2 pkg create<\/code> \u2192 Command to generate a new ROS 2 package.<\/p><\/li><li data-start=\"1185\" data-end=\"1377\"><p data-start=\"1187\" data-end=\"1377\"><code data-start=\"1187\" data-end=\"1207\">arduinobot_bringup<\/code> \u2192 The name of the package. By convention, a <code data-start=\"1252\" data-end=\"1263\">*_bringup<\/code> package contains launch files and scripts that \u201cbring up\u201d the robot system (start all its components together).<\/p><\/li><\/ul>\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-e6f21a8 elementor-widget elementor-widget-text-editor\" data-id=\"e6f21a8\" 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<h2 data-start=\"1384\" data-end=\"1415\"><strong>2. Writing the Launch File<\/strong><\/h2><p data-start=\"1417\" data-end=\"1579\">Now we create the main launch file: <code data-start=\"1453\" data-end=\"1480\">simulated_robot.launch.py<\/code>. This file will start <strong data-start=\"1503\" data-end=\"1513\">Gazebo<\/strong>, the <strong data-start=\"1519\" data-end=\"1534\">controllers<\/strong>, <strong data-start=\"1536\" data-end=\"1546\">MoveIt<\/strong>, and the <strong data-start=\"1556\" data-end=\"1576\">remote interface<\/strong>.<\/p><h3 data-start=\"1581\" data-end=\"1623\">Full Code: <code data-start=\"1596\" data-end=\"1623\">simulated_robot.launch.py<\/code><\/h3>\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-5e864ea elementor-widget elementor-widget-code-highlight\" data-id=\"5e864ea\" 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-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>from launch import LaunchDescription\r\nfrom launch_ros.actions import Node\r\nfrom launch.actions import IncludeLaunchDescription\r\nfrom launch.launch_description_sources import PythonLaunchDescriptionSource\r\nimport os\r\n\r\nfrom ament_index_python.packages import get_package_share_directory\r\n\r\ndef generate_launch_description():\r\n    # Get paths to other packages\r\n    gazebo_pkg = get_package_share_directory('arduinobot_gazebo')\r\n    controller_pkg = get_package_share_directory('arduinobot_controller')\r\n    moveit_pkg = get_package_share_directory('arduinobot_moveit')\r\n    interface_pkg = get_package_share_directory('arduinobot_remote_interface')\r\n\r\n    # Include their launch files\r\n    gazebo_launch = IncludeLaunchDescription(\r\n        PythonLaunchDescriptionSource(\r\n            os.path.join(gazebo_pkg, 'launch', 'gazebo.launch.py'))\r\n    )\r\n\r\n    controller_launch = IncludeLaunchDescription(\r\n        PythonLaunchDescriptionSource(\r\n            os.path.join(controller_pkg, 'launch', 'controller.launch.py'))\r\n    )\r\n\r\n    moveit_launch = IncludeLaunchDescription(\r\n        PythonLaunchDescriptionSource(\r\n            os.path.join(moveit_pkg, 'launch', 'moveit.launch.py'))\r\n    )\r\n\r\n    interface_launch = IncludeLaunchDescription(\r\n        PythonLaunchDescriptionSource(\r\n            os.path.join(interface_pkg, 'launch', 'interface.launch.py'))\r\n    )\r\n\r\n    return LaunchDescription([\r\n        gazebo_launch,\r\n        controller_launch,\r\n        moveit_launch,\r\n        interface_launch\r\n    ])\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-6b7a3fd elementor-widget elementor-widget-text-editor\" data-id=\"6b7a3fd\" 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=\"2220\" data-end=\"2243\"><strong>Let\u2019s break down the code<\/strong><\/h3>\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-132e47b elementor-widget elementor-widget-code-highlight\" data-id=\"132e47b\" 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-python \">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>from launch import LaunchDescription\r\nfrom launch_ros.actions import Node\r\nfrom launch.actions import IncludeLaunchDescription\r\nfrom launch.launch_description_sources import PythonLaunchDescriptionSource\r\nimport os\r\nfrom ament_index_python.packages import get_package_share_directory\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-8f421fc elementor-widget elementor-widget-text-editor\" data-id=\"8f421fc\" 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<ul data-start=\"3452\" data-end=\"3748\"><li data-start=\"3452\" data-end=\"3516\"><p data-start=\"3454\" data-end=\"3516\"><code data-start=\"3454\" data-end=\"3473\">LaunchDescription<\/code> \u2192 Defines the set of processes to start.<\/p><\/li><li data-start=\"3517\" data-end=\"3585\"><p data-start=\"3519\" data-end=\"3585\"><code data-start=\"3519\" data-end=\"3545\">IncludeLaunchDescription<\/code> \u2192 Lets us include other launch files.<\/p><\/li><li data-start=\"3586\" data-end=\"3674\"><p data-start=\"3588\" data-end=\"3674\"><code data-start=\"3588\" data-end=\"3619\">PythonLaunchDescriptionSource<\/code> \u2192 Allows referencing launch files written in Python.<\/p><\/li><li data-start=\"3675\" data-end=\"3748\"><p data-start=\"3677\" data-end=\"3748\"><code data-start=\"3677\" data-end=\"3706\">get_package_share_directory<\/code> \u2192 Finds the path to installed packages.<\/p><\/li><\/ul><h4 data-start=\"3750\" data-end=\"3778\">\u00a0<\/h4><h4 data-start=\"3750\" data-end=\"3778\"><strong>Getting Package Paths<\/strong><\/h4>\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-dfae5a6 elementor-widget elementor-widget-code-highlight\" data-id=\"dfae5a6\" 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-python \">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>gazebo_pkg = get_package_share_directory('arduinobot_gazebo')\r\ncontroller_pkg = get_package_share_directory('arduinobot_controller')\r\nmoveit_pkg = get_package_share_directory('arduinobot_moveit')\r\ninterface_pkg = get_package_share_directory('arduinobot_remote_interface')\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-821e45c elementor-widget elementor-widget-text-editor\" data-id=\"821e45c\" 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=\"4062\" data-end=\"4160\">Here we locate the package directories for Gazebo, controller, MoveIt, and the remote interface.<\/p><h4 data-start=\"4162\" data-end=\"4191\">\u00a0<\/h4><h4 data-start=\"4162\" data-end=\"4191\"><strong>Including Launch Files<\/strong><\/h4>\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-276b79f elementor-widget elementor-widget-code-highlight\" data-id=\"276b79f\" 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-python \">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>gazebo_launch = IncludeLaunchDescription(\r\n    PythonLaunchDescriptionSource(\r\n        os.path.join(gazebo_pkg, 'launch', 'gazebo.launch.py'))\r\n)\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-8691845 elementor-widget elementor-widget-text-editor\" data-id=\"8691845\" 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=\"4349\" data-end=\"4473\">We repeat this for each package (controller, moveit, interface). Each line tells ROS 2 to <strong data-start=\"4439\" data-end=\"4470\">include another launch file<\/strong>.<\/p><h4 data-start=\"4475\" data-end=\"4506\">\u00a0<\/h4><h4 data-start=\"4475\" data-end=\"4506\"><strong>Final Launch Description<\/strong><\/h4>\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-18787ab elementor-widget elementor-widget-code-highlight\" data-id=\"18787ab\" 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-python \">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>return LaunchDescription([\r\n    gazebo_launch,\r\n    controller_launch,\r\n    moveit_launch,\r\n    interface_launch\r\n])\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-6df5f32 elementor-widget elementor-widget-text-editor\" data-id=\"6df5f32\" 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=\"4633\" data-end=\"4749\">This returns a list of launch actions that ROS 2 executes. Running this file launches <strong data-start=\"4719\" data-end=\"4746\">all components together<\/strong>.<\/p><h2 data-start=\"4756\" data-end=\"4795\">\u00a0<\/h2><h2 data-start=\"4756\" data-end=\"4795\"><strong>3. Installing the Launch Directory<\/strong><\/h2><p data-start=\"4797\" data-end=\"4895\">To ensure the launch file is installed with the package, we need to update the <code data-start=\"4876\" data-end=\"4892\">CMakeLists.txt<\/code>.<\/p><h3 data-start=\"4897\" data-end=\"4921\">\u00a0<\/h3><h3 data-start=\"4897\" data-end=\"4921\">Full Code Addition<\/h3>\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-5af4bfd elementor-widget elementor-widget-code-highlight\" data-id=\"5af4bfd\" 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-python \">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>install(\r\n  DIRECTORY launch\r\n  DESTINATION share\/${PROJECT_NAME}\/\r\n)\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-69f68a5 elementor-widget elementor-widget-text-editor\" data-id=\"69f68a5\" 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=\"5009\" data-end=\"5040\"><strong>Let\u2019s break down the code<\/strong><\/h3><ul data-start=\"5042\" data-end=\"5309\"><li data-start=\"5042\" data-end=\"5113\"><p data-start=\"5044\" data-end=\"5113\"><code data-start=\"5044\" data-end=\"5055\">install()<\/code> \u2192 Command in CMake to install files into the workspace.<\/p><\/li><li data-start=\"5114\" data-end=\"5185\"><p data-start=\"5116\" data-end=\"5185\"><code data-start=\"5116\" data-end=\"5134\">DIRECTORY launch<\/code> \u2192 Installs everything in the <code data-start=\"5164\" data-end=\"5172\">launch<\/code> directory.<\/p><\/li><li data-start=\"5186\" data-end=\"5309\"><p data-start=\"5188\" data-end=\"5309\"><code data-start=\"5188\" data-end=\"5224\">DESTINATION share\/${PROJECT_NAME}\/<\/code> \u2192 Puts the files in the package\u2019s share directory so they can be found at runtime.<\/p><\/li><\/ul><h2 data-start=\"5316\" data-end=\"5351\">\u00a0<\/h2><h2 data-start=\"5316\" data-end=\"5351\">4. Running the Full Simulation<\/h2><p data-start=\"5353\" data-end=\"5399\">Now we are ready to run the complete system.<\/p><h4 data-start=\"5401\" data-end=\"5435\">\u00a0<\/h4><h4 data-start=\"5401\" data-end=\"5435\"><strong>Step 1 \u2014 Build the Workspace<\/strong><\/h4>\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-41ebcf3 elementor-widget elementor-widget-code-highlight\" data-id=\"41ebcf3\" 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-bash \">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>colcon build\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-a333079 elementor-widget elementor-widget-text-editor\" data-id=\"a333079\" 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=\"3453\" data-end=\"3477\"><strong>Step 2 \u2014 Source the Workspace<\/strong><\/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-f813f97 elementor-widget elementor-widget-code-highlight\" data-id=\"f813f97\" 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-bash \">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>. install\/setup.bash\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-c32f5d4 elementor-widget elementor-widget-text-editor\" data-id=\"c32f5d4\" 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=\"3453\" data-end=\"3477\"><strong>Step 3 \u2014 Launch the Simulation<\/strong><\/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-ffa8675 elementor-widget elementor-widget-code-highlight\" data-id=\"ffa8675\" 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-bash \">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>ros2 launch arduinobot_bringup simulated_robot.launch.py\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-a15a923 elementor-widget elementor-widget-text-editor\" data-id=\"a15a923\" 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=\"5642\" data-end=\"5759\">When you run this, Gazebo starts, controllers are loaded, MoveIt is initialized, and the remote interface is ready.<\/p><h2 data-start=\"5766\" data-end=\"5805\">\u00a0<\/h2><h2 data-start=\"5766\" data-end=\"5805\"><strong>5. Connecting with Alexa via Ngrok<\/strong><\/h2><p data-start=\"5807\" data-end=\"5902\">To test voice commands remotely, we need to expose the robot\u2019s web service through <strong data-start=\"5890\" data-end=\"5899\">ngrok<\/strong>.<\/p><h3 data-start=\"5904\" data-end=\"5916\">Steps:<\/h3><ol data-start=\"5917\" data-end=\"6200\"><li data-start=\"5917\" data-end=\"5971\"><p data-start=\"5920\" data-end=\"5934\">Start ngrok:<\/p><\/li><\/ol>\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-176de62 elementor-widget elementor-widget-code-highlight\" data-id=\"176de62\" 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-bash \">\n\t\t\t\t<code readonly=\"true\" class=\"language-bash\">\n\t\t\t\t\t<xmp>ngrok http 5000\r\n\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-e22cf2f elementor-widget elementor-widget-text-editor\" data-id=\"e22cf2f\" 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<ol data-start=\"5917\" data-end=\"6200\"><li data-start=\"5972\" data-end=\"6009\">\u00a0<\/li><li data-start=\"5972\" data-end=\"6009\">Copy the new <strong data-start=\"5988\" data-end=\"6006\">Forwarding URL<\/strong>.<\/li><li data-start=\"6010\" data-end=\"6091\"><p data-start=\"6013\" data-end=\"6091\">Paste it into your Alexa Developer Console under the endpoint configuration.<\/p><\/li><li data-start=\"6010\" data-end=\"6091\"><p data-start=\"6013\" data-end=\"6091\">Speak a command to Alexa (e.g., <em data-start=\"6127\" data-end=\"6157\">\u201cMove the robot arm forward\u201d<\/em>) and watch it execute in the simulation.<\/p><\/li><\/ol><h2 data-start=\"6207\" data-end=\"6225\">\u00a0<\/h2><h2 data-start=\"6207\" data-end=\"6225\"><strong>6. Conclusion<\/strong><\/h2><p data-start=\"6227\" data-end=\"6363\">We now have a <strong data-start=\"6241\" data-end=\"6278\">fully integrated robot simulation<\/strong> in ROS 2, complete with Gazebo, controllers, MoveIt, and a remote Alexa interface.<\/p><p data-start=\"6365\" data-end=\"6500\">This simulation acts as a <strong data-start=\"6391\" data-end=\"6402\">sandbox<\/strong> where you can safely test interactions and debug issues before deploying on the physical robot.<\/p><p data-start=\"6502\" data-end=\"6612\">The next step is to bring this exact setup to the real robot \u2014 and that\u2019s when your robot truly comes alive.<\/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\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Up to this point, we have built and tested individual parts of our robot: the URDF description, Gazebo simulation, controllers, and even integration with MoveIt and a remote Alexa interface. Now it\u2019s time to bring everything together into a single launch file that runs the complete robot simulation with all components working in harmony. This [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":3745,"comment_status":"closed","ping_status":"open","sticky":false,"template":"elementor_theme","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[45,43],"tags":[116,129,109,284,179,66,285,71,107,72,273,76,283],"class_list":["post-3857","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ros-2","category-tutorials","tag-alexa","tag-build","tag-control","tag-interaction","tag-lbd","tag-learn-by-doing","tag-model","tag-ros","tag-ros-2","tag-ros2","tag-smart","tag-step-by-step","tag-voice"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Launching the Complete Robot Simulation in ROS 2 - Learn by Doing!<\/title>\n<meta name=\"description\" content=\"Build a Voice Interaction Model in ROS 2 to trigger robot actions and add speech recognition for natural human-robot interaction.\" \/>\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\/launching-the-complete-robot-simulation-in-ros-2\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Launching the Complete Robot Simulation in ROS 2\" \/>\n<meta property=\"og:description\" content=\"Learn by Doing!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/learnbydoing.dev\/es\/launching-the-complete-robot-simulation-in-ros-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Learn by Doing!\" \/>\n<meta property=\"article:published_time\" content=\"2025-08-18T11:20:17+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-10T21:43:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/08\/Voice-Interaction-Model.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=\"3 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"Launching the Complete Robot Simulation in ROS 2\",\"datePublished\":\"2025-08-18T11:20:17+00:00\",\"dateModified\":\"2026-01-10T21:43:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/\"},\"wordCount\":499,\"publisher\":{\"@id\":\"https:\/\/learnbydoing.dev\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/08\/Voice-Interaction-Model.webp\",\"keywords\":[\"alexa\",\"build\",\"control\",\"interaction\",\"lbd\",\"learn by doing\",\"model\",\"ROS\",\"ROS 2\",\"ROS2\",\"smart\",\"step by step\",\"voice\"],\"articleSection\":[\"ROS 2\",\"Tutorials\"],\"inLanguage\":\"es\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/\",\"url\":\"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/\",\"name\":\"Launching the Complete Robot Simulation in ROS 2 - Learn by Doing!\",\"isPartOf\":{\"@id\":\"https:\/\/learnbydoing.dev\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/08\/Voice-Interaction-Model.webp\",\"datePublished\":\"2025-08-18T11:20:17+00:00\",\"dateModified\":\"2026-01-10T21:43:17+00:00\",\"description\":\"Build a Voice Interaction Model in ROS 2 to trigger robot actions and add speech recognition for natural human-robot interaction.\",\"breadcrumb\":{\"@id\":\"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/#primaryimage\",\"url\":\"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/08\/Voice-Interaction-Model.webp\",\"contentUrl\":\"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/08\/Voice-Interaction-Model.webp\",\"width\":1920,\"height\":1080},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-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\":\"Launching the Complete Robot Simulation 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":"Launching the Complete Robot Simulation in ROS 2 - Learn by Doing!","description":"Build a Voice Interaction Model in ROS 2 to trigger robot actions and add speech recognition for natural human-robot interaction.","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\/launching-the-complete-robot-simulation-in-ros-2\/","og_locale":"es_ES","og_type":"article","og_title":"Launching the Complete Robot Simulation in ROS 2","og_description":"Learn by Doing!","og_url":"https:\/\/learnbydoing.dev\/es\/launching-the-complete-robot-simulation-in-ros-2\/","og_site_name":"Learn by Doing!","article_published_time":"2025-08-18T11:20:17+00:00","article_modified_time":"2026-01-10T21:43:17+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/08\/Voice-Interaction-Model.webp","type":"image\/webp"}],"twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"","Tiempo de lectura":"3 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/#article","isPartOf":{"@id":"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/"},"author":{"name":"","@id":""},"headline":"Launching the Complete Robot Simulation in ROS 2","datePublished":"2025-08-18T11:20:17+00:00","dateModified":"2026-01-10T21:43:17+00:00","mainEntityOfPage":{"@id":"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/"},"wordCount":499,"publisher":{"@id":"https:\/\/learnbydoing.dev\/es\/#organization"},"image":{"@id":"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/#primaryimage"},"thumbnailUrl":"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/08\/Voice-Interaction-Model.webp","keywords":["alexa","build","control","interaction","lbd","learn by doing","model","ROS","ROS 2","ROS2","smart","step by step","voice"],"articleSection":["ROS 2","Tutorials"],"inLanguage":"es"},{"@type":"WebPage","@id":"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/","url":"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/","name":"Launching the Complete Robot Simulation in ROS 2 - Learn by Doing!","isPartOf":{"@id":"https:\/\/learnbydoing.dev\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/#primaryimage"},"image":{"@id":"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/#primaryimage"},"thumbnailUrl":"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/08\/Voice-Interaction-Model.webp","datePublished":"2025-08-18T11:20:17+00:00","dateModified":"2026-01-10T21:43:17+00:00","description":"Build a Voice Interaction Model in ROS 2 to trigger robot actions and add speech recognition for natural human-robot interaction.","breadcrumb":{"@id":"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-in-ros-2\/#primaryimage","url":"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/08\/Voice-Interaction-Model.webp","contentUrl":"https:\/\/learnbydoing.dev\/wp-content\/uploads\/2025\/08\/Voice-Interaction-Model.webp","width":1920,"height":1080},{"@type":"BreadcrumbList","@id":"https:\/\/learnbydoing.dev\/launching-the-complete-robot-simulation-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":"Launching the Complete Robot Simulation 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\/3857","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=3857"}],"version-history":[{"count":15,"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/posts\/3857\/revisions"}],"predecessor-version":[{"id":5463,"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/posts\/3857\/revisions\/5463"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/media\/3745"}],"wp:attachment":[{"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/media?parent=3857"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/categories?post=3857"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/learnbydoing.dev\/es\/wp-json\/wp\/v2\/tags?post=3857"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}