{"id":4221,"date":"2023-05-08T12:53:19","date_gmt":"2023-05-08T12:53:19","guid":{"rendered":"https:\/\/roboticsbackend.com\/?p=4221"},"modified":"2023-05-08T12:53:19","modified_gmt":"2023-05-08T12:53:19","slug":"ros2-nav2-tutorial","status":"publish","type":"post","link":"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/","title":{"rendered":"ROS2 Nav2 Tutorial"},"content":{"rendered":"<p>In this ROS2 Nav2 tutorial you will learn the basics of the Navigation 2 stack, step by step.<\/p>\n<p>You will first install the Nav2 stack on ROS2 Humble, then you will start directly to generate a map with SLAM. After this, we will check what\u2019s inside the map, and then use this map with the Navigation 2 stack, so that we can make a robot navigate inside the map.<\/p>\n<p>To do all that, you actually don\u2019t need to buy any hardware, we will use the simulation of an already configured robot, the Turtlebot3, on Gazebo.<\/p>\n<p>And this tutorial is in fact inspired by this 1H crash course video:<\/p>\n<p><iframe loading=\"lazy\" title=\"ROS2 Nav2 - Navigation Stack in 1 Hour [Crash Course]\" width=\"1200\" height=\"675\" src=\"https:\/\/www.youtube.com\/embed\/idQb2pB-h2Q?feature=oembed&#038;rel=0\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen><\/iframe><\/p>\n<p>You can watch the video and use the written tutorial to get all the commands quickly.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_81 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-69fcc610b3ee7\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-69fcc610b3ee7\"  aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#What_is_ROS2_Nav2\" >What is ROS2 Nav2?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#Install_Nav2\" >Install Nav2<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#Make_the_robot_move_in_the_environment\" >Make the robot move in the environment<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#Generate_a_map_with_ROS2_Nav2_%E2%80%93_using_SLAM\" >Generate a map with ROS2 Nav2 &#8211; using SLAM<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#Start_the_SLAM_functionality_and_RViz\" >Start the SLAM functionality and RViz<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#Generate_and_save_the_map\" >Generate and save the map<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#Whats_in_the_map\" >What&#8217;s in the map?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#Quick_fix_and_DDS_issue_with_Nav2\" >Quick fix and DDS issue with Nav2<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#Make_the_robot_navigate_using_the_map_and_ROS2_Nav2\" >Make the robot navigate using the map and ROS2 Nav2<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#Start_Navigation_2_for_the_robot\" >Start Navigation 2 for the robot<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#2D_pose_estimate_and_Navigation_goals\" >2D pose estimate and Navigation goals<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#Going_further_with_ROS2_Nav2\" >Going further with ROS2 Nav2<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"What_is_ROS2_Nav2\"><\/span>What is ROS2 Nav2?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Let&#8217;s quickly understand what Nav2 is and why we need it.<\/p>\n<p>And before we get started, let\u2019s just be clear on the terms we are going to use. When I write about Navigation, Navigation 2, Nav2, well this is all the same, I am writing about the Navigation 2 stack in ROS2 (also if I write ROS I also mean ROS2).<\/p>\n<p>So, why do we need Nav2 in the first place? Well, as you probably already know, ROS is a great framework that allows you to develop new robotics applications in no time. You get a lot of &#8220;plumbing&#8221; already done for you, a huge set of plug &amp; play libraries, a community to help you, etc.<\/p>\n<p>Now, how do you go from knowing the ROS basics, to successfully implementing navigation for a mobile robot? This is not trivial at all, and fortunately, the Navigation 2 stack was developed just for that. The &#8220;stack&#8221; is a collection of packages that have been developed with one goal in mind.<\/p>\n<p>And what is this goal? The main goal is to make a robot move from point A to point B, in a safe way. So, basically, to find a path that allows the robot to reach the destination, while making sure that it will not collide with other robots, with people, and obstacles.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-4236 aligncenter\" src=\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ROS2_Nav2_goal-1024x343.png\" alt=\"ROS2 Nav2 Goal\" width=\"1024\" height=\"343\" srcset=\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ROS2_Nav2_goal-1024x343.png 1024w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ROS2_Nav2_goal-300x100.png 300w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ROS2_Nav2_goal-768x257.png 768w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ROS2_Nav2_goal.png 1127w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>To achieve this, we will do a 2 step process:<\/p>\n<ol>\n<li>We will create a map of the environment using SLAM.<\/li>\n<li>We will make the robot navigate using this map &#8211; with the Navigation functionalities and tools.<\/li>\n<\/ol>\n<h2><span class=\"ez-toc-section\" id=\"Install_Nav2\"><\/span>Install Nav2<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>As a prerequisite for this tutorial, make sure you have installed Ubuntu and ROS2 on your computer. I strongly recommend using a dual boot for Ubuntu, not a virtual machine (3D tools like Gazebo are usually not working well on VMs). If you do want to use a VM, choose VMWare Workstation (free version) over VirtualBox.<\/p>\n<p>For the following, I will use Ubuntu 22.04 and ROS2 Humble.<\/p>\n<p>So, once you have correctly installed and setup ROS2 on your computer, let&#8217;s install the Navigation 2 stack.<\/p>\n<p>Here is how to install the Nav2 packages.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"beyond\" data-enlighter-linenumbers=\"false\">$ sudo apt install ros-humble-navigation2 ros-humble-nav2-bringup<\/pre>\n<p>As we will use a simulation of a robot on Gazebo, let&#8217;s install the packages for this robot (Turtlebot3).<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"beyond\" data-enlighter-linenumbers=\"false\">$ sudo apt install ros-humble-turtlebot3*<\/pre>\n<p>And that&#8217;s it to get started!<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Make_the_robot_move_in_the_environment\"><\/span>Make the robot move in the environment<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Before we generate a map with Nav2 and use it for navigation, we need to make sure that we can make our robot move in the environment.<\/p>\n<p>If you were using a custom robot, you would need to adapt it first for Nav2. This process is really not easy, especially if you&#8217;re doing it for the first time. So, to make things easier &#8211; as the goal here is just to get an introduction of the stack &#8211; we will use the Turtlebot3 in Gazebo.<\/p>\n<p>We first need to export an environment variable to choose which version of the Turtlebot3 we want to use (burger, waffle, waffle_pi).<\/p>\n<p>Add this line at the end of your .bashrc: <code class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\">export TURTLEBOT3_MODEL=waffle<\/code>. After doing that, make sure to source the .bashrc, or to open a new terminal.<\/p>\n<p>Then, time to start the simulated robot in a Gazebo world.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"beyond\" data-enlighter-linenumbers=\"false\">$ ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py<\/pre>\n<p>Note: the first time you launch this world, it may take some time (a few minutes) and you&#8217;ll have the impression that it froze on the loading screen. Don&#8217;t worry, just wait, don&#8217;t touch anything, and let it load the map. Then, when you start again, it will be much faster.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-4244 aligncenter\" src=\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/Turtlebot3_in_gazebo-1024x613.png\" alt=\"Turtlebot3 world in Gazebo\" width=\"1024\" height=\"613\" srcset=\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/Turtlebot3_in_gazebo-1024x613.png 1024w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/Turtlebot3_in_gazebo-300x179.png 300w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/Turtlebot3_in_gazebo-768x459.png 768w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/Turtlebot3_in_gazebo.png 1292w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>Great, now we have a robot inside a room. Let&#8217;s make it move. In a new terminal, start the teleop node.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"beyond\" data-enlighter-linenumbers=\"false\">$ ros2 run turtlebot3_teleop teleop_keyboard<\/pre>\n<p>You will see some instructions on the terminal. Press keys W, A, S, D, to make the robot move. It&#8217;s not necessarily super intuitive the first time you use it, so take a few minutes to familiarize yourself with the commands. And make sure your mouse is focused on the terminal when you press a key.<\/p>\n<p>Once you can make the robot move in the world, you are ready for the next steps.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Generate_a_map_with_ROS2_Nav2_%E2%80%93_using_SLAM\"><\/span>Generate a map with ROS2 Nav2 &#8211; using SLAM<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>In order to make the robot navigate autonomously in the world, we first need to generate a map of that world. And to do that, we&#8217;ll use the SLAM functionality of the ROS2 Nav2 stack.<\/p>\n<p>Note: there are many possible tools and algorithms to do SLAM. To make it easier we&#8217;ll choose the default SLAM tool for Turtlebot3: cartographer. Later on you can choose to use other tools, such as <a href=\"https:\/\/roboticsbackend.com\/ros2-nav2-generate-a-map-with-slam_toolbox\/\">slam_toolbox<\/a>.<\/p>\n<p>So, how to generate a map with SLAM?<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Start_the_SLAM_functionality_and_RViz\"><\/span>Start the SLAM functionality and RViz<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>First make sure you have started the robot &#8211; here, Turtlebot3 in Gazebo.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"beyond\" data-enlighter-linenumbers=\"false\">$ ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py<\/pre>\n<p>Then, let&#8217;s start the SLAM functionality for Turtlebot3.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"beyond\" data-enlighter-linenumbers=\"false\">$ ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True<\/pre>\n<p>Note: I provide the &#8220;use_sim_time&#8221; argument because we are running on Gazebo, so we want to use the Gazebo time. If using a real robot, skip this argument.<\/p>\n<p>After running this command you will see RViz starting.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-4242 aligncenter\" src=\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ros2_nav2_slam_rviz-1024x569.png\" alt=\"ROS2 Nav2 - SLAM in RViz\" width=\"1024\" height=\"569\" srcset=\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ros2_nav2_slam_rviz-1024x569.png 1024w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ros2_nav2_slam_rviz-300x167.png 300w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ros2_nav2_slam_rviz-768x427.png 768w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ros2_nav2_slam_rviz.png 1135w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>You can see the TFs of the robot, as well as the LaserScan from the Lidar sensor (red dots). Some pixels are already grey\/black. As you make the robot move, pixels will be cleared into 3 categories:<\/p>\n<ul>\n<li>Free space (will turn white),<\/li>\n<li>Obstacle (will turn black),<\/li>\n<li>Unknown space (will stay grey).<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"Generate_and_save_the_map\"><\/span>Generate and save the map<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Now, make the robot move in the world. Here we start the Turtlebot3 teleop node.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"beyond\" data-enlighter-linenumbers=\"false\">$ ros2 run turtlebot3_teleop teleop_keyboard<\/pre>\n<p>Make the robot move around until you get a satisfying result. By the way, what is a satisfying result? Well if you can manage to clear most of the free space (white pixels), and get most of the obstacles (black pixels), that&#8217;s good enough, and navigation will work fine. No need to clear 100% of the pixels.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-4243 aligncenter\" src=\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ros2_nav2_turtlebot3_slam_mapping-1024x569.png\" alt=\"ROS2 Nav2 - Generated map in RViz with SLAM\" width=\"1024\" height=\"569\" srcset=\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ros2_nav2_turtlebot3_slam_mapping-1024x569.png 1024w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ros2_nav2_turtlebot3_slam_mapping-300x167.png 300w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ros2_nav2_turtlebot3_slam_mapping-768x427.png 768w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ros2_nav2_turtlebot3_slam_mapping.png 1135w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>Once you get a good enough result, it&#8217;s time to save the map. Make sure you don&#8217;t stop the navigation terminal before you save the map, otherwise you&#8217;ll have to start everything again.<\/p>\n<p>To save the map, open a new terminal and run this command.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"beyond\" data-enlighter-linenumbers=\"false\">$ ros2 run nav2_map_server map_saver_cli -f my_map<\/pre>\n<p>With the optional &#8220;-f&#8221; argument you can specify the path\/name for the map. Don&#8217;t add any extension, this will be done automatically for you.<\/p>\n<p>Once you run this, you should see some logs in white and maybe yellow. If it doesn&#8217;t work (red error logs), try again several times.<\/p>\n<p>Your map has now been generated, and you can stop all the commands in all the terminals.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Whats_in_the_map\"><\/span>What&#8217;s in the map?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>You should now have 2 new files:<\/p>\n<ul>\n<li>my_map.yaml<\/li>\n<li>my_map.pgm<\/li>\n<\/ul>\n<p>The PGM file is the image representing the map, with white (free space), black (obstacles) and grey pixels (unknown space).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-4248 aligncenter\" src=\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/my_map.png\" alt=\"Generated map with Nav2 SLAM\" width=\"192\" height=\"178\" \/><\/p>\n<p>The YAML file contains important info about the map. This will be used by the Navigation stack.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\">image: my_map.pgm\nmode: trinary\nresolution: 0.05\norigin: [-2.97, -2.57, 0]\nnegate: 0\noccupied_thresh: 0.65\nfree_thresh: 0.25<\/pre>\n<p>Here is more info about the most important fields:<\/p>\n<ul>\n<li>image: the relative path from the YAML file to the PGM file.<\/li>\n<li>resolution: in meters per pixels. So, here 0.05 meters per pixels. One pixel represents 5 cm. That gives you the precision of the map.<\/li>\n<li>origin: the coordinates of the robot (when it started) relative to the lowest left point on the map.<\/li>\n<li>negate: if you set it to 1, then free and occupied space will be inverted.<\/li>\n<li>occupied_tresh and free_tresh: very basically put, when mapping, each pixel will be given a probability about whether there is an obstacle or not. With the values that you see here, if the probability is greater than 65%, we consider the space to be occupied. If the probability is less than 25%, the space is free.<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"Quick_fix_and_DDS_issue_with_Nav2\"><\/span>Quick fix and DDS issue with Nav2<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Before we continue with Navigation, we need to fix 2 small things.<\/p>\n<p>First, as you may know, ROS2 communication is based on DDS (for the middleware). No need to dive into this now, you just have to know that there are several possible DDS implementations, and the default one for ROS2 is Fast DDS. Unfortunately it doesn&#8217;t work so well with Nav2, so it&#8217;s been recommended to use Cyclone DDS instead.<\/p>\n<p>Let&#8217;s install and setup Cyclone DDS for ROS2.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"beyond\" data-enlighter-linenumbers=\"false\">$ sudo apt install ros-humble-rmw-cyclonedds-cpp<\/pre>\n<p>Cyclone DDS is now installed, now you need to tell ROS2 to use it instead of the default one.<\/p>\n<p>Add this line into your .bahsrc: <span class=\"enlighter-text\"><code class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp<\/code>. You can put it just before sourcing ROS2 for example.<br \/>\n<\/span><\/p>\n<p>Great, DDS problem solved!<\/p>\n<p>One more thing to do, and this is a Turtlebot3 specific issue.<\/p>\n<p>Open this param file:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"beyond\" data-enlighter-linenumbers=\"false\">$ sudo gedit \/opt\/ros\/humble\/share\/turtlebot3_navigation2\/param\/waffle.yaml<\/pre>\n<p>Find this line, and replace it like you see below.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"yaml\" data-enlighter-linenumbers=\"false\">    ...\n    #robot_model_type: \"differential\"\n    robot_model_type: \"nav2_amcl::DifferentialMotionModel\"\n    ...<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Make_the_robot_navigate_using_the_map_and_ROS2_Nav2\"><\/span>Make the robot navigate using the map and ROS2 Nav2<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Great, you now have a map, and everything setup so you can make the robot navigate autonomously, while avoiding obstacles.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Start_Navigation_2_for_the_robot\"><\/span>Start Navigation 2 for the robot<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Let&#8217;s start from a clean environment &#8211; stop everything, close and reopen all terminals. There are a lot of things that can go wrong with RViz and Gazebo, so we make sure to reduce the risks.<\/p>\n<p>Now, start the robot again.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"beyond\" data-enlighter-linenumbers=\"false\">$ ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py<\/pre>\n<p>In another terminal, start the Navigation stack, and provide the map as an argument.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"beyond\" data-enlighter-linenumbers=\"false\">$ ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=True map:=path\/to\/my_map.yaml<\/pre>\n<p>Note: use &#8220;use_sim_time&#8221; only if running with Gazebo. For the &#8220;map&#8221; argument, provide the path to the YAML file of the map.<\/p>\n<p>If you don&#8217;t see the map on RViz, try finding the &#8220;map&#8221; topic options on the left panel, and set to &#8220;transient local&#8221; instead of &#8220;volatile&#8221;. You might also try to restart everything, and even reboot your computer.<\/p>\n<p>Now, you should just see the map on the screen, but no robot. You&#8217;ll also see some kinds of error logs in the terminal. This is because Nav2 doesn&#8217;t know where your robot is, and you need to provide the first 2D pose estimate.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-4241 aligncenter\" src=\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/nav2_navigation_using_generated_map-1024x567.png\" alt=\"Nav2 - Navigation using generated map\" width=\"1024\" height=\"567\" srcset=\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/nav2_navigation_using_generated_map-1024x567.png 1024w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/nav2_navigation_using_generated_map-300x166.png 300w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/nav2_navigation_using_generated_map-768x426.png 768w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/nav2_navigation_using_generated_map.png 1285w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<h3><span class=\"ez-toc-section\" id=\"2D_pose_estimate_and_Navigation_goals\"><\/span>2D pose estimate and Navigation goals<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Click on the &#8220;2D pose estimate&#8221; button on RViz. Then click on the map where the robot is (you should see that on Gazebo). Maintain the click to also specify the orientation with a green arrow.<\/p>\n<p>Once you&#8217;re done, you should see something like that on RViz.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-4239 aligncenter\" src=\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/nav2_2D_pose_estimate-1024x567.png\" alt=\"Nav2 2D Pose Estimate in RViz\" width=\"1024\" height=\"567\" srcset=\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/nav2_2D_pose_estimate-1024x567.png 1024w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/nav2_2D_pose_estimate-300x166.png 300w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/nav2_2D_pose_estimate-768x426.png 768w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/nav2_2D_pose_estimate.png 1285w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>Finally, you can give navigation commands! Click on &#8220;Nav2 Goal&#8221;, then click on the map to select a position + orientation, and the robot should start to go to that pose. You can verify on Gazebo, to see that the robot is actually moving.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-large wp-image-4240 aligncenter\" src=\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/nav2_navigation_goal-1024x567.png\" alt=\"Nav2 Navigation Goal in RViz\" width=\"1024\" height=\"567\" srcset=\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/nav2_navigation_goal-1024x567.png 1024w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/nav2_navigation_goal-300x166.png 300w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/nav2_navigation_goal-768x426.png 768w, https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/nav2_navigation_goal.png 1285w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>Now, you can experiment with different poses. Give valid ones, and also invalid ones (ex: a point that cannot be reached).<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Going_further_with_ROS2_Nav2\"><\/span>Going further with ROS2 Nav2<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>In this tutorial you have seen how to get started with the Navigation 2 stack. You should now have a better idea of how it works and how to use it.<\/p>\n<p>Now to go further and really understand how things work, you can continue your learning with the <a href=\"https:\/\/rbcknd.com\/nav2\" target=\"_blank\" rel=\"noopener\">ROS2 Nav2 course<\/a> (6 hours of content). In this course you&#8217;ll also:<\/p>\n<ul>\n<li>Understand how Nav2 works behind the hoods, with all components: global\/local planner, parameters, TFs, etc.<\/li>\n<li>Learn how to build your own simulated world in Gazebo to be able to use Nav2 for your own office\/classroom\/building.<\/li>\n<li>Get an intro on how to adapt a custom robot for Nav2, with all the steps.<\/li>\n<li>Program with Nav2 directly using Python instead of the buttons on RViz.<\/li>\n<li>And even more tips and best practices.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>In this ROS2 Nav2 tutorial you will learn the basics of the Navigation 2 stack, step by step. You will first install the Nav2 stack on ROS2 Humble, then you will start directly to generate a map with SLAM. After this, we will check what\u2019s inside the map, and then use this map with the &#8230; <a title=\"ROS2 Nav2 Tutorial\" class=\"read-more\" href=\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/\" aria-label=\"Read more about ROS2 Nav2 Tutorial\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-4221","post","type-post","status-publish","format-standard","hentry","category-ros2"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>ROS2 Nav2 Tutorial - The Robotics Back-End<\/title>\n<meta name=\"description\" content=\"In this ROS2 Nav2 tutorial you will learn the basics of the Navigation 2 stack, step by step. Everything covered for beginners!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"ROS2 Nav2 Tutorial - The Robotics Back-End\" \/>\n<meta property=\"og:description\" content=\"In this ROS2 Nav2 tutorial you will learn the basics of the Navigation 2 stack, step by step. Everything covered for beginners!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/\" \/>\n<meta property=\"og:site_name\" content=\"The Robotics Back-End\" \/>\n<meta property=\"article:published_time\" content=\"2023-05-08T12:53:19+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ROS2_Nav2_goal-1024x343.png\" \/>\n<meta name=\"author\" content=\"ed\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@RoboticsBackend\" \/>\n<meta name=\"twitter:site\" content=\"@RoboticsBackend\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"ed\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/\"},\"author\":{\"name\":\"ed\",\"@id\":\"https:\/\/roboticsbackend.com\/#\/schema\/person\/a20832f15e39847d8eea5be981767353\"},\"headline\":\"ROS2 Nav2 Tutorial\",\"datePublished\":\"2023-05-08T12:53:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/\"},\"wordCount\":2012,\"publisher\":{\"@id\":\"https:\/\/roboticsbackend.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ROS2_Nav2_goal-1024x343.png\",\"articleSection\":[\"ROS2 Tutorials\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/\",\"url\":\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/\",\"name\":\"ROS2 Nav2 Tutorial - The Robotics Back-End\",\"isPartOf\":{\"@id\":\"https:\/\/roboticsbackend.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ROS2_Nav2_goal-1024x343.png\",\"datePublished\":\"2023-05-08T12:53:19+00:00\",\"description\":\"In this ROS2 Nav2 tutorial you will learn the basics of the Navigation 2 stack, step by step. Everything covered for beginners!\",\"breadcrumb\":{\"@id\":\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#primaryimage\",\"url\":\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ROS2_Nav2_goal.png\",\"contentUrl\":\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ROS2_Nav2_goal.png\",\"width\":1127,\"height\":377,\"caption\":\"ROS2 Nav2 Goal\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/roboticsbackend.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"ROS2 Nav2 Tutorial\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/roboticsbackend.com\/#website\",\"url\":\"https:\/\/roboticsbackend.com\/\",\"name\":\"The Robotics Back-End\",\"description\":\"Program Robots, Step by Step\",\"publisher\":{\"@id\":\"https:\/\/roboticsbackend.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/roboticsbackend.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/roboticsbackend.com\/#organization\",\"name\":\"Robotics Back-End\",\"url\":\"https:\/\/roboticsbackend.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/roboticsbackend.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2020\/02\/logo_hd.png\",\"contentUrl\":\"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2020\/02\/logo_hd.png\",\"width\":2500,\"height\":1875,\"caption\":\"Robotics Back-End\"},\"image\":{\"@id\":\"https:\/\/roboticsbackend.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/RoboticsBackend\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/roboticsbackend.com\/#\/schema\/person\/a20832f15e39847d8eea5be981767353\",\"name\":\"ed\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/roboticsbackend.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/7b666620f11fb12df5674e1e1ee525afe3d4ceecdaa57f8c60f6a937a33e3427?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/7b666620f11fb12df5674e1e1ee525afe3d4ceecdaa57f8c60f6a937a33e3427?s=96&d=identicon&r=g\",\"caption\":\"ed\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"ROS2 Nav2 Tutorial - The Robotics Back-End","description":"In this ROS2 Nav2 tutorial you will learn the basics of the Navigation 2 stack, step by step. Everything covered for beginners!","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:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/","og_locale":"en_US","og_type":"article","og_title":"ROS2 Nav2 Tutorial - The Robotics Back-End","og_description":"In this ROS2 Nav2 tutorial you will learn the basics of the Navigation 2 stack, step by step. Everything covered for beginners!","og_url":"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/","og_site_name":"The Robotics Back-End","article_published_time":"2023-05-08T12:53:19+00:00","og_image":[{"url":"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ROS2_Nav2_goal-1024x343.png","type":"","width":"","height":""}],"author":"ed","twitter_card":"summary_large_image","twitter_creator":"@RoboticsBackend","twitter_site":"@RoboticsBackend","twitter_misc":{"Written by":"ed","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#article","isPartOf":{"@id":"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/"},"author":{"name":"ed","@id":"https:\/\/roboticsbackend.com\/#\/schema\/person\/a20832f15e39847d8eea5be981767353"},"headline":"ROS2 Nav2 Tutorial","datePublished":"2023-05-08T12:53:19+00:00","mainEntityOfPage":{"@id":"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/"},"wordCount":2012,"publisher":{"@id":"https:\/\/roboticsbackend.com\/#organization"},"image":{"@id":"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#primaryimage"},"thumbnailUrl":"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ROS2_Nav2_goal-1024x343.png","articleSection":["ROS2 Tutorials"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/","url":"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/","name":"ROS2 Nav2 Tutorial - The Robotics Back-End","isPartOf":{"@id":"https:\/\/roboticsbackend.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#primaryimage"},"image":{"@id":"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#primaryimage"},"thumbnailUrl":"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ROS2_Nav2_goal-1024x343.png","datePublished":"2023-05-08T12:53:19+00:00","description":"In this ROS2 Nav2 tutorial you will learn the basics of the Navigation 2 stack, step by step. Everything covered for beginners!","breadcrumb":{"@id":"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#primaryimage","url":"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ROS2_Nav2_goal.png","contentUrl":"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2023\/05\/ROS2_Nav2_goal.png","width":1127,"height":377,"caption":"ROS2 Nav2 Goal"},{"@type":"BreadcrumbList","@id":"https:\/\/roboticsbackend.com\/ros2-nav2-tutorial\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/roboticsbackend.com\/"},{"@type":"ListItem","position":2,"name":"ROS2 Nav2 Tutorial"}]},{"@type":"WebSite","@id":"https:\/\/roboticsbackend.com\/#website","url":"https:\/\/roboticsbackend.com\/","name":"The Robotics Back-End","description":"Program Robots, Step by Step","publisher":{"@id":"https:\/\/roboticsbackend.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/roboticsbackend.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/roboticsbackend.com\/#organization","name":"Robotics Back-End","url":"https:\/\/roboticsbackend.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/roboticsbackend.com\/#\/schema\/logo\/image\/","url":"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2020\/02\/logo_hd.png","contentUrl":"https:\/\/roboticsbackend.com\/wp-content\/uploads\/2020\/02\/logo_hd.png","width":2500,"height":1875,"caption":"Robotics Back-End"},"image":{"@id":"https:\/\/roboticsbackend.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/RoboticsBackend"]},{"@type":"Person","@id":"https:\/\/roboticsbackend.com\/#\/schema\/person\/a20832f15e39847d8eea5be981767353","name":"ed","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/roboticsbackend.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/7b666620f11fb12df5674e1e1ee525afe3d4ceecdaa57f8c60f6a937a33e3427?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7b666620f11fb12df5674e1e1ee525afe3d4ceecdaa57f8c60f6a937a33e3427?s=96&d=identicon&r=g","caption":"ed"}}]}},"_links":{"self":[{"href":"https:\/\/roboticsbackend.com\/wp-json\/wp\/v2\/posts\/4221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/roboticsbackend.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/roboticsbackend.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/roboticsbackend.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/roboticsbackend.com\/wp-json\/wp\/v2\/comments?post=4221"}],"version-history":[{"count":0,"href":"https:\/\/roboticsbackend.com\/wp-json\/wp\/v2\/posts\/4221\/revisions"}],"wp:attachment":[{"href":"https:\/\/roboticsbackend.com\/wp-json\/wp\/v2\/media?parent=4221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/roboticsbackend.com\/wp-json\/wp\/v2\/categories?post=4221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/roboticsbackend.com\/wp-json\/wp\/v2\/tags?post=4221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}