<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD Journal Publishing DTD v2.3 20070202//EN" "journalpublishing.dtd">
<article article-type="research-article" dtd-version="2.3" xml:lang="EN" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink">
<front>
<journal-meta>
<journal-id journal-id-type="publisher-id">Front. Robot. AI</journal-id>
<journal-title>Frontiers in Robotics and AI</journal-title>
<abbrev-journal-title abbrev-type="pubmed">Front. Robot. AI</abbrev-journal-title>
<issn pub-type="epub">2296-9144</issn>
<publisher>
<publisher-name>Frontiers Media S.A.</publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id pub-id-type="publisher-id">1601862</article-id>
<article-id pub-id-type="doi">10.3389/frobt.2025.1601862</article-id>
<article-categories>
<subj-group subj-group-type="heading">
<subject>Robotics and AI</subject>
<subj-group>
<subject>Original Research</subject>
</subj-group>
</subj-group>
</article-categories>
<title-group>
<article-title>Autonomous navigation of quadrupeds using coverage path planning with morphological skeleton maps</article-title>
<alt-title alt-title-type="left-running-head">Becoy et al.</alt-title>
<alt-title alt-title-type="right-running-head">
<ext-link ext-link-type="uri" xlink:href="https://doi.org/10.3389/frobt.2025.1601862">10.3389/frobt.2025.1601862</ext-link>
</alt-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname>Becoy</surname>
<given-names>Alexander James</given-names>
</name>
<xref ref-type="aff" rid="aff1">
<sup>1</sup>
</xref>
<xref ref-type="aff" rid="aff2">
<sup>2</sup>
</xref>
<uri xlink:href="https://loop.frontiersin.org/people/2974325/overview"/>
<role content-type="https://credit.niso.org/contributor-roles/software/"/>
<role content-type="https://credit.niso.org/contributor-roles/methodology/"/>
<role content-type="https://credit.niso.org/contributor-roles/Writing - review &#x26; editing/"/>
<role content-type="https://credit.niso.org/contributor-roles/supervision/"/>
<role content-type="https://credit.niso.org/contributor-roles/investigation/"/>
<role content-type="https://credit.niso.org/contributor-roles/conceptualization/"/>
<role content-type="https://credit.niso.org/contributor-roles/writing-original-draft/"/>
<role content-type="https://credit.niso.org/contributor-roles/funding-acquisition/"/>
<role content-type="https://credit.niso.org/contributor-roles/data-curation/"/>
<role content-type="https://credit.niso.org/contributor-roles/visualization/"/>
<role content-type="https://credit.niso.org/contributor-roles/formal-analysis/"/>
<role content-type="https://credit.niso.org/contributor-roles/project-administration/"/>
<role content-type="https://credit.niso.org/contributor-roles/resources/"/>
<role content-type="https://credit.niso.org/contributor-roles/validation/"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Khomenko</surname>
<given-names>Kseniia</given-names>
</name>
<xref ref-type="aff" rid="aff1">
<sup>1</sup>
</xref>
<uri xlink:href="https://loop.frontiersin.org/people/3087168/overview"/>
<role content-type="https://credit.niso.org/contributor-roles/methodology/"/>
<role content-type="https://credit.niso.org/contributor-roles/Writing - review &#x26; editing/"/>
<role content-type="https://credit.niso.org/contributor-roles/software/"/>
<role content-type="https://credit.niso.org/contributor-roles/investigation/"/>
<role content-type="https://credit.niso.org/contributor-roles/supervision/"/>
<role content-type="https://credit.niso.org/contributor-roles/funding-acquisition/"/>
<role content-type="https://credit.niso.org/contributor-roles/conceptualization/"/>
<role content-type="https://credit.niso.org/contributor-roles/visualization/"/>
<role content-type="https://credit.niso.org/contributor-roles/resources/"/>
<role content-type="https://credit.niso.org/contributor-roles/validation/"/>
<role content-type="https://credit.niso.org/contributor-roles/data-curation/"/>
<role content-type="https://credit.niso.org/contributor-roles/formal-analysis/"/>
<role content-type="https://credit.niso.org/contributor-roles/project-administration/"/>
</contrib>
<contrib contrib-type="author" corresp="yes">
<name>
<surname>Peternel</surname>
<given-names>Luka</given-names>
</name>
<xref ref-type="aff" rid="aff1">
<sup>1</sup>
</xref>
<xref ref-type="corresp" rid="c001">&#x2a;</xref>
<uri xlink:href="https://loop.frontiersin.org/people/354336/overview"/>
<role content-type="https://credit.niso.org/contributor-roles/project-administration/"/>
<role content-type="https://credit.niso.org/contributor-roles/formal-analysis/"/>
<role content-type="https://credit.niso.org/contributor-roles/validation/"/>
<role content-type="https://credit.niso.org/contributor-roles/visualization/"/>
<role content-type="https://credit.niso.org/contributor-roles/methodology/"/>
<role content-type="https://credit.niso.org/contributor-roles/data-curation/"/>
<role content-type="https://credit.niso.org/contributor-roles/conceptualization/"/>
<role content-type="https://credit.niso.org/contributor-roles/writing-original-draft/"/>
<role content-type="https://credit.niso.org/contributor-roles/software/"/>
<role content-type="https://credit.niso.org/contributor-roles/Writing - review &#x26; editing/"/>
<role content-type="https://credit.niso.org/contributor-roles/funding-acquisition/"/>
<role content-type="https://credit.niso.org/contributor-roles/supervision/"/>
<role content-type="https://credit.niso.org/contributor-roles/resources/"/>
<role content-type="https://credit.niso.org/contributor-roles/investigation/"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Rajan</surname>
<given-names>Raj Thilak</given-names>
</name>
<xref ref-type="aff" rid="aff2">
<sup>2</sup>
</xref>
<uri xlink:href="https://loop.frontiersin.org/people/2173951/overview"/>
<role content-type="https://credit.niso.org/contributor-roles/conceptualization/"/>
<role content-type="https://credit.niso.org/contributor-roles/resources/"/>
<role content-type="https://credit.niso.org/contributor-roles/formal-analysis/"/>
<role content-type="https://credit.niso.org/contributor-roles/funding-acquisition/"/>
<role content-type="https://credit.niso.org/contributor-roles/validation/"/>
<role content-type="https://credit.niso.org/contributor-roles/visualization/"/>
<role content-type="https://credit.niso.org/contributor-roles/project-administration/"/>
<role content-type="https://credit.niso.org/contributor-roles/writing-original-draft/"/>
<role content-type="https://credit.niso.org/contributor-roles/investigation/"/>
<role content-type="https://credit.niso.org/contributor-roles/supervision/"/>
<role content-type="https://credit.niso.org/contributor-roles/data-curation/"/>
<role content-type="https://credit.niso.org/contributor-roles/methodology/"/>
<role content-type="https://credit.niso.org/contributor-roles/Writing - review &#x26; editing/"/>
<role content-type="https://credit.niso.org/contributor-roles/software/"/>
</contrib>
</contrib-group>
<aff id="aff1">
<sup>1</sup>
<institution>Department of Cognitive Robotics</institution>, <institution>Faculty of Mechanical Engineering</institution>, <institution>Delft University of Technology</institution>, <addr-line>Delft</addr-line>, <country>Netherlands</country>
</aff>
<aff id="aff2">
<sup>2</sup>
<institution>Department of Microelectronics</institution>, <institution>Faculty of Electrical Engineering, Mathematics and Computer Science</institution>, <institution>Delft University of Technology</institution>, <addr-line>Delft</addr-line>, <country>Netherlands</country>
</aff>
<author-notes>
<fn fn-type="edited-by">
<p>
<bold>Edited by:</bold> <ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/1675991/overview">Ziliang Kang</ext-link>, Massachusetts Institute of Technology, United States</p>
</fn>
<fn fn-type="edited-by">
<p>
<bold>Reviewed by:</bold> <ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/1810064/overview">Ruiheng Zhang</ext-link>, Beijing Institute of Technology, China</p>
<p>
<ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/2894825/overview">Kaoru Yamamoto</ext-link>, Kyushu University, Japan</p>
<p>
<ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/2930042/overview">Jiajie Qiu</ext-link>, Massachusetts Institute of Technology, United States</p>
</fn>
<corresp id="c001">&#x2a;Correspondence: Luka Peternel, <email>l.peternel@tudelft.nl</email>
</corresp>
</author-notes>
<pub-date pub-type="epub">
<day>31</day>
<month>07</month>
<year>2025</year>
</pub-date>
<pub-date pub-type="collection">
<year>2025</year>
</pub-date>
<volume>12</volume>
<elocation-id>1601862</elocation-id>
<history>
<date date-type="received">
<day>28</day>
<month>03</month>
<year>2025</year>
</date>
<date date-type="accepted">
<day>04</day>
<month>06</month>
<year>2025</year>
</date>
</history>
<permissions>
<copyright-statement>Copyright &#xa9; 2025 Becoy, Khomenko, Peternel and Rajan.</copyright-statement>
<copyright-year>2025</copyright-year>
<copyright-holder>Becoy, Khomenko, Peternel and Rajan</copyright-holder>
<license xlink:href="http://creativecommons.org/licenses/by/4.0/">
<p>This is an open-access article distributed under the terms of the Creative Commons Attribution License (CC BY). The use, distribution or reproduction in other forums is permitted, provided the original author(s) and the copyright owner(s) are credited and that the original publication in this journal is cited, in accordance with accepted academic practice. No use, distribution or reproduction is permitted which does not comply with these terms.</p>
</license>
</permissions>
<abstract>
<p>This article proposes a novel method of coverage path planning for the purpose of scanning an unstructured environment autonomously. The method uses the morphological skeleton of a prior 2D navigation map via SLAM to generate a sequence of points of interest (POIs). This sequence is then ordered to create an optimal path based on the robot&#x2019;s current position. To control the high-level operation, a finite state machine (FSM) is used to switch between two modes: navigating toward a POI using Nav2 and scanning the local surroundings. We validate the method in a leveled, indoor, obstacle-free, non-convex environment, evaluating time efficiency and reachability over five trials. The map reader and path planner can quickly process maps of widths and heights ranging between [196,225] <inline-formula id="inf1">
<mml:math id="m1">
<mml:mrow>
<mml:mi mathvariant="normal">p</mml:mi>
<mml:mi mathvariant="normal">i</mml:mi>
<mml:mi mathvariant="normal">x</mml:mi>
<mml:mi mathvariant="normal">e</mml:mi>
<mml:mi mathvariant="normal">l</mml:mi>
<mml:mi mathvariant="normal">s</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> and [185,231] <inline-formula id="inf2">
<mml:math id="m2">
<mml:mrow>
<mml:mi mathvariant="normal">p</mml:mi>
<mml:mi mathvariant="normal">i</mml:mi>
<mml:mi mathvariant="normal">x</mml:mi>
<mml:mi mathvariant="normal">e</mml:mi>
<mml:mi mathvariant="normal">l</mml:mi>
<mml:mi mathvariant="normal">s</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> in <inline-formula id="inf3">
<mml:math id="m3">
<mml:mrow>
<mml:mn>2.52</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="normal">m</mml:mi>
<mml:mi mathvariant="normal">s</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula id="inf4">
<mml:math id="m4">
<mml:mrow>
<mml:mn>1.7</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="normal">m</mml:mi>
<mml:mi mathvariant="normal">s</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, respectively. Their computation time increases with <inline-formula id="inf5">
<mml:math id="m5">
<mml:mrow>
<mml:mn>22.0</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi mathvariant="normal">n</mml:mi>
<mml:mi mathvariant="normal">s</mml:mi>
<mml:mo>/</mml:mo>
<mml:mi mathvariant="normal">p</mml:mi>
<mml:mi mathvariant="normal">i</mml:mi>
<mml:mi mathvariant="normal">x</mml:mi>
<mml:mi mathvariant="normal">e</mml:mi>
<mml:mi mathvariant="normal">l</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> and 8.17 &#x3bc;s/pixel, respectively. The robot managed to reach 86.5% of all waypoints across the five runs. The proposed method suffers from drift occurring in the 2D navigation map.</p>
</abstract>
<kwd-group>
<kwd>quadruped</kwd>
<kwd>autonomous navigation</kwd>
<kwd>unstructured environment</kwd>
<kwd>coverage path planning</kwd>
<kwd>robot operating system 2</kwd>
</kwd-group>
<custom-meta-wrap>
<custom-meta>
<meta-name>section-at-acceptance</meta-name>
<meta-value>Field Robotics</meta-value>
</custom-meta>
</custom-meta-wrap>
</article-meta>
</front>
<body>
<sec id="s1">
<title>1 Introduction</title>
<p>Due to advancements in technology and miniaturization, surface (or ground) robots, such as wheeled and legged robots, have been increasingly adopted for diverse operations in harsh and unstructured environments in the past decade. One of the key challenges in such environments is the lack of infrastructure to support diverse operations. These environments include, for example, disaster response (<xref ref-type="bibr" rid="B10">Chiou et al., 2022</xref>; <xref ref-type="bibr" rid="B16">Lin et al., 2022</xref>; <xref ref-type="bibr" rid="B31">Solmaz et al., 2024</xref>), mining operations (<xref ref-type="bibr" rid="B26">Paredes and Fleming-Mu&#xF1;oz, 2021</xref>; <xref ref-type="bibr" rid="B1">Ai et al., 2024</xref>), space exploration (<xref ref-type="bibr" rid="B14">Jiang et al., 2022</xref>; <xref ref-type="bibr" rid="B5">Candalot et al., 2024</xref>; <xref ref-type="bibr" rid="B2">Arm et al., 2019</xref>; <xref ref-type="bibr" rid="B28">Rajan et al., 2024</xref>), surveillance in remote locations (<xref ref-type="bibr" rid="B23">Miller et al., 2020</xref>; <xref ref-type="bibr" rid="B6">Chagoya et al., 2024</xref>), or hazardous industries such as nuclear power plant maintenance (<xref ref-type="bibr" rid="B8">Chen et al., 2022</xref>; <xref ref-type="bibr" rid="B30">Sharma et al. 2024</xref>).</p>
<p>In such complex environments, legged robots are more versatile and robust than other surface robots, such as wheeled rovers, and they can adaptively navigate uneven, rugged, or soft terrain. Legged robots can cover relatively larger spatial areas by choosing safe footholds within their range of motion and rapidly responding to adjust their kinematic configuration (<xref ref-type="bibr" rid="B33">Yin et al., 2023</xref>) to achieve their objectives. The number of legs in a legged robot determines its movement efficiency and ability to maintain stability (<xref ref-type="bibr" rid="B24">Nitulescu et al., 2016</xref>). Compared to bipedal humanoids, quadrupedal robots demonstrate a greater load capacity and improved stability due to their broader base of support. On the other hand, quadrupeds possess simpler structures and control mechanisms than hexapodal and octopodal robots (<xref ref-type="bibr" rid="B12">Fan et al., 2024</xref>; <xref ref-type="bibr" rid="B7">Chai et al., 2022</xref>). For this reason, quadrupedal robots are ideal for tasks involving the safe navigation of complex 3D environments for (sub-) surface exploration.</p>
<p>Several quadrupedal robots are already commercially available in the market. We compare three notable examples, namely, Boston Dynamics&#x2019; Spot, ANYbotics&#x2019; ANYmal, and Unitree Robotics&#x2019; Go2 Edu, as shown in <xref ref-type="fig" rid="F1">Figure 1</xref>, regarding attributes related to the access of development, operation durability, and affordability, as provided in <xref ref-type="table" rid="T1">Table 1</xref>. Both Spot and ANYmal have garnered significant popularity and have made substantial contributions to research and engineering (<xref ref-type="bibr" rid="B27">Portela et al., 2024</xref>; <xref ref-type="bibr" rid="B38">Zimmermann et al., 2021</xref>) compared to Go2 Edu. However, their operational runtime is limited, and their cost is considerably higher. Go2 has three modes: Air, Pro, and Edu, costing 1,600 USD, 2,800 USD, and 12,500 USD, respectively. However, only the Edu mode allows for software development, which is necessary for custom implementations, including other necessary features. Furthermore, Go2 Edu has a dedicated Robot Operating System 2 (ROS 2) integration that allows rapid development and testing. With a factor of two to three in running time, experiments can be conducted over a long session, and the robot can provide sufficient battery capacity to power additional sensors. This paper focuses on the development of software architecture for path planning and navigation specific to Go2 Edu.</p>
<fig id="F1" position="float">
<label>FIGURE 1</label>
<caption>
<p>Commercially available quadrupedal robots from different companies: <bold>(a)</bold> Boston Dynamics Spot. <bold>(b)</bold> ANYbotics ANYmal D. <bold>(c)</bold> Unitree Robotic Go2 Edu.</p>
</caption>
<graphic xlink:href="frobt-12-1601862-g001.tif">
<alt-text content-type="machine-generated">Three images of robotic quadrupeds labeled a, b, and c. a) A yellow Boston Dynamics robot in an indoor setting. b) A red robotic quadruped with an arm, outdoors. c) A gray robot with wiring visible on top, indoors.</alt-text>
</graphic>
</fig>
<table-wrap id="T1" position="float">
<label>TABLE 1</label>
<caption>
<p>Comparison of commercially available quadrupedal robots.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th align="left">Feature</th>
<th align="left">Spot</th>
<th align="left">ANYmal D</th>
<th align="left">Go2 Edu</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">Manufacturer</td>
<td align="center">Boston Dynamics</td>
<td align="center">ANYbotics</td>
<td align="center">Unitree Robotics</td>
</tr>
<tr>
<td align="left">Dimensions (L/W/H, mm)</td>
<td align="center">1,100 &#xd7; 500 &#xd7; 191</td>
<td align="center">930 &#xd7; 530 &#xd7; 890</td>
<td align="center">700 &#xd7; 310 &#xd7; 400</td>
</tr>
<tr>
<td align="left">Maximum walking speed (m/s)</td>
<td align="center">1.6</td>
<td align="center">1.3</td>
<td align="center">3.7</td>
</tr>
<tr>
<td align="left">Average running time (min)</td>
<td align="center">90</td>
<td align="center">90&#x2013;120</td>
<td align="center">120&#x2013;240</td>
</tr>
<tr>
<td align="left">Integrated LiDAR</td>
<td align="center">No</td>
<td align="center">Yes</td>
<td align="center">Yes</td>
</tr>
<tr>
<td align="left">Integrated optical camera</td>
<td align="center">Yes</td>
<td align="center">Yes</td>
<td align="center">Yes</td>
</tr>
<tr>
<td align="left">Integrated depth camera</td>
<td align="center">Yes</td>
<td align="center">Yes</td>
<td align="center">No</td>
</tr>
<tr>
<td align="left">Connectivity</td>
<td align="center">Wi-Fi, Ethernet</td>
<td align="center">Wi-Fi, 4G</td>
<td align="center">Wi-Fi, Bluetooth, 4G, Ethernet</td>
</tr>
<tr>
<td align="left">Custom software development</td>
<td align="center">Supported (SDK, APIs)</td>
<td align="center">Supported (ROS integration, APIs)</td>
<td align="center">Supported (SDK, ROS integration)</td>
</tr>
<tr>
<td align="left">Estimated cost (1,000 USD)</td>
<td align="center">74.5</td>
<td align="center">150</td>
<td align="center">12.5</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>The goal of this research is to enable quadrupedal robots to map terrain using coverage path planning. To achieve this, quadrupeds require sensors&#x2014;most commonly cameras (<xref ref-type="bibr" rid="B35">Zhang et al., 2022</xref>; <xref ref-type="bibr" rid="B34">Zhang et al., 2025a</xref>; <xref ref-type="bibr" rid="B36">Zhang et al., 2025b</xref>) and LiDAR (<xref ref-type="bibr" rid="B4">Bouman et al., 2022</xref>; <xref ref-type="bibr" rid="B25">Niu et al., 2024</xref>). In order to scan with these sensors, the robot needs to move to various points of interest (POIs), which requires coverage path planning and navigation methods. These are examined in the related works section below.</p>
<sec id="s1-1">
<title>1.1 Related works</title>
<p>Several studies have recently explored the development of software infrastructure for the Unitree Robotics&#x2019; Go2 Edu robot. <xref ref-type="bibr" rid="B22">Mei et al. (2024)</xref> developed a reinforcement learning method to enable the Go2 Edu robot to navigate narrow pipes using visual inputs from a depth camera. The navigation process is relatively straightforward due to the grid-like structure of the pipes, where each pipe is aligned in a straight path, with occasional protrusions serving as obstacles. <xref ref-type="bibr" rid="B13">Guo et al. (2024)</xref> developed a high-level path planning using a large language model, namely, OpenAI&#x2019;s ChatGPT-4o, which allows the interpretation of human verbal commands and translates them into a list of executable instructions. The system integrates a depth camera with a segmentation model to effectively perceive the environment. In addition, <xref ref-type="bibr" rid="B9">Cheng et al. (2024)</xref> developed a motion controller for the Go2 Edu robot to traverse complex and unstructured environments using proprioceptive sensing and collision estimation only.</p>
<p>Autonomous navigation using quadrupedal robots is crucial for exploring complex environments; however, research on 2D coverage path planning is limited. <xref ref-type="bibr" rid="B18">Ly et al. (2023)</xref> achieved coverage path planning for loco-manipulation through an integrated end-to-end pipeline combining perception, optimization, and whole-body motion planning with RGB-D camera inputs. <xref ref-type="bibr" rid="B4">Bouman et al. (2022)</xref> presented a 2D coverage path planner for investigating unknown and unstructured environments while accounting for time-bounded and dynamic constraints and traversability risk. The advantage of these approaches is that they guarantee timely execution when the mission is time-bound, and they find a good optimal tradeoff between the maximum area coverage and the path traveled. The drawback of these approaches is that they are focused on time constraints; therefore, they do not work when the task has a variable execution time and requires time to be defined in advance. In contrast, our approach enables planning for variable times.</p>
<p>Some navigation methods already enable planning for variable times. Recently, <xref ref-type="bibr" rid="B25">Niu et al. (2024)</xref> developed a novel autonomous exploration method that uses a topological skeleton of the environment&#x2019;s geometry via LiDAR, along with a finite state machine (FSM) to enable an exploratory strategy. This was demonstrated on a quadrupedal robot in an unstructured environment. These approaches have the advantage of being very adaptable in an unknown environment due to the use of a state machine that continuously checks for undiscovered areas within the map. The main difference between this work and our approach is that their method for obtaining topological skeletons uses wave propagation and Voronoi diagrams, while our method uses a morphological technique by treating the environment as an image. The impact of this is that the morphological technique simplifies the mapping and is thus computationally more efficient.</p>
<p>Furthermore, all the above methods of coverage path planning have specific map generation algorithms that are an integral part of the whole approach. Therefore, they are less modular, making it difficult to replace them with developing state-of-the-art mapping algorithms. In contrast, our approach can work with different types of mapping algorithms, thus making it more modular.</p>
</sec>
<sec id="s1-2">
<title>1.2 Contribution</title>
<p>In this work, we address the gap in the state of the art through the following key contributions.<list list-type="simple">
<list-item>
<p>1. We develop a control framework based on a finite state machine that switches between different operation modes to enable autonomous navigation and environmental inspection.</p>
</list-item>
<list-item>
<p>2. Using a prior 2D navigation map of the surroundings, the framework rapidly generates an efficient path based on the morphological skeleton of the map, which ensures coverage from small to large areas.</p>
</list-item>
<list-item>
<p>3. We validate the developed system through on-field experiments involving navigational tasks using the Unitree Robotics Go2 Edu robot in an indoor environment.</p>
</list-item>
<list-item>
<p>4. We designed an extended interface that enables the Unitree Robotics Go2 Edu to integrate with the control framework using ROS 2.</p>
</list-item>
<list-item>
<p>5. The whole application is open source and available at <ext-link ext-link-type="uri" xlink:href="https://github.com/asil-lab/go2-autonomous-navigation">https://github.com/asil-lab/go2-autonomous-navigation</ext-link>
</p>
</list-item>
</list>
</p>
</sec>
</sec>
<sec id="s2">
<title>2 Materials and equipment</title>
<sec id="s2-1">
<title>2.1 Hardware specifications</title>
<p>The Unitree Robotics Go2 Edu features three degrees of freedom (DOFs) per leg, consisting of hip, thigh, and calf hinge joints (from base to foot). It is equipped with an inertial measurement unit (IMU), an HD wide-angle camera, and foot-end force sensors. The robot offers a battery life of 2&#x2013;4 h and supports fast charging<xref ref-type="fn" rid="fn1">
<sup>1</sup>
</xref>.</p>
<p>For navigation and perception, the Go2 Edu is fitted with the Unitree L1&#x2014;a 4D LiDAR (3D position &#x2b; 1D greyscale) based on laser time-of-flight (TOF)&#x2014;mounted on its mouth. This LiDAR provides a 360&#xb0; <inline-formula id="inf6">
<mml:math id="m6">
<mml:mrow>
<mml:mo>&#xd7;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> 90&#xb0; field of view (FOV), a measurement accuracy of <inline-formula id="inf7">
<mml:math id="m7">
<mml:mrow>
<mml:mo>&#xb1;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>2.0 cm, and a scanning distance of up to 30 m with 90% reflectivity. It integrates an IMU with a 3-axis accelerometer and 3-axis gyroscope, has a proximal blind spot of 0.05 m, and features a sampling frequency of 43,200 points per second. Additionally, it operates with a circumferential scanning frequency of 11 Hz and a vertical scanning frequency of 180 Hz<xref ref-type="fn" rid="fn2">
<sup>2</sup>
</xref>. The integrated LiDAR sensor is also used for collision detection, which facilitates the differentiation between free and occupied spaces in the environment based on height. Additionally, it enables the generation of a 2D map for navigation during run-time and self-localization ability with respect to environmental features and the current state of the map.</p>
<p>Furthermore, the robot includes an expansion dock that houses an NVIDIA Jetson Orin, providing computing power of 40&#x2013;100 TOPS. It also comes with a manual two-handed joystick controller for user operation. Additionally, in order to monitor the robot remotely, a TP-Link TL-WR802N Nano WLAN Router is added to establish a wireless connection between the robot and the operator&#x2019;s computer.</p>
<p>Finally, we also integrated external sensors on the robot to measure ambiance characteristics such as temperature, humidity, and light intensity. The integration of these sensors is discussed in <xref ref-type="sec" rid="s12">Supplementary Material A</xref>, but their usage is outside the scope of this work and is, therefore, not detailed in this paper.</p>
</sec>
<sec id="s2-2">
<title>2.2 Software specifications</title>
<p>The Unitree Robotics Go2 Edu robot has a dedicated software development kit (SDK), which allows custom implementations to be programmed. This SDK uses a data distribution service (DDS) as the networking middleware, which enables reliable and real-time data exchange between the program and the robot<xref ref-type="fn" rid="fn3">
<sup>3</sup>
</xref>.</p>
<p>Using DDS, a ROS application (<xref ref-type="bibr" rid="B19">Macenski et al., 2022</xref>) is also implemented to facilitate seamless communication between distributed robotic components, thus ensuring real-time data exchange, scalability, and interoperability across diverse hardware and software platforms.</p>
<p>In particular, we use ROS 2 due to its additional benefits compared to ROS 1, such as decentralization, simplicity, and user-friendliness. We use the ROS 2 Foxy on Ubuntu 20.04 to develop our proposed framework as these specifications are well-established for the Unitree Robotics Go2 Edu robot.</p>
</sec>
<sec id="s2-3">
<title>2.3 SLAM</title>
<p>For the robot to determine its location within the environment while simultaneously creating a map, we use simultaneous localization and mapping (SLAM). SLAM allows the robot to dynamically create a map based on the history of information and localize the robot as a function of both the current measurement and the map simultaneously (<xref ref-type="bibr" rid="B32">Stachniss et al., 2016</xref>). In our case, a 2D map is sufficient because the robot can only navigate on the ground surface in the <inline-formula id="inf8">
<mml:math id="m8">
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula id="inf9">
<mml:math id="m9">
<mml:mrow>
<mml:mi>y</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> directions (excluding orientation in the <inline-formula id="inf10">
<mml:math id="m10">
<mml:mrow>
<mml:mi>z</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> direction). It is worth mentioning that Go2 Edu already comes with its own SLAM implementation. However, at the time of the development, it was not readily available due to the lack of documentation. Moreover, we aim to maintain modularity so that this implementation can be applied to other quadruped platforms, with only the software modules bridging the proposed method and the robot needing adaptation. Therefore, we use Macenski&#x2019;s SLAM_Toolbox to create a 2D map using a sequence of 2D laser scans as input (<xref ref-type="bibr" rid="B20">Macenski and Jambrecic, 2021</xref>). A 2D laser scan measures the distance to obstacles based on reflections detected by the robot&#x2019;s laser scanner at specific angles and time intervals. Using a radial laser scanner, it can measure the layout of the surroundings around the robot simultaneously in one measurement time-step.</p>
<p>Despite the strengths of Macenski&#x2019;s SLAM implementation, the integrated sensor that measures the geometry of the surroundings is a LiDAR that outputs data as a 3D point cloud. To make these data interpretable by the SLAM_Toolbox, we process the LiDAR measurements to identify the obstacles that the robot cannot navigate through. To achieve this task, we develop a data processing pipeline using the Point Cloud Library (PCL) (<xref ref-type="bibr" rid="B29">Rusu and Cousins, 2011</xref>), which transforms the input 3D point cloud/point _cloud/raw into the desired 2D laser scans/scan. An overview of this pipeline is shown in <xref ref-type="fig" rid="F2">Figure 2</xref>. Notably, this pipeline also outputs another point cloud/point_cloud/sampled, which is later used for environment scanning, as described in <xref ref-type="sec" rid="s12">Supplementary Material C</xref>.</p>
<fig id="F2" position="float">
<label>FIGURE 2</label>
<caption>
<p>Pipeline diagram of filtering the point cloud for SLAM and 3D scanning per measurement update.</p>
</caption>
<graphic xlink:href="frobt-12-1601862-g002.tif">
<alt-text content-type="machine-generated">Flowchart depicting a SLAM pipeline. It starts with raw point cloud data processed through a crop box filter, buffer, voxel grid filter, ground plane segmentation, and pointcloud-to-laserscan, resulting in &#x22;/scan&#x22;. Concurrently, cropped point cloud data undergoes a radar-to-map frame transformation to produce &#x22;/point_cloud/sampled&#x22;.</alt-text>
</graphic>
</fig>
</sec>
<sec id="s2-4">
<title>2.4 Navigation</title>
<p>We use the Nav2 framework (<xref ref-type="bibr" rid="B21">Macenski et al., 2023</xref>) to ensure that the robot can plan and navigate toward a desired pose (position and orientation) in the environment, which is also completely compatible with the SLAM_Toolbox discussed previously. Using the 2D navigation map provided by SLAM, the Nav2 framework can plan and navigate a path as a function of the destination&#x2019;s pose, the robot&#x2019;s current pose, and the robot&#x2019;s kinematic constraints with respect to its surroundings. A 2D pose is defined as <inline-formula id="inf11">
<mml:math id="m11">
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mo>&#x2254;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mi>x</mml:mi>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mi>y</mml:mi>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mi>&#x3c8;</mml:mi>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>, where <inline-formula id="inf12">
<mml:math id="m12">
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula id="inf13">
<mml:math id="m13">
<mml:mrow>
<mml:mi>y</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> define the longitudinal and lateral displacements, and <inline-formula id="inf14">
<mml:math id="m14">
<mml:mrow>
<mml:mi>&#x3c8;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> is the orientation of the robot about the <inline-formula id="inf15">
<mml:math id="m15">
<mml:mrow>
<mml:mi>z</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>-axis (vertical displacement).</p>
<p>The Nav2 framework includes an array of tools such as planners, recoveries, and controllers. It is outside the scope of this paper to experiment with different tools. Therefore, we mainly used the default configuration with minor adjustments that correspond to the robot&#x2019;s kinematics. Since the robot&#x2019;s movement can be controlled using 2D velocities <inline-formula id="inf16">
<mml:math id="m16">
<mml:mrow>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> as inputs, we can consider the robot to behave similarly to a differential wheeled robot. With this in mind, we can use Nav2&#x2019;s default planner <italic>NavFn Planner</italic>.</p>
<p>Finally, since the Nav2 framework requires a desired pose as an input, it serves as a local planner and navigator. Therefore, in order to achieve autonomy in the robot, we require a higher-level navigation approach capable of identifying and selecting ROIs to navigate within the environment.</p>
</sec>
</sec>
<sec sec-type="methods" id="s3">
<title>3 Methods</title>
<p>In this work, we propose a novel framework for the Unitree Robotics Go2 Edu robot for navigation in unstructured and unpredictable environments. <xref ref-type="fig" rid="F3">Figure 3</xref> presents a system overview highlighting the key modules. The key modules that are responsible for the autonomous navigation are highlighted in red. To create a graph of ROIs, the map reader examines the SLAM-generated map and transforms it into a topological skeleton based on its geometry (<xref ref-type="sec" rid="s3-1">Section 3.1</xref>). Path planning is informed by the graph, which creates an efficient path of ROIs, referred to as waypoints, that the robot must follow during navigation (<xref ref-type="sec" rid="s3-2">Section 3.2</xref>). To control the high-level operation, a state machine (<xref ref-type="sec" rid="s3-3">Section 3.3</xref>) is used to switch between actions, e.g., it checks when/whether each waypoint is complete, whether a fallback strategy is needed, and whether human operator input is detected. The communication between the modules is carried out via ROS 2 using an extended interface. More information on the extended interface can be found in <xref ref-type="sec" rid="s12">Supplementary Material B</xref>.</p>
<fig id="F3" position="float">
<label>FIGURE 3</label>
<caption>
<p>System overview of the proposed autonomous navigation with scanning capabilities in an unstructured environment. Green, hardware modules; blue, SLAM and Nav2 modules; red, autonomous navigation modules; purple, supplementary modules; and yellow, human agent.</p>
</caption>
<graphic xlink:href="frobt-12-1601862-g003.tif">
<alt-text content-type="machine-generated">Flowchart depicting a robot navigation system. Arrows indicate process flow among Map Reader, Path Planning, SLAM, LiDAR, Sensors, Navigation, State Machine, Scanning Procedure, Extended ROS Interface, and Robot, with interaction from a Human Operator.</alt-text>
</graphic>
</fig>
<sec id="s3-1">
<title>3.1 Map reader</title>
<p>To effectively cover the environment, the robot must follow a path that ensures it traverses every corner of the space. This path should align with the trajectory of the occupied areas, e.g., corridors. This approach is generally effective under the assumption that the environment is confined within a bounded, occupied space, such as an indoor setting. In order to create the path, we process the 2D navigation map as an 8-bit array using the algorithm, as shown in <xref ref-type="statement" rid="Algorithm_1">Algorithm 1</xref>. <inline-formula id="inf17">
<mml:math id="m17">
<mml:mrow>
<mml:mi mathvariant="bold">M</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula id="inf18">
<mml:math id="m18">
<mml:mrow>
<mml:mi>H</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, and <inline-formula id="inf19">
<mml:math id="m19">
<mml:mrow>
<mml:mi>W</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> denote the map and the map&#x2019;s height and width, respectively. The map is divided into cells using the map resolution <inline-formula id="inf20">
<mml:math id="m20">
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> in m/pixel. Each of these cells is an element in <inline-formula id="inf21">
<mml:math id="m21">
<mml:mrow>
<mml:mi mathvariant="bold">M</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula id="inf22">
<mml:math id="m22">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, which only contains one of the three types of space: <italic>occupied</italic>, <italic>free</italic>, and <inline-formula id="inf23">
<mml:math id="m23">
<mml:mrow>
<mml:mi>u</mml:mi>
<mml:mi>n</mml:mi>
<mml:mi>k</mml:mi>
<mml:mi>n</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>w</mml:mi>
<mml:mi>n</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, represented by the integers 0, 255, and 128, respectively.</p>
<p>
<statement content-type="algorithm" id="Algorithm_1">
<label>Algorithm 1</label>
<p>The 8-bit 2D navigation map <inline-formula id="inf24">
<mml:math id="m24">
<mml:mrow>
<mml:mi mathvariant="bold">M</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> is processed into an unordered set of waypoints <inline-formula id="inf25">
<mml:math id="m25">
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
</mml:math>,</inline-formula> where each element is a waypoint <inline-formula id="inf26">
<mml:math id="m26">
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>.<list list-type="simple">
<list-item>
<p>1:&#x2003;<bold>Input:</bold> Navigation map, i.e., <inline-formula id="inf27">
<mml:math id="m27">
<mml:mrow>
<mml:mi mathvariant="bold">M</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>H</mml:mi>
<mml:mo>&#xd7;</mml:mo>
<mml:mi>W</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>2:&#x2003;<bold>Input:</bold> Hyperparameters <inline-formula id="inf28">
<mml:math id="m28">
<mml:mrow>
<mml:mi>&#x3c3;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>&#x3ba;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold">K</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">o</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>3:&#x2003;<inline-formula id="inf29">
<mml:math id="m29">
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
<mml:mo>&#x2190;</mml:mo>
<mml:mi>&#x2205;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>4:&#x2003;<bold>for</bold>
<inline-formula id="inf30">
<mml:math id="m30">
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">{</mml:mo>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>H</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> <bold>do</bold>
</p>
</list-item>
<list-item>
<p>5:&#x2003;&#x2003;&#x2003;&#x2003;<bold>for</bold>
<inline-formula id="inf31">
<mml:math id="m31">
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">{</mml:mo>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>W</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> <bold>do</bold>
</p>
</list-item>
<list-item>
<p>6:&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;<bold>if</bold>
<inline-formula id="inf32">
<mml:math id="m32">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">M</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3c;</mml:mo>
<mml:mn>255</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> <bold>then</bold>
</p>
</list-item>
<list-item>
<p>7:&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;<inline-formula id="inf33">
<mml:math id="m33">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">M</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>8:&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;<bold>end if</bold>
</p>
</list-item>
<list-item>
<p>9:&#x2003;&#x2003;&#x2003;&#x2003;<bold>end for</bold>
</p>
</list-item>
<list-item>
<p>10:&#x2003;<bold>end for</bold>
</p>
</list-item>
<list-item>
<p>11:&#x2003;<inline-formula id="inf34">
<mml:math id="m34">
<mml:mrow>
<mml:mi mathvariant="bold">M</mml:mi>
<mml:mo>&#x2190;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> GaussianFilter(<inline-formula id="inf35">
<mml:math id="m35">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">M</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula id="inf36">
<mml:math id="m36">
<mml:mrow>
<mml:mi>&#x3c3;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>)</p>
</list-item>
<list-item>
<p>12:&#x2003;<bold>for</bold> <inline-formula id="inf37">
<mml:math id="m37">
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">{</mml:mo>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>H</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> <bold>do</bold>
</p>
</list-item>
<list-item>
<p>13:&#x2003;&#x2003;&#x2003;&#x2003;<bold>for</bold> <inline-formula id="inf38">
<mml:math id="m38">
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">{</mml:mo>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>W</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> <bold>do</bold>
</p>
</list-item>
<list-item>
<p>14:&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;<bold>if</bold> <inline-formula id="inf39">
<mml:math id="m39">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">M</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3e;</mml:mo>
<mml:mi>&#x3ba;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> <bold>then</bold>
</p>
</list-item>
<list-item>
<p>15:&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;<inline-formula id="inf40">
<mml:math id="m40">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">M</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>16:&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;<bold>end if</bold>
</p>
</list-item>
<list-item>
<p>17:&#x2003;&#x2003;&#x2003;&#x2003;<bold>end for</bold>
</p>
</list-item>
<list-item>
<p>18:&#x2003;<bold>end for</bold>
</p>
</list-item>
<list-item>
<p>19:&#x2003;<inline-formula id="inf41">
<mml:math id="m41">
<mml:mrow>
<mml:mi mathvariant="bold">C</mml:mi>
<mml:mo>&#x2190;</mml:mo>
<mml:mi>arg</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>max</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x7c;</mml:mo>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> FindContours<inline-formula id="inf42">
<mml:math id="m42">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">M</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>20:&#x2003;<inline-formula id="inf43">
<mml:math id="m43">
<mml:mrow>
<mml:mi mathvariant="bold">M</mml:mi>
<mml:mo>&#x2190;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> FillAreaByContour<inline-formula id="inf44">
<mml:math id="m44">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">C</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>21:&#x2003;<inline-formula id="inf45">
<mml:math id="m45">
<mml:mrow>
<mml:mi mathvariant="bold">M</mml:mi>
<mml:mo>&#x2190;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> Erode<inline-formula id="inf46">
<mml:math id="m46">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">M</mml:mi>
<mml:mo stretchy="false">&#x2223;</mml:mo>
<mml:mi mathvariant="bold">K</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>22:&#x2003;<inline-formula id="inf47">
<mml:math id="m47">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold">M</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="bold">S</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2190;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> Skeletonize<inline-formula id="inf48">
<mml:math id="m48">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">M</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>23:&#x2003;<bold>for</bold> <inline-formula id="inf49">
<mml:math id="m49">
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">{</mml:mo>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>H</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> <bold>do</bold>
</p>
</list-item>
<list-item>
<p>24:&#x2003;&#x2003;&#x2003;&#x2003;<bold>for</bold> <inline-formula id="inf50">
<mml:math id="m50">
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">{</mml:mo>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>V</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> <bold>do</bold>
</p>
</list-item>
<list-item>
<p>25:&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;<bold>if</bold> <inline-formula id="inf51">
<mml:math id="m51">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">M</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>255</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> <bold>then</bold>
</p>
</list-item>
<list-item>
<p>26:&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;<inline-formula id="inf52">
<mml:math id="m52">
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
<mml:mo>&#x2190;</mml:mo>
<mml:mi mathvariant="script">V</mml:mi>
<mml:mo>&#x222a;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">{</mml:mo>
<mml:mrow>
<mml:mi>R</mml:mi>
<mml:msup>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mi>i</mml:mi>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mi>j</mml:mi>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2b;</mml:mo>
<mml:mi mathvariant="bold-italic">o</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>27:&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;<bold>end if</bold>
</p>
</list-item>
<list-item>
<p>28:&#x2003;&#x2003;&#x2003;&#x2003;<bold>end for</bold>
</p>
</list-item>
<list-item>
<p>29:&#x2003;<bold>end for</bold>
</p>
</list-item>
<list-item>
<p>30:&#x2003;<bold>return</bold> <inline-formula id="inf53">
<mml:math id="m53">
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
</list>
</p>
</statement>
</p>
<p>First, an indoor environment is considered. In such cases, most unknown cells inside the map are located outside the boundaries of the occupied area, e.g., beyond the walls. This is because SLAM initially represents the environment as a grid of unknown cells before any exploration occurs. Furthermore, unknown cells often persist between occupied and free regions as a result of occlusions encountered during raycasting-based measurements, such as those performed using LiDAR, as shown in <xref ref-type="fig" rid="F6">Figure 6a</xref>. Consequently, this unknown space cannot be reached by the robot and can be treatedas part of the boundaries&#x2014;i.e., as occupied space, as shown in <xref ref-type="fig" rid="F6">Figure 6b</xref>.</p>
<p>To establish a smooth connection between occupied cells affected by noise in the map, a Gaussian filter (<xref ref-type="bibr" rid="B11">D&#x2019;Haeyer, 1989</xref>) is applied using a standard deviation parameter <inline-formula id="inf54">
<mml:math id="m54">
<mml:mrow>
<mml:mi>&#x3c3;</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="double-struck">N</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, as shown in <xref ref-type="fig" rid="F6">Figure 6c</xref>. Subsequently, in order to restore the binary representation of the occupied and free cells, the filtered result is binarized using a threshold parameter <inline-formula id="inf55">
<mml:math id="m55">
<mml:mrow>
<mml:mi>&#x3ba;</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mn>0,255</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>. A cell with a value greater than <inline-formula id="inf56">
<mml:math id="m56">
<mml:mrow>
<mml:mi>&#x3ba;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>is classified as a free cell; otherwise, it is designated as an occupied cell.</p>
<p>Due to residual noise and the presence of transparent obstacles, such as windows, there may be free cells that are unreachable to the robot. To mitigate this issue, we assume that the navigable space for the robot corresponds to the largest 2D contour. First, the contours within the map are found using the marching cubes algorithm (<xref ref-type="bibr" rid="B17">Lorensen and Cline, 1998</xref>). The map is then reconstructed by filling the largest 2D contour with a value of 255, as shown in <xref ref-type="fig" rid="F6">Figure 6d</xref>. It is worth noting that by filling only the largest contour, obstacles within that contour are not takeninto account.</p>
<p>To ensure that the robot maintains a safe distance from the occupied space during navigation, the free space in the map is reducedusing a morphological filter called erosion (<xref ref-type="bibr" rid="B15">Khosravy et al., 2017</xref>), as shown in <xref ref-type="fig" rid="F6">Figure 6e</xref>. Erosion uses a structuring element <inline-formula id="inf57">
<mml:math id="m57">
<mml:mrow>
<mml:mi mathvariant="bold">K</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, also referred to as a kernel, which determines the width to be removed. For the sake of simplicity, we consider a square matrix of 1s as our structuring element: <inline-formula id="inf58">
<mml:math id="m58">
<mml:mrow>
<mml:mi mathvariant="bold">K</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mn mathvariant="bold">1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msubsup>
<mml:mrow>
<mml:mn mathvariant="bold">1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:math>
</inline-formula>, where <inline-formula id="inf59">
<mml:math id="m59">
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> determines the length of the vector and <inline-formula id="inf60">
<mml:math id="m60">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1,2,3</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>. The larger the <inline-formula id="inf61">
<mml:math id="m61">
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> value, the larger the safe distance. In addition, the safe distance decreases as <inline-formula id="inf62">
<mml:math id="m62">
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>decreases. Therefore, <inline-formula id="inf63">
<mml:math id="m63">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x221d;</mml:mo>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>. This also removes narrow passages that prove impassable for the robot.</p>
<p>The remaining free space is reduced to a thin one-pixel-wide representation containing <inline-formula id="inf64">
<mml:math id="m64">
<mml:mrow>
<mml:mi>O</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>pixels, which corresponds to the topological skeleton of the map&#x2019;s geometry, as shown in <xref ref-type="fig" rid="F6">Figure 6f</xref>. In a practical scenario, the time complexity of 2D skeletonization is mainly proportional to the total number of pixels in an image <inline-formula id="inf65">
<mml:math id="m65">
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>as it iterates until the object becomes one pixel wide. Therefore, it can be considered <inline-formula id="inf66">
<mml:math id="m66">
<mml:mrow>
<mml:mi mathvariant="script">O</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>(<xref ref-type="bibr" rid="B37">Zhang and Suen, 1984</xref>).</p>
<p>The 2D skeleton map <inline-formula id="inf67">
<mml:math id="m67">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold">M</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="bold">S</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is then flattened into an unordered set that describes the <inline-formula id="inf68">
<mml:math id="m68">
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>- and <inline-formula id="inf69">
<mml:math id="m69">
<mml:mrow>
<mml:mi>y</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>-positions of every 2D point by transforming the pixel coordinates into real-world coordinates using the origin <inline-formula id="inf70">
<mml:math id="m70">
<mml:mrow>
<mml:mi mathvariant="bold-italic">o</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> and resolution <inline-formula id="inf71">
<mml:math id="m71">
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> of the 2D navigation map. Only those pixels for which <inline-formula id="inf72">
<mml:math id="m72">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="bold">S</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>i</mml:mi>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>255</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> are considered in this transformation. Considering that the skeleton contains <inline-formula id="inf73">
<mml:math id="m73">
<mml:mrow>
<mml:mi>O</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> pixels, it follows that there are <inline-formula id="inf74">
<mml:math id="m74">
<mml:mrow>
<mml:mi>O</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> waypoints in <inline-formula id="inf75">
<mml:math id="m75">
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>. We refer to every such 2D point defined by the skeleton as <italic>waypoints</italic>, which are denoted as <inline-formula id="inf76">
<mml:math id="m76">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>,</inline-formula> where <inline-formula id="inf77">
<mml:math id="m77">
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo>&#x2264;</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2264;</mml:mo>
<mml:mi>O</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>. The waypoints serve as points of interest for the robot to visit.</p>
</sec>
<sec id="s3-2">
<title>3.2 Path planning</title>
<p>In order to scan the whole environment, the robot should perform the scanning procedure for each waypoint. Therefore, the objective is to determine a path that includes every waypoint the robot must visit while optimizing for time efficiency. Ultimately, this can be considered a Traveling Salesman Problem (TSP), which we approach by formulating a fast and efficient path-planning algorithm. It takes a connected acyclic graph <inline-formula id="inf78">
<mml:math id="m78">
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> as the input and outputs a path <inline-formula id="inf79">
<mml:math id="m79">
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, which is the ordered set of waypoints. In other words, <inline-formula id="inf80">
<mml:math id="m80">
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> is a sequence of vertices <inline-formula id="inf81">
<mml:math id="m81">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> traversed by the robot.</p>
<p>In order to construct the graph <inline-formula id="inf82">
<mml:math id="m82">
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, we treat the unordered set of waypoints <inline-formula id="inf83">
<mml:math id="m83">
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, obtained from the map reader, as the set of vertices. Each vertex in <inline-formula id="inf84">
<mml:math id="m84">
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> uniquely corresponds to the coordinate vector of a waypoint and can, for the sake of simplicity, be denoted as <inline-formula id="inf85">
<mml:math id="m85">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mspace width="2.77695pt" class="tmspace"/>
<mml:mo>&#x2200;</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mtext>&#x2003;</mml:mtext>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>O</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>. Each vertex is then connected to other vertices if they are neighbors around the map&#x2019;s resolution <inline-formula id="inf86">
<mml:math id="m86">
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>. This should resemble the skeleton representation of the map, where the connections define the edges <inline-formula id="inf87">
<mml:math id="m87">
<mml:mrow>
<mml:mi mathvariant="script">E</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> of the graph <inline-formula id="inf88">
<mml:math id="m88">
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>.</p>
<p>
<xref ref-type="statement" rid="Algorithm_2">Algorithm 2</xref> outlines the procedure for obtaining an efficient path <inline-formula id="inf89">
<mml:math id="m89">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2a;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula> for coverage exploration of the whole environment. First, there are dead ends found in the skeleton representation of the map. For the robot to cover the whole environment, we can utilize these dead ends. Each dead end is identified as a leaf vertex <inline-formula id="inf90">
<mml:math id="m90">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2208;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> and is typically defined with degree 1. Assuming the graph <inline-formula id="inf91">
<mml:math id="m91">
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> is connected and acyclic, complete coverage of the map can be achieved by ensuring that the robot visits every leaf vertex in <inline-formula id="inf92">
<mml:math id="m92">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> in sequence. Since all other vertices in the graph lie on the paths connecting the leaves, traversing to each leaf inherently requires passing through the intermediate vertices. As a consequence, visiting all leaf vertices implies that the entire graph has been traversed.</p>
<p>After identifying all leaf vertices, the leaf vertex closest to the robot&#x2019;s current 2D position <inline-formula id="inf93">
<mml:math id="m93">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is selected as the initial source leaf vertex <inline-formula id="inf94">
<mml:math id="m94">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,start</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> using <xref ref-type="statement" rid="Algorithm_3">Algorithm 3</xref>. For every source leaf vertex <inline-formula id="inf95">
<mml:math id="m95">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,start</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, we find the next nearest unvisited leaf vertex as the target <inline-formula id="inf96">
<mml:math id="m96">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,target</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> using FindNearestLeaf, as defined in <xref ref-type="statement" rid="Algorithm_3">Algorithm 3</xref>. We find the shortest path <inline-formula id="inf97">
<mml:math id="m97">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula> between the source <inline-formula id="inf98">
<mml:math id="m98">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,source</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> and the target <inline-formula id="inf99">
<mml:math id="m99">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,target</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> given the graph <inline-formula id="inf100">
<mml:math id="m100">
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>. To achieve this, we use the method FindShortestPath, which essentially utilizes Dijkstra&#x2019;s algorithm. This algorithm has a time complexity of <inline-formula id="inf101">
<mml:math id="m101">
<mml:mrow>
<mml:mi mathvariant="script">O</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:mi mathvariant="script">E</mml:mi>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:mo>&#x2b;</mml:mo>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:mi mathvariant="script">V</mml:mi>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:mi>log</mml:mi>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:mi mathvariant="script">V</mml:mi>
<mml:mo stretchy="false">&#x7c;</mml:mo>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>, where <inline-formula id="inf102">
<mml:math id="m102">
<mml:mrow>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:mi mathvariant="script">V</mml:mi>
<mml:mo stretchy="false">&#x7c;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula id="inf103">
<mml:math id="m103">
<mml:mrow>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:mi mathvariant="script">E</mml:mi>
<mml:mo stretchy="false">&#x7c;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> denote the total number of vertices and the total number of edges in the graph, respectively (<xref ref-type="bibr" rid="B3">Barbehenn, 1998</xref>).</p>
<p>
<statement content-type="algorithm" id="Algorithm_2">
<label>Algorithm 2</label>
<p>A fast and efficient approach to planning a path <inline-formula id="inf104">
<mml:math id="m104">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2a;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>, with <inline-formula id="inf105">
<mml:math id="m105">
<mml:mrow>
<mml:mi>L</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> vertices, using the unordered set of waypoints obtained from the map reader <inline-formula id="inf106">
<mml:math id="m106">
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, map resolution <inline-formula id="inf107">
<mml:math id="m107">
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, waypoint resolution <inline-formula id="inf108">
<mml:math id="m108">
<mml:mrow>
<mml:mi>D</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, and the robot&#x2019;s starting 2D position <inline-formula id="inf109">
<mml:math id="m109">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>.<list list-type="simple">
<list-item>
<p>1:&#x2003;<bold>Input:</bold> Define graph <inline-formula id="inf110">
<mml:math id="m110">
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="script">E</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>2:&#x2003;<bold>Hyperparameters:</bold>
<inline-formula id="inf111">
<mml:math id="m111">
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula id="inf112">
<mml:math id="m112">
<mml:mrow>
<mml:mi>D</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula id="inf113">
<mml:math id="m113">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>3:&#x2003;<inline-formula id="inf114">
<mml:math id="m114">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,total</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2190;</mml:mo>
<mml:mi>&#x2205;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>4:&#x2003;<bold>for</bold> <inline-formula id="inf115">
<mml:math id="m115">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> <bold>do</bold>
</p>
</list-item>
<list-item>
<p>5:&#x2003;&#x2003;&#x2003;&#x2003;<bold>if</bold> degree<inline-formula id="inf116">
<mml:math id="m116">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:math>
</inline-formula> <bold>then</bold>
</p>
</list-item>
<list-item>
<p>6:&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;<inline-formula id="inf117">
<mml:math id="m117">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,total</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2190;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,total</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x222a;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">{</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>7:&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;<bold>end if</bold>
</p>
</list-item>
<list-item>
<p>8:&#x2003;<bold>end for</bold>
</p>
</list-item>
<list-item>
<p>9:&#x2003;<inline-formula id="inf118">
<mml:math id="m118">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,visited</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2190;</mml:mo>
<mml:mi>&#x2205;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>10:&#x2003;<inline-formula id="inf119">
<mml:math id="m119">
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>&#x2190;</mml:mo>
<mml:mi>&#x2205;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>11:&#x2003;<inline-formula id="inf120">
<mml:math id="m120">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,start</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2190;</mml:mo>
<mml:mtext>FindNearestLeaf</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,total</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>12:&#x2003;<bold>while</bold> <inline-formula id="inf121">
<mml:math id="m121">
<mml:mrow>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,visited</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:mo>&#x3c;</mml:mo>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,total</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x7c;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> <bold>do</bold>
</p>
</list-item>
<list-item>
<p>13:&#x2003;&#x2003;&#x2003;&#x2003;<inline-formula id="inf122">
<mml:math id="m122">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,visited</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2190;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,visited</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x222a;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">{</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,start</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>14:&#x2003;&#x2003;&#x2003;&#x2003;<inline-formula id="inf123">
<mml:math id="m123">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,target</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2190;</mml:mo>
<mml:mtext>FindNearestLeaf</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,start</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,total</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x5c;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,visited</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>15:&#x2003;&#x2003;&#x2003;&#x2003;<inline-formula id="inf124">
<mml:math id="m124">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2190;</mml:mo>
<mml:mtext>FindShortestPath</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,start</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,target</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x2223;</mml:mo>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>16:&#x2003;&#x2003;&#x2003;&#x2003;<bold>for</bold> <inline-formula id="inf125">
<mml:math id="m125">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula> <bold>do</bold>
</p>
</list-item>
<list-item>
<p>17:&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;<bold>if</bold> <inline-formula id="inf126">
<mml:math id="m126">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2209;</mml:mo>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> <bold>then</bold>
</p>
</list-item>
<list-item>
<p>18:&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;<inline-formula id="inf127">
<mml:math id="m127">
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>&#x2190;</mml:mo>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>&#x222a;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">{</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mo stretchy="false">}</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>19:&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;<bold>end if</bold>
</p>
</list-item>
<list-item>
<p>20:&#x2003;&#x2003;&#x2003;&#x2003;<bold>end for</bold>
</p>
</list-item>
<list-item>
<p>21:&#x2003;&#x2003;&#x2003;&#x2003;<inline-formula id="inf128">
<mml:math id="m128">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,start</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2190;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,target</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>22:&#x2003;<bold>end while</bold>
</p>
</list-item>
<list-item>
<p>23:&#x2003;<inline-formula id="inf129">
<mml:math id="m129">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2a;</mml:mo>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2190;</mml:mo>
<mml:mi>&#x2205;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>24:&#x2003;<bold>for</bold> <inline-formula id="inf130">
<mml:math id="m130">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2190;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> to <inline-formula id="inf131">
<mml:math id="m131">
<mml:mrow>
<mml:mo stretchy="false">&#x230a;</mml:mo>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>D</mml:mi>
<mml:mo>/</mml:mo>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
<mml:mo stretchy="false">&#x230b;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> <bold>do</bold>
</p>
</list-item>
<list-item>
<p>25:&#x2003;&#x2003;&#x2003;&#x2003;<inline-formula id="inf132">
<mml:math id="m132">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2a;</mml:mo>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2190;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2a;</mml:mo>
</mml:mrow>
</mml:msup>
<mml:mo>&#x222a;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>D</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>26:&#x2003;<bold>end for</bold>
</p>
</list-item>
<list-item>
<p>27:&#x2003;<bold>return</bold> <inline-formula id="inf133">
<mml:math id="m133">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2a;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
</list>
</p>
</statement>
</p>
<p>Once <inline-formula id="inf134">
<mml:math id="m134">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>is found, each vertex <inline-formula id="inf135">
<mml:math id="m135">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>is appended into <inline-formula id="inf136">
<mml:math id="m136">
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>. Unless some vertex <inline-formula id="inf137">
<mml:math id="m137">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:math>
</inline-formula>reappears as a path of a different path <inline-formula id="inf138">
<mml:math id="m138">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>, revisiting and scanning this position is unnecessary and should be avoided to conserve time and computational resources. Once iterated over all <inline-formula id="inf139">
<mml:math id="m139">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:math>
</inline-formula>in <inline-formula id="inf140">
<mml:math id="m140">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula id="inf141">
<mml:math id="m141">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,start</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is inserted into a set of visited leaf vertices <inline-formula id="inf142">
<mml:math id="m142">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,visited</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>,</inline-formula> and <inline-formula id="inf143">
<mml:math id="m143">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,target</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> becomes the next source <inline-formula id="inf144">
<mml:math id="m144">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,start</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>. Not only is the shortest path useful for appending <inline-formula id="inf145">
<mml:math id="m145">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> into <inline-formula id="inf146">
<mml:math id="m146">
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> but also for ensuring a feasible and unobstructed trajectory through occupied spaces.</p>
<p>This is iterated until all leaf vertices have been added and <inline-formula id="inf147">
<mml:math id="m147">
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> is complete. Nevertheless, because the original distance between every two waypoints is approximately equal to the map&#x2019;s resolution, a significant amountof time is spent on scanning with minimal displacement. Considering that the robot has a large scanning range capability of 30 m, which allows it to scan distances greater than the map resolution, we can increase the distance between every two waypoints to some arbitrary distance <inline-formula id="inf148">
<mml:math id="m148">
<mml:mrow>
<mml:mi>D</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> by reducing <inline-formula id="inf149">
<mml:math id="m149">
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> by a factor of <inline-formula id="inf150">
<mml:math id="m150">
<mml:mrow>
<mml:mi>D</mml:mi>
<mml:mo>/</mml:mo>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:math>,</inline-formula> where <inline-formula id="inf151">
<mml:math id="m151">
<mml:mrow>
<mml:mi>D</mml:mi>
<mml:mo>&#x2265;</mml:mo>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>. This is achieved by selecting every <inline-formula id="inf152">
<mml:math id="m152">
<mml:mrow>
<mml:mi>D</mml:mi>
<mml:mo>/</mml:mo>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> th element in <inline-formula id="inf153">
<mml:math id="m153">
<mml:mrow>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>.</p>
</sec>
<sec id="s3-3">
<title>3.3 State machine</title>
<p>To achieve autonomy that enables the robot to visit the waypoints and perform a scanning procedure in succession, an activity diagram is formulated, as shown in <xref ref-type="fig" rid="F4">Figure 4a</xref>. We can group two or more activities as a singular state if the transitions are consecutive without interruptions, e.g., a decision node. This state will perform all activities in their respective order. On the other hand, each decision node becomes a state that checks whether its control variable has reached a specified threshold. Each state has a conditionless trigger that automatically transitions the current state to the next specified state at the end of its action.</p>
<fig id="F4" position="float">
<label>FIGURE 4</label>
<caption>
<p>Comparison of <bold>(a)</bold> the activity diagram for autonomous coverage path planning and <bold>(b)</bold> its corresponding FSM diagram. <bold>(a)</bold> Activity diagram describing the autonomous coverage path planning given a prior 2D navigation map. <bold>(b)</bold> FSM diagram based on the activity diagram.</p>
</caption>
<graphic xlink:href="frobt-12-1601862-g004.tif">
<alt-text content-type="machine-generated">Flowchart diagrams illustrating robot navigation and control processes. The top diagram shows a sequence for loading a map, generating waypoints, planning routes, and handling interruptions or scanning. The bottom diagram details a loop for checking waypoints and destinations, with conditions for moving, manual control, and scanning completion.</alt-text>
</graphic>
</fig>
<p>
<statement content-type="algorithm" id="Algorithm_3">
<label>Algorithm 3</label>
<p>A method to find the nearest leaf vertex <inline-formula id="inf154">
<mml:math id="m154">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,target</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> from a set of selected leaf nodes <inline-formula id="inf155">
<mml:math id="m155">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf</mml:mtext>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:math>
</inline-formula> to a given source <inline-formula id="inf156">
<mml:math id="m156">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> using Euclidean distances.<list list-type="simple">
<list-item>
<p>1:&#x2003;<bold>Function</bold> FindNearestLeaf</p>
</list-item>
<list-item>
<p>2:&#x2003;<bold>Input:</bold>
<inline-formula id="inf157">
<mml:math id="m157">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula id="inf158">
<mml:math id="m158">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf</mml:mtext>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>3:&#x2003;<inline-formula id="inf159">
<mml:math id="m159">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,nearest</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2190;</mml:mo>
<mml:mn mathvariant="bold-italic">0</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>4:&#x2003;<inline-formula id="inf160">
<mml:math id="m160">
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mo>&#x2190;</mml:mo>
<mml:mi>&#x221e;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>5:&#x2003;<bold>for</bold>
<inline-formula id="inf161">
<mml:math id="m161">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,i</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2208;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf</mml:mtext>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:math>
</inline-formula> <bold>do</bold>
</p>
</list-item>
<list-item>
<p>6:&#x2003;&#x2003;&#x2003;&#x2003;<bold>if</bold>
<inline-formula id="inf162">
<mml:math id="m162">
<mml:mrow>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,i</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:mo>&#x3c;</mml:mo>
<mml:mi>d</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> <bold>then</bold>
</p>
</list-item>
<list-item>
<p>7:&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;<inline-formula id="inf163">
<mml:math id="m163">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,nearest</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2190;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,i</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>8:&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;&#x2003;<inline-formula id="inf164">
<mml:math id="m164">
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mo>&#x2190;</mml:mo>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,i</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x7c;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>9:&#x2003;&#x2003;&#x2003;&#x2003;<bold>end if</bold>
</p>
</list-item>
<list-item>
<p>10:&#x2003;<bold>end for</bold>
</p>
</list-item>
<list-item>
<p>11:&#x2003;<bold>return</bold> <inline-formula id="inf165">
<mml:math id="m165">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>leaf,nearest</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</p>
</list-item>
<list-item>
<p>12:&#x2003;<bold>End Function</bold>
</p>
</list-item>
</list>
</p>
</statement>
</p>
<p>With a FSM, we can achieve the desired autonomous navigation based on the triggers by handling the sequence of actions. The implemented state machine diagram is shown in <xref ref-type="fig" rid="F4">Figure 4b</xref>. Each state is explained as follows:<list list-type="simple">
<list-item>
<p>
<inline-formula id="inf166">
<mml:math id="m166">
<mml:mrow>
<mml:mo>&#x2022;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>In State: Load Map, an existing 2D navigation map is loaded into SLAM, allowing the robot to localize itselfwith respect to the map&#x2019;s metadata (meter-per-pixel resolution, width and height both in pixels, and origin as <inline-formula id="inf167">
<mml:math id="m167">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>x</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> in meters) and the robot&#x2019;s concurrent surroundings using 2D laser scans. After this map is loaded, it is then analyzed to generate a list of waypoints, each in <inline-formula id="inf168">
<mml:math id="m168">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>x</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> coordinates, for the robot to visit using the map reader. An optimal route is then planned to visit all of these waypoints, which reorders the original list using the path planner. Finally, it automatically transitions to the next state, State: Check Waypoints.</p>
</list-item>
<list-item>
<p>
<inline-formula id="inf169">
<mml:math id="m169">
<mml:mrow>
<mml:mo>&#x2022;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>State: Check Waypoints allows the system to iterate over the list of waypoints. If there are waypoints remaining, it removes the waypoint in the first entry of the list and stores it as the current destination, and it transitions to State: Check Destination. If there is no waypoint left, it transitions to State: Home.</p>
</list-item>
<list-item>
<p>
<inline-formula id="inf170">
<mml:math id="m170">
<mml:mrow>
<mml:mo>&#x2022;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>In State: Check Destination, the state machine determines whether the robot is already at the current destination with some acceptable offset. This is carried out by determining whether the Euclidean distance between the robot&#x2019;s 2D pose <inline-formula id="inf171">
<mml:math id="m171">
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> and a destination&#x2019;s pose <inline-formula id="inf172">
<mml:math id="m172">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>des</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is less than or equal to a set tolerance <inline-formula id="inf173">
<mml:math id="m173">
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3b4;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, where <inline-formula id="inf174">
<mml:math id="m174">
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>des</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">&#x3b4;</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>,</inline-formula> since the poses are defined along the <inline-formula id="inf175">
<mml:math id="m175">
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>- and <inline-formula id="inf176">
<mml:math id="m176">
<mml:mrow>
<mml:mi>y</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>-axes and the yaw orientation <inline-formula id="inf177">
<mml:math id="m177">
<mml:mrow>
<mml:mi>&#x3c8;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>with respect to the /map frame. If the condition is true, it transitions to State: Scan. Otherwise, it transitions to State: Move. It is worth noting that the path planner does not account for the orientation <inline-formula id="inf178">
<mml:math id="m178">
<mml:mrow>
<mml:mi>&#x3c8;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>. However, this orientation is likely a necessary requirement of the scanning procedure, which ensures that the robot is aligned with the desired orientation, as described in <xref ref-type="sec" rid="s12">Supplementary Material C</xref>.</p>
</list-item>
<list-item>
<p>
<inline-formula id="inf179">
<mml:math id="m179">
<mml:mrow>
<mml:mo>&#x2022;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>In State: Move, the robot is actuated to navigate toward the desired destination. Navigation is considered successful when the Euclidean distance between the robot&#x2019;s current pose <inline-formula id="inf180">
<mml:math id="m180">
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> and the target destination <inline-formula id="inf181">
<mml:math id="m181">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>des</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is less than or equal to a predefined threshold <inline-formula id="inf182">
<mml:math id="m182">
<mml:mrow>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>. Alternatively, if the navigation process exceeds a specified timeout duration <inline-formula id="inf183">
<mml:math id="m183">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>timeout</mml:mtext>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, it is also terminated. In either case, the system transitions back to the Check Destination state. However, if the system detects an interruption by a human operator via the joystick controller mid-operation, the system promptly cancels the ongoing action and immediately transitions to State: Manual Control.</p>
</list-item>
<list-item>
<p>
<inline-formula id="inf184">
<mml:math id="m184">
<mml:mrow>
<mml:mo>&#x2022;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>In State: Scan, the robot performs the procedure to scan the local environment, which is detailed in <xref ref-type="sec" rid="s12">Supplementary Material C</xref>. Once it is completed, it transitions to State: Check Waypoints.</p>
</list-item>
<list-item>
<p>
<inline-formula id="inf185">
<mml:math id="m185">
<mml:mrow>
<mml:mo>&#x2022;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>State: Manual Control allows the human operator to take over the robot&#x2019;s navigation and move it toward the destination. This should happen in a case when the robot is traversing difficult terrains or when the navigation framework is stuck at finding the right solution. This state transitions to State: Scan once the operator presses a button on the controller.</p>
</list-item>
<list-item>
<p>
<inline-formula id="inf186">
<mml:math id="m186">
<mml:mrow>
<mml:mo>&#x2022;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>In State: Home, the robot travels back to its starting position. Once the robot arrives at the starting position, it lies down on the ground and waits for new commands.</p>
</list-item>
</list>
</p>
<p>To sum up, the proposed framework for navigation consists of three key modules: the map reader to extract POIs using the 2D navigation map as waypoints, the path planner to order the waypoints as an efficient route given the robot&#x2019;s current position, and the state machine to enable the robot to navigate toward every waypoint and scan consecutively.</p>
</sec>
</sec>
<sec sec-type="results" id="s4">
<title>4 Results</title>
<p>To demonstrate the proposed framework and evaluate how well it performs, we conducted the experiment in a level, indoor, obstacle-free, non-convex environment. For evaluation, we used the two following metrics:<list list-type="simple">
<list-item>
<p>1. Time efficiency: the time required to process the map to create a path and reach each waypoint consecutively.</p>
</list-item>
<list-item>
<p>2. Reachability: the number of waypoints that the robot can reach over the total number of waypoints planned in %.</p>
</list-item>
</list>
</p>
<p>The Go2 Edu robot was initially manually controlled via a wireless controller to generate a 2D navigation map using the SLAM module. The experiment was then conducted, and the whole process was repeated over five trials. The SLAM module&#x2019;s map resolution was set to 0.10 m. The point cloud buffer time was set to 0.25 s. The laser scan&#x2019;s minimal and maximal ranges were set to 0.50 m and 30.0 m, respectively. The smoothing standard deviation was set to three. The crispification threshold was set to 128. The erosion kernel <inline-formula id="inf187">
<mml:math id="m187">
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> was set to 10 x 10 pixels. The waypoint-to-waypoint distance <inline-formula id="inf188">
<mml:math id="m188">
<mml:mrow>
<mml:mi>D</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> in path planning was set at 1.00 m. The robot&#x2019;s maximum x-, y-, and yaw velocities were set to 1.00 m/s, 0.50 m/s, and 0.80 rad/s, respectively. The 2D navigation position and orientation tolerance were set to 0.05 m and 0.08 rad, respectively, with a navigation timeout of 10.0 s to replan. The scanning procedure module was disabled to demonstrate the navigational tasks.</p>
<sec id="s4-1">
<title>4.1 SLAM, map reader, and path planning</title>
<p>Before presenting the main results, we first validate the accuracy of the 2D navigation maps generated by the SLAM module. The average map is derived by normalizing over the five 2D navigation maps obtained from five trials, as illustrated in <xref ref-type="fig" rid="F5">Figure 5</xref>. The width and height of these maps range between [196,225] and [185,231] pixels, respectively. We take the inner corner of the left- wing (upper left triangle of the map) of the room as the origin to align the maps in position and orientation accordingly. Analysis of the averaged map reveals that the right wing exhibits a wider range of shades of gray about the occupied space, suggesting that this part of the environment is slightly tilted relative to its actual orientation. Nonetheless, this does not severely affect the map reader, path planning, and navigation as the robot mainly localizes itself in its immediate surroundings and the topological skeleton of the map can still be found. For instance, as shown in <xref ref-type="fig" rid="F6">Figure 6</xref>, the map reader can still create waypoints mainly using the map&#x2019;s geometry, which also enables the robot to visit the corners by producing branches from the main path to these corners.</p>
<fig id="F5" position="float">
<label>FIGURE 5</label>
<caption>
<p>Derivation by normalizing over the five 2D navigation maps obtained from five trials, where the inner corner of the left wing of the room is taken as the origin, which is denoted as a red point. All five maps are translated and rotated around the red point accordingly.</p>
</caption>
<graphic xlink:href="frobt-12-1601862-g005.tif">
<alt-text content-type="machine-generated">Abstract design featuring a white, blurred zigzag pattern on a black background with a small red spot on one of the lines.</alt-text>
</graphic>
</fig>
<fig id="F6" position="float">
<label>FIGURE 6</label>
<caption>
<p>Demonstration of the map reader&#x2019;s pipeline using the 2D navigation map of trial 5 as input. <bold>(a)</bold> Original map. <bold>(b)</bold> Adjusted map. <bold>(c)</bold> Fuzzied map. <bold>(d)</bold> Contour map. <bold>(e)</bold> Eroded map. <bold>(f)</bold> Skeleton map.</p>
</caption>
<graphic xlink:href="frobt-12-1601862-g006.tif">
<alt-text content-type="machine-generated">Six maps showing different image processing techniques on a black background. 1. Original Map: White pixelated shape.2. Adjusted Map: Improved contrast of the shape.3. Fuzzied Map: Blurred edges.4. Contour Map: Enhanced outline.5. Eroded Map: Thinned shape.6. Skeleton Map: Central line within shape. Each map represents different data visualization methods.</alt-text>
</graphic>
</fig>
<p>To evaluate the time efficiency of the map reader, we record the duration required to process each map across five trials, considering a total of <inline-formula id="inf189">
<mml:math id="m189">
<mml:mrow>
<mml:mi>N</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>100</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> instances. We vary the weights in terms of the dimension per map. To facilitate a clearer representation in the plot, we use the product of the dimensions, <inline-formula id="inf190">
<mml:math id="m190">
<mml:mrow>
<mml:mi>H</mml:mi>
<mml:mo>&#xd7;</mml:mo>
<mml:mi>W</mml:mi>
</mml:mrow>
</mml:math>,</inline-formula> in pixels. As shown in <xref ref-type="fig" rid="F7">Figure 7a</xref>, we can observe that the average time taken for the map reader ranges from 2.34 ms to 2.70 ms over the five trials, with an average standard deviation of approximately 0.30 ms. We can also observe that the mean time increases by 22.0 ns for every additional pixel in the map. For instance, with a map of size <inline-formula id="inf191">
<mml:math id="m191">
<mml:mrow>
<mml:mi>H</mml:mi>
<mml:mo>&#xd7;</mml:mo>
<mml:mi>W</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:msup>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula> pixels, the expected mean time is <inline-formula id="inf192">
<mml:math id="m192">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>read</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2248;</mml:mo>
<mml:mn>23.6</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> ms.</p>
<fig id="F7" position="float">
<label>FIGURE 7</label>
<caption>
<p>Comparison of the mean time taken for <bold>(a)</bold> map reader and <bold>(b)</bold> path planner over five trials. <bold>(a)</bold> Mean time taken for map reader over five trials, iterated over N &#x3d; 100 plotted in blue dots, with standard deviation in 1&#x3c3; as the vertical blue line. Trend line is 22.0 ns/pixel. <bold>(b)</bold> Mean time taken for path planner over five trials, iterated over N &#x3d; 500 plotted in blue dots, with standard deviation in 1&#x3c3; as the vertical blue line. Trend line is 8.17 &#x3bc;s/pixel.</p>
</caption>
<graphic xlink:href="frobt-12-1601862-g007.tif">
<alt-text content-type="machine-generated">Graph a displays the mean time taken to read maps versus map size, showing a positive trend line with data points and error bars. Graph b illustrates the mean time taken for path planning versus the number of waypoints, also showing a positive trend line. Both graphs depict a quantitative relationship with increasing values on the x-axes corresponding to increases on the y-axes.</alt-text>
</graphic>
</fig>
<p>To remain within a maximum time taken of 1.0 s, the map should not be larger than the size of <inline-formula id="inf193">
<mml:math id="m193">
<mml:mrow>
<mml:mi>H</mml:mi>
<mml:mo>&#xd7;</mml:mo>
<mml:mi>W</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>45.4</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>1</mml:mn>
<mml:msup>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula> pixels. Assuming a square map with a map resolution of 0.10 m, this maximum map has a length of 673.4 m. Hence, our proposed map reader is fast for relatively small to large map sizes (ranging up to <inline-formula id="inf194">
<mml:math id="m194">
<mml:mrow>
<mml:mn>45.4</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>1</mml:mn>
<mml:msup>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula> pixels) within a lead time of <inline-formula id="inf195">
<mml:math id="m195">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>read</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1.0</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> s, especially when the map reader is only run once to produce the waypoints given the map&#x2019;s geometry.</p>
<p>To determine the path planner&#x2019;s time efficiency, we repeat the same process with the evaluation of the map reader over <inline-formula id="inf196">
<mml:math id="m196">
<mml:mrow>
<mml:mi>N</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>500</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> iterations per trial. Instead, we vary the weights in terms of the number of waypoints per map. In <xref ref-type="fig" rid="F7">Figure 7b</xref>, we can observe that the mean time taken ranges between 1.40 ms and 2.00 ms. The variances can be explained by the additional time required to find the next nearest leaf vertex from a source vertex as it searches the list sequentially. According to the trend line, the lead time increases by 8.17 &#x3bc;s for every additional waypoint. Therefore, according to the trend line, it means that for a map with 1,000 waypoints, the planning time becomes <inline-formula id="inf197">
<mml:math id="m197">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>plan</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2248;</mml:mo>
<mml:mn>6.18</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> ms, and for a map of <inline-formula id="inf198">
<mml:math id="m198">
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:msup>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula> waypoints, the planning time is <inline-formula id="inf199">
<mml:math id="m199">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>plan</mml:mtext>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2248;</mml:mo>
<mml:mn>8.17</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> s.</p>
<p>To stay within a lead time of 1.0 s, the number of waypoints should not be larger than <inline-formula id="inf200">
<mml:math id="m200">
<mml:mrow>
<mml:mn>1.219</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>1</mml:mn>
<mml:msup>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>5</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>. The bottleneck appears if the map resolution <inline-formula id="inf201">
<mml:math id="m201">
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> becomes small as it increases the number of pixels per meter in a map. This can substantially increase the number of waypoints by a factor of <inline-formula id="inf202">
<mml:math id="m202">
<mml:mrow>
<mml:mi>R</mml:mi>
<mml:mo>/</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>, where <inline-formula id="inf203">
<mml:math id="m203">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula> is the new map resolution and <inline-formula id="inf204">
<mml:math id="m204">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msup>
<mml:mo>&#x3c;</mml:mo>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>. Nonetheless, the path planner can be considered fast for a small to large number of waypoints, given a reasonable map resolution <inline-formula id="inf205">
<mml:math id="m205">
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>. It is also worth noting that it also runs only once to produce the necessary path.</p>
<p>To verify the path planner&#x2019;s performance, we first evaluate the logic of whether it works as intended. Using one trial as an example, we observe that the path planner has created an optimal path in terms of time, based on the given waypoints and the robot&#x2019;s current 2D position, as shown in <xref ref-type="fig" rid="F8">Figure 8a</xref>. Furthermore, according to <xref ref-type="fig" rid="F8">Figure 8b</xref>, we can observe that the mean waypoint&#x2013;waypoint distance is approximately 1.00 m, given the previously set waypoint resolution <inline-formula id="inf206">
<mml:math id="m206">
<mml:mrow>
<mml:mi>D</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>. The variance can be explained by the fact that the robot skips waypoints that have already been visited as it is unnecessary to scan the same position twice. This results in the robot having to travel distances of 1.00 m or more for some intervals. In contrast to traveling a longer distance, the robot can also visit the next waypoint in a shorter distance. This is because the path splicing happens at the end of the algorithm, whereby it results in a probability that two waypoints are less than the set waypoint resolution. Nevertheless, this does not heavily affect navigation, and the average waypoint distance is almost identical to the set waypoint resolution <inline-formula id="inf207">
<mml:math id="m207">
<mml:mrow>
<mml:mi>D</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>.</p>
<fig id="F8" position="float">
<label>FIGURE 8</label>
<caption>
<p>Demonstrations of path planner&#x2019;s performance. <bold>(a)</bold> An efficient path to explore the whole environment from the robot&#x2019;s starting position (green) to the farthest waypoint (blue) while visiting all other waypoints (black). Each arrow (red) denotes the direction from the source to the target. <bold>(b)</bold> Mean distance between every two connected waypoints generated by the path planning per trial, as defined by the waypoint resolution D.</p>
</caption>
<graphic xlink:href="frobt-12-1601862-g008.tif">
<alt-text content-type="machine-generated">Panel a shows a path with waypoints on a map, starting at a green star and ending at a blue star. Panel b is a bar graph illustrating the distance between waypoints across five trials, with error bars indicating variability.</alt-text>
</graphic>
</fig>
</sec>
<sec id="s4-2">
<title>4.2 Navigational performance</title>
<p>To determine the robot&#x2019;s navigational performance, we evaluate it according to the two aforementioned metrics, as shown in <xref ref-type="table" rid="T2">Table 2</xref>. In addition, <xref ref-type="fig" rid="F9">Figure 9</xref> shows the time taken for each waypoint over all trials. We can observe that the robot is able to reach 86.5% of the total waypoints across all trials, with a median time of 5.38 s per waypoint. As shown in <xref ref-type="fig" rid="F9">Figure 9</xref>, this was achieved in an average time of 8.525 s, with a standard deviation of 11.4 s.</p>
<table-wrap id="T2" position="float">
<label>TABLE 2</label>
<caption>
<p>Reachability and time taken for each trial, including key observations.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th align="left">Trial</th>
<th align="left">Reachability (%)</th>
<th align="left">Total time (s)</th>
<th align="left">Median time per waypoint (s)</th>
<th align="left">Observations</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">1</td>
<td align="center">100.0</td>
<td align="center">443.2</td>
<td align="center">5.40</td>
<td align="left">Human assistance required at waypoint 17</td>
</tr>
<tr>
<td align="left">2</td>
<td align="center">100.0</td>
<td align="center">397.0</td>
<td align="center">5.30</td>
<td align="left">Human assistance required at waypoint 36</td>
</tr>
<tr>
<td align="left">3</td>
<td align="center">82.61</td>
<td align="center">287.2</td>
<td align="center">5.40</td>
<td align="left">Significant map drift occurred after 3 min, such that the remaining eight waypoints were unreachable (displaced into the occupied space)</td>
</tr>
<tr>
<td align="left">4</td>
<td align="center">100.0</td>
<td align="center">322.3</td>
<td align="center">5.40</td>
<td align="left">Robot stalled at waypoints 6, 10, 18, 23, 28, 35, and 37&#x2013;39 due to replanning</td>
</tr>
<tr>
<td align="left">5</td>
<td align="center">48.72</td>
<td align="center">160.1</td>
<td align="center">5.40</td>
<td align="left">Significant map drift occurred after 2 min, such that the remaining 19 waypoints were unreachable as they displaced into the occupied space</td>
</tr>
</tbody>
</table>
</table-wrap>
<fig id="F9" position="float">
<label>FIGURE 9</label>
<caption>
<p>Time taken in seconds for the robot to reach each possible unique waypoint over five trials. Gray dots describe waypoints that the robot has not been able to reach. The outliers occurred due to Nav2 getting stuck at replanning, such that the navigation terminates within narrow desired tolerances, or due to map drift.</p>
</caption>
<graphic xlink:href="frobt-12-1601862-g009.tif">
<alt-text content-type="machine-generated">Line graph displaying time taken to reach unique waypoints across five trials, labeled 1 to 5. Each subplot shows fluctuating times with notable spikes. Trial 1 peaks at waypoint 16, Trial 2 at waypoint 37, Trial 3 at waypoint 34, Trial 4 at waypoint 39, and Trial 5 at waypoint 16. The x-axis represents waypoint indices and the y-axis represents time in seconds.</alt-text>
</graphic>
</fig>
<p>We can see several outliers where the robot took time ranging from 10.0 s to a few minutes to complete the navigation to the adjacent waypoint, for instance, at waypoint 17 in trial 1. This can be explained by Nav2 trying to create a local path that ends precisely within the desired tolerances in position and orientation, and because the robot requires a minimal input velocity in order to move, it overshoots the target, causing Nav2 to replan the local path. This can result in the robot becoming stuck indefinitely and requires assistance from a human operator. For some of these outliers, ranging from 30 s, human assistance is eventually required to reposition the robot correctly within the desired position and orientation tolerance.</p>
<p>Furthermore, <xref ref-type="table" rid="T2">Table 2</xref> shows that in trials 3 and 5, the robot failed to reach all of the waypoints. This is mainly due to map drifts that occur over time and the fact that the SLAM module was still operating by mapping the robot&#x2019;s surroundings online. This can be recognized, e.g., as two identical hallways slightly tilted relative to one another, as shown in <xref ref-type="fig" rid="F10">Figure 10</xref>. Due to the drift in the navigation map, since the coordinates of the waypoints remain the same, SLAM adjusts the 2D navigation map such that the later waypoints appear in places that the robot cannot reach, such as in the walls. Drift usually occurs because we only use relative sensors to localize itself with respect to the surroundings, e.g., IMU, leg encoders, and LiDAR. This can cause the uncertainty to increase over time, which is inherent in odometry.</p>
<fig id="F10" position="float">
<label>FIGURE 10</label>
<caption>
<p>Drift in the map where the hall is doubled. The drift occurred 10 min after the autonomous navigation started in trial 3.</p>
</caption>
<graphic xlink:href="frobt-12-1601862-g010.tif">
<alt-text content-type="machine-generated">A top-down view of a digital map displaying an incomplete layout of an indoor space. The map features a grey area with scattered green dots and black borders, indicating the explored and unexplored regions of the space. The grey background suggests a grid system overlay.</alt-text>
</graphic>
</fig>
</sec>
</sec>
<sec sec-type="discussion" id="s5">
<title>5 Discussion</title>
<p>Coverage path planning allows mobile robots such as quadrupeds to explore the whole environment. This is especially useful for applications such as surveillance, inspection, and search and rescue. Nevertheless, limited work has been carried out on autonomous navigation using coverage path planning on quadrupeds. Therefore, we developed an open-source framework using ROS 2 that enables a Unitree Robotics Go2 quadruped to autonomously navigate and visit every corner using a prior 2D navigation map. It utilizes a map reader to extract a graph of 2D waypoints using the topological skeleton of the map and a path planner to create an efficient path with respect to time and the starting position. A state machine is used to iterate over the ordered list of waypoints and navigate them in succession.</p>
<p>The map reader and the path planner can quickly process maps with widths and heights ranging from 196,225 pixels to 185,231 pixels in 2.52 ms and 1.7 ms, respectively. Their computation times increase with 22.0 ns/pixel and 8.17 &#x3bc;s/pixel, respectively. In a closed and unstructured environment, the robot managed to reach 86.5% of all waypoints over five runs. The failure can be explained due to drifts occurring in the maps over time because SLAM still operates online. Map drifts can be mitigated using absolute sensors such as global positioning system (GPS) and ultra-wideband anchors. Another issue that our path planning does not take into account is obstacles inside the large free space. This can be mitigated by subtracting the contours of said obstacles from the large free space. Skeletonization will account for the creation of waypoints around these occupied spaces. However, the presence of obstacles may necessitate adjustment to the path planner as they can give rise to cyclical graphs.</p>
<p>Compared to the state-of-the-art methods that use time-constrained planning (<xref ref-type="bibr" rid="B4">Bouman et al., 2022</xref>; <xref ref-type="bibr" rid="B18">Ly et al., 2023</xref>) and do not enable variable task execution times, our approach is not constrained by a predefined time. While a time-constrained approach is useful when the mission time is predefined, the variable-time approach provides a more adaptable solution when operating with limited knowledge. Unlike alternative state-of-the-art approaches that enable time-variable exploration (<xref ref-type="bibr" rid="B25">Niu et al., 2024</xref>), our approach is more computationally efficient due to the use of a morphological technique to extract the topological skeleton of the map. Even though the experimental conditions were different, a rough comparison of the map generation magnitude based on the results from each paper shows an order-of-magnitude difference (milliseconds vs. microseconds).</p>
<p>Nevertheless, the proposed method is primarily suited for known and static environments, rendering it unsuitable for real-world applications with irregular and moving obstacles within the environment and varying elevations. Future work will, therefore, focus on extending the proposed method to incorporate real-time autonomous coverage exploration in unknown 3D environments, particularly under diverse environmental conditions and in the presence of irregular and dynamic obstacles. Additionally, the influence of variations in key parameters will be systematically investigated. Moreover, the study will also investigate and aim to improve drift issues commonly encountered in SLAM. Finally, the proposed approach will be systematically compared with existing 2D coverage path planning methods to evaluate its relative performance and advantages.</p>
</sec>
</body>
<back>
<sec sec-type="data-availability" id="s6">
<title>Data availability statement</title>
<p>The raw data supporting the conclusions of this article will be made available by the authors, without undue reservation.</p>
</sec>
<sec sec-type="author-contributions" id="s7">
<title>Author contributions</title>
<p>AJB: Software, Methodology, Writing &#x2013; review and editing, Supervision, Investigation, Conceptualization, Writing &#x2013; original draft, Funding acquisition, Data curation, Visualization, Formal Analysis, Project administration, Resources, Validation. KK: Methodology, Writing &#x2013; review and editing, Software, Investigation, Supervision, Funding acquisition, Conceptualization, Visualization, Resources, Validation, Data curation, Formal Analysis, Project administration. LP: Project administration, Formal Analysis, Validation, Visualization, Methodology, Data curation, Conceptualization, Writing &#x2013; original draft, Software, Writing &#x2013; review and editing, Funding acquisition, Supervision, Resources, Investigation. RR: Conceptualization, Resources, Formal Analysis, Funding acquisition, Validation, Visualization, Project administration, Writing &#x2013; original draft, Investigation, Supervision, Data curation, Methodology, Writing &#x2013; review and editing, Software.</p>
</sec>
<sec sec-type="funding-information" id="s8">
<title>Funding</title>
<p>The author(s) declare that financial support was received for the research and/or publication of this article. The work was partially supported by the TU Delft Moonshot.</p>
</sec>
<sec sec-type="COI-statement" id="s9">
<title>Conflict of interest</title>
<p>The authors declare that the research was conducted in the absence of any commercial or financial relationships that could be construed as a potential conflict of interest.</p>
</sec>
<sec sec-type="ai-statement" id="s10">
<title>Generative AI statement</title>
<p>The author(s) declare that no Generative AI was used in the creation of this manuscript.</p>
</sec>
<sec sec-type="disclaimer" id="s11">
<title>Publisher&#x2019;s note</title>
<p>All claims expressed in this article are solely those of the authors and do not necessarily represent those of their affiliated organizations, or those of the publisher, the editors and the reviewers. Any product that may be evaluated in this article, or claim that may be made by its manufacturer, is not guaranteed or endorsed by the publisher.</p>
</sec>
<sec sec-type="supplementary-material" id="s12">
<title>Supplementary material</title>
<p>The Supplementary Material for this article can be found online at: <ext-link ext-link-type="uri" xlink:href="https://www.frontiersin.org/articles/10.3389/frobt.2025.1601862/full#supplementary-material">https://www.frontiersin.org/articles/10.3389/frobt.2025.1601862/full&#x23;supplementary-material</ext-link>
</p>
<supplementary-material xlink:href="DataSheet1.pdf" id="SM1" mimetype="application/pdf" xmlns:xlink="http://www.w3.org/1999/xlink"/>
</sec>
<fn-group>
<fn id="fn1">
<label>1</label>
<p>Go2 SDK Development Guide - About Go2 <ext-link ext-link-type="uri" xlink:href="https://support.unitree.com/home/en/developer/about_Go2">https://support.unitree.com/home/en/developer/about_Go2</ext-link>
</p>
</fn>
<fn id="fn2">
<label>2</label>
<p> 4D Lidar L1 Application Scenarios 4D Lidar L1 Efficacy &#x2014; Unitree Robotic <ext-link ext-link-type="uri" xlink:href="https://www.unitree.com/LiDAR">https://www.unitree.com/LiDAR</ext-link>
</p>
</fn>
<fn id="fn3">
<label>3</label>
<p>Go2 SDK Development Guide - SDK Concepts <ext-link ext-link-type="uri" xlink:href="https://support.unitree.com/home/en/developer/SDK_Concepts">https://support.unitree.com/home/en/developer/SDK_Concepts</ext-link>
</p>
</fn>
</fn-group>
<ref-list>
<title>References</title>
<ref id="B1">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Ai</surname>
<given-names>X.</given-names>
</name>
<name>
<surname>Xu</surname>
<given-names>C.</given-names>
</name>
<name>
<surname>Li</surname>
<given-names>B.</given-names>
</name>
<name>
<surname>Xia</surname>
<given-names>F.</given-names>
</name>
</person-group> (<year>2024</year>). <source>Robot-as-A-sensor: forming a sensing network with robots for underground mining missions</source>, <pub-id pub-id-type="doi">10.48550/arXiv.2405.00266</pub-id>
</citation>
</ref>
<ref id="B2">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Arm</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Zenkl</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Barton</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Beglinger</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Dietsche</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Ferrazzini</surname>
<given-names>L.</given-names>
</name>
<etal/>
</person-group> (<year>2019</year>). &#x201c;<article-title>Spacebok: a dynamic legged robot for space exploration</article-title>,&#x201d; in <source>2019 international conference on robotics and automation (ICRA)</source>, <fpage>6288</fpage>&#x2013;<lpage>6294</lpage>. <pub-id pub-id-type="doi">10.1109/ICRA.2019.8794136</pub-id>
</citation>
</ref>
<ref id="B3">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Barbehenn</surname>
<given-names>M.</given-names>
</name>
</person-group> (<year>1998</year>). <article-title>A note on the complexity of dijkstra&#x2019;s algorithm for graphs with weighted vertices</article-title>. <source>IEEE Trans. Comput.</source> <volume>47</volume>, <fpage>263</fpage>. <pub-id pub-id-type="doi">10.1109/12.663776</pub-id>
</citation>
</ref>
<ref id="B4">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Bouman</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Ott</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Kim</surname>
<given-names>S.-K.</given-names>
</name>
<name>
<surname>Chen</surname>
<given-names>K.</given-names>
</name>
<name>
<surname>Kochenderfer</surname>
<given-names>M. J.</given-names>
</name>
<name>
<surname>Lopez</surname>
<given-names>B.</given-names>
</name>
<etal/>
</person-group> (<year>2022</year>). &#x201c;<article-title>Adaptive coverage path planning for efficient exploration of unknown environments</article-title>,&#x201d; in <conf-name>2022 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)</conf-name>, <fpage>11916</fpage>&#x2013;<lpage>11923</lpage>. <pub-id pub-id-type="doi">10.1109/IROS47612.2022.9982287</pub-id>
</citation>
</ref>
<ref id="B5">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Candalot</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Hashim</surname>
<given-names>M.-M.</given-names>
</name>
<name>
<surname>Hickey</surname>
<given-names>B.</given-names>
</name>
<name>
<surname>Laine</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Hunter-Scullion</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Yoshida</surname>
<given-names>K.</given-names>
</name>
</person-group> (<year>2024</year>). <source>Soft gripping system for space exploration legged robots</source>. <fpage>144</fpage>, <lpage>156</lpage>. <pub-id pub-id-type="doi">10.1007/978-3-031-71301-9_14</pub-id>
</citation>
</ref>
<ref id="B6">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Chagoya</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Patel</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Koduru</surname>
<given-names>C.</given-names>
</name>
<name>
<surname>Kovarovics</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Tanveer</surname>
<given-names>M. H.</given-names>
</name>
<name>
<surname>Voicu</surname>
<given-names>R. C.</given-names>
</name>
</person-group> (<year>2024</year>). <article-title>Data collection, heat map generation for crack detection using robotic dog fused with flir sensor</article-title>. <source>SoutheastCon</source> <volume>2024</volume>, <fpage>824</fpage>&#x2013;<lpage>829</lpage>. <pub-id pub-id-type="doi">10.1109/SoutheastCon52093.2024.10500184</pub-id>
</citation>
</ref>
<ref id="B7">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Chai</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Li</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Song</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Zhang</surname>
<given-names>G.</given-names>
</name>
<name>
<surname>Zhang</surname>
<given-names>Q.</given-names>
</name>
<name>
<surname>Liu</surname>
<given-names>S.</given-names>
</name>
<etal/>
</person-group> (<year>2022</year>). <article-title>A survey of the development of quadruped robots: joint configuration, dynamic locomotion control method and mobile manipulation approach</article-title>. <source>Biomim. Intell. Robotics</source> <volume>2</volume>, <fpage>100029</fpage>. <pub-id pub-id-type="doi">10.1016/j.birob.2021.100029</pub-id>
</citation>
</ref>
<ref id="B8">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Chen</surname>
<given-names>Z.</given-names>
</name>
<name>
<surname>Wu</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Chen</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Cheng</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Zhang</surname>
<given-names>B.</given-names>
</name>
</person-group> (<year>2022</year>). <article-title>Patrol robot path planning in nuclear power plant using an interval multi-objective particle swarm optimization algorithm</article-title>. <source>Appl. Soft Comput.</source> <volume>116</volume>, <fpage>108192</fpage>. <pub-id pub-id-type="doi">10.1016/j.asoc.2021.108192</pub-id>
</citation>
</ref>
<ref id="B9">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Cheng</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Liu</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Pan</surname>
<given-names>G.</given-names>
</name>
<name>
<surname>Liu</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Ye</surname>
<given-names>L.</given-names>
</name>
</person-group> (<year>2024</year>). &#x201c;<article-title>Quadruped robot traversing 3d complex environments with limited perception</article-title>,&#x201d; in <conf-name>2024 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)</conf-name>, <fpage>9074</fpage>&#x2013;<lpage>9081</lpage>. <pub-id pub-id-type="doi">10.1109/IROS58592.2024.10801507</pub-id>
</citation>
</ref>
<ref id="B10">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Chiou</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Epsimos</surname>
<given-names>G.-T.</given-names>
</name>
<name>
<surname>Nikolaou</surname>
<given-names>G.</given-names>
</name>
<name>
<surname>Pappas</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Petousakis</surname>
<given-names>G.</given-names>
</name>
<name>
<surname>M&#xfc;hl</surname>
<given-names>S.</given-names>
</name>
<etal/>
</person-group> (<year>2022</year>). &#x201c;<article-title>Robot-assisted nuclear disaster response: report and insights from a field exercise</article-title>,&#x201d; in <conf-name>2022 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)</conf-name>, <fpage>4545</fpage>&#x2013;<lpage>4552</lpage>. <pub-id pub-id-type="doi">10.1109/IROS47612.2022.9981881</pub-id>
</citation>
</ref>
<ref id="B11">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>D&#x2019;Haeyer</surname>
<given-names>J. P.</given-names>
</name>
</person-group> (<year>1989</year>). <article-title>Gaussian filtering of images: a regularization approach</article-title>. <source>Signal Process.</source> <volume>18</volume>, <fpage>169</fpage>&#x2013;<lpage>181</lpage>. <pub-id pub-id-type="doi">10.1016/0165-1684(89)90048-0</pub-id>
</citation>
</ref>
<ref id="B12">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Fan</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Pei</surname>
<given-names>Z.</given-names>
</name>
<name>
<surname>Wang</surname>
<given-names>C.</given-names>
</name>
<name>
<surname>Li</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Tang</surname>
<given-names>Z.</given-names>
</name>
<name>
<surname>Liu</surname>
<given-names>Q.</given-names>
</name>
</person-group> (<year>2024</year>). <article-title>A review of quadruped robots: structure, control, and autonomous motion</article-title>. <source>Adv. Intell. Syst.</source>, <volume>6</volume>, <fpage>2300783</fpage>. <pub-id pub-id-type="doi">10.1002/aisy.202300783</pub-id>
</citation>
</ref>
<ref id="B13">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Guo</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Wang</surname>
<given-names>Z.</given-names>
</name>
<name>
<surname>Bai</surname>
<given-names>W.</given-names>
</name>
</person-group> (<year>2024</year>). <article-title>Learning quadrupedal robot locomotion for narrow pipe inspection</article-title>. <comment>arXiv</comment>, <pub-id pub-id-type="doi">10.48550/arXiv.2412.13621</pub-id>
</citation>
</ref>
<ref id="B14">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Jiang</surname>
<given-names>Z.</given-names>
</name>
<name>
<surname>Cao</surname>
<given-names>X.</given-names>
</name>
<name>
<surname>Huang</surname>
<given-names>X.</given-names>
</name>
<name>
<surname>Li</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Ceccarelli</surname>
<given-names>M.</given-names>
</name>
</person-group> (<year>2022</year>). <article-title>Progress and development trend of space intelligent robot technology</article-title>. <source>Space Sci. and Technol.</source> <volume>2022</volume>, <fpage>2022</fpage>. <pub-id pub-id-type="doi">10.34133/2022/9832053</pub-id>
</citation>
</ref>
<ref id="B15">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Khosravy</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Gupta</surname>
<given-names>N.</given-names>
</name>
<name>
<surname>Marina</surname>
<given-names>N.</given-names>
</name>
<name>
<surname>Sethi</surname>
<given-names>I. K.</given-names>
</name>
<name>
<surname>Asharif</surname>
<given-names>M. R.</given-names>
</name>
</person-group> (<year>2017</year>). <source>Morphological filters: an inspiration from natural geometrical erosion and dilation</source>. <publisher-loc>Cham</publisher-loc>: <publisher-name>Springer International Publishing</publisher-name>, <fpage>349</fpage>&#x2013;<lpage>379</lpage>. <pub-id pub-id-type="doi">10.1007/978-3-319-50920-4_14</pub-id>
</citation>
</ref>
<ref id="B16">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Lin</surname>
<given-names>T.-H.</given-names>
</name>
<name>
<surname>Huang</surname>
<given-names>J.-T.</given-names>
</name>
<name>
<surname>Putranto</surname>
<given-names>A.</given-names>
</name>
</person-group> (<year>2022</year>). <article-title>Integrated smart robot with earthquake early warning system for automated inspection and emergency response</article-title>. <source>Nat. hazards</source> <volume>110</volume>, <fpage>765</fpage>&#x2013;<lpage>786</lpage>. <pub-id pub-id-type="doi">10.1007/s11069-021-04969-2</pub-id>
</citation>
</ref>
<ref id="B17">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Lorensen</surname>
<given-names>W. E.</given-names>
</name>
<name>
<surname>Cline</surname>
<given-names>H. E.</given-names>
</name>
</person-group> (<year>1998</year>). <source>Marching cubes: a high resolution 3D surface construction algorithm</source>. <publisher-loc>New York, NY, USA</publisher-loc>: <publisher-name>Association for Computing Machinery</publisher-name>, <fpage>347</fpage>&#x2013;<lpage>353</lpage>. <pub-id pub-id-type="doi">10.1145/280811.281026</pub-id>
</citation>
</ref>
<ref id="B18">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Ly</surname>
<given-names>K. T.</given-names>
</name>
<name>
<surname>Munks</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Merkt</surname>
<given-names>W.</given-names>
</name>
<name>
<surname>Havoutis</surname>
<given-names>I.</given-names>
</name>
</person-group> (<year>2023</year>). &#x201c;<article-title>Asymptotically optimized multi-surface coverage path planning for loco-manipulation in inspection and monitoring</article-title>,&#x201d; in <conf-name>2023 IEEE 19th International Conference on Automation Science and Engineering (CASE)</conf-name>, <fpage>1</fpage>&#x2013;<lpage>7</lpage>. <pub-id pub-id-type="doi">10.1109/CASE56687.2023.10260625</pub-id>
</citation>
</ref>
<ref id="B19">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Macenski</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Foote</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Gerkey</surname>
<given-names>B.</given-names>
</name>
<name>
<surname>Lalancette</surname>
<given-names>C.</given-names>
</name>
<name>
<surname>Woodall</surname>
<given-names>W.</given-names>
</name>
</person-group> (<year>2022</year>). <article-title>Robot operating system 2: design, architecture, and uses in the wild</article-title>. <source>Sci. Robotics</source> <volume>7</volume>, <fpage>eabm6074</fpage>. <pub-id pub-id-type="doi">10.1126/scirobotics.abm6074</pub-id>
</citation>
</ref>
<ref id="B20">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Macenski</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Jambrecic</surname>
<given-names>I.</given-names>
</name>
</person-group> (<year>2021</year>). <article-title>Slam toolbox: slam for the dynamic world</article-title>. <source>J. Open Source Softw.</source> <volume>6</volume>, <fpage>2783</fpage>. <pub-id pub-id-type="doi">10.21105/joss.02783</pub-id>
</citation>
</ref>
<ref id="B21">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Macenski</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Moore</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Lu</surname>
<given-names>D. V.</given-names>
</name>
<name>
<surname>Merzlyakov</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Ferguson</surname>
<given-names>M.</given-names>
</name>
</person-group> (<year>2023</year>). <article-title>From the desks of ROS maintainers: a survey of modern and capable mobile robotics algorithms in the robot operating system 2</article-title>. <source>Robotics Aut. Syst.</source>, <pub-id pub-id-type="doi">10.1016/j.robot.2023.104493</pub-id> </citation>
</ref>
<ref id="B22">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Mei</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Wang</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Zheng</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Jin</surname>
<given-names>Q.</given-names>
</name>
</person-group> (<year>2024</year>). <article-title>QuadrupedGPT: towards a versatile quadruped agent in open-ended worlds</article-title>. <source>arXiv</source>, <pub-id pub-id-type="doi">10.48550/arXiv.2406.16578</pub-id>
</citation>
</ref>
<ref id="B23">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Miller</surname>
<given-names>I. D.</given-names>
</name>
<name>
<surname>Cladera</surname>
<given-names>F.</given-names>
</name>
<name>
<surname>Cowley</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Shivakumar</surname>
<given-names>S. S.</given-names>
</name>
<name>
<surname>Lee</surname>
<given-names>E. S.</given-names>
</name>
<name>
<surname>Jarin-Lipschitz</surname>
<given-names>L.</given-names>
</name>
<etal/>
</person-group> (<year>2020</year>). <article-title>Mine tunnel exploration using multiple quadrupedal robots</article-title>. <source>IEEE Robotics Automation Lett.</source> <volume>5</volume>, <fpage>2840</fpage>&#x2013;<lpage>2847</lpage>. <pub-id pub-id-type="doi">10.1109/LRA.2020.2972872</pub-id>
</citation>
</ref>
<ref id="B24">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Nitulescu</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Ivanescu</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Hai Nguyen</surname>
<given-names>V. D.</given-names>
</name>
<name>
<surname>Manoiu-Olaru</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2016</year>). &#x201c;<article-title>Designing the legs of a hexapod robot</article-title>,&#x201d; in <conf-name>2016 20th International Conference on System Theory, Control and Computing (ICSTCC)</conf-name>, <fpage>119</fpage>&#x2013;<lpage>124</lpage>. <pub-id pub-id-type="doi">10.1109/ICSTCC.2016.7790651</pub-id>
</citation>
</ref>
<ref id="B25">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Niu</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Ji</surname>
<given-names>X.</given-names>
</name>
<name>
<surname>Zhang</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Wen</surname>
<given-names>F.</given-names>
</name>
<name>
<surname>Ying</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Liu</surname>
<given-names>P.</given-names>
</name>
</person-group> (<year>2024</year>). <source>A skeleton-based topological planner for exploration in complex unknown environments</source>, <pub-id pub-id-type="doi">10.48550/arXiv.2412.13664</pub-id>
</citation>
</ref>
<ref id="B26">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Paredes</surname>
<given-names>D.</given-names>
</name>
<name>
<surname>Fleming-Mu&#xF1;oz</surname>
<given-names>D.</given-names>
</name>
</person-group> (<year>2021</year>). <article-title>Automation and robotics in mining: jobs, income and inequality implications</article-title>. <source>Extr. Industries Soc.</source> <volume>8</volume>, <fpage>189</fpage>&#x2013;<lpage>193</lpage>. <pub-id pub-id-type="doi">10.1016/j.exis.2021.01.004</pub-id>
</citation>
</ref>
<ref id="B27">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Portela</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Cramariuc</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Mittal</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Hutter</surname>
<given-names>M.</given-names>
</name>
</person-group> (<year>2024</year>). <source>Whole-body end-effector pose tracking</source>, <pub-id pub-id-type="doi">10.48550/arXiv.2409.16048</pub-id>
</citation>
</ref>
<ref id="B28">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Rajan</surname>
<given-names>R. T.</given-names>
</name>
<name>
<surname>Menicucci</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Noroozi</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Sachdeva</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Verhoeven</surname>
<given-names>C.</given-names>
</name>
</person-group> (<year>2024</year>). &#x201c;<article-title>Lunar zebro &#xe2;&#x20ac; an autonomous moon rover</article-title>,&#x201d; in <source>IAF space exploration symposium</source>. <pub-id pub-id-type="doi">10.52202/078357-0039</pub-id>
</citation>
</ref>
<ref id="B29">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Rusu</surname>
<given-names>R. B.</given-names>
</name>
<name>
<surname>Cousins</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2011</year>). &#x201c;<article-title>3D is here: point cloud library (PCL)</article-title>,&#x201d; in <conf-name>IEEE International Conference on Robotics and Automation (ICRA)</conf-name>, <conf-loc>Shanghai, China</conf-loc>. <pub-id pub-id-type="doi">10.1109/ICRA.2011.5980567</pub-id>
</citation>
</ref>
<ref id="B30">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Sharma</surname>
<given-names>U.</given-names>
</name>
<name>
<surname>Medasetti</surname>
<given-names>U. S.</given-names>
</name>
<name>
<surname>Deemyad</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Mashal</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Yadav</surname>
<given-names>V.</given-names>
</name>
</person-group> (<year>2024</year>). <article-title>Mobile robot for security applications in remotely operated advanced reactors</article-title>. <source>Appl. Sci.</source> <volume>14</volume>, <fpage>2552</fpage>. <pub-id pub-id-type="doi">10.3390/app14062552</pub-id>
</citation>
</ref>
<ref id="B31">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Solmaz</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Innerwinkler</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>W&#xe3;jcik</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Tong</surname>
<given-names>K.</given-names>
</name>
<name>
<surname>Politi</surname>
<given-names>E.</given-names>
</name>
<name>
<surname>Dimitrakopoulos</surname>
<given-names>G.</given-names>
</name>
<etal/>
</person-group> (<year>2024</year>). &#x201c;<article-title>Robust robotic search and rescue in harsh environments: an example and open challenges</article-title>,&#x201d; in <source>2024 IEEE international symposium on robotic and sensors environments (ROSE)</source>, <fpage>1</fpage>&#x2013;<lpage>8</lpage>. <pub-id pub-id-type="doi">10.1109/ROSE62198.2024.10591144</pub-id>
</citation>
</ref>
<ref id="B32">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Stachniss</surname>
<given-names>C.</given-names>
</name>
<name>
<surname>Leonard</surname>
<given-names>J. J.</given-names>
</name>
<name>
<surname>Thrun</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2016</year>). <source>Simultaneous localization and mapping</source>. <publisher-loc>Cham</publisher-loc>: <publisher-name>Springer International Publishing</publisher-name>, <fpage>1153</fpage>&#x2013;<lpage>1176</lpage>. <pub-id pub-id-type="doi">10.1007/978-3-319-32552-1_46</pub-id>
</citation>
</ref>
<ref id="B33">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Yin</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Zhao</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Xiao</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Gao</surname>
<given-names>F.</given-names>
</name>
</person-group> (<year>2023</year>). <article-title>Footholds optimization for legged robots walking on complex terrain</article-title>. <source>Front. Mech. Eng.</source> <volume>18</volume>, <fpage>26</fpage>. <pub-id pub-id-type="doi">10.1007/s11465-022-0742-y</pub-id>
</citation>
</ref>
<ref id="B34">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Zhang</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Cao</surname>
<given-names>Z.</given-names>
</name>
<name>
<surname>Huang</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Yang</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Xu</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Xu</surname>
<given-names>M.</given-names>
</name>
</person-group> (<year>2025a</year>). <article-title>Visible-infrared person re-identification with real-world label noise</article-title>. <source>IEEE Trans. Circuits Syst. Video Technol.</source> <volume>35</volume>, <fpage>4857</fpage>&#x2013;<lpage>4869</lpage>. <pub-id pub-id-type="doi">10.1109/TCSVT.2025.3526449</pub-id>
</citation>
</ref>
<ref id="B35">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Zhang</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Xu</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Yu</surname>
<given-names>Z.</given-names>
</name>
<name>
<surname>Shi</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Mu</surname>
<given-names>C.</given-names>
</name>
<name>
<surname>Xu</surname>
<given-names>M.</given-names>
</name>
</person-group> (<year>2022</year>). <article-title>Deep-irtarget: an automatic target detector in infrared imagery using dual-domain feature extraction and allocation</article-title>. <source>IEEE Trans. Multimedia</source> <volume>24</volume>, <fpage>1735</fpage>&#x2013;<lpage>1749</lpage>. <pub-id pub-id-type="doi">10.1109/TMM.2021.3070138</pub-id>
</citation>
</ref>
<ref id="B36">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Zhang</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Yang</surname>
<given-names>B.</given-names>
</name>
<name>
<surname>Xu</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Huang</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Xu</surname>
<given-names>X.</given-names>
</name>
<name>
<surname>Zhang</surname>
<given-names>Q.</given-names>
</name>
<etal/>
</person-group> (<year>2025b</year>). <article-title>A benchmark and frequency compression method for infrared few-shot object detection</article-title>. <source>IEEE Trans. Geoscience Remote Sens.</source> <volume>63</volume>, <fpage>1</fpage>&#x2013;<lpage>11</lpage>. <pub-id pub-id-type="doi">10.1109/TGRS.2025.3540945</pub-id>
</citation>
</ref>
<ref id="B37">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Zhang</surname>
<given-names>T. Y.</given-names>
</name>
<name>
<surname>Suen</surname>
<given-names>C. Y.</given-names>
</name>
</person-group> (<year>1984</year>). <source>A fast parallel algorithm for thinning digital patterns 27</source>
</citation>
</ref>
<ref id="B38">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Zimmermann</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Poranne</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Coros</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2021</year>). &#x201c;<article-title>Go fetch! - dynamic grasps using boston dynamics spot with external robotic arm</article-title>,&#x201d; in <conf-name>2021 IEEE International Conference on Robotics and Automation (ICRA)</conf-name>, <fpage>4488</fpage>&#x2013;<lpage>4494</lpage>. <pub-id pub-id-type="doi">10.1109/ICRA48506.2021.9561835</pub-id>
</citation>
</ref>
</ref-list>
</back>
</article>