<?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. Electron.</journal-id>
<journal-title>Frontiers in Electronics</journal-title>
<abbrev-journal-title abbrev-type="pubmed">Front. Electron.</abbrev-journal-title>
<issn pub-type="epub">2673-5857</issn>
<publisher>
<publisher-name>Frontiers Media S.A.</publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id pub-id-type="publisher-id">1507644</article-id>
<article-id pub-id-type="doi">10.3389/felec.2025.1507644</article-id>
<article-categories>
<subj-group subj-group-type="heading">
<subject>Electronics</subject>
<subj-group>
<subject>Original Research</subject>
</subj-group>
</subj-group>
</article-categories>
<title-group>
<article-title>Stable heteroclinic channels for controlling a simulated aquatic serpentine robot in narrow crevices</article-title>
<alt-title alt-title-type="left-running-head">Mengers 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/felec.2025.1507644">10.3389/felec.2025.1507644</ext-link>
</alt-title>
</title-group>
<contrib-group>
<contrib contrib-type="author" corresp="yes">
<name>
<surname>Mengers</surname>
<given-names>Nathaniel</given-names>
</name>
<xref ref-type="corresp" rid="c001">&#x2a;</xref>
<uri xlink:href="https://loop.frontiersin.org/people/2598941/overview"/>
<role content-type="https://credit.niso.org/contributor-roles/conceptualization/"/>
<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/investigation/"/>
<role content-type="https://credit.niso.org/contributor-roles/methodology/"/>
<role content-type="https://credit.niso.org/contributor-roles/visualization/"/>
<role content-type="https://credit.niso.org/contributor-roles/writing-original-draft/"/>
<role content-type="https://credit.niso.org/contributor-roles/Writing - review &#x26; editing/"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Rouse</surname>
<given-names>Natasha</given-names>
</name>
<uri xlink:href="https://loop.frontiersin.org/people/1338170/overview"/>
<role content-type="https://credit.niso.org/contributor-roles/Writing - review &#x26; editing/"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Daltorio</surname>
<given-names>Kathryn A.</given-names>
</name>
<uri xlink:href="https://loop.frontiersin.org/people/2282181/overview"/>
<role content-type="https://credit.niso.org/contributor-roles/funding-acquisition/"/>
<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/supervision/"/>
<role content-type="https://credit.niso.org/contributor-roles/Writing - review &#x26; editing/"/>
</contrib>
</contrib-group>
<aff>
<institution>Biologically Inspired Robotics Laboratory</institution>, <institution>Mechanical and Aerospace Engineering</institution>, <institution>Case Western Reserve University</institution>, <addr-line>Cleveland</addr-line>, <addr-line>OH</addr-line>, <country>United States</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/1782694/overview">Afaque Manzoor</ext-link>, Washington University in St. Louis, 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/2152438/overview">Giovanni Bianchi</ext-link>, Polytechnic University of Milan, Italy</p>
<p>
<ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/2363317/overview">Qiyuan Fu</ext-link>, Biorobotics Laboratory (BioRob), Switzerland</p>
<p>
<ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/1105694/overview">Jahan Zeb Gul</ext-link>, Air University, Pakistan</p>
</fn>
<corresp id="c001">&#x2a;Correspondence: Nathaniel Mengers, <email>nnm22@case.edu</email>
</corresp>
</author-notes>
<pub-date pub-type="epub">
<day>24</day>
<month>02</month>
<year>2025</year>
</pub-date>
<pub-date pub-type="collection">
<year>2025</year>
</pub-date>
<volume>6</volume>
<elocation-id>1507644</elocation-id>
<history>
<date date-type="received">
<day>08</day>
<month>10</month>
<year>2024</year>
</date>
<date date-type="accepted">
<day>31</day>
<month>01</month>
<year>2025</year>
</date>
</history>
<permissions>
<copyright-statement>Copyright &#xa9; 2025 Mengers, Rouse and Daltorio.</copyright-statement>
<copyright-year>2025</copyright-year>
<copyright-holder>Mengers, Rouse and Daltorio</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>Stable Heteroclinic Channels (SHCs) are dynamical systems composed of connected saddle equilibria. This work demonstrates a control system that combines SHCs with movement primitives to enable swimming in a simulated six segment snake robot. We identify control system parameters for lateral undulation, where all joints oscillate with the same amplitude, and anguilliform swimming, where joint amplitudes increase linearly from the head to the tail. Swimming speed is improved by learning SHC movement primitive parameters. We also propose a method for adapting the gait amplitude and frequency with tactile sensor input to accommodate obstacles. Then, we evaluate the relationship between SHC movement primitive parameters and the resulting trajectories. The swimming speed and efficiency of SHC controllers for each gait are compared against a conventional serpenoid controller, which derives joint trajectories from sinusoids. Controllers are evaluated first in an unobstructed environment, then in straight passages of various widths, and finally in 65 randomly generated uneven channels. We find that the amplitudes of joint oscillations scale proportionally with the SHC controller parameters. Due to gait optimization, as well as adaptive amplitude and frequency in response to tactile input, the learned SHC control system exhibits an average 28.8% greater speed than a serpenoid controller that only adapts amplitude during contact. This research demonstrates that SHCs benefit from intuitive tuning like serpenoid control, while also effectively incorporating sensory information to generate smooth kinematic trajectories.</p>
</abstract>
<kwd-group>
<kwd>stable heteroclinic channels</kwd>
<kwd>snake robot</kwd>
<kwd>autonomy</kwd>
<kwd>central pattern generator</kwd>
<kwd>motor primitive</kwd>
<kwd>nonlinear control</kwd>
</kwd-group>
<custom-meta-wrap>
<custom-meta>
<meta-name>section-at-acceptance</meta-name>
<meta-value>Flexible Electronics</meta-value>
</custom-meta>
</custom-meta-wrap>
</article-meta>
</front>
<body>
<sec id="s1">
<title>1 Introduction</title>
<p>Modeling neuroanatomical structures not only supports biological research, but advances robotics by inspiring frameworks for adaptive, flexible control. Motor primitives (MPs) describe fundamental units of actuation that are assembled to produce complex behavior (<xref ref-type="bibr" rid="B17">Giszter, 2015</xref>). MP models in robots offer modular (<xref ref-type="bibr" rid="B43">Paraschos et al., 2013</xref>), learnable (<xref ref-type="bibr" rid="B33">Kober and Peters, 2009</xref>) control with efficient sensor integration (<xref ref-type="bibr" rid="B7">Bonardi et al., 2012</xref>). Meanwhile, central pattern generators (CPGs) are neural circuits that produce rhythms without rhythmic input (<xref ref-type="bibr" rid="B26">Ijspeert, 2008</xref>) for locomotion and other functions (<xref ref-type="bibr" rid="B54">Sherrington, 1910</xref>; <xref ref-type="bibr" rid="B19">Grillner and Wall&#xe9;n, 2010</xref>; <xref ref-type="bibr" rid="B12">Cropper et al., 2004</xref>). Hierarchical MP and CPG combinations have been proposed for adaptable rhythms in biological (<xref ref-type="bibr" rid="B20">Guertin, 2013</xref>) and mechanical contexts (<xref ref-type="bibr" rid="B39">Moreno and Gomez, 2011</xref>). However, relationships between MP parameters and resulting behaviors are nonlinear, complicating modification and analysis (<xref ref-type="bibr" rid="B50">Rouse and Daltorio, 2021</xref>). We demonstrate that kinematic MPs incorporating Stable Heteroclinic Channels (SHCs), an emerging CPG model (<xref ref-type="bibr" rid="B13">Daltorio et al., 2013</xref>; <xref ref-type="bibr" rid="B8">Brecelj and Petri&#x10d;, 2023a</xref>), enable transparent, learnable, and sensor-adaptable control in a simulated swimming snake robot. In obstacle-free and confined environments, we compare speed and efficiency for SHC controllers with a serpenoid controller, which prescribes joint angles via sinusoids. We further show that incorporating tactile sensing improves speed in confined spaces.</p>
<p>MPs have been used to both model animal behavior (<xref ref-type="bibr" rid="B62">Tresch and Bizzi, 1999</xref>; <xref ref-type="bibr" rid="B16">Fod et al., 2002</xref>; <xref ref-type="bibr" rid="B57">Tagliabue et al., 2015</xref>) and plan robot motion (<xref ref-type="bibr" rid="B28">Ijspeert et al., 2013</xref>). MPs arise when modular clusters of neurons and muscle cells reliably produce specific kinematic trajectories or force outputs (<xref ref-type="bibr" rid="B17">Giszter, 2015</xref>). Dynamic Movement Primitives (DMPs) are a popular framework for constructing kinematic MPs in robots (<xref ref-type="bibr" rid="B43">Paraschos et al., 2013</xref>; <xref ref-type="bibr" rid="B22">Hoffmann et al., 2009</xref>; <xref ref-type="bibr" rid="B44">Pastor et al., 2009</xref>; <xref ref-type="bibr" rid="B52">Schaal, 2006</xref>; <xref ref-type="bibr" rid="B33">Kober and Peters, 2009</xref>). They rely on sequentially arranged, weighted Gaussian distributions (kernels), where weights are learned from demonstration to produce arbitrary trajectories (<xref ref-type="bibr" rid="B52">Schaal, 2006</xref>; <xref ref-type="bibr" rid="B44">Pastor et al., 2009</xref>; <xref ref-type="bibr" rid="B34">Kong et al., 2023</xref>). Sensory inputs adapt the planned trajectory, allowing robots to interact with their environment <xref ref-type="bibr" rid="B43">Paraschos et al. (2013)</xref>. Periodically activating kernels yields rhythmic behavior (<xref ref-type="bibr" rid="B28">Ijspeert et al., 2013</xref>). The mapping from learned parameters to the planned trajectory is nonlinear (<xref ref-type="bibr" rid="B50">Rouse and Daltorio, 2021</xref>). Thus, the controller behaves as a black box, making it difficult to discern how adjusting the weights may influence robot behavior.</p>
<p>Like MPs, CPGs are an important aspect of biological motor function, and have been modeled for robotic control. Biological CPGs can emerge from a pacemaker neuron that rhythmically self excites (<xref ref-type="bibr" rid="B21">Harris-Warrick, 2010</xref>; <xref ref-type="bibr" rid="B36">Marder and Eisen, 1984</xref>), or mutually inhibitory, modular neuron clusters (e.g., half-center oscillators) (<xref ref-type="bibr" rid="B26">Ijspeert, 2008</xref>; <xref ref-type="bibr" rid="B19">Grillner and Wall&#xe9;n, 2010</xref>). The peripheral nervous system can modulate rhythms by inhibiting or exciting CPG neurons (<xref ref-type="bibr" rid="B2">Andersson et al., 1978</xref>). In addition to modeling neural connections, biomimetic CPG simulate cellular processes using Hodgkin-Huxley (HH) (<xref ref-type="bibr" rid="B56">Simoni and DeWeerth, 2007</xref>) dynamics or approximations such as leaky integrators (<xref ref-type="bibr" rid="B65">Yu et al., 2014</xref>). More abstract models use limit cycles, or coupled oscillatory differential equations, to approximate neuron clusters without reproducing cellular dynamics (<xref ref-type="bibr" rid="B64">Wang Z. et al., 2017</xref>; <xref ref-type="bibr" rid="B28">Ijspeert et al., 2013</xref>). Couplings represent relationships between joints, as well as extensors and flexors for a single joint (<xref ref-type="bibr" rid="B59">Thandiackal et al., 2021</xref>). Biomimetic models offer insight into mechanisms for rhythmogenesis, while abstractions address neuron cluster interactions (<xref ref-type="bibr" rid="B26">Ijspeert, 2008</xref>). Modularity and sensor integration make both types of CPGs attractive tools for rhythmic control in robots (<xref ref-type="bibr" rid="B25">Hunt et al., 2017</xref>; <xref ref-type="bibr" rid="B27">Ijspeert et al., 2007</xref>).</p>
<p>Segmental robots based on snakes (<xref ref-type="bibr" rid="B63">Wang J. et al., 2017</xref>), salamanders (<xref ref-type="bibr" rid="B27">Ijspeert et al., 2007</xref>), and worms (<xref ref-type="bibr" rid="B47">Riddle et al., 2023</xref>) are useful for examining CPG controllers due to their modular construction and variety of motor patterns. Biomimetic CPGs have been demonstrated for controlling a biohybrid snake robot, where light responsive cells induce turning by stimulating neurons that control the anterior joint (<xref ref-type="bibr" rid="B11">Cheslet et al., 2024</xref>). Additionally, <xref ref-type="bibr" rid="B41">Norman-Tenazas (2021)</xref> algorithmically evaluates neuron configurations for CPGs with leaky-integrator dynamics, then applies the best performer to a snake robot with motor torque sensing for navigating peg arrays. More abstract models emphasizing CPG connectivity have been examined as well. For example, <xref ref-type="bibr" rid="B59">Thandiackal et al. (2021)</xref> applies Matsuoka oscillators to show that intrinsic joint oscillations, intersegmental coupling, and reflex chains sensitive to fluid forces can all drive undulation, though a combined approach is more robust. Meanwhile, <xref ref-type="bibr" rid="B39">Moreno and Gomez (2011)</xref> use motor primitives to adapt CPG amplitude and frequency. Combined with range sensors on the front and sides of the robot, the hierarchical structure enables the robot to avoid and climb over obstacles.</p>
<p>While abstract CPGs based on limit cycles have demonstrated effective control in segmented robots, some research suggests that CPGs constructed with stable heteroclinic channels (SHCs) are more responsive to sensory inputs (<xref ref-type="bibr" rid="B23">Horchler et al., 2015</xref>; <xref ref-type="bibr" rid="B46">Rabinovich et al., 2006</xref>; <xref ref-type="bibr" rid="B53">Shaw et al., 2015</xref>). SHCs consist of saddle equilibria connected cyclically such that the unstable manifold of one flows into the stable manifold of the next (<xref ref-type="bibr" rid="B23">Horchler et al., 2015</xref>). Perturbing the system away from equilibria with noise or sensor input causes state transitions, analogous to pushing a ball off of a hill <xref ref-type="bibr" rid="B23">Horchler et al. (2015)</xref>. Perturbation intensity and timing influence residence times near equilibria (<xref ref-type="bibr" rid="B23">Horchler et al., 2015</xref>; <xref ref-type="bibr" rid="B14">Rouse et al., 2024</xref>). <xref ref-type="bibr" rid="B4">Ashwin and Postlethwaite (2016)</xref>; <xref ref-type="bibr" rid="B3">Ashwin et al. (2011)</xref> describe heteroclinic cycle stability criteria with consideration to noise. Biological research on Aplysia shows that SHCs tuned for finite state machine-like transitions are responsive to sensor inputs and qualitatively reproduce <italic>in vivo</italic> feeding behaviors (<xref ref-type="bibr" rid="B53">Shaw et al., 2015</xref>). SHCs have also been applied in a simulated worm-like robot, with force sensors modulating transitions between expansion and contraction to improve locomotion through a pipe (<xref ref-type="bibr" rid="B13">Daltorio et al., 2013</xref>). Similarly, <xref ref-type="bibr" rid="B9">Brecelj and Petri&#x10d; (2023b)</xref> use SHCs in a humanoid robot, where saddles correspond to stances (e.g., standing, raised hands) and forces on the grasper drive transitions. Recently, <xref ref-type="bibr" rid="B50">Rouse and Daltorio (2021)</xref> demonstrated that MPs based on SHCs instead of Gaussian kernels exhibit transparent control. Specifically, weights visually resemble the trajectory in a kinematic model.</p>
<p>Our research demonstrates movement primitives based on SHCs for control of a simulated snake robot, then assesses methods for adapting gaits by scaling and learning weight parameters, as well as incorporating sensory input. We validate the hypothesis that joint trajectories, which collectively constitute the gait, vary proportionally with SHC weight parameters. We exploit this characteristic to construct an anguilliform (eel-like) swimming gait from the lateral undulation gait. The anguilliform gait is characterized by smaller oscillations in anterior joints. We demonstrate that weights are learnable, enabling gait optimization with respect to swimming speed and efficiency. Finally, we show that gaits are enhanced by modifying the rate of progression between saddle points with sensory information. To our knowledge, this is the first work demonstrating correspondence between SHC movement primitive weights and the resulting gait in a nonlinear dynamical system.</p>
<p>To validate our controller, we implement both serpenoid and SHC control in a planar snake robot simulation and demonstrate that the controllers achieve comparable performance (i.e., efficiency and swimming speed) in quiescent fluid. We show that the anguiliform gait emerges by independently scaling the weight amplitudes for each joint, then characterize the relationship between weights and joint amplitudes (<xref ref-type="fig" rid="F1">Figure 1</xref>). Separately, we apply gradient descent to optimize the SHC weights, improving the speed of the robot in an obstacle free environment. Then we integrate tactile sensing to increase the progression rate between saddle points during contact and assess the controller performance as the robot maneuvers through both straight and uneven passages. The efficiency and speed of the simulated robot with SHC control and compliant serpenoid control are compared. Our work serves as a basis for future controllers that adapt to fluid and obstacle interactions in a biologically plausible manner.</p>
<fig id="F1" position="float">
<label>FIGURE 1</label>
<caption>
<p>An SHC movement primitive controller, like a serpenoid controller, can realize a lateral undulation gait. With SHC movement primitives, joint amplitudes can be independently tuned by manually scaling weights, as shown by the anguilliform SHC controller. Alternatively, learning weights permits gait optimization to improve swimming speed (4 learned weights per joint; maximum weight for each joint is shown). In our SHC-based controllers, contact sensing produces a coupled change in the frequency and amplitude of the gait.</p>
</caption>
<graphic xlink:href="felec-06-1507644-g001.tif"/>
</fig>
</sec>
<sec sec-type="methods" id="s2">
<title>2 Methods</title>
<sec id="s2-1">
<title>2.1 Modes of locomotion</title>
<p>Biological snakes use various gaits for different environmental conditions. In uncluttered terrestrial environments, snakes perform lateral undulation, where a transverse wave propagates from the head to the tail (<xref ref-type="fig" rid="F2">Figure 2A</xref>). All points on the body trace the same path because ground forces prevent slipping in the transverse direction (<xref ref-type="bibr" rid="B18">Gray, 1946</xref>; <xref ref-type="bibr" rid="B29">Jayne, 2020</xref>). Aquatic lateral undulation, or anguilliform locomotion, is also characterized by a similar transverse wave, but the amplitude and wavelength increases from the head to the tail (<xref ref-type="fig" rid="F2">Figure 2B</xref>). Different points trace distinct paths because there are no ground contact forces to facilitate nonholonomic constraints (<xref ref-type="bibr" rid="B18">Gray, 1946</xref>; <xref ref-type="bibr" rid="B29">Jayne, 2020</xref>). Instead, resistive and reactive fluid forces provide thrust (<xref ref-type="bibr" rid="B45">Pi&#xf1;eirua et al., 2015</xref>). Additionally, the muscle activation timing differs from terrestrial lateral undulation (<xref ref-type="bibr" rid="B29">Jayne, 2020</xref>).</p>
<fig id="F2" position="float">
<label>FIGURE 2</label>
<caption>
<p>
<bold>(A)</bold> During terrestrial lateral undulation, all joints oscillate with the same amplitude such that the lateral displacement remains the same at the front of the body as at the rear <bold>(B)</bold> In anguilliform locomotion, the lateral displacement is minimal near the head and increases posteriorally.</p>
</caption>
<graphic xlink:href="felec-06-1507644-g002.tif"/>
</fig>
<p>In loose or slippery substrates such as sand, snakes in the Caenophidia clade switch to a sidewinding gait (<xref ref-type="bibr" rid="B40">Mosauer, 1932</xref>). Sidewinding is characterized by anchoring some sections of the body on the ground, thrusting the unanchored sections to one side, then repeating, alternating the unanchored and anchored sections to produce lateral locomotion. In tunnel concertina locomotion, a snake will anchor itself against both sides of a narrow passage, extend forward by straightening its joints starting from the head, then anchor itself again (<xref ref-type="bibr" rid="B18">Gray, 1946</xref>). A variation of concertina locomotion is also used for arboreal locomotion during climbing or along thin branches (<xref ref-type="bibr" rid="B5">Astley and Jayne, 2007</xref>). In spaces too narrow for concertina locomotion, snakes may use a rectilinear gait where portions of the body are lifted off the ground and moved forward, akin to walking (<xref ref-type="bibr" rid="B35">Lissmann, 1950</xref>).</p>
</sec>
<sec id="s2-2">
<title>2.2 Control</title>
<sec id="s2-2-1">
<title>2.2.1 Lateral undulation gait with serpenoid control</title>
<p>In early work parameterizing snake kinematics, <xref ref-type="bibr" rid="B55">Shigeo (1994)</xref> proposed the serpenoid curve, wherein sinusoids approximate the shape of an undulating snake. The desired relative joint angle <inline-formula id="inf1">
<mml:math id="m1">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2217;</mml:mo>
</mml:mrow>
</mml:msubsup>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> for joint <inline-formula id="inf2">
<mml:math id="m2">
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> at time <inline-formula id="inf3">
<mml:math id="m3">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> follows <xref ref-type="disp-formula" rid="e1">Equation 1</xref> with joint amplitude <inline-formula id="inf4">
<mml:math id="m4">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, frequency <inline-formula id="inf5">
<mml:math id="m5">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, and phase offset between joints <inline-formula id="inf6">
<mml:math id="m6">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>. Biasing the relative joint angles with the steering term <inline-formula id="inf7">
<mml:math id="m7">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> induces whole body turning.<disp-formula id="e1">
<mml:math id="m8">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2217;</mml:mo>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>i</mml:mi>
<mml:mi>n</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mi>t</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
<label>(1)</label>
</disp-formula>
</p>
<p>Hirose&#x2019;s model has become popular for snake robots due to its simplicity and versatility. The serpenoid curve has been used for both terrestrial and aquatic lateral undulation (<xref ref-type="bibr" rid="B55">Shigeo, 1994</xref>; <xref ref-type="bibr" rid="B42">Ostrowski and Burdick, 1996</xref>; <xref ref-type="bibr" rid="B51">Sato et al., 2002</xref>; <xref ref-type="bibr" rid="B31">Kelasidi et al., 2014</xref>). It has also been adapted for sidewinding (<xref ref-type="bibr" rid="B58">Tesch et al., 2009</xref>), concertina (<xref ref-type="bibr" rid="B10">Chen and Roth, 2023</xref>), and rectilinear (<xref ref-type="bibr" rid="B58">Tesch et al., 2009</xref>) gaits. Additionally, several authors have augmented the serpenoid curve to support obstacle aided locomotion (<xref ref-type="bibr" rid="B48">Rollinson and Choset, 2013</xref>; <xref ref-type="bibr" rid="B61">Travers et al., 2018</xref>; <xref ref-type="bibr" rid="B60">Travers et al., 2015</xref>) and mitigate slipping (<xref ref-type="bibr" rid="B15">Dehghani and Mahjoob, 2009</xref>). In our work, we use it as a basis for comparison with our SHC controllers. We select gait parameters <inline-formula id="inf8">
<mml:math id="m9">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi>&#x3c0;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
</inline-formula> rads, frequency <inline-formula id="inf9">
<mml:math id="m10">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mn>5</mml:mn>
<mml:mi>&#x3c0;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>9</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
</inline-formula> rads/s, and <inline-formula id="inf10">
<mml:math id="m11">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mi>&#x3c0;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>9</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
</inline-formula> rads, consistent with <xref ref-type="bibr" rid="B32">Kelasidi et al. (2017)</xref>.</p>
<p>To ensure locomotion along the <inline-formula id="inf11">
<mml:math id="m12">
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> axis, we adapt the steering control in <xref ref-type="bibr" rid="B32">Kelasidi et al. (2017)</xref>. The simulated robot heading <inline-formula id="inf12">
<mml:math id="m13">
<mml:mrow>
<mml:mi>&#x3c8;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> is computed as the average of all linkage angles with respect to the horizontal <inline-formula id="inf13">
<mml:math id="m14">
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> (See <xref ref-type="fig" rid="F3">Figure 3</xref>; <xref ref-type="disp-formula" rid="e2">Equation 2</xref>). We assign a desired heading <inline-formula id="inf14">
<mml:math id="m15">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">ref</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> using the steering constant <inline-formula id="inf15">
<mml:math id="m16">
<mml:mrow>
<mml:mi mathvariant="normal">&#x394;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>4</mml:mn>
<mml:mi>l</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> (where <inline-formula id="inf16">
<mml:math id="m17">
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mi>l</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> is the length of one robot segment) and the center of mass displacement from the <inline-formula id="inf17">
<mml:math id="m18">
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> axis, <inline-formula id="inf18">
<mml:math id="m19">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>Y</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>C</mml:mi>
<mml:mi>M</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> <xref ref-type="disp-formula" rid="e3">(Equation 3)</xref>. Then, the steering term <inline-formula id="inf19">
<mml:math id="m20">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is computed using proportional-integral (PI) control with integral gain <inline-formula id="inf20">
<mml:math id="m21">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>I</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mn>0.2</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3c0;</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
</inline-formula> and proportional gain <inline-formula id="inf21">
<mml:math id="m22">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.2</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> (<xref ref-type="disp-formula" rid="e4">Equation 4</xref>; <xref ref-type="table" rid="T1">Table 1</xref>).<disp-formula id="e2">
<mml:math id="m23">
<mml:mrow>
<mml:mi>&#x3c8;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:mstyle displaystyle="true">
<mml:munderover>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
</mml:munderover>
</mml:mstyle>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
<label>(2)</label>
</disp-formula>
<disp-formula id="e3">
<mml:math id="m24">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">ref</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>a</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi>n</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>Y</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>C</mml:mi>
<mml:mi>M</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">&#x394;</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
<label>(3)</label>
</disp-formula>
<disp-formula id="e4">
<mml:math id="m25">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>I</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x222b;</mml:mo>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">ref</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>&#x3c8;</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mi>d</mml:mi>
<mml:mi>t</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mfenced open="" close=")">
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">ref</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>&#x3c8;</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
<label>(4)</label>
</disp-formula>
</p>
<fig id="F3" position="float">
<label>FIGURE 3</label>
<caption>
<p>
<bold>(A)</bold> Kinematic diagram of <inline-formula id="inf22">
<mml:math id="m26">
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> segment serpentine robot. Variable naming from <xref ref-type="bibr" rid="B30">Kelasidi et al. (2018)</xref> <bold>(B)</bold> Simulated lateral undulation of a robot with <inline-formula id="inf23">
<mml:math id="m27">
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> segments in an obstacle free aquatic environment.</p>
</caption>
<graphic xlink:href="felec-06-1507644-g003.tif"/>
</fig>
<table-wrap id="T1" position="float">
<label>TABLE 1</label>
<caption>
<p>Serpenoid controller parameters.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th align="left">Variable</th>
<th align="left">Description</th>
<th align="left">Value</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">
<inline-formula id="inf24">
<mml:math id="m28">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>c</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Amplitude damping for sensorized controller <inline-formula id="inf25">
<mml:math id="m29">
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>r</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">1,050</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf26">
<mml:math id="m30">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Steering ultimate gain</td>
<td align="left">1</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf27">
<mml:math id="m31">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>I</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Steering integral gain</td>
<td align="left">
<inline-formula id="inf28">
<mml:math id="m32">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>/</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mn>0.2</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3c0;</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf29">
<mml:math id="m33">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Steering proportional gain</td>
<td align="left">
<inline-formula id="inf30">
<mml:math id="m34">
<mml:mrow>
<mml:mn>0.2</mml:mn>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.2</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf31">
<mml:math id="m35">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Steering integral period</td>
<td align="left">
<inline-formula id="inf32">
<mml:math id="m36">
<mml:mrow>
<mml:mn>0.5</mml:mn>
<mml:msub>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>&#x3c0;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf33">
<mml:math id="m37">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Steering ultimate period</td>
<td align="left">
<inline-formula id="inf34">
<mml:math id="m38">
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mi>&#x3c0;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf35">
<mml:math id="m39">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Angular offset between joints</td>
<td align="left">
<inline-formula id="inf36">
<mml:math id="m40">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mi>&#x3c0;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>9</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf37">
<mml:math id="m41">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Amplitude proportional gain for controller with tactile sensing</td>
<td align="left">1,500</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf38">
<mml:math id="m42">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Proportional gain for contact disturbances</td>
<td align="left">500</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf39">
<mml:math id="m43">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Equilibrium amplitude <inline-formula id="inf40">
<mml:math id="m44">
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi>r</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi>d</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">
<inline-formula id="inf41">
<mml:math id="m45">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>&#x3c0;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf42">
<mml:math id="m46">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Amplitude <italic>(rad)</italic>
</td>
<td align="left">
<inline-formula id="inf43">
<mml:math id="m47">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>&#x3c0;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf44">
<mml:math id="m48">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Frequency (<italic>rad/s</italic>)</td>
<td align="left">
<inline-formula id="inf45">
<mml:math id="m49">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mn>5</mml:mn>
<mml:mi>&#x3c0;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>9</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>The actuator torques <inline-formula id="inf46">
<mml:math id="m50">
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> for each joint <inline-formula id="inf47">
<mml:math id="m51">
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> are computed as in <xref ref-type="bibr" rid="B31">Kelasidi et al. (2014)</xref> with proportional gain <inline-formula id="inf48">
<mml:math id="m52">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>50</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>, damping <inline-formula id="inf49">
<mml:math id="m53">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.5</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>, and relative joint angles <inline-formula id="inf50">
<mml:math id="m54">
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> <xref ref-type="disp-formula" rid="e5">(Equation 5)</xref>.<disp-formula id="e5">
<mml:math id="m55">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2217;</mml:mo>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2217;</mml:mo>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
<label>(5)</label>
</disp-formula>
</p>
</sec>
<sec id="s2-2-2">
<title>2.2.2 Tactile sensing with serpenoid control</title>
<p>Trajectory planning is enhanced by considering the interactions between the robot and environmental obstacles. <xref ref-type="bibr" rid="B60">Travers et al. (2015)</xref> define shape compliant control, where serpenoid curve parameters vary due to obstacle contact. Specifically, their robot senses externally applied torques on each joint and adjusts the reference joint amplitudes using an admittance controller, enabling the robot to brace against obstacles <xref ref-type="disp-formula" rid="e6">(Equation 6)</xref>.<disp-formula id="e6">
<mml:math id="m56">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>M</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>a</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msubsup>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo>&#x308;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mo>&#x308;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">ref</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x2b;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi>D</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>a</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msubsup>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">ref</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x2b;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>a</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msubsup>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">ref</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">ext</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:math>
<label>(6)</label>
</disp-formula>In <xref ref-type="bibr" rid="B60">Travers et al. (2015)</xref>, the admittance controller gains <inline-formula id="inf51">
<mml:math id="m57">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>M</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>a</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula id="inf52">
<mml:math id="m58">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>D</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>a</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:math>
</inline-formula>, and <inline-formula id="inf53">
<mml:math id="m59">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>a</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2032;</mml:mo>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:math>
</inline-formula> are functions of the robot configuration, and the reference amplitude <inline-formula id="inf54">
<mml:math id="m60">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">ref</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is held constant for a given joint. Their compliant control produces coordinated locomotion through an environment with regularly spaced pegs. Other methods of shape control have been explored for pipe climbing (<xref ref-type="bibr" rid="B48">Rollinson and Choset, 2013</xref>) and navigating rugged terrain (<xref ref-type="bibr" rid="B61">Travers et al., 2018</xref>).</p>
<p>We adopt a simplified shape controller based on <xref ref-type="bibr" rid="B60">Travers et al. (2015)</xref>, where the robot narrows its gait by decreasing joint amplitudes during contact. Once contact ceases, the joint amplitudes return to the reference value <inline-formula id="inf55">
<mml:math id="m61">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">ref</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi>&#x3c0;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
</inline-formula> (see <xref ref-type="disp-formula" rid="e7">Equation 7</xref>). This method reduces contact with the walls in confined spaces. We choose amplitude gain <inline-formula id="inf56">
<mml:math id="m62">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1500</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>, amplitude damping <inline-formula id="inf57">
<mml:math id="m63">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>c</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1050</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>, and tactile input gain <inline-formula id="inf58">
<mml:math id="m64">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>500</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>. Tactile input <inline-formula id="inf59">
<mml:math id="m65">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>z</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> if any linkages contact an obstacle and <inline-formula id="inf60">
<mml:math id="m66">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>z</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> otherwise. Joints are uniformly impacted by tactile inputs from all segments.<disp-formula id="e7">
<mml:math id="m67">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mo>&#x308;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>c</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">ref</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x3d;</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>z</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
<label>(7)</label>
</disp-formula>
</p>
</sec>
<sec id="s2-2-3">
<title>2.2.3 Lateral undulation gait with SHC control</title>
<sec id="s2-2-3-1">
<title>2.2.3.1 SHC dynamics</title>
<p>To validate SHC-based MPs as a viable control method snake robots, we first emulate the lateral undulation gait employed by the serpenoid controller. SHCs encode rhythmic behavior as cyclic progression between saddle points or kernels. The kernel activity <inline-formula id="inf61">
<mml:math id="m68">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mi>K</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, which denotes proximity to each of the <inline-formula id="inf62">
<mml:math id="m69">
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> saddle points, is given by <xref ref-type="disp-formula" rid="e8">Equation 8</xref> (<xref ref-type="bibr" rid="B50">Rouse and Daltorio, 2021</xref>; <xref ref-type="bibr" rid="B13">Daltorio et al., 2013</xref>). The <inline-formula id="inf63">
<mml:math id="m70">
<mml:mrow>
<mml:mo>&#x2299;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> operator indicates element-wise multiplication. The kernel activity dictates the phase of the rhythmic trajectory. Oscillation of all joints is established by generating two cycles in antiphase, one for counterclockwise and one for clockwise motion. Counterclockwise and clockwise motor commands are analogous to contraction of muscles on the left and right side of a biological snake. Maintaining distinct cycles for each direction allows phase differences between joints to be easily defined and emphasizes how couplings between joints can drive undulation. Connections between counterclockwise and clockwise components should be included in future research, similar to other works (<xref ref-type="bibr" rid="B41">Norman-Tenazas, 2021</xref>; <xref ref-type="bibr" rid="B64">Wang Z. et al., 2017</xref>).</p>
<p>With a phase offset of <inline-formula id="inf64">
<mml:math id="m71">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mi>&#x3c0;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>9</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
</inline-formula> radians between joints and separate kernels for each direction, it is convenient to choose <inline-formula id="inf65">
<mml:math id="m72">
<mml:mrow>
<mml:mi>K</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>18</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> kernels.<disp-formula id="e8">
<mml:math id="m73">
<mml:mrow>
<mml:mi>&#x3c4;</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>x</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>x</mml:mi>
<mml:mo>&#x2299;</mml:mo>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>x</mml:mi>
<mml:mi>&#x3c1;</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mi>d</mml:mi>
<mml:mi>t</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>&#x3b7;</mml:mi>
<mml:mi>d</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>W</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
<label>(8)</label>
</disp-formula>
</p>
<p>Considering only the subformula <inline-formula id="inf66">
<mml:math id="m74">
<mml:mrow>
<mml:mi>&#x3c4;</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>x</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi>x</mml:mi>
<mml:mo>&#x2299;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfenced>
<mml:mi>d</mml:mi>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, the activity of the <inline-formula id="inf67">
<mml:math id="m75">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula> kernel grows exponentially according to its growth rate, <inline-formula id="inf68">
<mml:math id="m76">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> and the time scaling factor <inline-formula id="inf69">
<mml:math id="m77">
<mml:mrow>
<mml:mi>&#x3c4;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>. Then, we design an inhibition matrix <inline-formula id="inf70">
<mml:math id="m78">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>K</mml:mi>
<mml:mo>&#xd7;</mml:mo>
<mml:mi>K</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> such that each kernel inhibits itself and all other kernels in the same cycle except the next one in the sequence. The inhibition causes kernels to momentarily activate <inline-formula id="inf71">
<mml:math id="m79">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3e;</mml:mo>
<mml:mn>0.9</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> in a winnerless competition (<xref ref-type="bibr" rid="B23">Horchler et al., 2015</xref>). To ensure stability, the kernel activity is bounded such that <inline-formula id="inf72">
<mml:math id="m80">
<mml:mrow>
<mml:mn>0.0005</mml:mn>
<mml:mo>&#x2264;</mml:mo>
<mml:mi>x</mml:mi>
<mml:mo>&#x2264;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>, as in <xref ref-type="bibr" rid="B49">Rouse and Daltorio (2024)</xref>. Since the proposed SHC controller includes one cycle corresponding to counterclockwise and another for clockwise motion of each joint, we compose the relationship between kernels using a block diagonal connection submatrix <inline-formula id="inf73">
<mml:math id="m81">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
<mml:mo>&#xd7;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:math>
</inline-formula> as in <xref ref-type="disp-formula" rid="e9">Equations 9</xref>, <xref ref-type="disp-formula" rid="e10">10</xref>.</p>
<p>We refer to <xref ref-type="bibr" rid="B49">Rouse and Daltorio (2024)</xref> as a guideline for tuning the SHC MP controller. The study outlines how inhibition parameters impact kernel activation and trajectories as the controller traces a square. The growth rate <inline-formula id="inf74">
<mml:math id="m82">
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> influences how quickly the kernels are excited, thereby influencing the frequency of the CPG. The growth magnitude <inline-formula id="inf75">
<mml:math id="m83">
<mml:mrow>
<mml:mi>&#x3b2;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> controls the peak amplitude of kernels. When <inline-formula id="inf76">
<mml:math id="m84">
<mml:mrow>
<mml:mi>&#x3b2;</mml:mi>
<mml:mo>&#x3c;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>, the kernel and trajectory amplitude are reduced. For <inline-formula id="inf77">
<mml:math id="m85">
<mml:mrow>
<mml:mi>&#x3b2;</mml:mi>
<mml:mo>&#x3e;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>, kernels maintain their maximum activity <inline-formula id="inf78">
<mml:math id="m86">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> for an extended period, then decay slowly. The resulting trajectory has increased amplitude, slower transitions away from each vertex, and a phase shift. The insensitivity to noise <inline-formula id="inf79">
<mml:math id="m87">
<mml:mrow>
<mml:mi>&#x3bd;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> determines how likely perturbations are to induce state transitions. Varying <inline-formula id="inf80">
<mml:math id="m88">
<mml:mrow>
<mml:mi>&#x3bd;</mml:mi>
<mml:mo>&#x3c;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> has little impact on the kernel activation or trajectories. Increasing <inline-formula id="inf81">
<mml:math id="m89">
<mml:mrow>
<mml:mi>&#x3bd;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> above 1 allows more precision near waypoints, but distorts transitions between waypoints and reduces the frequency of the cycle. We select the growth rate for all joints <inline-formula id="inf82">
<mml:math id="m90">
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>23.2</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> such that the overall frequency of the CPG is the same as the frequency of the serpenoid controller <inline-formula id="inf83">
<mml:math id="m91">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>. To avoid distorting the shape or frequency of the lateral undulation gait, we set <inline-formula id="inf84">
<mml:math id="m92">
<mml:mrow>
<mml:mi>&#x3b2;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula id="inf85">
<mml:math id="m93">
<mml:mrow>
<mml:mi>&#x3bd;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>.<disp-formula id="e9">
<mml:math id="m94">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="{" close="">
<mml:mrow>
<mml:mtable class="cases">
<mml:mtr>
<mml:mtd columnalign="left">
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>/</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mspace width="1em"/>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mi>i</mml:mi>
<mml:mi>f</mml:mi>
<mml:mspace width="0.22em"/>
<mml:mi>i</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>j</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="left">
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>/</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3bd;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfrac>
<mml:mspace width="1em"/>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mi>i</mml:mi>
<mml:mi>f</mml:mi>
<mml:mspace width="0.22em"/>
<mml:mi>i</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x2295;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="left">
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfrac>
<mml:mspace width="1em"/>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mi>o</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>h</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>w</mml:mi>
<mml:mi>i</mml:mi>
<mml:mi>s</mml:mi>
<mml:mi>e</mml:mi>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
<label>(9)</label>
</disp-formula>
<disp-formula id="e10">
<mml:math id="m95">
<mml:mrow>
<mml:mi>&#x3c1;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:msup>
<mml:mrow>
<mml:mi>&#x3c1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:msup>
<mml:mrow>
<mml:mi>&#x3c1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
<label>(10)</label>
</disp-formula>
</p>
<p>In addition to the excitatory and inhibitory components, the heteroclinic dynamics are augmented with Brownian noise via a time invariant Wiener process, <inline-formula id="inf86">
<mml:math id="m96">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>W</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> (<xref ref-type="disp-formula" rid="e8">Equation 8</xref>) (<xref ref-type="bibr" rid="B13">Daltorio et al., 2013</xref>; <xref ref-type="bibr" rid="B4">Ashwin and Postlethwaite, 2016</xref>; <xref ref-type="bibr" rid="B53">Shaw et al., 2015</xref>). Using Euler-Maruyama integration, the noise term is represented as <inline-formula id="inf87">
<mml:math id="m97">
<mml:mrow>
<mml:mi>&#x3b7;</mml:mi>
<mml:mi>d</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>W</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>&#x3b7;</mml:mi>
<mml:msqrt>
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:msqrt>
<mml:mi mathvariant="script">N</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mn>0,1</mml:mn>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
</inline-formula>, where <inline-formula id="inf88">
<mml:math id="m98">
<mml:mrow>
<mml:mi>&#x3b7;</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:mo>&#x2212;</mml:mo>
<mml:mn>10</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula> is a scaling parameter, <inline-formula id="inf89">
<mml:math id="m99">
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mi>t</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.001</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> is the simulation time step, and <inline-formula id="inf90">
<mml:math id="m100">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mi>K</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mn>0,1</mml:mn>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
</inline-formula> is a vector of normally distributed noise with mean of 0 and standard deviation of 1. The chosen scaling parameter is within ranges used in prior works (<xref ref-type="bibr" rid="B23">Horchler et al., 2015</xref>; <xref ref-type="bibr" rid="B49">Rouse and Daltorio, 2024</xref>; <xref ref-type="bibr" rid="B13">Daltorio et al., 2013</xref>) and is large enough to ensure sustained, regular transitions without causing the kernel activity to appear noisy. Though stability analysis for our controller with respect to noise (see <xref ref-type="bibr" rid="B3">Ashwin et al., 2011</xref>) would be valuable, this is left to future work. Parameter values are listed in <xref ref-type="table" rid="T2">Table 2</xref>.</p>
<table-wrap id="T2" position="float">
<label>TABLE 2</label>
<caption>
<p>SHC controller parameters.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th align="left">Variable</th>
<th align="left">Description</th>
<th align="left">Value</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">
<inline-formula id="inf91">
<mml:math id="m101">
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Number of kernels</td>
<td align="left">18</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf92">
<mml:math id="m102">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Steering ultimate gain</td>
<td align="left">2</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf93">
<mml:math id="m103">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Steering proportional gain</td>
<td align="left">
<inline-formula id="inf94">
<mml:math id="m104">
<mml:mrow>
<mml:mn>0.2</mml:mn>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.4</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf95">
<mml:math id="m105">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Tactile sensing gain</td>
<td align="left">0.55</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf96">
<mml:math id="m106">
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Steering gain matrix</td>
<td align="left">
<inline-formula id="inf97">
<mml:math id="m107">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>/</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:msub>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mi>K</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf98">
<mml:math id="m108">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Steering derivative period</td>
<td align="left">
<inline-formula id="inf99">
<mml:math id="m109">
<mml:mrow>
<mml:mn>0.333</mml:mn>
<mml:msub>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.333</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf100">
<mml:math id="m110">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Steering integral period</td>
<td align="left">
<inline-formula id="inf101">
<mml:math id="m111">
<mml:mrow>
<mml:mn>0.5</mml:mn>
<mml:msub>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.5</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf102">
<mml:math id="m112">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Steering ultimate period</td>
<td align="left">1</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf103">
<mml:math id="m113">
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Kernel Activation</td>
<td align="left">
<inline-formula id="inf104">
<mml:math id="m114">
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mn>0.0004</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf105">
<mml:math id="m115">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Initial conditions of kernels</td>
<td align="left">
<inline-formula id="inf106">
<mml:math id="m116">
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mn>0.0093</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>0.9756</mml:mn>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:mn>0.0093</mml:mn>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>5</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:mn>0.45</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>0.5</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>0,0</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf107">
<mml:math id="m117">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>z</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Tactile sensing signal</td>
<td align="left">1 if contact, 0 otherwise</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf108">
<mml:math id="m118">
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Growth rate</td>
<td align="left">23.2</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf109">
<mml:math id="m119">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Damping coefficient</td>
<td align="left">4</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf110">
<mml:math id="m120">
<mml:mrow>
<mml:mi>&#x3b2;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Magnitude</td>
<td align="left">1</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf111">
<mml:math id="m121">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Proportional gain coefficient</td>
<td align="left">1</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf112">
<mml:math id="m122">
<mml:mrow>
<mml:mi>&#x3b7;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Noise magnitude</td>
<td align="left">
<inline-formula id="inf113">
<mml:math id="m123">
<mml:mrow>
<mml:mn>1</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:mo>&#x2212;</mml:mo>
<mml:mn>9</mml:mn>
</mml:mrow>
</mml:msup>
<mml:mo>&#x22c5;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>K</mml:mi>
<mml:mo>&#xd7;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">sensors</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf114">
<mml:math id="m124">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3bb;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>4</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Weight parameter</td>
<td align="left">
<inline-formula id="inf115">
<mml:math id="m125">
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mn>3,7,3,7</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> (Lateral undulation SHC only)</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf116">
<mml:math id="m126">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">goal</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Joint trajectory goal</td>
<td align="left">0</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf117">
<mml:math id="m127">
<mml:mrow>
<mml:mi>&#x3bd;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Insensitivity to noise</td>
<td align="left">1</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf118">
<mml:math id="m128">
<mml:mrow>
<mml:mi>&#x3c4;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Temporal scaling factor</td>
<td align="left">1</td>
</tr>
</tbody>
</table>
</table-wrap>
</sec>
<sec id="s2-2-3-2">
<title>2.2.3.2 Movement primitives with SHCs</title>
<p>To integrate SHCs with the MP framework, we define the desired joint accelerations <inline-formula id="inf119">
<mml:math id="m129">
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2a;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo>&#x308;</mml:mo>
</mml:mover>
</mml:mrow>
</mml:math>
</inline-formula> as a function of kernel activity and current joint configuration <xref ref-type="disp-formula" rid="e11">(Equation 11)</xref>. From the accelerations, desired joint velocities and angles are derived via explicit Euler integration.<disp-formula id="e11">
<mml:math id="m130">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mo>&#x308;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2a;</mml:mo>
</mml:mrow>
</mml:msup>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">goal</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2a;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x2212;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2a;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>f</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
<label>(11)</label>
</disp-formula>
</p>
<p>The first term constitutes a PD controller with gain parameters <inline-formula id="inf120">
<mml:math id="m131">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>4</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula id="inf121">
<mml:math id="m132">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> [consistent with <xref ref-type="bibr" rid="B50">Rouse and Daltorio (2021)</xref>, <xref ref-type="bibr" rid="B49">Rouse and Daltorio (2024)</xref>] to ensure reference tracking. We choose an equilibrium joint angle <inline-formula id="inf122">
<mml:math id="m133">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">goal</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> such that the robot progresses in a straight line. The mapping function <inline-formula id="inf123">
<mml:math id="m134">
<mml:mrow>
<mml:mi>f</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> in <xref ref-type="disp-formula" rid="e11">Equation 11</xref> dictates the shape of the trajectory. We adapt the mapping function defined in <xref ref-type="bibr" rid="B50">Rouse and Daltorio (2021)</xref> <xref ref-type="disp-formula" rid="e12">(Equation 12)</xref>.<disp-formula id="e12">
<mml:math id="m135">
<mml:mrow>
<mml:mi>f</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi>x</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>P</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>z</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">ref</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>z</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:msub>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
<label>(12)</label>
</disp-formula>
</p>
<p>The weight matrix <inline-formula id="inf124">
<mml:math id="m136">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mi>K</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> defines the sensitivity of the joints to the activity of each kernel. We also incorporate Proportional Integral Derivative (PID) steering control with gain matrix <inline-formula id="inf125">
<mml:math id="m137">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>K</mml:mi>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>K</mml:mi>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mn>0.8</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>0.4</mml:mn>
<mml:mo>,</mml:mo>
<mml:mn>0.133</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>, reference signal <inline-formula id="inf126">
<mml:math id="m138">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>z</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">ref</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">ref</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3c8;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">ref</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3c8;</mml:mi>
</mml:mrow>
<mml:mo>&#x308;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">ref</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
</inline-formula>, and heading parameters <inline-formula id="inf127">
<mml:math id="m139">
<mml:mrow>
<mml:mi>z</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mi>&#x3c8;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3c8;</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>&#x3c8;</mml:mi>
</mml:mrow>
<mml:mo>&#x308;</mml:mo>
</mml:mover>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
</inline-formula>. The steering gains are tuned with a Ziegler-Nichols closed loop method adjusted for no overshoot (<xref ref-type="bibr" rid="B38">McCormack and Godfrey, 1998</xref>). The forcing term is normalized by the total kernel activity.</p>
<p>The weight submatrix <inline-formula id="inf128">
<mml:math id="m140">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is chosen according to <xref ref-type="disp-formula" rid="e13">Equation 13</xref> and the overall weights are assigned as in <xref ref-type="disp-formula" rid="e14">Equation 14</xref>. The operators <inline-formula id="inf129">
<mml:math id="m141">
<mml:mrow>
<mml:mo>&#x2295;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula id="inf130">
<mml:math id="m142">
<mml:mrow>
<mml:mo>&#x2296;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> indicate circulant addition and subtraction, respectively. We assign <inline-formula id="inf131">
<mml:math id="m143">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3bb;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3bb;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula id="inf132">
<mml:math id="m144">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3bb;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3bb;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>4</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>7</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>. The weight matrix encodes the positive (counterclockwise) and negative (clockwise) trends in joint angles as the corresponding kernels become active or inactive.<disp-formula id="e13">
<mml:math id="m145">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="{" close="">
<mml:mrow>
<mml:mtable class="cases">
<mml:mtr>
<mml:mtd columnalign="left">
<mml:msub>
<mml:mrow>
<mml:mi>&#x3bb;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mspace width="1em"/>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mi>i</mml:mi>
<mml:mi>f</mml:mi>
<mml:mspace width="0.22em"/>
<mml:mi>i</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x2295;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mspace width="0.22em"/>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="left">
<mml:msub>
<mml:mrow>
<mml:mi>&#x3bb;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mspace width="1em"/>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mi>i</mml:mi>
<mml:mi>f</mml:mi>
<mml:mspace width="0.22em"/>
<mml:mi>i</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x2296;</mml:mo>
<mml:mn>2</mml:mn>
<mml:mspace width="0.22em"/>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="left">
<mml:msub>
<mml:mrow>
<mml:mi>&#x3bb;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mspace width="1em"/>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mi>i</mml:mi>
<mml:mi>f</mml:mi>
<mml:mspace width="0.22em"/>
<mml:mi>i</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mspace width="0.22em"/>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="left">
<mml:msub>
<mml:mrow>
<mml:mi>&#x3bb;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>4</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mspace width="1em"/>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mi>i</mml:mi>
<mml:mi>f</mml:mi>
<mml:mspace width="0.22em"/>
<mml:mi>i</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x2296;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="left">
<mml:mn>0</mml:mn>
<mml:mspace width="1em"/>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mi>o</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>h</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>w</mml:mi>
<mml:mi>i</mml:mi>
<mml:mi>s</mml:mi>
<mml:mi>e</mml:mi>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
<label>(13)</label>
</disp-formula>
<disp-formula id="e14">
<mml:math id="m146">
<mml:mrow>
<mml:mi>w</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
<label>(14)</label>
</disp-formula>
</p>
<p>Once the desired joint accelerations, velocities, and positions are computed for a given time step, we evaluate the joint torques using the same methods as in <xref ref-type="disp-formula" rid="e5">Equation 5</xref> in <xref ref-type="sec" rid="s2-2-1">Section 2.2.1</xref>.</p>
</sec>
</sec>
<sec id="s2-2-4">
<title>2.2.4 Anguilliform gait with SHC control</title>
<p>Replicating the anguilliform gait with SHC control provides an opportunity to assess the scalability of SHC movement primitive trajectories. In <xref ref-type="bibr" rid="B50">Rouse and Daltorio (2021)</xref>, the authors demonstrate that weight parameters for SHC movement primitives visually represent and are proportional to the desired trajectory for a simple kinematic model. Inspired by their work, we examine how gaits can be adapted by scaling the weights. Specifically, we assess weight scaling as a means of switching from the terrestrial lateral undulation gait to anguilliform locomotion. <xref ref-type="bibr" rid="B31">Kelasidi et al. (2014)</xref> approximate anguilliform locomotion by linearly scaling the joint amplitudes in their serpenoid controller as in <xref ref-type="disp-formula" rid="e15">Equations 15</xref>, <xref ref-type="disp-formula" rid="e16">16</xref>.<disp-formula id="e15">
<mml:math id="m147">
<mml:mrow>
<mml:mi>g</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>n</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
<label>(15)</label>
</disp-formula>
<disp-formula id="e16">
<mml:math id="m148">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2217;</mml:mo>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mi>g</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>n</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mi>s</mml:mi>
<mml:mi>i</mml:mi>
<mml:mi>n</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mi>t</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
<label>(16)</label>
</disp-formula>to implement an anguilliform gait with SHC control, we apply the scaling relationship in <xref ref-type="disp-formula" rid="e15">Equation 15</xref> to the weight matrix (<xref ref-type="disp-formula" rid="e17">Equation 17</xref>). We expect that scaling the weights will proportionally change the amplitude of the trajectories for each joint.<disp-formula id="e17">
<mml:math id="m149">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>a</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mi>g</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>n</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
<label>(17)</label>
</disp-formula>
</p>
</sec>
<sec id="s2-2-5">
<title>2.2.5 SHC control with tactile sensing</title>
<p>CPGs, both in biological systems and robots, are most useful when they can be adapted by sensory information. Here, we establish a mechanism for incorporating tactile signals into SHC movement primitives, with the goal of improving speed of the simulated snake robot as it undulates through confined spaces. We introduce the term <inline-formula id="inf133">
<mml:math id="m150">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>z</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> into the SHC canonical state equation, where <inline-formula id="inf134">
<mml:math id="m151">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.55</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> (<xref ref-type="disp-formula" rid="e18">Equation18</xref>). We assign <inline-formula id="inf135">
<mml:math id="m152">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>z</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> if any linkage contacts an obstacle and <inline-formula id="inf136">
<mml:math id="m153">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>z</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> otherwise, as in <xref ref-type="sec" rid="s2-2-2">Section 2.2.2</xref>. During contact, kernels progress more quickly such that joints have less time to accelerate and joint amplitudes decline. The increased kernel progression rate also increases joint oscillation frequency, leading to higher thrust (<xref ref-type="bibr" rid="B24">Huang et al., 2019</xref>) that may enable the robot to overcome friction if contact persists. Since all tactile sensors affect every kernel, phase differences between joints remain constant and coordinated locomotion is maintained. In future work, we may consider alternative SHC formulations that allow tactile sensors to impact joints independently.<disp-formula id="e18">
<mml:math id="m154">
<mml:mrow>
<mml:mi>&#x3c4;</mml:mi>
<mml:mi>d</mml:mi>
<mml:mi>x</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>x</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>z</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>x</mml:mi>
<mml:mi>&#x3c1;</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mi>d</mml:mi>
<mml:mi>t</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi>&#x3b7;</mml:mi>
<mml:msqrt>
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:msqrt>
<mml:mi mathvariant="script">N</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mn>0,1</mml:mn>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
<label>(18)</label>
</disp-formula>
</p>
</sec>
<sec id="s2-2-6">
<title>2.2.6 Learned gait with SHC control</title>
<p>Robots, like animals, benefit from optimizing the speed and energy efficiency of locomotion. In (<xref ref-type="bibr" rid="B50">Rouse and Daltorio, 2021</xref>), the authors demonstrate that weights in SHC movement primitives can be learned to replicate a known trajectory for a purely kinematic system. Here, we extend their work, improving the robot&#x2019;s performance by adjusting weights with consideration to the system dynamics. Beginning with the SHC controller for lateral undulation (see <xref ref-type="sec" rid="s2-2-5">Section 2.2.5</xref>), we simulate swimming for <inline-formula id="inf137">
<mml:math id="m155">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">max</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>10</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> seconds in an obstacle-free environment. The forward velocity of the center of mass <xref ref-type="disp-formula" rid="e19">(Equation 19)</xref> and energy efficiency of locomotion are assessed. We define efficiency as the overall cost of transport (COT) <xref ref-type="disp-formula" rid="e20">(Equation 20)</xref>, where <inline-formula id="inf138">
<mml:math id="m156">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">start</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula id="inf139">
<mml:math id="m157">
<mml:mrow>
<mml:mi>G</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>9.81</mml:mn>
<mml:mfrac>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
</inline-formula> is the acceleration due to gravity and <inline-formula id="inf140">
<mml:math id="m158">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">total</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> is the total mass of the robot.<disp-formula id="e19">
<mml:math id="m159">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">avg</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">max</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfrac>
<mml:mstyle displaystyle="true">
<mml:munderover>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">start</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">max</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:munderover>
</mml:mstyle>
<mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<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:mrow>
<mml:mi>C</mml:mi>
<mml:mi>M</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mi>d</mml:mi>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
<label>(19)</label>
</disp-formula>
<disp-formula id="e20">
<mml:math id="m160">
<mml:mrow>
<mml:mi>C</mml:mi>
<mml:mi>O</mml:mi>
<mml:mi>T</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">start</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">max</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msubsup>
<mml:msubsup>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">joints</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msubsup>
<mml:mfenced open="|" close="|">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mi>G</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">total</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>X</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>C</mml:mi>
<mml:mi>M</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">max</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
<label>(20)</label>
</disp-formula>
</p>
<p>We establish a cost function <xref ref-type="disp-formula" rid="e21">(Equation 21)</xref> rewarding velocity, while penalizing poor efficiency. Note that the velocity is larger than the COT for lateral undulation such that this cost function prioritizes speed.<disp-formula id="e21">
<mml:math id="m161">
<mml:mrow>
<mml:mi>c</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>s</mml:mi>
<mml:mi>t</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>5000</mml:mn>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mi>C</mml:mi>
<mml:mi>O</mml:mi>
<mml:mi>T</mml:mi>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>5000</mml:mn>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">avg</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
<label>(21)</label>
</disp-formula>we numerically approximate the gradient of the cost function with respect to <inline-formula id="inf141">
<mml:math id="m162">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3bb;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>4</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> for each joint <inline-formula id="inf142">
<mml:math id="m163">
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>. The weights are improved via gradient descent with a learning rate <inline-formula id="inf143">
<mml:math id="m164">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b7;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">learn</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.01</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> until the rate of change of weights <inline-formula id="inf144">
<mml:math id="m165">
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3bb;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>4</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2264;</mml:mo>
<mml:mn>0.01</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>, requiring 155 iterations <xref ref-type="disp-formula" rid="e22">(Equation 22)</xref>. The selected learning rate allows smooth improvement in performance, and changes become relatively small by the time the stop condition is reached (see <xref ref-type="sec" rid="s11">Supplementary Figure</xref>). While our experiments in <xref ref-type="sec" rid="s2-3-2">Sections 2.3.2</xref>, <xref ref-type="sec" rid="s2-3-3">2.3.3</xref> include obstacles, the weights are not relearned for these conditions. The tactile sensing parameters are kept the same as in <xref ref-type="sec" rid="s2-2-5">Section 2.2.5</xref>.<disp-formula id="e22">
<mml:math id="m166">
<mml:mrow>
<mml:mi>w</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>w</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b7;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">learn</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x22c5;</mml:mo>
<mml:mi>&#x2207;</mml:mi>
<mml:mi>c</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>s</mml:mi>
<mml:mi>t</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
<label>(22)</label>
</disp-formula>
</p>
</sec>
</sec>
<sec id="s2-3">
<title>2.3 Experimental design</title>
<sec id="s2-3-1">
<title>2.3.1 Obstacle-free swimming</title>
<p>We first consider a simulated robot quiescent water with no obstacles. We adopt the framework proposed by <xref ref-type="bibr" rid="B32">Kelasidi et al. (2017)</xref>, which addresses a submerged planar robot comprised of discrete linkages with elliptical cross sections. Fluid is viscous, incompressible, and irrotational in the reference frame of the robot. The authors develop equations of motion for the center of mass <inline-formula id="inf145">
<mml:math id="m167">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>X</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>C</mml:mi>
<mml:mi>M</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>Y</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>X</mml:mi>
<mml:mi>M</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> and linkage orientation <inline-formula id="inf146">
<mml:math id="m168">
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> including linear drag, nonlinear drag, and added mass in an unobstructed environment. Relative joint angles are derived from kinematics as <inline-formula id="inf147">
<mml:math id="m169">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>. We consider a robot with <inline-formula id="inf148">
<mml:math id="m170">
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> segments, where each segment has a major radius <inline-formula id="inf149">
<mml:math id="m171">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.09</mml:mn>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, minor radius <inline-formula id="inf150">
<mml:math id="m172">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.035</mml:mn>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, half-length of <inline-formula id="inf151">
<mml:math id="m173">
<mml:mrow>
<mml:mi>l</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.09</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, and a mass of <inline-formula id="inf152">
<mml:math id="m174">
<mml:mrow>
<mml:mi>m</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.5</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi>k</mml:mi>
<mml:mi>g</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, except the head segment. The head segment is extended (<inline-formula id="inf153">
<mml:math id="m175">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>l</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.11</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula id="inf154">
<mml:math id="m176">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.94</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi>k</mml:mi>
<mml:mi>g</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>) to accommodate electronic components for a physical robot, which is under development. Fluid parameters and fluid body interaction constants are kept consistent with <xref ref-type="bibr" rid="B32">Kelasidi et al. (2017)</xref> (fluid density <inline-formula id="inf155">
<mml:math id="m177">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">fluid</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1000</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi>k</mml:mi>
<mml:mi>g</mml:mi>
<mml:mo>/</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>, added mass coefficient <inline-formula id="inf156">
<mml:math id="m178">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>C</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>A</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>, added inertia coefficient <inline-formula id="inf157">
<mml:math id="m179">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>C</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>M</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>, drag coefficient along link axis <inline-formula id="inf158">
<mml:math id="m180">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>C</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>f</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.03</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>, and drag coefficient perpendicular to link <inline-formula id="inf159">
<mml:math id="m181">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>C</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>D</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> &#x3d; 2). All simulation parameters can be found in <xref ref-type="table" rid="T3">Table 3</xref>.</p>
<table-wrap id="T3" position="float">
<label>TABLE 3</label>
<caption>
<p>Parameters for fluid dynamics, obstacle modeling, and kinematics.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th align="left">Variable</th>
<th align="left">Description</th>
<th align="left">Value</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">
<inline-formula id="inf160">
<mml:math id="m182">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>C</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>A</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Added mass coefficient</td>
<td align="left">1</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf161">
<mml:math id="m183">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>C</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>D</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Drag coefficient perpendicular to link axis</td>
<td align="left">2</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf162">
<mml:math id="m184">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>C</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>f</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Drag coefficient along link axis</td>
<td align="left">0.03</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf163">
<mml:math id="m185">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>C</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>M</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Added inertia coefficient</td>
<td align="left">1</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf164">
<mml:math id="m186">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>c</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">wall</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Obstacle damping coefficient <inline-formula id="inf165">
<mml:math id="m187">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>N</mml:mi>
<mml:mo>&#x22c5;</mml:mo>
<mml:mi>s</mml:mi>
<mml:mo>/</mml:mo>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">500</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf166">
<mml:math id="m188">
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Simulation time step (s)</td>
<td align="left">0.001</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf167">
<mml:math id="m189">
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">segment</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Point resolution for collision dynamics <inline-formula id="inf168">
<mml:math id="m190">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">0.01</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf169">
<mml:math id="m191">
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">wall</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Feature width for obstacles <inline-formula id="inf170">
<mml:math id="m192">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">0.001</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf171">
<mml:math id="m193">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">major radius (m)</td>
<td align="left">0.09</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf172">
<mml:math id="m194">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">minor radius (m)</td>
<td align="left">0.035</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf173">
<mml:math id="m195">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>F</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>C</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Sliding friction (N)</td>
<td align="left">&#x2014;</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf174">
<mml:math id="m196">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>F</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Normal force (N)</td>
<td align="left">&#x2014;</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf175">
<mml:math id="m197">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>F</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Static friction (N)</td>
<td align="left">&#x2014;</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf176">
<mml:math id="m198">
<mml:mrow>
<mml:mi>G</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Gravitational acceleration <inline-formula id="inf177">
<mml:math id="m199">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">9.81</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf178">
<mml:math id="m200">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Motor derivative gain</td>
<td align="left">0.5</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf179">
<mml:math id="m201">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Motor proportional gain</td>
<td align="left">50</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf180">
<mml:math id="m202">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">wall</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Obstacle stiffness coefficient (N/m)</td>
<td align="left">30,000</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf181">
<mml:math id="m203">
<mml:mrow>
<mml:mi>l</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">link half-length (m)</td>
<td align="left">[<inline-formula id="inf182">
<mml:math id="m204">
<mml:mrow>
<mml:mn>0.0</mml:mn>
<mml:msub>
<mml:mrow>
<mml:mn>9</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>5</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, 0.11]</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf183">
<mml:math id="m205">
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">link mass (kg)</td>
<td align="left">
<inline-formula id="inf184">
<mml:math id="m206">
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo>.</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mn>5</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>5</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:mn>0.94</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf185">
<mml:math id="m207">
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Number of links</td>
<td align="left">6</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf186">
<mml:math id="m208">
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Joint torque <inline-formula id="inf187">
<mml:math id="m209">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>N</mml:mi>
<mml:mo>&#x22c5;</mml:mo>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">&#x2014;</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf188">
<mml:math id="m210">
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Absolute angle of linkages (rad)</td>
<td align="left">&#x2014;</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf189">
<mml:math id="m211">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3bc;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Coefficient of kinetic friction</td>
<td align="left">0.6</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf190">
<mml:math id="m212">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3bc;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Coefficient of static friction</td>
<td align="left">0.8</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf191">
<mml:math id="m213">
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Relative joint angles (<italic>rad</italic>)</td>
<td align="left">&#x2014;</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf192">
<mml:math id="m214">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2a;</mml:mo>
</mml:mrow>
</mml:msup>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Desired relative joint angles (<italic>rad</italic>)</td>
<td align="left">&#x2014;</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf193">
<mml:math id="m215">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>f</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Fluid density <inline-formula id="inf194">
<mml:math id="m216">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mi>g</mml:mi>
<mml:mo>/</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">1,000</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf195">
<mml:math id="m217">
<mml:mrow>
<mml:mi>&#x3c8;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>
</td>
<td align="left">Robot heading (rad)</td>
<td align="left">&#x2014;</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>The experiment is conducted for the serpenoid, lateral undulation SHC, anguilliform SHC, and learned SHC controllers. The simulation runs for 60&#xa0;s, recording the robot&#x2019;s position, joint torques, and joint velocities. Power consumption is approximated as <inline-formula id="inf196">
<mml:math id="m218">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mfenced open="|" close="|">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
</inline-formula>. Then, we compare the swimming speed and COT for each controller. Additionally, we assess the differences in behavior for SHC controllers by examining the joint trajectories, kernel activity, and forcing term <inline-formula id="inf197">
<mml:math id="m219">
<mml:mrow>
<mml:mi>f</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>. At time <inline-formula id="inf198">
<mml:math id="m220">
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>, the robot is at rest with all linkage angles <inline-formula id="inf199">
<mml:math id="m221">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> and the center of mass located at the origin.</p>
</sec>
<sec id="s2-3-2">
<title>2.3.2 Straight channels</title>
<p>Simulating the robot in structured environments allows us to assess our method for integrating tactile information with SHC control. We examine straight passages ranging from <inline-formula id="inf200">
<mml:math id="m222">
<mml:mrow>
<mml:mi>W</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.2</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> to <inline-formula id="inf201">
<mml:math id="m223">
<mml:mrow>
<mml:mi>W</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.7</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> in width, at intervals of <inline-formula id="inf202">
<mml:math id="m224">
<mml:mrow>
<mml:mn>0.01</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>. The minimum width allows <inline-formula id="inf203">
<mml:math id="m225">
<mml:mrow>
<mml:mn>0.01</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> of freedom on each side of the robot, while the maximum channel width permits the joints to oscillate freely if the robot is centered. The robot begins entirely in the channel with <inline-formula id="inf204">
<mml:math id="m226">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> and no contact with the walls. The overall COT and average velocity are calculated after 30&#xa0;s of swimming for each case. This experiment addresses the serpenoid and lateral undulation SHC without sensing, as well as the serpenoid, lateral undulation SHC, and learned SHC with tactile sensing (&#x2b;T).</p>
<p>Obstacles are treated as points connected by flat surfaces with stiffness <inline-formula id="inf205">
<mml:math id="m227">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">wall</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>30,000</mml:mn>
<mml:mfrac>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
</inline-formula> and damping <inline-formula id="inf206">
<mml:math id="m228">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>c</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">wall</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>500</mml:mn>
<mml:mfrac>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>m</mml:mi>
<mml:mo>&#x22c5;</mml:mo>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
</inline-formula>. We approximate each robot segment as a set of points spaced <inline-formula id="inf207">
<mml:math id="m229">
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">segment</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.001</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> apart and assume that points colliding with an obstacle penetrated the nearest surface. The normal distance <inline-formula id="inf208">
<mml:math id="m230">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> and normal velocity <inline-formula id="inf209">
<mml:math id="m231">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> between the point and surface are computed, then the normal force centered at the point is approximated as <inline-formula id="inf210">
<mml:math id="m232">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>F</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">wall</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x22c5;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>c</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">wall</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x22c5;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>&#x22c5;</mml:mo>
<mml:mi>d</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">segment</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>. We incorporate friction via a linear model with stiction (<xref ref-type="bibr" rid="B37">Marques et al., 2016</xref>), where <inline-formula id="inf211">
<mml:math id="m233">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>F</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3bc;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>F</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula id="inf212">
<mml:math id="m234">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>F</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>C</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3bc;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>F</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula id="inf213">
<mml:math id="m235">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3bc;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.8</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>, and <inline-formula id="inf214">
<mml:math id="m236">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3bc;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.6</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>. The details are replicated in <xref ref-type="disp-formula" rid="e23">Equation 23</xref>. The variables <inline-formula id="inf215">
<mml:math id="m237">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>, <inline-formula id="inf216">
<mml:math id="m238">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.001</mml:mn>
<mml:mfrac>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
</inline-formula>, and <inline-formula id="inf217">
<mml:math id="m239">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.002</mml:mn>
<mml:mfrac>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
</inline-formula> represent the tangential velocity, velocity at maximum static friction, and velocity at which only kinetic friction occurs (<xref ref-type="table" rid="T3">Table 3</xref>). Torque is obtained by integrating contact forces over the displacement from the link center of mass. The effects of obstacles on fluid behavior are ignored for simplicity, and fluid far from the robot remains quiescent.<disp-formula id="e23">
<mml:math id="m240">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold">F</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="bold">f</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="{" close="">
<mml:mrow>
<mml:mtable class="cases">
<mml:mtr>
<mml:mtd columnalign="left">
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mfenced open="&#x2016;" close="&#x2016;">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfrac>
<mml:msub>
<mml:mrow>
<mml:mi>F</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:mtext>sgn</mml:mtext>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:mspace width="1em"/>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mtext>if&#x2009;</mml:mtext>
<mml:mfenced open="&#x2016;" close="&#x2016;">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x2264;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="left">
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>F</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mfenced open="&#x2016;" close="&#x2016;">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfrac>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>F</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>S</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>F</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>C</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mfenced>
<mml:mtext>sgn</mml:mtext>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:mspace width="1em"/>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mtext>if&#x2009;</mml:mtext>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3c;</mml:mo>
<mml:mfenced open="&#x2016;" close="&#x2016;">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x3c;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="left">
<mml:msub>
<mml:mrow>
<mml:mi>F</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>C</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mtext>sgn</mml:mtext>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:mspace width="1em"/>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mtext>if&#x2009;</mml:mtext>
<mml:mfenced open="&#x2016;" close="&#x2016;">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x2265;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
<label>(23)</label>
</disp-formula>
</p>
</sec>
<sec id="s2-3-3">
<title>2.3.3 Uneven channels</title>
<p>One of the most daunting aspects for exploratory robots is maintaining productive locomotion in complex terrain. We simulate the robot moving through channels with randomly generated feature (see examples in <xref ref-type="fig" rid="F4">Figure 4</xref>). To establish consistent initial conditions, each channel begins with a <inline-formula id="inf218">
<mml:math id="m241">
<mml:mrow>
<mml:mn>1.5</mml:mn>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> long and <inline-formula id="inf219">
<mml:math id="m242">
<mml:mrow>
<mml:mn>0.5</mml:mn>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> wide straight section. The robot begins completely straight, at rest, and inside the channel. After the straight section, the upper surface of the channel is constructed such that <inline-formula id="inf220">
<mml:math id="m243">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">wall,i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">wall,i&#x2212;1</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>0.025</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula id="inf221">
<mml:math id="m244">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">upper,i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">upper,i&#x2212;1</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:mi mathvariant="script">N</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi>&#x3bc;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>&#x3c3;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.03</mml:mn>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
</inline-formula>. Points along the bottom surface <inline-formula id="inf222">
<mml:math id="m245">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">lower,i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> are computed likewise. If the distance between <inline-formula id="inf223">
<mml:math id="m246">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">upper,i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> or <inline-formula id="inf224">
<mml:math id="m247">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">lower,i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> and any point on the opposite boundary is less than the minimum channel width <inline-formula id="inf225">
<mml:math id="m248">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>W</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">min</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.30</mml:mn>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> (<inline-formula id="inf226">
<mml:math id="m249">
<mml:mrow>
<mml:mn>1.7</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> times robot width), the <inline-formula id="inf227">
<mml:math id="m250">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula> upper and lower points are replaced. Similarly, the <inline-formula id="inf228">
<mml:math id="m251">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula> points are regenerated if the distance between <inline-formula id="inf229">
<mml:math id="m252">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">upper,i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> and <inline-formula id="inf230">
<mml:math id="m253">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">lower,i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> exceeds <inline-formula id="inf231">
<mml:math id="m254">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>W</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">max</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.5</mml:mn>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> (2.8 times robot width) apart so that results do not simply reflect obstacle-free behavior. Due to random walk, the center lines shift laterally up to 1.6&#x2013;3.0 robot widths over a single length of the robot, depending on the channel.</p>
<fig id="F4" position="float">
<label>FIGURE 4</label>
<caption>
<p>Examples of uneven channels with randomly generated features that impede the robot.</p>
</caption>
<graphic xlink:href="felec-06-1507644-g004.tif"/>
</fig>
<p>We simulate 60&#xa0;s of swimming in each channel using the serpenoid and lateral undulation SHC controllers with and without tactile sensing. The learned SHC controller (&#x2b;T) is also examined. Steering is disabled since the direction of the channel varies. We estimate the minimum number of channels required <inline-formula id="inf232">
<mml:math id="m255">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">channels,min</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>61</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula> using power analysis conducted in the software G&#x2a;Power for 1-way ANOVA with effect size <inline-formula id="inf233">
<mml:math id="m256">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>f</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.25</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>, power <inline-formula id="inf234">
<mml:math id="m257">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.95</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>, and five groups. To account for invalid results, we increase the sample size to <inline-formula id="inf235">
<mml:math id="m258">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">channels</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>65</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>. Specifically, data is excluded if the robot does not enter and remain within the uneven portion of the channel. We compute the COT and velocity using only time steps after the robot has fully entered the uneven section. Since the data does not follow normality assumptions, we assess statistical significance with Kruskal&#x2013;Wallis testing, followed by Dunn-&#x160;&#xed;d&#xe1;k <italic>post hoc</italic> analysis. Furthermore we categorize the progress for each controller as continual, ceased, or intermittent. We specify that progress has ceased if the robot does not move forward by more than 0.1&#xa0;m for at least 7.2&#xa0;s (two gait cycles under unimpeded locomotion). We define intermittent progress where forward motion ceases for at least two gait cycles, but later resumes. The rates of continual, ceased, and intermittent progression for each controller are assessed.</p>
</sec>
</sec>
</sec>
<sec sec-type="results" id="s3">
<title>3 Results</title>
<sec id="s3-1">
<title>3.1 Obstacle-free swimming</title>
<sec id="s3-1-1">
<title>3.1.1 Lateral undulation gait with SHC control</title>
<p>In quiescent fluid with no obstacles, the SHC controller successfully replicates the lateral undulation gait. The SHC controller produces similar joint oscillations to the serpenoid controller, but with a smoother transition from rest to steady state oscillation (<xref ref-type="fig" rid="F5">Figure 5A</xref>). For both methods, the heading naturally oscillates during undulation. The steering controllers compensate by increasing or decreasing the desired joint trajectories, causing joint amplitudes to differ from the reference value of <inline-formula id="inf236">
<mml:math id="m259">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>30</mml:mn>
<mml:mo>&#x00B0;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>.</p>
<fig id="F5" position="float">
<label>FIGURE 5</label>
<caption>
<p>
<bold>(A, B)</bold> The SHC controller produces comparable trajectories to the serpenoid controller <bold>(C)</bold> In obstacle-free conditions, the lateral undulation SHC performs similarly to the serpenoid controller. The anguilliform SHC controller swims slower because the joint oscillation amplitude is reduced, so thrust decreases. Learning SHC weights improves speed. Video is included in <xref ref-type="sec" rid="s11">Supplementary Files</xref> <bold>(D)</bold> The COT reaches steady state performance after <inline-formula id="inf237">
<mml:math id="m260">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">start</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> for all controllers. Due to nonsmooth trajectories, the serpenoid controller experiences higher transient energy losses and larger overall COT (i.e., COT at <inline-formula id="inf238">
<mml:math id="m261">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">start</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>) than SHC controllers.</p>
</caption>
<graphic xlink:href="felec-06-1507644-g005.tif"/>
</fig>
<p>Since the serpenoid and lateral undulation SHC controllers generate similar trajectories, they achieve comparable performance. The average velocity of the center of mass for both controllers is <inline-formula id="inf239">
<mml:math id="m262">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">avg,serpenoid</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2248;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">avg,LUSHC</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.28</mml:mn>
<mml:mfrac>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
</inline-formula>. The progression of the robot for all controllers is depicted in <xref ref-type="fig" rid="F5">Figure 5</xref> (also see <xref ref-type="sec" rid="s11">Supplementary Files</xref> for <xref ref-type="sec" rid="s11">Supplementary Video</xref> recording). (B) Due to differences in steering controller implementations, the SHC controller produces slightly better steady state efficiency <inline-formula id="inf240">
<mml:math id="m263">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>C</mml:mi>
<mml:mi>O</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">start</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>L</mml:mi>
<mml:mi>U</mml:mi>
<mml:mi>S</mml:mi>
<mml:mi>H</mml:mi>
<mml:mi>C</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.087</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> than the serpenoid controller <inline-formula id="inf241">
<mml:math id="m264">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>C</mml:mi>
<mml:mi>O</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">start</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>s</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>p</mml:mi>
<mml:mi>e</mml:mi>
<mml:mi>n</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>i</mml:mi>
<mml:mi>d</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.097</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> (<xref ref-type="table" rid="T4">Table 4</xref>).</p>
<table-wrap id="T4" position="float">
<label>TABLE 4</label>
<caption>
<p>Performance during obstacle-free swimming.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th align="left">Controller</th>
<th align="center">Average velocity <inline-formula id="inf242">
<mml:math id="m265">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>m</mml:mi>
<mml:mo>/</mml:mo>
<mml:mi>s</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>
</th>
<th align="center">Overall COT</th>
<th align="center">COT after t &#x3d; 1&#xa0;s</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">Lateral Undulation SHC</td>
<td align="center">0.281</td>
<td align="center">0.088</td>
<td align="center">0.087</td>
</tr>
<tr>
<td align="left">Anguilliform SHC</td>
<td align="center">0.166</td>
<td align="center">0.072</td>
<td align="center">0.072</td>
</tr>
<tr>
<td align="left">Learned SHC</td>
<td align="center">0.319</td>
<td align="center">0.102</td>
<td align="center">0.101</td>
</tr>
<tr>
<td align="left">Serpenoid</td>
<td align="center">0.284</td>
<td align="center">0.126</td>
<td align="center">0.097</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>A benefit of SHC control over serpenoid control is apparent when assessing the overall COT including transient effects <inline-formula id="inf243">
<mml:math id="m266">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">start</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>. The conventional serpenoid curve yields a desired trajectory with nonzero initial joint angles and velocities, whereas most robots realistically start from rest. High accelerations, large joint torques, and high energy consumption are required to reduce the trajectory error, leading to an overall COT of 0.126 (<inline-formula id="inf244">
<mml:math id="m267">
<mml:mrow>
<mml:mn>30</mml:mn>
<mml:mi>&#x0025;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> above steady state value). Shape-based control of the joint amplitude avoids this issue, albeit at increased complexity (<xref ref-type="bibr" rid="B60">Travers et al., 2015</xref>; <xref ref-type="bibr" rid="B61">2018</xref>; <xref ref-type="bibr" rid="B48">Rollinson and Choset, 2013</xref>). In contrast, the SHC framework natively computes desired accelerations, then the desired velocity and position are evaluated by integration. This yields smooth kinematic trajectories such that the lateral undulation SHC controller achieves an overall COT only <inline-formula id="inf245">
<mml:math id="m268">
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mi>&#x0025;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> greater than its steady state value (<xref ref-type="fig" rid="F5">Figure 5A</xref>).</p>
</sec>
<sec id="s3-1-2">
<title>3.1.2 Anguilliform gait with SHC control</title>
<p>By linearly scaling the SHC weights, we transform the lateral undulation gait to an anguilliform gait, with reduced anterior joint amplitudes. For example, we scale the weights for the anterior-most joint by <inline-formula id="inf246">
<mml:math id="m269">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>g</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>5</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>14</mml:mn>
<mml:mi>&#x0025;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> <xref ref-type="disp-formula" rid="e15">(Equation 15)</xref> relative to weights for the lateral undulation SHC controller. Consequently, the anguilliform SHC controller forcing term <inline-formula id="inf247">
<mml:math id="m270">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>f</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>5</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> magnitude is lower in comparison with the lateral undulation SHC (<xref ref-type="fig" rid="F6">Figure 6A</xref>). This translates to a smaller joint amplitude (<xref ref-type="fig" rid="F6">Figure 6C</xref>). The lateral undulation SHC controller exhibits a joint amplitude of <inline-formula id="inf248">
<mml:math id="m271">
<mml:mrow>
<mml:mn>29.5</mml:mn>
<mml:mo>&#xb0;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>, while the anguilliform SHC controller&#x2019;s anterior joint amplitude reduces to <inline-formula id="inf249">
<mml:math id="m272">
<mml:mrow>
<mml:mn>4.0</mml:mn>
<mml:mo>&#xb0;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> <inline-formula id="inf250">
<mml:math id="m273">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>13.6</mml:mn>
<mml:mi>&#x0025;</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>, showing good correspondence with the scaling factor <inline-formula id="inf251">
<mml:math id="m274">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>g</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>5</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula>.</p>
<fig id="F6" position="float">
<label>FIGURE 6</label>
<caption>
<p>
<bold>(A)</bold> Positively (cyan) and negatively (magenta) weighted SHC kernels <inline-formula id="inf252">
<mml:math id="m275">
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> for the anterior joint activate in alternatingly, encoding upward and downward trends in the forcing term <inline-formula id="inf253">
<mml:math id="m276">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>f</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>5</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>. Lower weights cause smaller oscillations for the anguilliform SHC controller <bold>(B)</bold> Anterior joint trajectories resemble SHC forcing terms. Reduced <inline-formula id="inf254">
<mml:math id="m277">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>f</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>5</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> for the anguilliform SHC controller corresponds to small anterior joint oscillations <bold>(C)</bold> The lateral undulation SHC controller uses the same weights for all joints. Anguilliform controller weights are scaled linearly with lower magnitudes for anterior joints. Learning yields a similar trend <bold>(D)</bold> Lateral undulation SHC and serpenoid controllers joint amplitudes differ slightly from the desired value <inline-formula id="inf255">
<mml:math id="m278">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b1;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> due to steering and fluid effects. SHC joint amplitude trends resemble the weight amplitude trends <bold>(E)</bold> For lateral undulation and anguilliform SHC controllers, the peak weights are consistently <inline-formula id="inf256">
<mml:math id="m279">
<mml:mrow>
<mml:mn>40</mml:mn>
<mml:mo>&#xb0;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> apart. The learned SHC controller develops smaller phase offsets near <inline-formula id="inf257">
<mml:math id="m280">
<mml:mrow>
<mml:mn>30</mml:mn>
<mml:mo>&#xb0;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> <bold>(F)</bold> In the learned SHC gait, phase offsets between joints are reduced except in the anterior joint, corresponding to shifts in weights.</p>
</caption>
<graphic xlink:href="felec-06-1507644-g006.tif"/>
</fig>
<p>Scaling effects are more thoroughly characterized by considering the amplitudes of weights and <inline-formula id="inf258">
<mml:math id="m281">
<mml:mrow>
<mml:mi>&#x3d5;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> for all joints (<xref ref-type="fig" rid="F6">Figures 6B, D</xref>). The SHC weight amplitude for joint <inline-formula id="inf259">
<mml:math id="m282">
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> is defined by the maximum value in the <inline-formula id="inf260">
<mml:math id="m283">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula> row of the weight matrix (<xref ref-type="fig" rid="F7">Figure 7</xref>). Anguilliform SHC weight amplitudes decrease linearly from the tail to the head, with similar trends emerging in joint amplitudes. The visible correspondence between weights, forcing term <inline-formula id="inf261">
<mml:math id="m284">
<mml:mrow>
<mml:mi>f</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>, and joint trajectories makes SHC MPs a transparent framework that robot operators can intuitively modify. Because lateral displacement is reduced, the anguilliform gait produces less thrust and slower swimming <inline-formula id="inf262">
<mml:math id="m285">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>0.166</mml:mn>
<mml:mfrac>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> than the lateral undulation gait. However, the anguilliform gait is more efficient by 26.1% <inline-formula id="inf263">
<mml:math id="m286">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>C</mml:mi>
<mml:mi>O</mml:mi>
<mml:mi>T</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.0718</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> relative to serpenoid control <inline-formula id="inf264">
<mml:math id="m287">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>C</mml:mi>
<mml:mi>O</mml:mi>
<mml:mi>T</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.0972</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> and 17% relative to lateral undulation SHC control <inline-formula id="inf265">
<mml:math id="m288">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>C</mml:mi>
<mml:mi>O</mml:mi>
<mml:mi>T</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.0867</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>. While we only simulate one sample and recommend more comprehensive experiments with hardware, results qualitatively agree with prior work showing that efficiency is optimized at lower amplitudes compared to velocity (<xref ref-type="bibr" rid="B1">Anastasiadis et al., 2023</xref>).</p>
<fig id="F7" position="float">
<label>FIGURE 7</label>
<caption>
<p>Weights for SHC controllers. Lateral undulation uses consistent weights across all joints, while the anguilliform weights decrease in magnitude from the tail (joint 1) to the head (joint 5). In the learned gait, peak weights also decrease towards the head, although the phase differences between joints also differ because <inline-formula id="inf266">
<mml:math id="m289">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3bb;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>4</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> are tuned independently for joint <inline-formula id="inf267">
<mml:math id="m290">
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>.</p>
</caption>
<graphic xlink:href="felec-06-1507644-g007.tif"/>
</fig>
</sec>
<sec id="s3-1-3">
<title>3.1.3 Learned gait with SHC control</title>
<p>Our gait optimization for SHC control modifies the weight parameters to enhance speed of locomotion, while minimally affecting energy efficiency. The learned SHC controller achieves a <inline-formula id="inf268">
<mml:math id="m291">
<mml:mrow>
<mml:mn>12.3</mml:mn>
<mml:mi>&#x0025;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> higher overall velocity <inline-formula id="inf269">
<mml:math id="m292">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>0.32</mml:mn>
<mml:mtext>&#x2009;</mml:mtext>
<mml:mi>m</mml:mi>
<mml:mo>/</mml:mo>
<mml:mi>s</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> compared with the lateral undulation SHC controller. The steady state efficiency degrades, with the COT increasing from 0.087 in the lateral undulation gait to 0.10 in the learned gait.</p>
<p>The improved speed of locomotion in the learned SHC controller corresponds to changes in the controller weights and joint amplitudes. Relative to the lateral undulation SHC controller, the learned SHC controller possesses higher weight amplitudes for the posterior joints and lower weights for the anterior joints (7 (B)). The learned SHC weight amplitudes correspond loosely to the joint amplitudes (<xref ref-type="fig" rid="F6">Figure 6D</xref>), which show a gradual decrease towards the head of the robot. Compared with anguilliform and lateral undulation SHC controllers, the learned controller shows weaker correspondence between weights and joint amplitudes because the distribution of weights, and thus acceleration patterns, may differ between joints.</p>
<p>When optimizing weight parameters for the learned SHC controller, the distribution of weights for each joint changes along with the peak amplitude. We compute the phases of weight distributions <inline-formula id="inf270">
<mml:math id="m293">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:math>
</inline-formula> for each of the <inline-formula id="inf271">
<mml:math id="m294">
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> joints using a centroid method (<xref ref-type="disp-formula" rid="e24">Equations 24</xref>&#x2013;<xref ref-type="disp-formula" rid="e27">27</xref>).<disp-formula id="e24">
<mml:math id="m295">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mn>360</mml:mn>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:mfrac>
<mml:mo>,</mml:mo>
<mml:mspace width="1em"/>
<mml:mn>1</mml:mn>
<mml:mo>&#x2264;</mml:mo>
<mml:mi>k</mml:mi>
<mml:mo>&#x2264;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
<label>(24)</label>
</disp-formula>
<disp-formula id="e25">
<mml:math id="m296">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>K</mml:mi>
<mml:mo>/</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:msub>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>s</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>K</mml:mi>
<mml:mo>/</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:msub>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
<label>(25)</label>
</disp-formula>
<disp-formula id="e26">
<mml:math id="m297">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>K</mml:mi>
<mml:mo>/</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:msub>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>i</mml:mi>
<mml:mi>n</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>K</mml:mi>
<mml:mo>/</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:msub>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:math>
<label>(26)</label>
</disp-formula>
<disp-formula id="e27">
<mml:math id="m298">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>a</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi>n</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:math>
<label>(27)</label>
</disp-formula>
</p>
<p>Gait optimization produces weight phase offsets between joints <inline-formula id="inf272">
<mml:math id="m299">
<mml:mrow>
<mml:mi mathvariant="normal">&#x394;</mml:mi>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:math>
</inline-formula> mostly near <inline-formula id="inf273">
<mml:math id="m300">
<mml:mrow>
<mml:mn>30</mml:mn>
<mml:mo>&#xb0;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>, lower than the design value of <inline-formula id="inf274">
<mml:math id="m301">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>h</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>40</mml:mn>
<mml:mo>&#xb0;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> applied for other controllers (<xref ref-type="fig" rid="F6">Figure 6E</xref>). The phase offset for the anterior joint pair may differ due to the longer segment length and increased mass, or because the <inline-formula id="inf275">
<mml:math id="m302">
<mml:mrow>
<mml:mi mathvariant="normal">&#x394;</mml:mi>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>5</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:math>
</inline-formula> has little impact on the optimization cost function. For all controllers, the weight phase offsets identified in the weight matrix are good predictors for phase offsets in the joint trajectories <inline-formula id="inf276">
<mml:math id="m303">
<mml:mrow>
<mml:mi mathvariant="normal">&#x394;</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:math>
</inline-formula> (<xref ref-type="fig" rid="F6">Figure 6F</xref>). Some deviation occurs due to steering and fluid effects in all controllers.</p>
</sec>
</sec>
<sec id="s3-2">
<title>3.2 Straight channels</title>
<p>We assess our method for integrating sensory information in the SHC controller by examining the robot&#x2019;s progress through straight, narrow passages. Video of the robot in a <inline-formula id="inf277">
<mml:math id="m304">
<mml:mrow>
<mml:mn>0.3</mml:mn>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> channel is included in <xref ref-type="sec" rid="s11">Supplementary Files</xref>. In cases where the robot penetrates deeply into obstacles, frictional forces are overestimated such that the robot slows abruptly. In future work, this can be resolved with smaller time steps during contact. Nevertheless, controllers that incorporate tactile information (denoted by (&#x2b;T)) adapt their behavior to accommodate contact, enabling forward locomotion (<xref ref-type="fig" rid="F8">Figure 8B</xref>). In contrast, unsensorized controllers push backwards against the wall, moving opposite of the intended direction. Speed benefits of gait optimization in an obstacle-free environment are retained in this structured environment.To validate how the sensor integration impacts SHC-generated gaits, we examine the kernel activity. Tactile sensing increases the frequency of kernel activation, forcing term <inline-formula id="inf278">
<mml:math id="m305">
<mml:mrow>
<mml:mi>f</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>, and joint trajectories (<xref ref-type="fig" rid="F8">Figures 8C, D</xref>). While the forcing term <inline-formula id="inf279">
<mml:math id="m306">
<mml:mrow>
<mml:mi>f</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula> achieves the same magnitude, the joints have less time to accelerate and therefore achieve lower amplitudes. The coupled frequency and amplitude adaptation enables the SHC controllers with tactile sensing to locomote more quickly than sensor-free implementations or the serpenoid (&#x2b;T) controller, which only adapts joint amplitude.</p>
<fig id="F8" position="float">
<label>FIGURE 8</label>
<caption>
<p>
<bold>(A)</bold> Using lateral undulation SHC control with tactile sensing (&#x2b;T), the robot moves through a 0.3&#xa0;m channel <bold>(B)</bold> Tactile sensing improves the swimming speed through the channel, especially with learned SHC control <bold>(C)</bold> Contact detection increases the frequency of SHC kernels and <inline-formula id="inf280">
<mml:math id="m307">
<mml:mrow>
<mml:mi>f</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:math>
</inline-formula>, as shown for the lateral undulation gait <bold>(D)</bold> Increasing kernel frequency corresponds to faster, lower amplitude joint trajectories.</p>
</caption>
<graphic xlink:href="felec-06-1507644-g008.tif"/>
</fig>
<p>The relative performance of the controllers depends on the width of the crevice (<xref ref-type="fig" rid="F9">Figure 9</xref>). In the narrowest channels all controllers yield backwards net locomotion, as the robot incidentally pushes backwards against the walls. As channel width increases, forward velocity generally increases before saturating when the channels are wide enough that wall contact becomes negligible. Controllers that incorporate tactile sensing achieve forward progress at lower channel widths and maintain higher average velocities than their unsensorized counterparts. Moreover, the SHC controllers with tactile sensing achieve higher average velocities than the serpenoid (&#x2b;T) controller, suggesting that the frequency and amplitude modulation is more effective than amplitude reduction alone. Consistent with results for the unimpeded swimming study, the learned SHC (&#x2b;T) controller yields the highest velocity of all controllers in most regimes.</p>
<fig id="F9" position="float">
<label>FIGURE 9</label>
<caption>
<p>
<bold>(A)</bold> Controllers yield backwards locomotion in the narrowest channels. Velocities increase until no wall contact occurs. The learned SHC controller (&#x2b;T) permits faster swimming than both the lateral undulation SHC and serpenoid controllers <bold>(B)</bold> COT is defined only where the robot progresses forwards and decreases (i.e., locomotion becomes more efficient) as channel width increases. Tactile sensing reduces COT especially in narrow channels. While the learned gait generally improves speed, it sacrifices efficiency in some conditions.</p>
</caption>
<graphic xlink:href="felec-06-1507644-g009.tif"/>
</fig>
<p>The advantages of tactile sensing are similarly evident from COT trends for narrow crevices (<xref ref-type="fig" rid="F9">Figure 9</xref>). For the same channels, COTs for controllers equipped with tactile sensors are consistently lower than for controllers without. The lateral undulation and learned SHC controllers (&#x2b;T) achieve similar efficiency to the serpenoid controller (&#x2b;T) in channels narrower than approximately <inline-formula id="inf281">
<mml:math id="m308">
<mml:mrow>
<mml:mn>0.45</mml:mn>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula>, and better efficiency in wider channels. While the learned SHC controller (&#x2b;T) offers better speed, the lateral undulation SHC (&#x2b;T) offers modestly better efficiency in some conditions. Based on the improved average velocity and efficiency, we conclude that scaling kernel progression rates according to tactile data is an effective mechanism for improving SHC performance in straight, narrow channels.</p>
</sec>
<sec id="s3-3">
<title>3.3 Uneven channels</title>
<p>In uneven channels, contact detection remains crucial to the performance of the robot. Without tactile sensing, the serpenoid and SHC controllers cannot adapt the body shape and become trapped when the robot contacts both sides of the channel (<xref ref-type="fig" rid="F10">Figure 10A</xref>). With tactile sensing, the controllers reduce the amplitude of the joints, narrowing the gait and allowing the robot to pass obstacles (see video in <xref ref-type="sec" rid="s11">Supplementary Files</xref>). However, the robot may still not progress consistently if it comes into contact with an obstacle head on, for example, the lateral undulation SHC (&#x2b;T) controller in <xref ref-type="fig" rid="F10">Figure 10A</xref>. In this case, the robot continually retries forward motion, colliding with the channel wall until a more suitable approach configuration occurs by chance and the robot overcomes the obstacle. As in prior experiments, the learned SHC allows the greatest forward progress when it is not trapped in the channel (<xref ref-type="fig" rid="F10">Figure 10</xref>).</p>
<fig id="F10" position="float">
<label>FIGURE 10</label>
<caption>
<p>
<bold>(A)</bold> Tactile sensing improves locomotion in uneven terrain, though many attempts may be needed if approach is sub-optimal (e.g., lateral undulation SHC (&#x2b;T); see <xref ref-type="sec" rid="s11">Supplementary Video</xref>) <bold>(B)</bold> We categorize progress for each trial as continual (black), ceased (red), or intermittent (blue). Lateral undulation SHC (&#x2b;T) and learned SHC (&#x2b;T) controllers progress faster, but are trapped more often than the serpenoid controller (&#x2b;T) <bold>(C, D)</bold> Velocity and COT distributions (dots) are shown. <inline-formula id="inf282">
<mml:math id="m309">
<mml:mrow>
<mml:mn>95</mml:mn>
<mml:mi>&#x0025;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> confidence intervals (black) are established with bias corrected and accelerated nonparametric bootstrapping (<inline-formula id="inf283">
<mml:math id="m310">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>n</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">bootstrap</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>10,000</mml:mn>
</mml:mrow>
</mml:math>
</inline-formula>, convergence shown in <xref ref-type="sec" rid="s11">Supplemental Materials</xref>). The learned SHC (&#x2b;T) offers the greatest speed, though serpenoid control (&#x2b;T) yields the lowest and most reliable COT. Violin plot code by <xref ref-type="bibr" rid="B6">Bechtold (2016)</xref>.</p>
</caption>
<graphic xlink:href="felec-06-1507644-g010.tif"/>
</fig>
<p>In the complete set of channels, the serpenoid and SHC controllers with tactile sensing achieve greater progress than those without. Of 65 obstacles, our analyses include 59 (serpenoid), 65 (serpenoid (&#x2b;T)), 62 (lateral undulation SHC), 64 (lateral undulation SHC (&#x2b;T)), and 62 (learned SHC (&#x2b;T)) data points. In <inline-formula id="inf284">
<mml:math id="m311">
<mml:mrow>
<mml:mn>95</mml:mn>
<mml:mi>&#x0025;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> of cases where lateral undulation SHC controllers with and without sensing both produce valid results, the sensor equipped controller moves further through the channel. Similar results apply for the serpenoid controllers <inline-formula id="inf285">
<mml:math id="m312">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>98</mml:mn>
<mml:mi>&#x0025;</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>. The coupled frequency and amplitude response in the lateral undulation (&#x2b;T) and learned SHC (&#x2b;T) controllers allow the robot to swim further compared with the serpenoid (&#x2b;T) controller, as long as the robot does not become trapped in the channel (<xref ref-type="fig" rid="F10">Figure 10</xref>). However, the SHC (&#x2b;T) controllers also suffer from high variability in performance. The serpenoid controller (&#x2b;T) shows continual progression in the most channels (62%), followed by the learned SHC (&#x2b;T) and lateral undulation SHC (&#x2b;T) (both 45%) controllers (<xref ref-type="table" rid="T5">Table 5</xref>). The learned SHC (&#x2b;T) controller is more likely to recover from being trapped (e.g., intermittent progress, <inline-formula id="inf286">
<mml:math id="m313">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>27</mml:mn>
<mml:mi>&#x0025;</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> than the lateral undulation SHC (&#x2b;T) controller <inline-formula id="inf287">
<mml:math id="m314">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>14</mml:mn>
<mml:mi>&#x0025;</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>. Although the SHC controllers with tactile sensing are more likely to become trapped in uneven, confined spaces and operate less efficiently (see <xref ref-type="fig" rid="F10">Figure 10D</xref>) than the serpenoid (&#x2b;T) controller, they can achieve greater maximal forward progress.</p>
<table-wrap id="T5" position="float">
<label>TABLE 5</label>
<caption>
<p>Uneven channel performance.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th rowspan="2" align="left">Controller</th>
<th colspan="3" align="center">Progression categorization (%)</th>
<th colspan="2" align="center">COT CI</th>
<th colspan="2" align="center">Velocity CI</th>
</tr>
<tr>
<th align="center">Continual</th>
<th align="center">Intermittent</th>
<th align="center">Ceased</th>
<th align="center">Lower</th>
<th align="center">Upper</th>
<th align="center">Lower</th>
<th align="center">Upper</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">Lateral Undulation SHC</td>
<td align="left">6.6</td>
<td align="left">15</td>
<td align="left">79</td>
<td align="center">4.86</td>
<td align="center">7.17</td>
<td align="center">0.040</td>
<td align="center">0.050</td>
</tr>
<tr>
<td align="left">Lateral Undulation SHC (&#x2b;T)</td>
<td align="left">45</td>
<td align="left">20</td>
<td align="left">34</td>
<td align="center">1.68</td>
<td align="center">3.24</td>
<td align="center">0.079</td>
<td align="center">0.096</td>
</tr>
<tr>
<td align="left">Learned SHC (&#x2b;T)</td>
<td align="left">45</td>
<td align="left">27</td>
<td align="left">27</td>
<td align="center">1.48</td>
<td align="center">2.73</td>
<td align="center">0.091</td>
<td align="center">0.106</td>
</tr>
<tr>
<td align="left">Serpenoid</td>
<td align="left">5</td>
<td align="left">10</td>
<td align="left">85</td>
<td align="center">6.54</td>
<td align="center">9.05</td>
<td align="center">0.036</td>
<td align="center">0.043</td>
</tr>
<tr>
<td align="left">Serpenoid (&#x2b;T)</td>
<td align="left">62</td>
<td align="left">14</td>
<td align="left">25</td>
<td align="center">0.89</td>
<td align="center">1.48</td>
<td align="center">0.072</td>
<td align="center">0.082</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>Mean velocities are compared between controllers with a Kruskal&#x2013;Wallis test, which indicates that one or more controllers differs <inline-formula id="inf288">
<mml:math id="m315">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>p</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>2.7</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:mo>&#x2212;</mml:mo>
<mml:mn>30</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>. Controller pairs are compared with Dunn test with a &#x160;id&#xe1;k correction to account for multiple comparisons, using <inline-formula id="inf289">
<mml:math id="m316">
<mml:mrow>
<mml:mn>95</mml:mn>
<mml:mi>&#x0025;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> confidence. The learned SHC (&#x2b;T) controller outperforms the serpenoid controller (&#x2b;T), achieving 28.8% higher velocity on average <inline-formula id="inf290">
<mml:math id="m317">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>p</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.014</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> (See <xref ref-type="fig" rid="F10">Figure 10C</xref> and <xref ref-type="table" rid="T5">Table 5</xref>). The learned SHC (&#x2b;T) controller performs similarly to the lateral undulation SHC (&#x2b;T) controller <inline-formula id="inf291">
<mml:math id="m318">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>p</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0.31</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>, albeit with slightly higher average velocity and lower variance due to improved rate of recovery from entrapment. Overall, these results indicate that modulating SHC kernel activation rates based on tactile sensing is an effective approach for navigating uneven terrain, particularly when paired with gait optimization techniques.</p>
<p>Incorporating tactile sensing improves efficiency, as well as speed. A Kruskal&#x2013;Wallis test shows significant differences between the controllers <inline-formula id="inf292">
<mml:math id="m319">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>p</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>6.8</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:mo>&#x2212;</mml:mo>
<mml:mn>38</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>, and we proceed with a Dunn-&#x160;id&#xe1;k <italic>post hoc</italic> evaluation as before. Compared to the lateral undulation SHC controller without sensing, the learned SHC controller (&#x2b;T) <inline-formula id="inf293">
<mml:math id="m320">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>p</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>9.0</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:mo>&#x2212;</mml:mo>
<mml:mn>8</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> and lateral undulation SHC controller (&#x2b;T) <inline-formula id="inf294">
<mml:math id="m321">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>p</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>2.3</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:mo>&#x2212;</mml:mo>
<mml:mn>8</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> are more efficient. The learned and lateral undulation SHC controllers with sensing show similar efficiency <inline-formula id="inf295">
<mml:math id="m322">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>p</mml:mi>
<mml:mo>&#x3e;</mml:mo>
<mml:mn>0.999</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>. However, the serpenoid controller (&#x2b;T) is significantly more efficient than either the learned SHC (&#x2b;T) <inline-formula id="inf296">
<mml:math id="m323">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>p</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>6.9</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:mo>&#x2212;</mml:mo>
<mml:mn>4</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> or lateral undulation SHC controllers (&#x2b;T) <inline-formula id="inf297">
<mml:math id="m324">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>p</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1.8</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:mo>&#x2212;</mml:mo>
<mml:mn>4</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> (<xref ref-type="fig" rid="F10">Figure 10D</xref>). The elevated COT for the sensorized SHC controllers is likely because tactile input increases the joint oscillation frequency, which entails higher energy consumption. If the increased motion does not enable the robot to overcome an obstacle, efficiency declines. Reducing efficiency for increased velocity may be acceptable for robots that are powered via tether or have time sensitive objectives, as in search and rescue.</p>
</sec>
</sec>
<sec sec-type="discussion" id="s4">
<title>4 Discussion</title>
<p>In this work, we implement movement primitives based on stable heteroclinic channels to control a simulated aquatic snake robot. The SHC controller provides comparable performance to a conventional serpenoid controller. We demonstrate that MP weights relate proportionally to joint trajectories by linearly scaling the weights from the lateral undulation SHC controller to achieve an anguilliform gait. We optimize the SHC controller by modeling the system dynamics and iteratively tuning the weights, resulting in a <inline-formula id="inf298">
<mml:math id="m325">
<mml:mrow>
<mml:mn>12</mml:mn>
<mml:mi>&#x0025;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> speed increase when the robot swims in an obstacle-free environment. Furthermore, we show that modulating transitions between SHC kernels with tactile sensing adapts the gait frequency and amplitudes to improve locomotion in straight passages (<xref ref-type="fig" rid="F8">Figure 8</xref>). Finally, we examine locomotion over a diverse set of randomly generated channels that are between 1.7 and 2.8 times wider than the robot, and wander laterally up to three times the robot width over the robot&#x2019;s length. Even for the most consistent controller examined (serpenoid (&#x2b;T)), channel geometry considerably impacts velocity <inline-formula id="inf299">
<mml:math id="m326">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>0.037</mml:mn>
<mml:mfrac>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.10</mml:mn>
<mml:mfrac>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> and cost of transport <inline-formula id="inf300">
<mml:math id="m327">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>0.56</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>2.4</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>. Applying sensory information to regulate the pace of kernel transitions in SHC movement primitives improves average velocity by <inline-formula id="inf301">
<mml:math id="m328">
<mml:mrow>
<mml:mn>25.3</mml:mn>
<mml:mi>&#x0025;</mml:mi>
</mml:mrow>
</mml:math>
</inline-formula> compared to a serpenoid controller that only alters the gait amplitude during contact in a variety of uneven, confined environments. SHC movement primitives thus constitute a transparent, learnable, and adaptable framework for establishing rhythmic gaits.</p>
<p>Our research serves as a practical demonstration of controlling a nonlinear dynamical system with SHC movement primitives and adapting its behavior by incorporationg sensory information. By showing that the weight parameters in SHC movement primitive relate proportionally to the resulting joint trajectories, we provide a pathway for robot operators to intuitively visualize, alter, and design gaits. In optimized controllers, the same visualizations may permit operators to heuristically predict emergent behavior without extensive testing. Thus, the SHC movement primitive controller offers a transparent approach to modeling CPGs, enabling faster development of bio-inspired systems. The abstract, visualizable approach allows researchers to address how CPG modules, represented by saddle equilibria, interact with sensory inputs and other modules to produce complex rhythmic motor patterns.</p>
<p>The present work demonstrates that SHCs are a promising control framework for replicating rhythmic behavior, and suggests that other locomotion patterns may be constructed by tuning weights and modulating progression between kernels. Future research may examine more advanced methods for incorporating sensory feedback to adapt individual joint trajectories, rather than regulating the entire network. Investigating weights and arrangements of saddle equilibria that enable other gaits, such as concertina locomotion would also be worthwhile. Transitioning between gaits may be achievable by expanding upon research by <xref ref-type="bibr" rid="B49">Rouse and Daltorio (2024)</xref>, which explores the effects of sensor noise on decision making. Additionally, integration of more complex sensory information, such as vision, for localization and long term path planning would be beneficial. The effects of multisensory joint adaptation and gait transitions could be analyzed in environments with abrupt directional changes or multiple paths, such as S or T-shaped channels. With these improvements, movement primitives based on SHCs may contribute to research in biology by providing a convenient method for abstractly modeling neurological functions that support locomotion without detailed simulation of underlying cellular dynamics.</p>
</sec>
</body>
<back>
<sec sec-type="data-availability" id="s5">
<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="s6">
<title>Author contributions</title>
<p>NM: Conceptualization, Formal Analysis, Funding acquisition, Investigation, Methodology, Visualization, Writing&#x2013;original draft, Writing&#x2013;review and editing. NR: Writing&#x2013;review and editing. KD: Funding acquisition, Project administration, Resources, Supervision, Writing&#x2013;review and editing.</p>
</sec>
<sec sec-type="funding-information" id="s7">
<title>Funding</title>
<p>The author(s) declare that financial support was received for the research, authorship, and/or publication of this article. This research would not be possible without funding from Department of Defense (DoD) through the National Defense Science &#x26; Engineering Graduate (NDSEG) Fellowship Program. Research was also supported by the National Science Foundation&#x2019;s CAREER award (2047330).</p>
</sec>
<ack>
<p>Additionally, we thank Dr. Hillel Chiel (Department of Biology, Case Western Reserve University) for reviewing and editing this work, as well as Dr. Zonghe Chua (Department of Electrical, Computer, and Systems Engineering, Case Western Reserve University) for advice on statistical analysis.</p>
</ack>
<sec sec-type="COI-statement" id="s8">
<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="s9">
<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="s10">
<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 id="s11">
<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/felec.2025.1507644/full#supplementary-material">https://www.frontiersin.org/articles/10.3389/felec.2025.1507644/full&#x23;supplementary-material</ext-link>
</p>
<supplementary-material>
<label>SUPPLEMENTARY VIDEO S1</label>
<caption>
<p>A comparison of swimming behavior for SHC movement primitive and serpenoid controllers in an unobstructed environment.</p>
</caption>
</supplementary-material>
<supplementary-material>
<label>SUPPLEMENTARY VIDEO S2</label>
<caption>
<p>In a 0.3&#xa0;m channel, tactile sensing improves performance for both SHC movement primitive and serpenoid controllers. SHC controllers undulate both at higher frequency and lower amplitude during contact, while the serpenoid controller only reduces amplitude.</p>
</caption>
</supplementary-material>
<supplementary-material>
<label>SUPPLEMENTARY VIDEO S3</label>
<caption>
<p>Tactile sensor input improves the robot&#x2019;s ability to navigate uneven terrain. However, the robot can still be stymied by obstacles. With sensing, the SHC controller tuned for lateral undulation becomes stuck (t&#x223C;35&#xa0;s), but ultimately recovers.</p>
</caption>
</supplementary-material>
<supplementary-material>
<label>SUPPLEMENTARY FIGURE S1</label>
<caption>
<p>When learning weight parameters via gradient descent for the SHC control system, the velocity and COT stabilize within about 150 iterations.</p>
</caption>
</supplementary-material>
<supplementary-material>
<label>SUPPLEMENTARY FIGURE S2</label>
<caption>
<p>Confidence intervals on cost of transport for experiments in uneven channels are constructed by bootstrapping. 10,000 iterations is sufficient to ensure convergence of both upper and lower bounds for any of the tested controllers.</p>
</caption>
</supplementary-material>
<supplementary-material>
<label>SUPPLEMENTARY FIGURE S3</label>
<caption>
<p>Bootstrapped confidence intervals for velocity in uneven channels converge within 10,000 iterations for all examined controllers.</p>
</caption>
</supplementary-material>
<supplementary-material xlink:href="Video2.avi" id="SM1" mimetype="application/avi" xmlns:xlink="http://www.w3.org/1999/xlink"/>
<supplementary-material xlink:href="Image3.jpeg" id="SM2" mimetype="application/jpeg" xmlns:xlink="http://www.w3.org/1999/xlink"/>
<supplementary-material xlink:href="Video3.avi" id="SM3" mimetype="application/avi" xmlns:xlink="http://www.w3.org/1999/xlink"/>
<supplementary-material xlink:href="Image1.jpeg" id="SM4" mimetype="application/jpeg" xmlns:xlink="http://www.w3.org/1999/xlink"/>
<supplementary-material xlink:href="Image2.jpeg" id="SM5" mimetype="application/jpeg" xmlns:xlink="http://www.w3.org/1999/xlink"/>
<supplementary-material xlink:href="Video1.avi" id="SM6" mimetype="application/avi" xmlns:xlink="http://www.w3.org/1999/xlink"/>
</sec>
<ref-list>
<title>References</title>
<ref id="B1">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Anastasiadis</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Paez</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Melo</surname>
<given-names>K.</given-names>
</name>
<name>
<surname>Tytell</surname>
<given-names>E. D.</given-names>
</name>
<name>
<surname>Ijspeert</surname>
<given-names>A. J.</given-names>
</name>
<name>
<surname>Mulleners</surname>
<given-names>K.</given-names>
</name>
</person-group> (<year>2023</year>). <article-title>Identification of the trade-off between speed and efficiency in undulatory swimming using a bio-inspired robot</article-title>. <source>Sci. Rep.</source> <volume>13</volume>, <fpage>15032</fpage>. <pub-id pub-id-type="doi">10.1038/s41598-023-41074-9</pub-id>
</citation>
</ref>
<ref id="B2">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Andersson</surname>
<given-names>O.</given-names>
</name>
<name>
<surname>Grillner</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Lindquist</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Zomlefer</surname>
<given-names>M.</given-names>
</name>
</person-group> (<year>1978</year>). <article-title>Peripheral control of the spinal pattern generators for locomotion in cat</article-title>. <source>Brain Res.</source> <volume>150</volume>, <fpage>625</fpage>&#x2013;<lpage>630</lpage>. <pub-id pub-id-type="doi">10.1016/0006-8993(78)90827-2</pub-id>
</citation>
</ref>
<ref id="B3">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Ashwin</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Karabacak</surname>
<given-names>&#xc3;.</given-names>
</name>
<name>
<surname>Nowotny</surname>
<given-names>T.</given-names>
</name>
</person-group> (<year>2011</year>). <article-title>Criteria for robustness of heteroclinic cycles in neural microcircuits</article-title>. <source>J. Math. Neurosci.</source> <volume>1</volume>, <fpage>13</fpage>. <pub-id pub-id-type="doi">10.1186/2190-8567-1-13</pub-id>
</citation>
</ref>
<ref id="B4">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Ashwin</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Postlethwaite</surname>
<given-names>C.</given-names>
</name>
</person-group> (<year>2016</year>). <article-title>Quantifying noisy attractors: from heteroclinic to excitable networks</article-title>. <source>SIAM J. Appl. Dyn. Syst.</source> <volume>15</volume>, <fpage>1989</fpage>&#x2013;<lpage>2016</lpage>. <pub-id pub-id-type="doi">10.1137/16M1061813</pub-id>
</citation>
</ref>
<ref id="B5">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Astley</surname>
<given-names>H. C.</given-names>
</name>
<name>
<surname>Jayne</surname>
<given-names>B. C.</given-names>
</name>
</person-group> (<year>2007</year>). <article-title>Effects of perch diameter and incline on the kinematics, performance and modes of arboreal locomotion of corn snakes (Elaphe guttata)</article-title>. <source>J. Exp. Biol.</source> <volume>210</volume>, <fpage>3862</fpage>&#x2013;<lpage>3872</lpage>. <pub-id pub-id-type="doi">10.1242/jeb.009050</pub-id>
</citation>
</ref>
<ref id="B6">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Bechtold</surname>
<given-names>B.</given-names>
</name>
</person-group> (<year>2016</year>). <article-title>Violin plots for matlab</article-title>. <pub-id pub-id-type="doi">10.5281/zenodo.4559847</pub-id>
</citation>
</ref>
<ref id="B7">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Bonardi</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Moeckel</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Sproewitz</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Vespignani</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Ijspeert</surname>
<given-names>A. J.</given-names>
</name>
</person-group> (<year>2012</year>). &#x201c;<article-title>Locomotion through reconfiguration based on motor primitives for roombots self-reconfigurable modular robots</article-title>,&#x201d; in <source>ROBOTIK 2012; 7th German conference on robotics</source>, <fpage>1</fpage>&#x2013;<lpage>6</lpage>.</citation>
</ref>
<ref id="B8">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Brecelj</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Petri&#x10d;</surname>
<given-names>T.</given-names>
</name>
</person-group> (<year>2023a</year>). <article-title>Stable heteroclinic channel networks for physical human-humanoid robot collaboration</article-title>. <source>Sensors</source> <volume>23</volume>, <fpage>1396</fpage>. <pub-id pub-id-type="doi">10.3390/s23031396</pub-id>
</citation>
</ref>
<ref id="B9">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Brecelj</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Petri&#x10d;</surname>
<given-names>T.</given-names>
</name>
</person-group> (<year>2023b</year>). &#x201c;<article-title>Utilizing a phase state system for reliable physical assistance in human-humanoid robot collaboration</article-title>,&#x201d; in <source>2023 21st international conference on advanced robotics (ICAR)</source>, <fpage>258</fpage>&#x2013;<lpage>263</lpage>. <pub-id pub-id-type="doi">10.1109/ICAR58858.2023.10406553</pub-id>
</citation>
</ref>
<ref id="B10">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Chen</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Roth</surname>
<given-names>A.</given-names>
</name>
</person-group> (<year>2023</year>). <article-title>Gait design of a novel arboreal concertina locomotion for snake-like robots</article-title>. <source>ArXiv:2309.06000</source>. <pub-id pub-id-type="doi">10.48550/arXiv.2309.06000</pub-id>
</citation>
</ref>
<ref id="B11">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Cheslet</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Beaubois</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Khoyratee</surname>
<given-names>F.</given-names>
</name>
<name>
<surname>Kohno</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Ikeuchi</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Levi</surname>
<given-names>T.</given-names>
</name>
</person-group> (<year>2024</year>). &#x201c;<article-title>Biomimetic snake locomotion using Central Pattern Generators network and bio-hybrid robot perspective</article-title>,&#x201d; in <source>Isarob</source> (<publisher-loc>Beppu, Japan</publisher-loc>).</citation>
</ref>
<ref id="B12">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Cropper</surname>
<given-names>E. C.</given-names>
</name>
<name>
<surname>Evans</surname>
<given-names>C. G.</given-names>
</name>
<name>
<surname>Hurwitz</surname>
<given-names>I.</given-names>
</name>
<name>
<surname>Jing</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Proekt</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Romero</surname>
<given-names>A.</given-names>
</name>
<etal/>
</person-group> (<year>2004</year>). <article-title>Feeding neural networks in the mollusc Aplysia</article-title>. <source>Neurosignals</source> <volume>13</volume>, <fpage>70</fpage>&#x2013;<lpage>86</lpage>. <pub-id pub-id-type="doi">10.1159/000076159</pub-id>
</citation>
</ref>
<ref id="B13">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Daltorio</surname>
<given-names>K. A.</given-names>
</name>
<name>
<surname>Boxerbaum</surname>
<given-names>A. S.</given-names>
</name>
<name>
<surname>Horchler</surname>
<given-names>A. D.</given-names>
</name>
<name>
<surname>Shaw</surname>
<given-names>K. M.</given-names>
</name>
<name>
<surname>Chiel</surname>
<given-names>H. J.</given-names>
</name>
<name>
<surname>Quinn</surname>
<given-names>R. D.</given-names>
</name>
</person-group> (<year>2013</year>). <article-title>Efficient worm-like locomotion: slip and control of soft-bodied peristaltic robots</article-title>. <source>Bioinspiration and Biomimetics</source> <volume>8</volume>, <fpage>035003</fpage>. <pub-id pub-id-type="doi">10.1088/1748-3182/8/3/035003</pub-id>
</citation>
</ref>
<ref id="B14">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>[Dataset] Rouse</surname>
<given-names>N.</given-names>
</name>
<name>
<surname>Horchler</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Chiel</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Daltorio</surname>
<given-names>K.</given-names>
</name>
</person-group> (<year>2024</year>). <source>Sttable heteroclinic channels as a decision-making model: overcoming low signal-to-noise ratio with mutual inhibition</source>.</citation>
</ref>
<ref id="B15">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Dehghani</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Mahjoob</surname>
<given-names>M. J.</given-names>
</name>
</person-group> (<year>2009</year>). &#x201c;<article-title>A modified serpenoid equation for snake robots</article-title>,&#x201d; in <source>2008 IEEE international conference on robotics and biomimetics</source>, <fpage>1647</fpage>&#x2013;<lpage>1652</lpage>. <pub-id pub-id-type="doi">10.1109/ROBIO.2009.4913248</pub-id>
</citation>
</ref>
<ref id="B16">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Fod</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Matari&#x107;</surname>
<given-names>M. J.</given-names>
</name>
<name>
<surname>Jenkins</surname>
<given-names>O. C.</given-names>
</name>
</person-group> (<year>2002</year>). <article-title>Automated derivation of primitives for movement classification</article-title>. <source>Aut. Robots</source> <volume>12</volume>, <fpage>39</fpage>&#x2013;<lpage>54</lpage>. <pub-id pub-id-type="doi">10.1023/A:1013254724861</pub-id>
</citation>
</ref>
<ref id="B17">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Giszter</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2015</year>). <article-title>Motor primitives&#x2014;new data and future questions</article-title>. <source>Curr. Opin. Neurobiol.</source> <volume>33</volume>, <fpage>156</fpage>&#x2013;<lpage>165</lpage>. <pub-id pub-id-type="doi">10.1016/j.conb.2015.04.004</pub-id>
</citation>
</ref>
<ref id="B18">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Gray</surname>
<given-names>J.</given-names>
</name>
</person-group> (<year>1946</year>). <article-title>The mechanism of locomotion in snakes</article-title>. <source>J. Exp. Biol.</source> <volume>23</volume>, <fpage>101</fpage>&#x2013;<lpage>120</lpage>. <pub-id pub-id-type="doi">10.1242/jeb.23.2.101</pub-id>
</citation>
</ref>
<ref id="B19">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Grillner</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Wall&#xe9;n</surname>
<given-names>P.</given-names>
</name>
</person-group> (<year>2010</year>). &#x201c;<article-title>The lamprey locomotor central pattern generator</article-title>,&#x201d; in <source>Handbook of brain microcircuits</source>. Editors <person-group person-group-type="editor">
<name>
<surname>Shepherd</surname>
<given-names>D.</given-names>
</name>
<name>
<surname>Grillner</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Gordon</surname>
<given-names>P.</given-names>
</name>
</person-group> (<publisher-name>Oxford University Press</publisher-name>). <pub-id pub-id-type="doi">10.1093/med/9780195389883.003.0032</pub-id>
</citation>
</ref>
<ref id="B20">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Guertin</surname>
<given-names>P. A.</given-names>
</name>
</person-group> (<year>2013</year>). <article-title>Central pattern generator for locomotion: anatomical, physiological, and pathophysiological considerations</article-title>. <source>Front. Neurology</source> <volume>3</volume>, <fpage>183</fpage>. <pub-id pub-id-type="doi">10.3389/fneur.2012.00183</pub-id>
</citation>
</ref>
<ref id="B21">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Harris-Warrick</surname>
<given-names>R. M.</given-names>
</name>
</person-group> (<year>2010</year>). <article-title>General principles of rhythmogenesis in central pattern generator networks</article-title>. <source>Prog. Brain Res.</source> <volume>187</volume>, <fpage>213</fpage>&#x2013;<lpage>222</lpage>. <pub-id pub-id-type="doi">10.1016/B978-0-444-53613-6.00014-9</pub-id>
</citation>
</ref>
<ref id="B22">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Hoffmann</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Pastor</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Park</surname>
<given-names>D.-H.</given-names>
</name>
<name>
<surname>Schaal</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2009</year>). &#x201c;<article-title>Biologically-inspired dynamical systems for movement generation: automatic real-time goal adaptation and obstacle avoidance</article-title>,&#x201d; in <source>2009 IEEE international conference on robotics and automation</source>, <fpage>2587</fpage>&#x2013;<lpage>2592</lpage>. <pub-id pub-id-type="doi">10.1109/ROBOT.2009.5152423</pub-id>
</citation>
</ref>
<ref id="B23">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Horchler</surname>
<given-names>A. D.</given-names>
</name>
<name>
<surname>Daltorio</surname>
<given-names>K. A.</given-names>
</name>
<name>
<surname>Chiel</surname>
<given-names>H. J.</given-names>
</name>
<name>
<surname>Quinn</surname>
<given-names>R. D.</given-names>
</name>
</person-group> (<year>2015</year>). <article-title>Designing responsive pattern generators: stable heteroclinic channel cycles for modeling and control</article-title>. <source>Bioinspiration and Biomimetics</source> <volume>10</volume>, <fpage>026001</fpage>. <pub-id pub-id-type="doi">10.1088/1748-3190/10/2/026001</pub-id>
</citation>
</ref>
<ref id="B24">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Huang</surname>
<given-names>Z.</given-names>
</name>
<name>
<surname>Kong</surname>
<given-names>D.</given-names>
</name>
<name>
<surname>Ren</surname>
<given-names>C.</given-names>
</name>
<name>
<surname>Li</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Ma</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2019</year>). &#x201c;<article-title>Performance study of an underwater snake-like robot with a flexible caudal fin</article-title>,&#x201d; in <source>2019 IEEE international conference on mechatronics and automation (ICMA)</source>, <fpage>1</fpage>&#x2013;<lpage>5</lpage>. <pub-id pub-id-type="doi">10.1109/ICMA.2019.8816412</pub-id>
</citation>
</ref>
<ref id="B25">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Hunt</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Szczecinski</surname>
<given-names>N.</given-names>
</name>
<name>
<surname>Quinn</surname>
<given-names>R.</given-names>
</name>
</person-group> (<year>2017</year>). <article-title>Development and training of a neural controller for hind leg walking in a dog robot</article-title>. <source>Front. Neurorobotics</source> <volume>11</volume>, <fpage>18</fpage>. <pub-id pub-id-type="doi">10.3389/fnbot.2017.00018</pub-id>
</citation>
</ref>
<ref id="B26">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Ijspeert</surname>
<given-names>A. J.</given-names>
</name>
</person-group> (<year>2008</year>). <article-title>Central pattern generators for locomotion control in animals and robots: a review</article-title>. <source>Neural Netw.</source> <volume>21</volume>, <fpage>642</fpage>&#x2013;<lpage>653</lpage>. <pub-id pub-id-type="doi">10.1016/j.neunet.2008.03.014</pub-id>
</citation>
</ref>
<ref id="B27">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Ijspeert</surname>
<given-names>A. J.</given-names>
</name>
<name>
<surname>Crespi</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Ryczko</surname>
<given-names>D.</given-names>
</name>
<name>
<surname>Cabelguen</surname>
<given-names>J.-M.</given-names>
</name>
</person-group> (<year>2007</year>). <article-title>From swimming to walking with a salamander robot driven by a spinal cord model</article-title>. <source>Science</source> <volume>315</volume>, <fpage>1416</fpage>&#x2013;<lpage>1420</lpage>. <pub-id pub-id-type="doi">10.1126/science.1138353</pub-id>
</citation>
</ref>
<ref id="B28">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Ijspeert</surname>
<given-names>A. J.</given-names>
</name>
<name>
<surname>Nakanishi</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Hoffmann</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Pastor</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Schaal</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2013</year>). <article-title>Dynamical movement primitives: learning attractor models for motor behaviors</article-title>. <source>Neural Comput.</source> <volume>25</volume>, <fpage>328</fpage>&#x2013;<lpage>373</lpage>. <pub-id pub-id-type="doi">10.1162/NECO_a_00393</pub-id>
</citation>
</ref>
<ref id="B29">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Jayne</surname>
<given-names>B. C.</given-names>
</name>
</person-group> (<year>2020</year>). <article-title>What defines different modes of snake locomotion?</article-title> <source>Integr. Comp. Biol.</source> <volume>60</volume>, <fpage>156</fpage>&#x2013;<lpage>170</lpage>. <pub-id pub-id-type="doi">10.1093/icb/icaa017</pub-id>
</citation>
</ref>
<ref id="B30">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Kelasidi</surname>
<given-names>E.</given-names>
</name>
<name>
<surname>Jesmani</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Pettersen</surname>
<given-names>K. Y.</given-names>
</name>
<name>
<surname>Gravdahl</surname>
<given-names>J. T.</given-names>
</name>
</person-group> (<year>2018</year>). <article-title>Locomotion efficiency optimization of biologically inspired snake robots</article-title>. <source>Appl. Sci.</source> <volume>8</volume>, <fpage>80</fpage>. <pub-id pub-id-type="doi">10.3390/app8010080</pub-id>
</citation>
</ref>
<ref id="B31">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Kelasidi</surname>
<given-names>E.</given-names>
</name>
<name>
<surname>Pettersen</surname>
<given-names>K. Y.</given-names>
</name>
<name>
<surname>Gravdahl</surname>
<given-names>J. T.</given-names>
</name>
<name>
<surname>Liljeb&#xe4;ck</surname>
<given-names>P.</given-names>
</name>
</person-group> (<year>2014</year>). &#x201c;<article-title>Modeling of underwater snake robots</article-title>,&#x201d; in <source>2014 IEEE international conference on robotics and automation (ICRA)</source>, <fpage>4540</fpage>&#x2013;<lpage>4547</lpage>. <pub-id pub-id-type="doi">10.1109/ICRA.2014.6907522</pub-id>
</citation>
</ref>
<ref id="B32">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Kelasidi</surname>
<given-names>E.</given-names>
</name>
<name>
<surname>Pettersen</surname>
<given-names>K. Y.</given-names>
</name>
<name>
<surname>Gravdahl</surname>
<given-names>J. T.</given-names>
</name>
<name>
<surname>Str&#xf8;ms&#xf8;yen</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>S&#xf8;rensen</surname>
<given-names>A.</given-names>
</name>
</person-group> (<year>2017</year>). &#x201c;<article-title>Modeling and propulsion methods of underwater snake robots</article-title>,&#x201d; in <source>2017 IEEE conference on control technology and applications (CCTA)</source>, <fpage>819</fpage>&#x2013;<lpage>826</lpage>. <pub-id pub-id-type="doi">10.1109/CCTA.2017.8062561</pub-id>
</citation>
</ref>
<ref id="B33">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Kober</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Peters</surname>
<given-names>J.</given-names>
</name>
</person-group> (<year>2009</year>). &#x201c;<article-title>Learning motor primitives for robotics</article-title>,&#x201d; in <source>2009 IEEE international conference on robotics and automation</source>, <fpage>2112</fpage>&#x2013;<lpage>2118</lpage>. <pub-id pub-id-type="doi">10.1109/ROBOT.2009.5152577</pub-id>
</citation>
</ref>
<ref id="B34">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Kong</surname>
<given-names>L.-H.</given-names>
</name>
<name>
<surname>He</surname>
<given-names>W.</given-names>
</name>
<name>
<surname>Chen</surname>
<given-names>W.-S.</given-names>
</name>
<name>
<surname>Zhang</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Wang</surname>
<given-names>Y.-N.</given-names>
</name>
</person-group> (<year>2023</year>). <article-title>Dynamic movement primitives based robot skills learning</article-title>. <source>Mach. Intell. Res.</source> <volume>20</volume>, <fpage>396</fpage>&#x2013;<lpage>407</lpage>. <pub-id pub-id-type="doi">10.1007/s11633-022-1346-z</pub-id>
</citation>
</ref>
<ref id="B35">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Lissmann</surname>
<given-names>H. W.</given-names>
</name>
</person-group> (<year>1950</year>). <article-title>Rectilinear locomotion in a snake (Boa occidentalis)</article-title>. <source>J. Exp. Biol.</source> <volume>26</volume>, <fpage>368</fpage>&#x2013;<lpage>379</lpage>. <pub-id pub-id-type="doi">10.1242/jeb.26.4.368</pub-id>
</citation>
</ref>
<ref id="B36">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Marder</surname>
<given-names>E.</given-names>
</name>
<name>
<surname>Eisen</surname>
<given-names>J. S.</given-names>
</name>
</person-group> (<year>1984</year>). <article-title>Electrically coupled pacemaker neurons respond differently to same physiological inputs and neurotransmitters</article-title>. <source>J. Neurophysiology</source> <volume>51</volume>, <fpage>1362</fpage>&#x2013;<lpage>1374</lpage>. <pub-id pub-id-type="doi">10.1152/jn.1984.51.6.1362</pub-id>
</citation>
</ref>
<ref id="B37">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Marques</surname>
<given-names>F.</given-names>
</name>
<name>
<surname>Flores</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Claro</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Lankarani</surname>
<given-names>H.</given-names>
</name>
</person-group> (<year>2016</year>). <article-title>A survey and comparison of several friction force models for dynamic analysis of multibody mechanical systems</article-title>. <source>Nonlinear Dyn.</source> <volume>86</volume>, <fpage>1407</fpage>&#x2013;<lpage>1443</lpage>. <pub-id pub-id-type="doi">10.1007/s11071-016-2999-3</pub-id>
</citation>
</ref>
<ref id="B38">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>McCormack</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Godfrey</surname>
<given-names>K.</given-names>
</name>
</person-group> (<year>1998</year>). <article-title>Rule-based autotuning based on frequency domain identification</article-title>. <source>IEEE Trans. Control Syst. Technol.</source> <volume>6</volume>, <fpage>43</fpage>&#x2013;<lpage>61</lpage>. <pub-id pub-id-type="doi">10.1109/87.654876</pub-id>
</citation>
</ref>
<ref id="B39">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Moreno</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Gomez</surname>
<given-names>J.</given-names>
</name>
</person-group> (<year>2011</year>). &#x201c;<article-title>Central pattern generators and hormone inspired messages: a hybrid control strategy to implement motor primitives on chain type modular reconfigurable robots</article-title>,&#x201d; in <source>2011 IEEE international conference on robotics and automation</source>, <fpage>1014</fpage>&#x2013;<lpage>1019</lpage>. <pub-id pub-id-type="doi">10.1109/ICRA.2011.5980149</pub-id>
</citation>
</ref>
<ref id="B40">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Mosauer</surname>
<given-names>W.</given-names>
</name>
</person-group> (<year>1932</year>). <article-title>On the locomotion of snakes</article-title>. <source>Science</source> <volume>76</volume>, <fpage>583</fpage>&#x2013;<lpage>585</lpage>. <pub-id pub-id-type="doi">10.1126/science.76.1982.583</pub-id>
</citation>
</ref>
<ref id="B41">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Norman-Tenazas</surname>
<given-names>R.</given-names>
</name>
</person-group> (<year>2021</year>). <source>Robust snake robot control via A spiking neuron central pattern generator</source>. <publisher-loc>Baltimore, MD</publisher-loc>: <publisher-name>Johns Hopkins University</publisher-name>. <comment>Master&#x2019;s thesis</comment>.</citation>
</ref>
<ref id="B42">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Ostrowski</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Burdick</surname>
<given-names>J.</given-names>
</name>
</person-group> (<year>1996</year>). <article-title>Gait kinematics for a serpentine robot</article-title>. In , <source>Proceedings of IEEE international conference on robotics and automation</source>. <fpage>1294</fpage>&#x2013;<lpage>1299</lpage>. <pub-id pub-id-type="doi">10.1109/ROBOT.1996.506885</pub-id>
</citation>
</ref>
<ref id="B43">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Paraschos</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Daniel</surname>
<given-names>C.</given-names>
</name>
<name>
<surname>Peters</surname>
<given-names>J. R.</given-names>
</name>
<name>
<surname>Neumann</surname>
<given-names>G.</given-names>
</name>
</person-group> (<year>2013</year>). &#x201c;<article-title>Probabilistic movement primitives</article-title>,&#x201d; in <source>Advances in neural information processing systems</source> (<publisher-loc>San Diego, CA</publisher-loc>: <publisher-name>Neural Information Processing Systems, Inc.</publisher-name>), <volume>26</volume>.</citation>
</ref>
<ref id="B44">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Pastor</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Hoffmann</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Asfour</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Schaal</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2009</year>). &#x201c;<article-title>Learning and generalization of motor skills by learning from demonstration</article-title>,&#x201d; in <source>2009 IEEE international conference on robotics and automation</source>, <fpage>763</fpage>&#x2013;<lpage>768</lpage>. <pub-id pub-id-type="doi">10.1109/ROBOT.2009.5152385</pub-id>
</citation>
</ref>
<ref id="B45">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Pi&#xf1;eirua</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Godoy-Diana</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Thiria</surname>
<given-names>B.</given-names>
</name>
</person-group> (<year>2015</year>). <article-title>Resistive thrust production can be as crucial as added mass mechanisms for inertial undulatory swimmers</article-title>. <source>Phys. Rev. E</source> <volume>92</volume>, <fpage>021001</fpage>. <pub-id pub-id-type="doi">10.1103/PhysRevE.92.021001</pub-id>
</citation>
</ref>
<ref id="B46">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Rabinovich</surname>
<given-names>M. I.</given-names>
</name>
<name>
<surname>Huerta</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Varona</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Afraimovich</surname>
<given-names>V. S.</given-names>
</name>
</person-group> (<year>2006</year>). <article-title>Generation and reshaping of sequences in neural systems</article-title>. <source>Biol. Cybern.</source> <volume>95</volume>, <fpage>519</fpage>&#x2013;<lpage>536</lpage>. <pub-id pub-id-type="doi">10.1007/s00422-006-0121-5</pub-id>
</citation>
</ref>
<ref id="B47">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Riddle</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Jackson</surname>
<given-names>C.</given-names>
</name>
<name>
<surname>Daltorio</surname>
<given-names>K. A.</given-names>
</name>
<name>
<surname>Quinn</surname>
<given-names>R. D.</given-names>
</name>
</person-group> (<year>2023</year>). &#x201c;<article-title>A dynamic simulation of&#xc2; a&#xc2; compliant worm robot amenable to&#xc2; neural control</article-title>,&#x201d; in <source>Biomimetic and biohybrid systems</source>. Editors <person-group person-group-type="editor">
<name>
<surname>Meder</surname>
<given-names>F.</given-names>
</name>
<name>
<surname>Hunt</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Margheri</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Mura</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Mazzolai</surname>
<given-names>B.</given-names>
</name>
</person-group> (<publisher-loc>Cham</publisher-loc>: <publisher-name>Springer Nature Switzerland</publisher-name>), <fpage>338</fpage>&#x2013;<lpage>352</lpage>. <pub-id pub-id-type="doi">10.1007/978-3-031-38857-6_25</pub-id>
</citation>
</ref>
<ref id="B48">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Rollinson</surname>
<given-names>D.</given-names>
</name>
<name>
<surname>Choset</surname>
<given-names>H.</given-names>
</name>
</person-group> (<year>2013</year>). &#x201c;<article-title>Gait-based compliant control for snake robots</article-title>,&#x201d; in <source>2013 IEEE international conference on robotics and automation</source>, <fpage>5138</fpage>&#x2013;<lpage>5143</lpage>. <pub-id pub-id-type="doi">10.1109/ICRA.2013.6631311</pub-id>
</citation>
</ref>
<ref id="B49">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Rouse</surname>
<given-names>N.</given-names>
</name>
<name>
<surname>Daltorio</surname>
<given-names>K.</given-names>
</name>
</person-group> (<year>2024</year>). <article-title>Stable heteroclinic channel-based movement primitives: tuning trajectories using saddle parameters</article-title>. <source>Appl. Sci.</source> <volume>14</volume>, <fpage>2523</fpage>. <pub-id pub-id-type="doi">10.3390/app14062523</pub-id>
</citation>
</ref>
<ref id="B50">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Rouse</surname>
<given-names>N. A.</given-names>
</name>
<name>
<surname>Daltorio</surname>
<given-names>K. A.</given-names>
</name>
</person-group> (<year>2021</year>). <article-title>Visualization of stable heteroclinic channel-based movement primitives</article-title>. <source>IEEE Robotics Automation Lett.</source> <volume>6</volume>, <fpage>2343</fpage>&#x2013;<lpage>2348</lpage>. <pub-id pub-id-type="doi">10.1109/LRA.2021.3061382</pub-id>
</citation>
</ref>
<ref id="B51">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Sato</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Fukaya</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Iwasaki</surname>
<given-names>T.</given-names>
</name>
</person-group> (<year>2002</year>). <article-title>Serpentine locomotion with robotic snakes</article-title>. <source>IEEE Control Syst. Mag.</source> <volume>22</volume>, <fpage>64</fpage>&#x2013;<lpage>81</lpage>. <pub-id pub-id-type="doi">10.1109/37.980248</pub-id>
</citation>
</ref>
<ref id="B52">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Schaal</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2006</year>). &#x201c;<article-title>Dynamic movement primitives -A framework for motor control in humans and humanoid robotics</article-title>,&#x201d; in <source>Adaptive motion of animals and machines</source>. Editors <person-group person-group-type="editor">
<name>
<surname>Kimura</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Tsuchiya</surname>
<given-names>K.</given-names>
</name>
<name>
<surname>Ishiguro</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Witte</surname>
<given-names>H.</given-names>
</name>
</person-group> (<publisher-loc>Tokyo</publisher-loc>: <publisher-name>Springer</publisher-name>), <fpage>261</fpage>&#x2013;<lpage>280</lpage>. <pub-id pub-id-type="doi">10.1007/4-431-31381-8_23</pub-id>
</citation>
</ref>
<ref id="B53">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Shaw</surname>
<given-names>K. M.</given-names>
</name>
<name>
<surname>Lyttle</surname>
<given-names>D. N.</given-names>
</name>
<name>
<surname>Gill</surname>
<given-names>J. P.</given-names>
</name>
<name>
<surname>Cullins</surname>
<given-names>M. J.</given-names>
</name>
<name>
<surname>McManus</surname>
<given-names>J. M.</given-names>
</name>
<name>
<surname>Lu</surname>
<given-names>H.</given-names>
</name>
<etal/>
</person-group> (<year>2015</year>). <article-title>The significance of dynamical architecture for adaptive responses to mechanical loads during rhythmic behavior</article-title>. <source>J. Comput. Neurosci.</source> <volume>38</volume>, <fpage>25</fpage>&#x2013;<lpage>51</lpage>. <pub-id pub-id-type="doi">10.1007/s10827-014-0519-3</pub-id>
</citation>
</ref>
<ref id="B54">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Sherrington</surname>
<given-names>C. S.</given-names>
</name>
</person-group> (<year>1910</year>). <article-title>Flexion-reflex of the limb, crossed extension-reflex, and reflex stepping and standing</article-title>. <source>J. Physiology</source> <volume>40</volume>, <fpage>28</fpage>&#x2013;<lpage>121</lpage>. <pub-id pub-id-type="doi">10.1113/jphysiol.1910.sp001362</pub-id>
</citation>
</ref>
<ref id="B55">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Shigeo</surname>
<given-names>H.</given-names>
</name>
</person-group> (<year>1994</year>). <article-title>Biologically inspired robots: snake-like locomotors and manipulators by Shigeo hirose oxford university press, oxford, 1993, 220<italic>pages, incl. Index</italic> (&#xa3;40)</article-title>. <source>Robotica</source> <volume>12</volume>, <fpage>282</fpage>. <pub-id pub-id-type="doi">10.1017/S0263574700017264</pub-id>
</citation>
</ref>
<ref id="B56">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Simoni</surname>
<given-names>M. F.</given-names>
</name>
<name>
<surname>DeWeerth</surname>
<given-names>S. P.</given-names>
</name>
</person-group> (<year>2007</year>). <article-title>Sensory feedback in a half-center oscillator model</article-title>. <source>IEEE Trans. Biomed. Eng.</source> <volume>54</volume>, <fpage>193</fpage>&#x2013;<lpage>204</lpage>. <pub-id pub-id-type="doi">10.1109/TBME.2006.886868</pub-id>
</citation>
</ref>
<ref id="B57">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Tagliabue</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Ciancio</surname>
<given-names>A. L.</given-names>
</name>
<name>
<surname>Brochier</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Eskiizmirliler</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Maier</surname>
<given-names>M. A.</given-names>
</name>
</person-group> (<year>2015</year>). <article-title>Differences between kinematic synergies and muscle synergies during two-digit grasping</article-title>. <source>Front. Hum. Neurosci.</source> <volume>9</volume>, <fpage>165</fpage>. <pub-id pub-id-type="doi">10.3389/fnhum.2015.00165</pub-id>
</citation>
</ref>
<ref id="B58">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Tesch</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Lipkin</surname>
<given-names>K.</given-names>
</name>
<name>
<surname>Brown</surname>
<given-names>I.</given-names>
</name>
<name>
<surname>Hatton</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Peck</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Rembisz</surname>
<given-names>J.</given-names>
</name>
<etal/>
</person-group> (<year>2009</year>). <article-title>Parameterized and scripted gaits for modular snake robots</article-title>. <source>Adv. Robot.</source> <volume>23</volume>, <fpage>1131</fpage>&#x2013;<lpage>1158</lpage>. <pub-id pub-id-type="doi">10.1163/156855309X452566</pub-id>
</citation>
</ref>
<ref id="B59">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Thandiackal</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Melo</surname>
<given-names>K.</given-names>
</name>
<name>
<surname>Paez</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Herault</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Kano</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Akiyama</surname>
<given-names>K.</given-names>
</name>
<etal/>
</person-group> (<year>2021</year>). <article-title>Emergence of robust self-organized undulatory swimming based on local hydrodynamic force sensing</article-title>. <source>Sci. Robotics</source> <volume>6</volume>, <fpage>eabf6354</fpage>. <pub-id pub-id-type="doi">10.1126/scirobotics.abf6354</pub-id>
</citation>
</ref>
<ref id="B60">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Travers</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Gong</surname>
<given-names>C.</given-names>
</name>
<name>
<surname>Choset</surname>
<given-names>H.</given-names>
</name>
</person-group> (<year>2015</year>). &#x201c;<article-title>Shape-constrained whole-body adaptivity</article-title>,&#x201d; in <source>2015 IEEE international symposium on safety, security, and rescue robotics (SSRR)</source>, <fpage>1</fpage>&#x2013;<lpage>6</lpage>. <pub-id pub-id-type="doi">10.1109/SSRR.2015.7442945</pub-id>
</citation>
</ref>
<ref id="B61">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Travers</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Whitman</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Choset</surname>
<given-names>H.</given-names>
</name>
</person-group> (<year>2018</year>). <article-title>Shape-based coordination in locomotion control</article-title>. <source>Int. J. Robotics Res.</source> <volume>37</volume>, <fpage>1253</fpage>&#x2013;<lpage>1268</lpage>. <pub-id pub-id-type="doi">10.1177/0278364918761569</pub-id>
</citation>
</ref>
<ref id="B62">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Tresch</surname>
<given-names>M. C.</given-names>
</name>
<name>
<surname>Bizzi</surname>
<given-names>E.</given-names>
</name>
</person-group> (<year>1999</year>). <article-title>Responses to spinal microstimulation in the chronically spinalized rat and their relationship to spinal systems activated by low threshold cutaneous stimulation</article-title>. <source>Exp. Brain Res.</source> <volume>129</volume>, <fpage>0401</fpage>&#x2013;<lpage>0416</lpage>. <pub-id pub-id-type="doi">10.1007/s002210050908</pub-id>
</citation>
</ref>
<ref id="B63">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Wang</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Ouyang</surname>
<given-names>W.</given-names>
</name>
<name>
<surname>Gao</surname>
<given-names>W.</given-names>
</name>
<name>
<surname>Ren</surname>
<given-names>Q.</given-names>
</name>
</person-group> (<year>2017a</year>). &#x201c;<article-title>Locomotion control of a serpentine crawling robot inspired by central pattern generators</article-title>,&#x201d; in <source>2017 asia-pacific signal and information processing association annual summit and conference (APSIPA ASC)</source>, <fpage>414</fpage>&#x2013;<lpage>419</lpage>. <pub-id pub-id-type="doi">10.1109/APSIPA.2017.8282067</pub-id>
</citation>
</ref>
<ref id="B64">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Wang</surname>
<given-names>Z.</given-names>
</name>
<name>
<surname>Gao</surname>
<given-names>Q.</given-names>
</name>
<name>
<surname>Zhao</surname>
<given-names>H.</given-names>
</name>
</person-group> (<year>2017b</year>). <article-title>CPG-inspired locomotion control for a snake robot basing on nonlinear oscillators</article-title>. <source>J. Intelligent and Robotic Syst.</source> <volume>85</volume>, <fpage>209</fpage>&#x2013;<lpage>227</lpage>. <pub-id pub-id-type="doi">10.1007/s10846-016-0373-9</pub-id>
</citation>
</ref>
<ref id="B65">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Yu</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Tan</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Chen</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Zhang</surname>
<given-names>J.</given-names>
</name>
</person-group> (<year>2014</year>). <article-title>A survey on CPG-inspired control models and system implementation</article-title>. <source>IEEE Trans. Neural Netw. Learn. Syst.</source> <volume>25</volume>, <fpage>441</fpage>&#x2013;<lpage>456</lpage>. <pub-id pub-id-type="doi">10.1109/TNNLS.2013.2280596</pub-id>
</citation>
</ref>
</ref-list>
</back>
</article>