<?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. Control. Eng.</journal-id>
<journal-title>Frontiers in Control Engineering</journal-title>
<abbrev-journal-title abbrev-type="pubmed">Front. Control. Eng.</abbrev-journal-title>
<issn pub-type="epub">2673-6268</issn>
<publisher>
<publisher-name>Frontiers Media S.A.</publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id pub-id-type="publisher-id">782121</article-id>
<article-id pub-id-type="doi">10.3389/fcteg.2021.782121</article-id>
<article-categories>
<subj-group subj-group-type="heading">
<subject>Control Engineering</subject>
<subj-group>
<subject>Original Research</subject>
</subj-group>
</subj-group>
</article-categories>
<title-group>
<article-title>Planar Formation Control of a School of Robotic Fish: Theory and Experiments</article-title>
<alt-title alt-title-type="left-running-head">Paley et&#x20;al.</alt-title>
<alt-title alt-title-type="right-running-head">Planar Formation of Robotic Fish</alt-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname>Paley</surname>
<given-names>Derek A.</given-names>
</name>
<xref ref-type="aff" rid="aff1">
<sup>1</sup>
</xref>
</contrib>
<contrib contrib-type="author" corresp="yes">
<name>
<surname>Thompson</surname>
<given-names>Anthony A.</given-names>
</name>
<xref ref-type="aff" rid="aff2">
<sup>2</sup>
</xref>
<xref ref-type="corresp" rid="c001">&#x2a;</xref>
<uri xlink:href="https://loop.frontiersin.org/people/1482710/overview"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Wolek</surname>
<given-names>Artur</given-names>
</name>
<xref ref-type="aff" rid="aff3">
<sup>3</sup>
</xref>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Ghanem</surname>
<given-names>Paul</given-names>
</name>
<xref ref-type="aff" rid="aff4">
<sup>4</sup>
</xref>
</contrib>
</contrib-group>
<aff id="aff1">
<label>
<sup>1</sup>
</label>Department of Aerospace Engineering, Institute for Systems Research, University of Maryland, <addr-line>College Park</addr-line>, <addr-line>MD</addr-line>, <country>United&#x20;States</country>
</aff>
<aff id="aff2">
<label>
<sup>2</sup>
</label>Department of Aerospace Engineering, University of Maryland, <addr-line>College Park</addr-line>, <addr-line>MD</addr-line>, <country>United&#x20;States</country>
</aff>
<aff id="aff3">
<label>
<sup>3</sup>
</label>Department of Mechanical Engineering and Engineering Science, University of North Carolina at Charlotte, <addr-line>Charlotte</addr-line>, <addr-line>NC</addr-line>, <country>United&#x20;States</country>
</aff>
<aff id="aff4">
<label>
<sup>4</sup>
</label>Department of Electrical Engineering, Northeastern University, <addr-line>Boston</addr-line>, <addr-line>MA</addr-line>, <country>United&#x20;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/977805/overview">Paulo Lopes Dos Santos</ext-link>, University of Porto, Portugal</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/996124/overview">Fotis Nicholas Koumboulis</ext-link>, National and Kapodistrian University of Athens, Greece</p>
<p>
<ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/472563/overview">Sunan Huang</ext-link>, National University of Singapore, Singapore</p>
<p>
<ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/1506697/overview">Xiao Yu</ext-link>, Xiamen University, China</p>
</fn>
<corresp id="c001">&#x2a;Correspondence: Anthony A. Thompson, <email>athomp95@umd.edu</email>
</corresp>
<fn fn-type="other">
<p>This article was submitted to Control and Automation Systems, a section of the journal Frontiers in Control Engineering</p>
</fn>
</author-notes>
<pub-date pub-type="epub">
<day>03</day>
<month>12</month>
<year>2021</year>
</pub-date>
<pub-date pub-type="collection">
<year>2021</year>
</pub-date>
<volume>2</volume>
<elocation-id>782121</elocation-id>
<history>
<date date-type="received">
<day>23</day>
<month>09</month>
<year>2021</year>
</date>
<date date-type="accepted">
<day>01</day>
<month>11</month>
<year>2021</year>
</date>
</history>
<permissions>
<copyright-statement>Copyright &#xa9; 2021 Paley, Thompson, Wolek and Ghanem.</copyright-statement>
<copyright-year>2021</copyright-year>
<copyright-holder>Paley, Thompson, Wolek and Ghanem</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&#x20;terms.</p>
</license>
</permissions>
<abstract>
<p>This paper presents a nonlinear control design for the stabilization of parallel and circular motion in a school of robotic fish actuated with internal reaction wheels. The closed-loop swimming dynamics of the fish robots are represented by the canonical Chaplygin sleigh. They exchange relative state information according to a connected, undirected communication graph to form a system of coupled, nonlinear, second-order oscillators. Prior work on collective motion of constant-speed, self-propelled particles serves as the foundation of our approach. However, unlike a self-propelled particle, the fish robots follow limit-cycle dynamics to sustain periodic flapping for forward motion with time-varying speed. Parallel and circular motions are achieved in an average sense without feedback linearization of the agents&#x2019; dynamics. Implementation of the proposed parallel formation control law on an actual school of soft robotic fish is described, including system identification experiments to identify motor dynamics and the design of a motor torque-tracking controller to follow the formation torque control. Experimental results demonstrate a school of four robotic fish achieving parallel formations starting from random initial conditions.</p>
</abstract>
<kwd-group>
<kwd>bio-inspired robotics</kwd>
<kwd>formation control</kwd>
<kwd>network systems control</kwd>
<kwd>DC motor control and estimation</kwd>
<kwd>AUV control</kwd>
</kwd-group>
</article-meta>
</front>
<body>
<sec id="s1">
<title>1 Introduction</title>
<p>Collective behavior of mobile agents has received significant interest recently in fields such as biology, physics, computer science, and control engineering (<xref ref-type="bibr" rid="B28">Reynolds, 1987</xref>; <xref ref-type="bibr" rid="B33">Vicsek et&#x20;al., 1995</xref>; <xref ref-type="bibr" rid="B27">Ren et&#x20;al., 2007</xref>). Research in this area is allowing scientists to better understand swarming behavior in nature and benefits control engineers in numerous applications by mimicking nature&#x2019;s behavior in engineered mobile systems such as unmanned ground, air, and underwater vehicles.</p>
<p>Previous investigations of bioinspired underwater vehicles include the design, sensing, and control of a single fish-inspired robot that is driven by an internal reaction wheel (<xref ref-type="bibr" rid="B38">Zhang et&#x20;al., 2016</xref>; <xref ref-type="bibr" rid="B10">Free et&#x20;al., 2017</xref>; <xref ref-type="bibr" rid="B17">Lee et&#x20;al., 2019</xref>). Here, we present control laws that stabilize planar formations of a school of such robotic fish (<xref ref-type="fig" rid="F1">Figure&#x20;1</xref>). Related work involving formation experiments of fish robots propelled by tail flapping was presented in (<xref ref-type="bibr" rid="B1">Berlinger et&#x20;al., 2021</xref>; <xref ref-type="bibr" rid="B39">Zhang et&#x20;al., 2021</xref>). In (<xref ref-type="bibr" rid="B1">Berlinger et&#x20;al., 2021</xref>), a school of fish robots achieves circular formations and other collective behaviors using vision-based behaviors based on relative position. Similarily, in (<xref ref-type="bibr" rid="B39">Zhang et&#x20;al., 2021</xref>), parallel and circular formations are achieved using an overhead camera to provide absolute positions of all the agents. Our work differs in that we investigate synchronized motion of multiple fish robots driven by an internal reaction wheel. We utilize consensus control to achieve collective motion by communicating only relative position and/or orientation with nearby agents. This approach is particularly well suited to challenging underwater environments where small, low-power robots have limited communication or sensing&#x20;range.</p>
<fig id="F1" position="float">
<label>FIGURE 1</label>
<caption>
<p>A school of soft robotic fish serves as a testbed for formation control experiments at the University of Maryland&#x2019;s Neutral Buoyancy Research Facility.</p>
</caption>
<graphic xlink:href="fcteg-02-782121-g001.tif"/>
</fig>
<p>Consensus control in Euclidean space, which assumes that the states of the system live on <inline-formula id="inf1">
<mml:math id="m1">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>, is a well-studied topic (<xref ref-type="bibr" rid="B6">Cao et&#x20;al., 2013</xref>). The goal of consensus control is to steer <italic>N</italic> agents into identical states. Similarly, average-consensus control laws steer agents towards the average value of the initial conditions of the agents (<xref ref-type="bibr" rid="B21">Olshevsky, 2015</xref>). Consensus and average consensus are typically studied for single-integrator dynamics (<xref ref-type="bibr" rid="B26">Ren and Beard, 2005</xref>), which may contain linear or nonlinear drift vector fields (<xref ref-type="bibr" rid="B5">Cao and Ren, 2012</xref>). Interactions between agents can be static (<xref ref-type="bibr" rid="B7">Chopra, 2012</xref>), time-varying (<xref ref-type="bibr" rid="B19">Moreau, 2005</xref>), all-to-all (<xref ref-type="bibr" rid="B7">Chopra, 2012</xref>), or limited (<xref ref-type="bibr" rid="B18">Li et&#x20;al., 2011</xref>). These interactions are typically described using the Laplacian matrix from algebraic graph theory (<xref ref-type="bibr" rid="B12">Horn and Johnson, 1990</xref>) to compute relative state information, such as relative position. Consensus and average consensus in Euclidean space have also been studied for double-integrator dynamics (<xref ref-type="bibr" rid="B37">Zhang and Tian, 2009</xref>) and second-order systems with a nonlinear drift vector field that represents the vehicle dynamics (<xref ref-type="bibr" rid="B35">Yu et&#x20;al., 2010</xref>). Furthermore, consensus control on a nonlinear manifold has been investigated (<xref ref-type="bibr" rid="B29">Scardovi et&#x20;al., 2007</xref>; <xref ref-type="bibr" rid="B24">Paley, 2009</xref>). For example, consensus on the <italic>N</italic>-torus&#x2014;also called synchronization&#x2014;arises in the control of planar formations, where the heading orientation is a phase angle on the unit circle (<xref ref-type="bibr" rid="B30">Sepulchre et&#x20;al., 2007</xref>). Orientation and translation control of agents in the plane utilizes the special Euclidean group (<xref ref-type="bibr" rid="B14">Justh and Krishnaprasad, 2004</xref>). Many synchronization approaches are based on the theory of coupled oscillators, such as the celebrated Kuramoto model (<xref ref-type="bibr" rid="B30">Sepulchre et&#x20;al., 2007</xref>), and invoke the graph Laplacian for cooperative control of first-order dynamics on the <italic>N</italic>-torus (<xref ref-type="bibr" rid="B31">Sepulchre et&#x20;al., 2008</xref>). Second-order consensus of coupled oscillators with double-integrator dynamics (<xref ref-type="bibr" rid="B20">Napora and Paley, 2013</xref>) uses the gradient of a phase potential.</p>
<p>Another class of collective behaviors of multi-agent systems are circular formations. Previous work in this area studied circular formations of first-order, self-propelled particles with unit velocity. Feedback control laws designed in (<xref ref-type="bibr" rid="B30">Sepulchre et&#x20;al., 2007</xref>) stabilize a circular formation having a fixed center and a constant radius. Some extensions to this work consider a circular formation in a flow field (<xref ref-type="bibr" rid="B23">Paley, 2008</xref>) and constant non-unitary velocity, or with a constraint bounding the circular formation to a region of interest (<xref ref-type="bibr" rid="B13">Jain and Ghose, 2019</xref>). Other extensions include time-varying centers, so that the circular formation position is not fixed (<xref ref-type="bibr" rid="B3">Brin&#xf3;n-Arranz et&#x20;al., 2014</xref>; <xref ref-type="bibr" rid="B34">Yu and Liu, 2017</xref>). Some authors assume agents use relative-position sensing to achieve circular formations around a given center and radius that is known only to a subset of agents (<xref ref-type="bibr" rid="B36">Yu et&#x20;al., 2018</xref>). Circular formation control on the tangent bundle of the <italic>N</italic>-torus has also been investigated where agents are second-order self-propelled particles (<xref ref-type="bibr" rid="B30">Sepulchre et&#x20;al., 2007</xref>; <xref ref-type="bibr" rid="B20">Napora and Paley, 2013</xref>).</p>
<p>This work investigates planar formations in a novel setting: a system of second-order oscillators with nonlinear dynamics and nonholonomic constraints on the tangent bundle of the <italic>N</italic>-torus. The closed-loop swimming dynamics of the fish robots are represented by the Chaplygin sleigh (<xref ref-type="bibr" rid="B15">Kelly et&#x20;al., 2012</xref>), (<xref ref-type="bibr" rid="B17">Lee et&#x20;al., 2019</xref>), a nonholonomic mechanical system driven by an internal reaction wheel. Our control design is inspired by prior work on collective motion of self-propelled particles (<xref ref-type="bibr" rid="B22">Paley, 2007</xref>; <xref ref-type="bibr" rid="B30">Sepulchre et&#x20;al., 2007</xref>; <xref ref-type="bibr" rid="B23">Paley, 2008</xref>; <xref ref-type="bibr" rid="B20">Napora and Paley, 2013</xref>); however, a key distinction is that agents have second-order limit-cycle dynamics with time-varying speed. Thus, novel parallel and circular formations are achieved in an average&#x20;sense.</p>
<p>The contributions of this paper are 1) a control design that achieves parallel motion for a school of robotic fish, represented by a system of coupled, nonlinear, second-order oscillators with Chaplygin sleigh dynamics using only relative state information; 2) a control design that achieves circular motion for the same system; 3) system identification of the reaction-wheel motor dynamics and the design of an optimal estimation and tracking controller that follows the torque commands of the formation control; and 4) experimental validation of the parallel formation control law on a school of bio-inspired robotic fish (<xref ref-type="fig" rid="F1">Figure&#x20;1</xref>). The proposed control algorithms are illustrated through both numerical simulations and experiments in the University of Maryland&#x2019;s Neutral Buoyancy Research Facility.</p>
<p>The remainder of the paper is organized as follows. <xref ref-type="sec" rid="s2">Section 2</xref> provides preliminaries on graph theory, the self-propelled particle model, and Chaplygin sleigh dynamics. <xref ref-type="sec" rid="s3">Section 3</xref> present control designs to achieve parallel and circular formations for a robotic fish school. <xref ref-type="sec" rid="s4">Section 4</xref> presents the experimental implementation and results for the parallel formation control for a school of robotic fish. Lastly, <xref ref-type="sec" rid="s5">Section 5</xref> summarizes the paper and discusses ongoing and future&#x20;work.</p>
</sec>
<sec id="s2">
<title>2 Background</title>
<p>This section reviews concepts from graph theory, presents the self-propelled particle model, and summarizes the dynamics of a Chaplygin sleigh, used to model our robotic&#x20;fish.</p>
<sec id="s2-1">
<title>2.1 Graph Theory</title>
<p>A graph is used to represent the communication topology of an interacting system of agents. The communication graph is built upon a set of nodes <inline-formula id="inf2">
<mml:math id="m2">
<mml:mi mathvariant="script">V</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">{</mml:mo>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">}</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> that represent agents. An edge denoted by the pair (<italic>k</italic>, <italic>j</italic>) exists between agent <inline-formula id="inf3">
<mml:math id="m3">
<mml:mi>k</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="script">V</mml:mi>
</mml:math>
</inline-formula> and <inline-formula id="inf4">
<mml:math id="m4">
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="script">V</mml:mi>
</mml:math>
</inline-formula> if information flows from <italic>j</italic> to <italic>k</italic>. The set of all edges is denoted <inline-formula id="inf5">
<mml:math id="m5">
<mml:mi mathvariant="script">E</mml:mi>
<mml:mo>&#x2286;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>. The set of nodes <inline-formula id="inf6">
<mml:math id="m6">
<mml:mi mathvariant="script">V</mml:mi>
</mml:math>
</inline-formula> and the edges <inline-formula id="inf7">
<mml:math id="m7">
<mml:mi mathvariant="script">E</mml:mi>
</mml:math>
</inline-formula> define a graph <inline-formula id="inf8">
<mml:math id="m8">
<mml:mi>G</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="script">V</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="script">E</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> (<xref ref-type="bibr" rid="B9">Diestel, 2000</xref>). A sequence of edges {(<italic>k</italic>, <italic>k</italic>
<sub>1</sub>), (<italic>k</italic>
<sub>1</sub>, <italic>k</italic>
<sub>2</sub>), &#x2026;, (<italic>k</italic>
<sub>
<italic>&#x3be;</italic>
</sub>, <italic>j</italic>)} with distinct nodes <inline-formula id="inf9">
<mml:math id="m9">
<mml:msub>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>l</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="script">V</mml:mi>
</mml:math>
</inline-formula>, <italic>k</italic>
<sub>
<italic>l</italic>
</sub> &#x2260; <italic>k</italic>, <italic>k</italic>
<sub>
<italic>l</italic>
</sub> &#x2260; <italic>j</italic>, for <italic>l</italic>&#x20;&#x3d; 1, 2, &#x2026;, <italic>&#x3be;</italic> is called a path from node <italic>k</italic> to node <italic>j</italic>. A graph <italic>G</italic> is called undirected if <inline-formula id="inf10">
<mml:math id="m10">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="script">E</mml:mi>
</mml:math>
</inline-formula> implies <inline-formula id="inf11">
<mml:math id="m11">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="script">E</mml:mi>
</mml:math>
</inline-formula>. For a undirected graph, the set of neighbors to node <italic>k</italic> is denoted <inline-formula id="inf12">
<mml:math id="m12">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">{</mml:mo>
<mml:mrow>
<mml:mi>v</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="script">V</mml:mi>
<mml:mspace width="0.3333em" class="nbsp"/>
<mml:mo>:</mml:mo>
<mml:mspace width="0.3333em" class="nbsp"/>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="script">E</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">}</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>. If there exists a path between any pair of distinct nodes <inline-formula id="inf13">
<mml:math id="m13">
<mml:mi>k</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="script">V</mml:mi>
</mml:math>
</inline-formula>, then an undirected graph <italic>G</italic> is called connected. Edges are expressed using the adjacency matrix <inline-formula id="inf14">
<mml:math id="m14">
<mml:mi>A</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
<mml:mo>&#xd7;</mml:mo>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>, where the entry on the <italic>k</italic>th row and <italic>j</italic>th column is<disp-formula id="equ1">
<mml:math id="m15">
<mml:msub>
<mml:mrow>
<mml:mi>A</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mi>j</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:mn>1</mml:mn>
<mml:mspace width="1em"/>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mtext>if</mml:mtext>
<mml:mspace width="0.3333em" class="nbsp"/>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="script">E</mml:mi>
</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:mtext>otherwise</mml:mtext>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:math>
</disp-formula>
</p>
<p>The degree matrix <inline-formula id="inf15">
<mml:math id="m16">
<mml:mi>D</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
<mml:mo>&#xd7;</mml:mo>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> encodes how many unique edges are connected to each node and has nonzero elements on the diagonal, i.e.,<disp-formula id="equ2">
<mml:math id="m17">
<mml:msub>
<mml:mrow>
<mml:mi>D</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mi>j</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:msubsup>
<mml:mrow>
<mml:mo movablelimits="false" form="prefix">&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>n</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:msub>
<mml:mrow>
<mml:mi>A</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mi>n</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mspace width="1em"/>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mtext>if</mml:mtext>
<mml:mspace width="1em"/>
<mml:mi>k</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>j</mml:mi>
</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:mtext>otherwise</mml:mtext>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:math>
</disp-formula>
</p>
<p>The symmetric and positive semi-definite Laplacian matrix <inline-formula id="inf16">
<mml:math id="m18">
<mml:mi>L</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
<mml:mo>&#xd7;</mml:mo>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> associated with the undirected graph <italic>G</italic> is <italic>L</italic>&#x20;&#x3d; <italic>D</italic>&#x20;&#x2212; <italic>A</italic>. The Laplacian is used to compute relative state information communicated between agents. The quadratic form <bold>
<italic>z</italic>
</bold>
<sup>
<italic>T</italic>
</sup>
<italic>L</italic>
<bold>
<italic>z</italic>
</bold> &#x2265; 0, where <inline-formula id="inf17">
<mml:math id="m19">
<mml:mi mathvariant="bold-italic">z</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>, is equal to zero if and only if <italic>z</italic>
<sub>
<italic>k</italic>
</sub> &#x3d; <italic>z</italic>
<sub>
<italic>j</italic>
</sub>, for all <inline-formula id="inf18">
<mml:math id="m20">
<mml:mi>k</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="script">V</mml:mi>
</mml:math>
</inline-formula>.</p>
</sec>
<sec id="s2-2">
<title>2.2&#x20;Self-Propelled Particle Model</title>
<p>The self-propelled particle model (<xref ref-type="bibr" rid="B14">Justh and Krishnaprasad, 2004</xref>) has often been used to describe the collective motion of <italic>N</italic> planar vehicles that move at a constant speed with steering controls inputs. The planar position of the <italic>k</italic>th particle with respect to the origin of the inertial frame is expressed using complex coordinates as <inline-formula id="inf19">
<mml:math id="m21">
<mml:msub>
<mml:mrow>
<mml:mi>r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</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>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="double-struck">C</mml:mi>
</mml:math>
</inline-formula>, where <inline-formula id="inf20">
<mml:math id="m22">
<mml:mi>k</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="script">V</mml:mi>
</mml:math>
</inline-formula>. The dynamics of the <italic>k</italic>th particle are<disp-formula id="e1">
<mml:math id="m23">
<mml:mtable class="aligned">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>r</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msup>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(1)</label>
</disp-formula>where, for the <italic>k</italic>th particle, <inline-formula id="inf21">
<mml:math id="m24">
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x225c;</mml:mo>
<mml:msqrt>
<mml:mrow>
<mml:msubsup>
<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>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2b;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:msqrt>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:math>
</inline-formula> is a constant speed, <inline-formula id="inf22">
<mml:math id="m25">
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x225c;</mml:mo>
<mml:mi mathvariant="normal">a</mml:mi>
<mml:mi mathvariant="normal">t</mml:mi>
<mml:mi mathvariant="normal">a</mml:mi>
<mml:mi mathvariant="normal">n</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>/</mml:mo>
<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>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="double-struck">T</mml:mi>
</mml:math>
</inline-formula> is the orientation of the velocity (also called the phase of the particle), <inline-formula id="inf23">
<mml:math id="m26">
<mml:mi mathvariant="double-struck">T</mml:mi>
<mml:mo>&#x225c;</mml:mo>
<mml:mi mathvariant="double-struck">S</mml:mi>
</mml:math>
</inline-formula> is the torus, and <inline-formula id="inf24">
<mml:math id="m27">
<mml:msub>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:math>
</inline-formula> is the steering control. The unit vector <inline-formula id="inf25">
<mml:math id="m28">
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> is called the phasor of particle <italic>k</italic> and is aligned with its heading, whereas <inline-formula id="inf26">
<mml:math id="m29">
<mml:mi>i</mml:mi>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> is perpendicular to the heading (<xref ref-type="fig" rid="F2">Figure&#x20;2A</xref>). For a constant speed, <italic>v</italic>
<sub>
<italic>k</italic>
</sub> &#x3d; <italic>v</italic>
<sub>0</sub>, and a constant turn-rate, <inline-formula id="inf27">
<mml:math id="m30">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula>, the particle moves on a circle with radius <inline-formula id="inf28">
<mml:math id="m31">
<mml:mo stretchy="false">&#x7c;</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:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x7c;</mml:mo>
</mml:math>
</inline-formula> and center <inline-formula id="inf29">
<mml:math id="m32">
<mml:msub>
<mml:mrow>
<mml:mi>c</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>. This fixed-radius circle will later serve as a reference for stabilizing circular formations.</p>
<fig id="F2" position="float">
<label>FIGURE 2</label>
<caption>
<p>Coordinates and unit vectors: <bold>(A)</bold> the self-propelled particle; <bold>(B)</bold> the Chaplygin-sleigh model of a robotic fish. In <bold>(B)</bold>, the hydrofoil shape represents the fish robot body and a bronze-colored reaction wheel is shown at the center of&#x20;mass.</p>
</caption>
<graphic xlink:href="fcteg-02-782121-g002.tif"/>
</fig>
<p>When referring to the positions, phase arrangement, reference circle centers, and control inputs of the collective of <italic>N</italic> particles, we use bold letters, i.e.,&#x20;<inline-formula id="inf30">
<mml:math id="m33">
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mo>&#x225c;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">C</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>, <inline-formula id="inf31">
<mml:math id="m34">
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
<mml:mo>&#x225c;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>, <inline-formula id="inf32">
<mml:math id="m35">
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mo>&#x225c;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>c</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>c</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">C</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>, and <inline-formula id="inf33">
<mml:math id="m36">
<mml:mi mathvariant="bold-italic">u</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>, respectively. Similarly, <inline-formula id="inf34">
<mml:math id="m37">
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x225c;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">C</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>. For complex numbers, <inline-formula id="inf35">
<mml:math id="m38">
<mml:msub>
<mml:mrow>
<mml:mi>z</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>z</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="double-struck">C</mml:mi>
</mml:math>
</inline-formula>, the inner product is defined as <inline-formula id="inf36">
<mml:math id="m39">
<mml:mrow>
<mml:mo stretchy="false">&#x27e8;</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>z</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>z</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">&#x27e9;</mml:mo>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mi mathvariant="normal">R</mml:mi>
<mml:mi mathvariant="normal">e</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">{</mml:mo>
<mml:mrow>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>z</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo>&#x304;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>z</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">}</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>, where <inline-formula id="inf37">
<mml:math id="m40">
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>z</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo>&#x304;</mml:mo>
</mml:mover>
</mml:mrow>
</mml:math>
</inline-formula> is the complex conjugate of <italic>z</italic>
<sub>1</sub>. This inner product is equivalent to the standard inner product on <inline-formula id="inf38">
<mml:math id="m41">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>. For complex vectors, <inline-formula id="inf39">
<mml:math id="m42">
<mml:mi mathvariant="bold-italic">z</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">y</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">C</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>, the inner product is similarly defined as <inline-formula id="inf40">
<mml:math id="m43">
<mml:mrow>
<mml:mo stretchy="false">&#x27e8;</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold-italic">z</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">y</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x27e9;</mml:mo>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mo movablelimits="false" form="prefix">&#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:msubsup>
<mml:mi mathvariant="normal">R</mml:mi>
<mml:mi mathvariant="normal">e</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">{</mml:mo>
<mml:mrow>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>z</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo>&#x304;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>y</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">}</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>. The modulus of a complex number is denoted <inline-formula id="inf41">
<mml:math id="m44">
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:mo>&#x22c5;</mml:mo>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:mo>&#x3d;</mml:mo>
<mml:msqrt>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">&#x27e8;</mml:mo>
<mml:mrow>
<mml:mo>&#x22c5;</mml:mo>
<mml:mo>,</mml:mo>
<mml:mo>&#x22c5;</mml:mo>
</mml:mrow>
<mml:mo stretchy="false">&#x27e9;</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:msqrt>
</mml:math>
</inline-formula>.</p>
<p>Cooperative control laws for stabilizing the collective motion of identical, unit-speed, self-propelled particles in parallel or circular formations have been extended to include an external flow field (<xref ref-type="bibr" rid="B23">Paley, 2008</xref>), motion on spherical surfaces (<xref ref-type="bibr" rid="B24">Paley, 2009</xref>), and various communication topologies (<xref ref-type="bibr" rid="B30">Sepulchre et&#x20;al., 2007</xref>; <xref ref-type="bibr" rid="B31">Sepulchre et&#x20;al., 2008</xref>). For parallel formations, all particles are synchronized when they have equal and constant phase, <bold>
<italic>&#x3b8;</italic>
</bold> &#x3d; <italic>&#x3b8;</italic>
<sub>0</sub>
<bold>1</bold>, where <bold>1</bold> &#x3d; [1,&#x2026;,1]<sup>T</sup> is the <italic>N</italic>-by-1 vector of ones, for some constant <inline-formula id="inf42">
<mml:math id="m45">
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="double-struck">T</mml:mi>
</mml:math>
</inline-formula>. For synchronization, the relative positions of particles are arbitrary. For circular formations, all particles move in the same direction along the same circle, that is, <inline-formula id="inf43">
<mml:math id="m46">
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mn mathvariant="bold-italic">1</mml:mn>
</mml:math>
</inline-formula> for some constant <italic>&#x3c9;</italic>
<sub>0</sub> and <bold>
<italic>c</italic>
</bold> &#x3d; <italic>c</italic>
<sub>0</sub>
<bold>1</bold> for some constant <inline-formula id="inf44">
<mml:math id="m47">
<mml:msub>
<mml:mrow>
<mml:mi>c</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="double-struck">C</mml:mi>
</mml:math>
</inline-formula>. In a circular formation, the relative phases of the particles are arbitrary.</p>
<p>Parallel and circular formations may be achieved using Lyapunov-based control design to minimize a potential function for a desired formation. Consider the Laplacian parallel formation potential (<xref ref-type="bibr" rid="B22">Paley, 2007</xref>)<disp-formula id="e2">
<mml:math id="m48">
<mml:msub>
<mml:mrow>
<mml:mi>U</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x225c;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
<mml:mrow>
<mml:mo stretchy="false">&#x27e8;</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi>L</mml:mi>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">&#x27e9;</mml:mo>
</mml:mrow>
<mml:mo>,</mml:mo>
</mml:math>
<label>(2)</label>
</disp-formula>which is minimized when the agents are synchronized. Assume the Laplacian matrix <italic>L</italic> corresponds to a time-invariant, connected, and undirected graph <italic>G</italic> representing the communication topology of the agents. The time-derivative of <italic>U</italic>
<sub>
<italic>p</italic>
</sub>(<bold>
<italic>&#x3b8;</italic>
</bold>) along trajectories of <xref ref-type="disp-formula" rid="e1">Eq. 1</xref> is (<xref ref-type="bibr" rid="B22">Paley, 2007</xref>)<disp-formula id="e3">
<mml:math id="m49">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>U</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x3d;</mml:mo>
<mml:munderover accentunder="false" accent="false">
<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>N</mml:mi>
</mml:mrow>
</mml:munderover>
<mml:mfrac>
<mml:mrow>
<mml:mi>&#x2202;</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>U</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x2202;</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfrac>
<mml:mfrac>
<mml:mrow>
<mml:mi>&#x2202;</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x2202;</mml:mi>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:mo>&#x3d;</mml:mo>
<mml:munderover accentunder="false" accent="false">
<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>N</mml:mi>
</mml:mrow>
</mml:munderover>
<mml:mrow>
<mml:mo stretchy="false">&#x27e8;</mml:mo>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">&#x27e9;</mml:mo>
</mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
</mml:math>
<label>(3)</label>
</disp-formula>where <italic>L</italic>
<sub>
<italic>k</italic>
</sub> is the <italic>k</italic>th row of the Laplacian matrix. The term <italic>L</italic>
<sub>
<italic>k</italic>
</sub>
<italic>e</italic>
<sup>
<italic>i</italic>
<bold>
<italic>&#x3b8;</italic>
</bold>
</sup> is the sum of the phasor of the <italic>k</italic>th agent relative to the phasors of all connected agents, i.e.,&#x20;<inline-formula id="inf45">
<mml:math id="m50">
<mml:msub>
<mml:mrow>
<mml:mi>L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x3d;</mml:mo>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mo movablelimits="false" form="prefix">&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msub>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>. Choosing the gradient control (<xref ref-type="bibr" rid="B22">Paley, 2007</xref>)<disp-formula id="e4">
<mml:math id="m51">
<mml:msub>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>K</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">&#x27e8;</mml:mo>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">&#x27e9;</mml:mo>
</mml:mrow>
<mml:mo>,</mml:mo>
</mml:math>
<label>(4)</label>
</disp-formula>for <italic>K</italic>&#x20;&#x3e; 0, makes <xref ref-type="disp-formula" rid="e3">Eq. 3</xref> negative semi-definite and drives <italic>U</italic>
<sub>
<italic>p</italic>
</sub>(<bold>
<italic>&#x3b8;</italic>
</bold>) to zero so that agents converge to the set of synchronized parallel formations.</p>
<p>Similarly, to achieve a circular formation, the Laplacian circular formation potential (<xref ref-type="bibr" rid="B22">Paley, 2007</xref>)<disp-formula id="e5">
<mml:math id="m52">
<mml:msub>
<mml:mrow>
<mml:mi>U</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>c</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x225c;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
<mml:mrow>
<mml:mo stretchy="false">&#x27e8;</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>L</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x27e9;</mml:mo>
</mml:mrow>
<mml:mspace width="0.28em"/>
</mml:math>
<label>(5)</label>
</disp-formula>may be used. The potential <italic>U</italic>
<sub>
<italic>c</italic>
</sub>(<bold>
<italic>r</italic>
</bold>, <bold>
<italic>&#x3b8;</italic>
</bold>) has a minimum value when the agents are in a circular formation. The time-derivative of <italic>U</italic>
<sub>
<italic>c</italic>
</sub>(<bold>
<italic>r</italic>
</bold>, <bold>
<italic>&#x3b8;</italic>
</bold>) along trajectories of the self-propelled particle <xref ref-type="disp-formula" rid="e1">Eq. 1</xref> is (<xref ref-type="bibr" rid="B22">Paley, 2007</xref>)<disp-formula id="e6">
<mml:math id="m53">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>U</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>c</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x3d;</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:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:munderover accentunder="false" accent="false">
<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>N</mml:mi>
</mml:mrow>
</mml:munderover>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:mrow>
<mml:mo stretchy="false">&#x27e8;</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mi mathvariant="bold-italic">c</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x27e9;</mml:mo>
</mml:mrow>
<mml:mo>.</mml:mo>
</mml:math>
<label>(6)</label>
</disp-formula>
</p>
<p>Choosing the circular formation control (<xref ref-type="bibr" rid="B22">Paley, 2007</xref>)<disp-formula id="e7">
<mml:math id="m54">
<mml:msub>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">&#x27e8;</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mi mathvariant="bold-italic">c</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x27e9;</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
<mml:mspace width="0.28em"/>
</mml:math>
<label>(7)</label>
</disp-formula>makes <xref ref-type="disp-formula" rid="e6">Eq. 6</xref> negative semi-definite and drives <italic>U</italic>
<sub>
<italic>c</italic>
</sub>(<bold>
<italic>r</italic>
</bold>, <bold>
<italic>&#x3b8;</italic>
</bold>) towards zero so that the agents&#x2019; time-averaged circle centers coincide to a common point.</p>
</sec>
<sec id="s2-3">
<title>2.3 Chaplygin Sleigh Dynamics</title>
<p>The Chaplygin sleigh is a canonical nonholonomic mechanical system consisting of a rigid body moving in the plane that is supported by two frictionless sliding points and a single knife edge that allows no motion perpendicular to its edge (<xref ref-type="bibr" rid="B2">Bloch, 2003</xref>). Previous studies have demonstrated that a fish robot driven by an internal reaction wheel can be modeled as a Chaplygin sleigh due to the nonholonomic constraint imposed by the Kutta condition (<xref ref-type="bibr" rid="B15">Kelly et&#x20;al., 2012</xref>), (<xref ref-type="bibr" rid="B17">Lee et&#x20;al., 2019</xref>), which constrains the fluid flow at the trailing edge. As the reaction wheel spins back and forth, it flaps the robot&#x2019;s body, which interacts with the surrounding fluid to generate thrust.</p>
<p>Consider a system of <italic>N</italic> fish robots each modeled as a Chaplygin sleigh with the following dynamics in state-space form (<xref ref-type="bibr" rid="B17">Lee et&#x20;al., 2019</xref>):<disp-formula id="e8">
<mml:math id="m55">
<mml:mtable class="aligned">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>r</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msup>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mi>l</mml:mi>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>d</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi>m</mml:mi>
<mml:mi>l</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:mo>,</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(8)</label>
</disp-formula>where <inline-formula id="inf46">
<mml:math id="m56">
<mml:msub>
<mml:mrow>
<mml:mi>r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="double-struck">C</mml:mi>
</mml:math>
</inline-formula> is the position of the trailing edge of the fish robot (<xref ref-type="fig" rid="F2">Figure&#x20;2B</xref>), <inline-formula id="inf47">
<mml:math id="m57">
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:math>
</inline-formula> is the swimming speed, <inline-formula id="inf48">
<mml:math id="m58">
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="double-struck">T</mml:mi>
</mml:math>
</inline-formula> is the velocity orientation, <inline-formula id="inf49">
<mml:math id="m59">
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:math>
</inline-formula> is the angular rate of the <italic>k</italic>th fish, and <inline-formula id="inf50">
<mml:math id="m60">
<mml:msub>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:math>
</inline-formula> is the applied torque, where <italic>k</italic>&#x20;&#x3d; 1, &#x2026;, <italic>N</italic>. Furthermore, <italic>d</italic>&#x20;&#x2265; 0 is the drag coefficient, and <italic>m</italic>&#x20;&#x3e; 0, <italic>l</italic>&#x20;&#x3e; 0, and <italic>b</italic>&#x20;&#x3e; 0 are the mass, length, and moment of inertia, respectively. Unlike the self-propelled particle <xref ref-type="disp-formula" rid="e1">Eq. 1</xref>, the speed of the Chaplygin sleigh <xref ref-type="disp-formula" rid="e8">Eq. 8</xref> is not constant and the control input is a torque rather than an angular&#x20;rate.</p>
<p>Prior work has established that the Chaplygin-sleigh model exhibits limit-cycle dynamics under open-loop periodic control inputs (<xref ref-type="bibr" rid="B25">Pollard et&#x20;al., 2019</xref>), as well as feedback control (<xref ref-type="bibr" rid="B17">Lee et&#x20;al., 2019</xref>) (<xref ref-type="bibr" rid="B11">Free et&#x20;al., 2020</xref>). Consider the feedback control (<xref ref-type="bibr" rid="B17">Lee et&#x20;al., 2019</xref>)<disp-formula id="e9">
<mml:math id="m61">
<mml:msub>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>b</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2061;</mml:mo>
<mml:mi>sin</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mo>&#x304;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mfenced>
<mml:mo>,</mml:mo>
</mml:math>
<label>(9)</label>
</disp-formula>where <inline-formula id="inf51">
<mml:math id="m62">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mo>&#x304;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula> is the desired heading angle of the <italic>k</italic>th fish, and <italic>K</italic>
<sub>1</sub>, <italic>K</italic>
<sub>2</sub> &#x3e; 0 are feedback gains. Substituting <xref ref-type="disp-formula" rid="e9">Eq. 9</xref> into <xref ref-type="disp-formula" rid="e8">Eq. 8</xref> yields the closed-loop system (<xref ref-type="bibr" rid="B17">Lee et&#x20;al., 2019</xref>)<disp-formula id="e10">
<mml:math id="m63">
<mml:mtable class="aligned">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>r</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msup>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mi>l</mml:mi>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>d</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi>m</mml:mi>
<mml:mi>l</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2061;</mml:mo>
<mml:mi>sin</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mo>&#x304;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(10)</label>
</disp-formula>
</p>
<p>The system <xref ref-type="disp-formula" rid="e10">Eq. 10</xref> can be divided into a slow and fast subsystem (<xref ref-type="bibr" rid="B17">Lee et&#x20;al., 2019</xref>), where the fast <italic>v</italic>
<sub>
<italic>k</italic>
</sub>-subsystem (<xref ref-type="bibr" rid="B17">Lee et&#x20;al., 2019</xref>), <inline-formula id="inf52">
<mml:math id="m64">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>d</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>l</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:math>
</inline-formula>,</p>
<p>converges to <inline-formula id="inf53">
<mml:math id="m65">
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2192;</mml:mo>
<mml:mi>l</mml:mi>
<mml:mo>/</mml:mo>
<mml:mi>d</mml:mi>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> for a sufficiently large drag coefficient <italic>d</italic>. Let <italic>a</italic>&#x20;&#x3d; <italic>ml</italic>
<sup>2</sup>/<italic>bd</italic> &#x3e; 0. The slow (<italic>&#x3b8;</italic>
<sub>
<italic>k</italic>
</sub>, <italic>&#x3c9;</italic>
<sub>
<italic>k</italic>
</sub>)-subsystem becomes (<xref ref-type="bibr" rid="B17">Lee et&#x20;al., 2019</xref>)<disp-formula id="e11">
<mml:math id="m66">
<mml:mtable class="aligned">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>a</mml:mi>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2061;</mml:mo>
<mml:mi>sin</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mo>&#x304;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(11)</label>
</disp-formula>
</p>
<p>Observe that <xref ref-type="disp-formula" rid="e11">Eq. 11</xref> gives the equations of motion of a pendulum with nonlinear damping and natural frequency <inline-formula id="inf54">
<mml:math id="m67">
<mml:msqrt>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msqrt>
</mml:math>
</inline-formula> (<xref ref-type="bibr" rid="B17">Lee et&#x20;al., 2019</xref>). The system <xref ref-type="disp-formula" rid="e11">Eq. 11</xref> has two equilibrium points corresponding to a fish robot heading that is parallel <inline-formula id="inf55">
<mml:math id="m68">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mo>&#x304;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> and anti-parallel <inline-formula id="inf56">
<mml:math id="m69">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mo>&#x304;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>&#x3c0;</mml:mi>
<mml:mi>mod</mml:mi>
<mml:mn>2</mml:mn>
<mml:mi>&#x3c0;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> to the desired heading. Both equilibria are unstable and the system exhibits a stable limit cycle centered on <inline-formula id="inf57">
<mml:math id="m70">
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mo>&#x304;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> in the (<italic>&#x3b8;</italic>
<sub>
<italic>k</italic>
</sub>, <italic>&#x3c9;</italic>
<sub>
<italic>k</italic>
</sub>) plane (<xref ref-type="bibr" rid="B17">Lee et&#x20;al., 2019</xref>). The corresponding limit cycle of <xref ref-type="disp-formula" rid="e10">Eq. 10</xref> is evident in the (<italic>v</italic>
<sub>
<italic>k</italic>
</sub>, <italic>&#x3c9;</italic>
<sub>
<italic>k</italic>
</sub>) plane as well. The limit cycle propels the robot in the desired direction by flapping; however, the limit cycle is achieved only for certain values of the control gains <italic>K</italic>
<sub>1</sub> and <italic>K</italic>
<sub>2</sub> (<xref ref-type="bibr" rid="B17">Lee et&#x20;al., 2019</xref>). The average swimming velocity is proportional to <italic>K</italic>
<sub>1</sub>, but if <italic>K</italic>
<sub>1</sub> is too large, then the angular rate in the resulting limit cycle does not switch signs and the robot spins in a circle (<xref ref-type="bibr" rid="B17">Lee et&#x20;al., 2019</xref>). The control law <xref ref-type="disp-formula" rid="e9">Eq. 9</xref> that enables each fish robot to swim in a desired direction can be modified, with interactions from neighboring fish, to achieve collective motion of the school, as described&#x20;next.</p>
</sec>
</sec>
<sec id="s3">
<title>3 Planar Formation Control</title>
<p>We propose a nonlinear control design for the stabilization of parallel and circular formations in a model of a school of robotic fish. Our approach bridges collective motion of self-propelled particles (<xref ref-type="bibr" rid="B22">Paley, 2007</xref>) and feedback control of a fish robot modeled by Chaplygin sleigh dynamics (<xref ref-type="bibr" rid="B17">Lee et&#x20;al., 2019</xref>). Since (<xref ref-type="bibr" rid="B22">Paley, 2007</xref>) assumes a constant-speed particle, it cannot be applied directly to control fish robots that follow limit-cycle dynamics with a varying speed. Furthermore, since the fish robots oscillate, parallel and circular motions are achieved in an average sense. Novel formation potential functions are required for Lyapunov-based control design.</p>
<sec id="s3-1">
<title>3.1 Parallel Formations</title>
<p>Consider a collection of <italic>N</italic> identical fish robots modeled by the Chaplygin sleigh system <xref ref-type="disp-formula" rid="e8">Eq. 8</xref>. Assume a sufficiently large drag coefficient so that <inline-formula id="inf58">
<mml:math id="m71">
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2192;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>l</mml:mi>
<mml:mo>/</mml:mo>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> and the (<italic>&#x3b8;</italic>
<sub>
<italic>k</italic>
</sub>, <italic>&#x3c9;</italic>
<sub>
<italic>k</italic>
</sub>) dynamics follow <xref ref-type="disp-formula" rid="e11">Eq. 11</xref>. For the purposes of control design, the simplified Chaplygin sleigh system <xref ref-type="disp-formula" rid="e8">Eq. 8</xref> becomes<disp-formula id="e12">
<mml:math id="m72">
<mml:mtable class="aligned">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>r</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi>l</mml:mi>
<mml:mo>/</mml:mo>
<mml:mi>d</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msup>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>a</mml:mi>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(12)</label>
</disp-formula>
</p>
<p>Inspired by the Laplacian parallel formation potential <xref ref-type="disp-formula" rid="e2">Eq. 2</xref> for the self-propelled particle, consider the potential<disp-formula id="e13">
<mml:math id="m73">
<mml:msub>
<mml:mrow>
<mml:mi>V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">&#x27e8;</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi>L</mml:mi>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">&#x27e9;</mml:mo>
</mml:mrow>
<mml:mo>.</mml:mo>
</mml:math>
<label>(13)</label>
</disp-formula>
</p>
<p>The time-derivative of <italic>V</italic>
<sub>
<italic>p</italic>
</sub>(<bold>
<italic>&#x3b8;</italic>
</bold>) is<disp-formula id="e14">
<mml:math id="m74">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>V</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
<mml:mo>&#x2b;</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:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">&#x27e8;</mml:mo>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi>L</mml:mi>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">&#x27e9;</mml:mo>
</mml:mrow>
<mml:mo>,</mml:mo>
</mml:math>
<label>(14)</label>
</disp-formula>where, along trajectories of <xref ref-type="disp-formula" rid="e12">Eq. 12</xref>,<disp-formula id="e15">
<mml:math id="m75">
<mml:msup>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:munderover accentunder="false" accent="false">
<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>N</mml:mi>
</mml:mrow>
</mml:munderover>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>a</mml:mi>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msup>
<mml:msub>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
</mml:math>
<label>(15)</label>
</disp-formula>and<disp-formula id="e16">
<mml:math id="m76">
<mml:mo stretchy="false">&#x2329;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi>L</mml:mi>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo stretchy="false">&#x232a;</mml:mo>
<mml:mo>&#x3d;</mml:mo>
<mml:munderover accentunder="false" accent="false">
<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>N</mml:mi>
</mml:mrow>
</mml:munderover>
<mml:mo stretchy="false">&#x2329;</mml:mo>
<mml:mi>i</mml:mi>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo stretchy="false">&#x232a;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>.</mml:mo>
</mml:math>
<label>(16)</label>
</disp-formula>By choosing the control<disp-formula id="e17">
<mml:math id="m77">
<mml:mtable class="aligned">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mi>b</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:mrow>
<mml:mo stretchy="false">&#x27e8;</mml:mo>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">&#x27e9;</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right"/>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mi>b</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:munder>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:munder>
<mml:mi>sin</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</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>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mfenced>
<mml:mo>,</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(17)</label>
</disp-formula>and substituting <xref ref-type="disp-formula" rid="e15">Eqs 15</xref>&#x2013;<xref ref-type="disp-formula" rid="e17">17</xref> into <xref ref-type="disp-formula" rid="e14">Eq. 14</xref>, <inline-formula id="inf59">
<mml:math id="m78">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>V</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> becomes<disp-formula id="e18">
<mml:math id="m79">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>V</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x3d;</mml:mo>
<mml:munderover accentunder="false" accent="false">
<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>N</mml:mi>
</mml:mrow>
</mml:munderover>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>a</mml:mi>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>.</mml:mo>
</mml:math>
<label>(18)</label>
</disp-formula>
</p>
<p>The feedback control law <xref ref-type="disp-formula" rid="e17">Eq. 17</xref> relies only on relative-state measurements between agents and does not include feedback linearization of the agents&#x2019; dynamics. Recall <italic>K</italic>
<sub>1</sub>, <italic>K</italic>
<sub>2</sub> &#x3e; 0 are control gains. Since <xref ref-type="disp-formula" rid="e18">Eq. 18</xref> is a summation of quartic functions with roots at <italic>&#x3c9;</italic>
<sub>
<italic>k</italic>
</sub> &#x3d; 0 and <inline-formula id="inf60">
<mml:math id="m80">
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:mo>&#x3d;</mml:mo>
<mml:msqrt>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>/</mml:mo>
<mml:mi>a</mml:mi>
</mml:mrow>
</mml:msqrt>
</mml:math>
</inline-formula>, then <inline-formula id="inf61">
<mml:math id="m81">
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>V</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mo>&#x3c;</mml:mo>
<mml:mn>0</mml:mn>
</mml:math>
</inline-formula> outside <inline-formula id="inf62">
<mml:math id="m82">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="normal">&#x3a9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>p</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">{</mml:mo>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#xd7;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mspace width="0.3333em" class="nbsp"/>
<mml:mo>:</mml:mo>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:mo>&#x2264;</mml:mo>
<mml:msqrt>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>/</mml:mo>
<mml:mi>a</mml:mi>
</mml:mrow>
</mml:msqrt>
<mml:mspace width="0.3333em" class="nbsp"/>
<mml:mo>&#x2200;</mml:mo>
<mml:mspace width="0.3333em" class="nbsp"/>
<mml:mi>k</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">}</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>. Therefore, all trajectories are trapped in &#x3a9;<sub>
<italic>p</italic>
</sub>. The gain <italic>K</italic>
<sub>2</sub> in <xref ref-type="disp-formula" rid="e17">Eq. 17</xref> is chosen to ensure forward flapping motion for <xref ref-type="disp-formula" rid="e8">Eq. 8</xref>, as discussed in <xref ref-type="sec" rid="s2-3">Section&#x20;2.3</xref>.</p>
<p>The control law <xref ref-type="disp-formula" rid="e17">Eq. 17</xref> is illustrated by numerical simulation using control <xref ref-type="disp-formula" rid="e17">Eq. 17</xref> and the full dynamics <xref ref-type="disp-formula" rid="e8">Eq. 8</xref>. The simulation was conducted for 150&#xa0;s with <italic>N</italic>&#x20;&#x3d; 8 robots using the parameters listed in <xref ref-type="table" rid="T1">Table&#x20;1</xref>. The robots were initialized with random headings and zero linear and angular velocities. A communication range of 3&#xa0;m determined the communication topology, which remained invariant during the simulation based on the agent&#x2019;s random initial positions. <xref ref-type="fig" rid="F3">Figures 3A,B</xref> show all <italic>N</italic> robots converging to the same limit cycle in the (<italic>&#x3b8;</italic>
<sub>
<italic>k</italic>
</sub>, <italic>&#x3c9;</italic>
<sub>
<italic>k</italic>
</sub>) and (<italic>v</italic>
<sub>
<italic>k</italic>
</sub>, <italic>&#x3c9;</italic>
<sub>
<italic>k</italic>
</sub>) planes. As a result, all robots move in the same direction (on average), as shown in <xref ref-type="fig" rid="F3">Figure&#x20;3C</xref>. The parallel potential, <italic>V</italic>
<sub>
<italic>p</italic>
</sub>(<italic>t</italic>), initially decreases (<xref ref-type="fig" rid="F3">Figure&#x20;3D</xref>), but instead of converging to zero, it oscillates around a fixed value as the robots converge to different phases on the same limit&#x20;cycle.</p>
<table-wrap id="T1" position="float">
<label>TABLE 1</label>
<caption>
<p>Parameters used to simulate the fish robot system, based on the experimental testbed.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th align="left">Parameter</th>
<th align="center">Symbol</th>
<th align="center">Value</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">Mass</td>
<td align="center">
<italic>m</italic>
</td>
<td align="center">1.4&#xa0;kg</td>
</tr>
<tr>
<td align="left">Length</td>
<td align="center">
<italic>l</italic>
</td>
<td align="center">0.31&#xa0;m</td>
</tr>
<tr>
<td align="left">Drag coefficient</td>
<td align="center">
<italic>d</italic>
</td>
<td align="center">0.5</td>
</tr>
<tr>
<td align="left">Moment of inertia</td>
<td align="center">
<italic>b</italic>
</td>
<td align="center">0.1395&#xa0;kg &#x22c5;m<sup>2</sup>
</td>
</tr>
<tr>
<td align="left">Control gains</td>
<td align="center">(<italic>K</italic>
<sub>1</sub>, <italic>K</italic>
<sub>2</sub>, <italic>K</italic>
<sub>3</sub>)</td>
<td align="center">(0.5, 3, 1)</td>
</tr>
</tbody>
</table>
</table-wrap>
<fig id="F3" position="float">
<label>FIGURE 3</label>
<caption>
<p>Simulation of <xref ref-type="disp-formula" rid="e8">Eq. 8</xref> with parallel formation control <xref ref-type="disp-formula" rid="e17">Eq. 17</xref> and N&#x20;&#x3d;8 identical fish. The black circular markers in <bold>(A&#x2013;C)</bold> indicate the simulation states. The last 10 s of the limit cycle in <bold>(A)</bold> and <bold>(B)</bold> are shown with colored lines. The parallel potential <xref ref-type="disp-formula" rid="e13">Eq. 13</xref> in <bold>(D)</bold> shown for 150 s.</p>
</caption>
<graphic xlink:href="fcteg-02-782121-g003.tif"/>
</fig>
</sec>
<sec id="s3-2">
<title>3.2 Circular Formations</title>
<p>The parallel formation control <xref ref-type="disp-formula" rid="e17">Eq. 17</xref> is based on the forward swimming control <xref ref-type="disp-formula" rid="e9">Eq. 9</xref>; however, a desired heading was not prescribed, but rather the average heading emerged through interactions among agents depending on their initial conditions. Similarly, a circular formation control is proposed here that drives the fish robots to continuously adjust their heading at a known average rate, while aligning the center position of the nominal circles to an (average) consensus value. Virtual fish can be introduced to achieve a reference heading or position (<xref ref-type="bibr" rid="B30">Sepulchre et&#x20;al., 2007</xref>, <xref ref-type="bibr" rid="B31">2008</xref>). Consider the following circular formation potential inspired by <xref ref-type="disp-formula" rid="e5">Eq. 5</xref>:<disp-formula id="e19">
<mml:math id="m83">
<mml:msub>
<mml:mrow>
<mml:mi>V</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>c</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3b3;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mn mathvariant="bold">1</mml:mn>
<mml:mo>&#x2b;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">&#x27e8;</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>L</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x27e9;</mml:mo>
</mml:mrow>
<mml:mo>,</mml:mo>
</mml:math>
<label>(19)</label>
</disp-formula>where <inline-formula id="inf63">
<mml:math id="m84">
<mml:mi mathvariant="bold-italic">&#x3b3;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b3;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b3;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">T</mml:mi>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> with <bold>
<italic>&#x3b3;</italic>
</bold>
<sub>
<italic>k</italic>
</sub>(<italic>t</italic>) &#x3d; cos(<italic>&#x3b8;</italic>
<sub>
<italic>k</italic>
</sub> &#x2212; <italic>&#x3c9;</italic>
<sub>0</sub>
<italic>t</italic>) and <italic>K</italic>
<sub>2</sub>, <italic>K</italic>
<sub>3</sub> &#x3e; 0. The time-derivative of <italic>V</italic>
<sub>
<italic>c</italic>
</sub> along trajectories of <xref ref-type="disp-formula" rid="e12">Eq. 12</xref> is<disp-formula id="e20">
<mml:math id="m85">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>V</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>c</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msup>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3b3;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mn mathvariant="bold">1</mml:mn>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">&#x27e8;</mml:mo>
<mml:mrow>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi>L</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x27e9;</mml:mo>
</mml:mrow>
<mml:mo>,</mml:mo>
</mml:math>
<label>(20)</label>
</disp-formula>where <inline-formula id="inf64">
<mml:math id="m86">
<mml:msup>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3b3;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mn mathvariant="bold">1</mml:mn>
<mml:mo>&#x3d;</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mo movablelimits="false" form="prefix">&#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>N</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2061;</mml:mo>
<mml:mi>sin</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mi>t</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mspace width="0.28em"/>
<mml:mo>,</mml:mo>
</mml:math>
</inline-formula> and <inline-formula id="inf65">
<mml:math id="m87">
<mml:msup>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
</mml:math>
</inline-formula> is given in <xref ref-type="disp-formula" rid="e15">Eq.&#x20;15</xref>.</p>
<p>When averaged over time, the motion of a fish robot resembles that of a self-propelled particle. Recall that the reference circle center for a self-propelled particle is <inline-formula id="inf66">
<mml:math id="m88">
<mml:msub>
<mml:mrow>
<mml:mi>c</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2b;</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:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mi>i</mml:mi>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>. Since the average swimming speed of the robots is <italic>bK</italic>
<sub>1</sub>/<italic>ml</italic> (<xref ref-type="bibr" rid="B17">Lee et&#x20;al., 2019</xref>), then by setting <italic>v</italic>
<sub>0</sub> &#x3d; <italic>bK</italic>
<sub>1</sub>/<italic>ml</italic>, the parameter <italic>&#x3c9;</italic>
<sub>0</sub> may be chosen to yield an average turn rate and reference circle with radius <inline-formula id="inf67">
<mml:math id="m89">
<mml:mo stretchy="false">&#x7c;</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:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x7c;</mml:mo>
</mml:math>
</inline-formula>. However, <italic>&#x3c9;</italic>
<sub>0</sub> should be sufficiently small to ensure that <italic>&#x3c9;</italic>
<sub>
<italic>k</italic>
</sub> switches signs along the limit-cycle so that the robots flap. The third term in <xref ref-type="disp-formula" rid="e20">Eq. 20</xref>, evaluated along trajectories of <xref ref-type="disp-formula" rid="e12">Eq. 12</xref>, is<disp-formula id="e21">
<mml:math id="m90">
<mml:mo stretchy="false">&#x2329;</mml:mo>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">c</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mi>L</mml:mi>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mo stretchy="false">&#x232a;</mml:mo>
<mml:mo>&#x3d;</mml:mo>
<mml:munderover accentunder="false" accent="false">
<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>N</mml:mi>
</mml:mrow>
</mml:munderover>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>l</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<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:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:mfenced>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x2329;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mi mathvariant="bold-italic">c</mml:mi>
<mml:mo stretchy="false">&#x232a;</mml:mo>
<mml:mo>.</mml:mo>
</mml:math>
<label>(21)</label>
</disp-formula>Therefore <xref ref-type="disp-formula" rid="e20">Eq. 20</xref> may be rewritten as<disp-formula id="e22">
<mml:math id="m91">
<mml:mtable class="aligned">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>V</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>c</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">r</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:munderover accentunder="false" accent="false">
<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>N</mml:mi>
</mml:mrow>
</mml:munderover>
<mml:mfenced open="[" close="">
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>a</mml:mi>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>b</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msup>
<mml:msub>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right"/>
<mml:mtd columnalign="left">
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2061;</mml:mo>
<mml:mi>sin</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right"/>
<mml:mtd columnalign="left">
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mfenced open="" close="]">
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>l</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<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:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:mfenced>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mo stretchy="false">&#x27e8;</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mi mathvariant="bold-italic">c</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x27e9;</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:mfenced>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(22)</label>
</disp-formula>Choosing the control<disp-formula id="e23">
<mml:math id="m92">
<mml:mtable class="aligned">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mi>u</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mi>b</mml:mi>
<mml:mfenced open="(" close="">
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2061;</mml:mo>
<mml:mi>sin</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mfenced>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right"/>
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>l</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<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:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:mfenced>
<mml:mrow>
<mml:mo stretchy="false">&#x27e8;</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mi mathvariant="bold-italic">c</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x27e9;</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mo>)</mml:mo>
</mml:mrow>
<mml:mo>,</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(23)</label>
</disp-formula>the derivative <xref ref-type="disp-formula" rid="e22">Eq. 22</xref> becomes<disp-formula id="e24">
<mml:math id="m93">
<mml:mtable class="aligned">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>V</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>c</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:munderover accentunder="false" accent="false">
<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>N</mml:mi>
</mml:mrow>
</mml:munderover>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>a</mml:mi>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2061;</mml:mo>
<mml:mi>sin</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mfenced>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mo>&#x2264;</mml:mo>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:munderover accentunder="false" accent="false">
<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>N</mml:mi>
</mml:mrow>
</mml:munderover>
<mml:mfenced open="[" close="">
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>a</mml:mi>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
<mml:mfenced open="" close="]">
<mml:mrow>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x7c;</mml:mo>
</mml:mrow>
</mml:mfenced>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(24)</label>
</disp-formula>
</p>
<p>Thus, <inline-formula id="inf68">
<mml:math id="m94">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi>V</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>c</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3c;</mml:mo>
<mml:mn>0</mml:mn>
</mml:math>
</inline-formula> outside <inline-formula id="inf69">
<mml:math id="m95">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="normal">&#x3a9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>c</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">{</mml:mo>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3b8;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#xd7;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mspace width="0.3333em" class="nbsp"/>
<mml:mo>:</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2264;</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:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:msqrt>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>4</mml:mn>
<mml:mi>a</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x7c;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x7c;</mml:mo>
</mml:mrow>
</mml:msqrt>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>/</mml:mo>
<mml:mn>2</mml:mn>
<mml:mi>a</mml:mi>
<mml:mspace width="0.3333em" class="nbsp"/>
<mml:mo>&#x2200;</mml:mo>
<mml:mspace width="0.3333em" class="nbsp"/>
<mml:mi>k</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi mathvariant="script">V</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">}</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>, which implies the system is driven to a bounded set containing the desired limit cycle. The <italic>K</italic>
<sub>3</sub> term in <xref ref-type="disp-formula" rid="e23">Eq. 23</xref> biases the torque to align the reference circles, whereas the remaining terms produce a flapping motion with a given average turn rate. Although <xref ref-type="disp-formula" rid="e24">Eq. 24</xref> remains negative for any positive <italic>K</italic>
<sub>3</sub>, this gain must be chosen sufficiently small to ensure flapping. As with <xref ref-type="disp-formula" rid="e17">Eq. 17</xref>, the feedback control <xref ref-type="disp-formula" rid="e23">Eq. 23</xref> relies only on relative-state measurements between agents and does not include feedback linearization of the agents&#x2019; dynamics.</p>
<p>The circular formation feedback control <xref ref-type="disp-formula" rid="e17">Eq. 17</xref> is numerically illustrated by simulating <xref ref-type="disp-formula" rid="e8">Eq. 8</xref> with parameters from <xref ref-type="table" rid="T1">Table&#x20;1</xref> and using <italic>&#x3c9;</italic>
<sub>0</sub> &#x3d; 0.05&#xa0;rad/s. The simulation was conducted for ten minutes to demonstrate circular motion. <xref ref-type="fig" rid="F4">Figure&#x20;4A</xref> shows all <italic>N</italic> robots converge to the same limit cycle in the (<italic>v</italic>
<sub>
<italic>k</italic>
</sub>, <italic>&#x3c9;</italic>
<sub>
<italic>k</italic>
</sub>) plane. The orbits in <xref ref-type="fig" rid="F4">Figure&#x20;4B</xref> resemble the limit cycle in <xref ref-type="fig" rid="F3">Figure&#x20;3B</xref>; however, due to the time-varying term in <xref ref-type="disp-formula" rid="e19">Eq. 19</xref>, they translate along the perimeter of the phase cylinder. The net result is motion along a circle whose center position is determined by the initial conditions of the agents (<xref ref-type="fig" rid="F4">Figure&#x20;4C</xref>). Since the oscillating centers are aligned when all robots have identical position and phase, the controller drives all the robots to one side of the circle. In ongoing work, we seek to stabilize symmetric circular formations (<xref ref-type="bibr" rid="B30">Sepulchre et&#x20;al., 2007</xref>; <xref ref-type="bibr" rid="B31">Sepulchre et&#x20;al., 2008</xref>), which evenly distribute the agents around the formation. The circular potential exhibits low and high frequency oscillations (<xref ref-type="fig" rid="F4">Figure&#x20;4D</xref>), which correspond to motion around the reference circle and flapping, respectively.</p>
<fig id="F4" position="float">
<label>FIGURE 4</label>
<caption>
<p>Simulation of <xref ref-type="disp-formula" rid="e8">Eq. 8</xref> with circular formation control <xref ref-type="disp-formula" rid="e23">Eq. 23</xref> and <italic>N</italic>&#x20;&#x3d; 8 identical fish. Black circular markers in <bold>(A&#x2013;D)</bold> indicate initial simulation states. The last 5&#xa0;s of the simulation are shown with colored lines in <bold>(A)</bold> and <bold>(B)</bold>, and the last 90&#xa0;s in <bold>(C)</bold>.</p>
</caption>
<graphic xlink:href="fcteg-02-782121-g004.tif"/>
</fig>
</sec>
</sec>
<sec id="s4">
<title>4 Experimental Results</title>
<p>This section describes the implementation of the parallel formation control law <xref ref-type="disp-formula" rid="e17">Eq. 17</xref> on a school of robotic fish and experimental results. First, the experimental testbed used in this work is briefly described. Next, results from system identification experiments are presented that provide parameters for a model of the reaction wheel dynamics. Based on this model, an inner-loop linear-quadratic-Gaussian (LQG) controller is implemented to track a desired reference torque generated from the formation control law using the onboard motor&#x2019;s angular velocity measurements. Lastly, results from a series of in-water experiments demonstrating the parallel formation control are presented.</p>
<sec id="s4-1">
<title>4.1 Experimental Testbed</title>
<p>The fish-inspired soft robots used in the experiments (<xref ref-type="fig" rid="F1">Figure&#x20;1</xref>) are each driven by a Pololu 12&#xa0;V DC motor (with a 4.4 to 1 gear ratio) that oscillates a reaction wheel located at each robot&#x2019;s center of mass. Each fish robot measures its orientation with an onboard BNO055 inertial measurement unit (IMU) sensor that features a built-in extended Kalman filter. A micro-SD card is used to store sensor data and a 900&#xa0;MHz xBee radio enables each fish robot to communicate with a ground station and other fish robots on the water&#x2019;s surface. Each fish robot performs onboard sensor processing and control with a Teensy 3.2 microcontroller. For a more detailed discussion of the fish robots&#x2019; design, refer to (<xref ref-type="bibr" rid="B17">Lee et&#x20;al., 2019</xref>).</p>
<p>The experiments were conducted in a 367,000 gallon water tank at the Neutral Buoyancy Research Facility at the University of Maryland, College Park. An overhead camera is mounted above the experimental area to record the true position of each robotic fish; however, the position data is not used in real time by the fish for formation control. Instead, during formation control experiments, each robot exchanges orientation data from their onboard IMU with other fish in the school using the xBee radios. Since the position of each robotic fish is not computed in real-time, an invariant complete communication graph was used in the experiments; whereas, a proximity-based communication graph was used in simulation.<sup>AT</sup> The overhead camera images are post-processed after each experiment to visualize the trajectory of each robotic fish. The image processing uses MATLAB&#x2019;s built-in corner/object detection based on a minimum eigenvalue algorithm (<xref ref-type="bibr" rid="B32">The MathWorks, 2019</xref>) and a built-in constant velocity Kalman filter for object tracking. Since all of the sensing and control law computations occur onboard, the school of robotic fish are a self-contained system when performing formation control experiments. The block diagram in <xref ref-type="fig" rid="F5">Figure&#x20;5</xref> gives an overview of the experimental testbed.</p>
<fig id="F5" position="float">
<label>FIGURE 5</label>
<caption>
<p>Block diagram of the experimental testbed. Since all of the sensing and control law computations occur onboard, the school of robotic fish are a closed self-contained system when performing parallel formation control experiments.</p>
</caption>
<graphic xlink:href="fcteg-02-782121-g005.tif"/>
</fig>
<p>The nonlinear control laws <xref ref-type="disp-formula" rid="e17">Eq. 17</xref> or <xref ref-type="disp-formula" rid="e23">Eq. 23</xref> generate a reference torque command that steers the fish robots to their respective formations. However, this torque cannot be commanded directly since the control input into the reaction wheel system is the voltage applied to the DC motor generated by the motor driver and Teensy micro-controller. Furthermore, the only available measurement is the angular velocity of the motor&#x2019;s shaft measured by an encoder. Thus, to track the reference torque a linear-quadratic-Gaussian (LQG) controller and estimator was implemented. The LQG controller assumes the following motor dynamics (<xref ref-type="bibr" rid="B16">Kim, 2017</xref>):<disp-formula id="e25">
<mml:math id="m96">
<mml:mtable class="eqnarray">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mi>&#x3bc;</mml:mi>
<mml:mfrac>
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>R</mml:mi>
<mml:mi>i</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>e</mml:mi>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(25)</label>
</disp-formula>
<disp-formula id="e26">
<mml:math id="m97">
<mml:mtable class="eqnarray">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mi>e</mml:mi>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
</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:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(26)</label>
</disp-formula>
<disp-formula id="e27">
<mml:math id="m98">
<mml:mtable class="eqnarray">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mi>&#x3c4;</mml:mi>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3c4;</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mi>i</mml:mi>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(27)</label>
</disp-formula>
<disp-formula id="e28">
<mml:math id="m99">
<mml:mtable class="eqnarray">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mi>J</mml:mi>
<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:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mi>&#x3c4;</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b6;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
</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:mo>,</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(28)</label>
</disp-formula>where &#x39b; is the voltage input, <italic>R</italic> is the motor&#x2019;s electrical resistance, <italic>&#x3bc;</italic> is the inductance, <italic>i</italic> is the current, <italic>e</italic> is the motor&#x2019;s back electromotive force (EMF), <inline-formula id="inf70">
<mml:math id="m100">
<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:math>
</inline-formula> is the angular rate of the output shaft, <italic>J</italic> is the sum of inertias between the reaction wheel and motor&#x2019;s output shaft, <italic>&#x3c4;</italic> is the torque applied by the motor, <italic>&#x3b6;</italic>
<sub>
<italic>m</italic>
</sub> is the internal damping friction applied to output shaft, and <italic>K</italic>
<sub>
<italic>e</italic>
</sub> and <italic>K</italic>
<sub>
<italic>&#x3c4;</italic>
</sub> are the motor&#x2019;s generator and torque constants, respectively. To identify the values of the DC motor and reaction wheel parameters, a series of system identification experiments were conducted, as described&#x20;next.</p>
<p>The resistance of the motor <italic>R</italic> was measured directly with an ohm&#xa0;meter, and the sum of the motor and reaction wheel inertias <italic>J</italic> was approximated using analytical expressions for the moment of inertia of a cylinder about its axis of symmetry with a known mass and diameter. To determine the motor generator constant <italic>K</italic>
<sub>
<italic>e</italic>
</sub>, substitute <xref ref-type="disp-formula" rid="e26">Eq. 26</xref> into <xref ref-type="disp-formula" rid="e25">Eq. 25</xref> and examine the system at steady current state, i.e.,&#x20;<italic>di</italic>/<italic>dt</italic> &#x3d; 0. Solving for <inline-formula id="inf71">
<mml:math id="m101">
<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:math>
</inline-formula> yields<disp-formula id="e29">
<mml:math id="m102">
<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>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfrac>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>R</mml:mi>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mo>.</mml:mo>
</mml:math>
<label>(29)</label>
</disp-formula>
</p>
<p>Using a Rigol DP711 power supply and quadrature encoder attached to the motor&#x2019;s output shaft, a series of constant voltages were applied to the motor. For each voltage, the current through the motor and the angular velocity of the output shaft at steady state were recorded. A linear regression was used to determine the quantity 1/<italic>K</italic>
<sub>
<italic>e</italic>
</sub>, which is the slope of the line in <xref ref-type="disp-formula" rid="e29">Eq. 29</xref> and <xref ref-type="fig" rid="F6">Figure&#x20;6A</xref>.</p>
<fig id="F6" position="float">
<label>FIGURE 6</label>
<caption>
<p>Experimental data used to identify motor-reaction wheel dynamics: Panels <bold>(A&#x2013;C)</bold> are used to infer the values of the generator constant, linear damping, and torque constant through linear regression. Panel <bold>(D)</bold> compares the motor&#x2019;s simulated and actuated response with a best guessed value of the inductance.</p>
</caption>
<graphic xlink:href="fcteg-02-782121-g006.tif"/>
</fig>
<p>The internal frinction coefficient <italic>&#x3b6;</italic>
<sub>
<italic>m</italic>
</sub> was found by setting the torque to zero, i.e.,&#x20;<italic>&#x3c4;</italic> &#x3d; 0 in <xref ref-type="disp-formula" rid="e28">Eq. 28</xref>, and solving the resulting differential equation to obtain<disp-formula id="e30">
<mml:math id="m103">
<mml:mi>ln</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<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:mfenced open="(" close=")">
<mml:mrow>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x3d;</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b6;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi>J</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:mi>t</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>ln</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<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:mfenced open="(" close=")">
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mfenced>
<mml:mo>,</mml:mo>
</mml:math>
<label>(30)</label>
</disp-formula>where <inline-formula id="inf72">
<mml:math id="m104">
<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:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> is the initial shaft angular velocity. Notice that <xref ref-type="disp-formula" rid="e30">Eq. 30</xref> is a linear equation that describes <inline-formula id="inf73">
<mml:math id="m105">
<mml:mi>ln</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</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 stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula> as a function of time. A similar technique as described previously can be used to find &#x2212; <italic>&#x3b6;</italic>
<sub>
<italic>m</italic>
</sub>/<italic>J</italic> from a time-history of torque-free motor data. To identify the damping parameter, the motor was initialized with a constant nonzero angular velocity and the input voltage was removed. The motor&#x2019;s angular velocity was recorded as it decays under internal friction. As before, a linear regression was used to determine the slope &#x2212; <italic>&#x3b6;</italic>
<sub>
<italic>m</italic>
</sub>/<italic>J</italic> in <xref ref-type="disp-formula" rid="e30">Eq. 30</xref> from <xref ref-type="fig" rid="F6">Figure&#x20;6B</xref> and, hence, <italic>&#x3b6;</italic>
<sub>
<italic>m</italic>
</sub> can be inferred since <italic>J</italic> is&#x20;known.</p>
<p>To determine the torque constant <italic>K</italic>
<sub>
<italic>&#x3c4;</italic>
</sub>, substitute <xref ref-type="disp-formula" rid="e27">Eq. 27</xref> into <xref ref-type="disp-formula" rid="e28">Eq. 28</xref> at steady state (<inline-formula id="inf74">
<mml:math id="m106">
<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:math>
</inline-formula> constant) and solve for <inline-formula id="inf75">
<mml:math id="m107">
<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:math>
</inline-formula> to obtain<disp-formula id="e31">
<mml:math id="m108">
<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>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3c4;</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b6;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfrac>
<mml:mi>i</mml:mi>
<mml:mo>.</mml:mo>
</mml:math>
<label>(31)</label>
</disp-formula>
</p>
<p>By repeating the procedure used to determine <italic>K</italic>
<sub>
<italic>e</italic>
</sub>, using the value of <italic>&#x3b6;</italic>
<sub>
<italic>m</italic>
</sub>, the value of <italic>K</italic>
<sub>
<italic>&#x3c4;</italic>
</sub> is found from the slope <italic>K</italic>
<sub>
<italic>&#x3c4;</italic>
</sub>/<italic>&#x3b6;</italic>
<sub>
<italic>m</italic>
</sub> in <xref ref-type="disp-formula" rid="e31">Eq. 31</xref> and <xref ref-type="fig" rid="F6">Figure&#x20;6C</xref>.</p>
<p>Since the inductance <italic>&#x3bc;</italic> only plays a role in the transient response of the motor, which are sufficiently fast, we estimate this parameter heuristically. The simulated response of the motor to a sinusoidal voltage input is visually compared to the actual response of the motor under the same input. The process is repeated while adjusting the value of <italic>&#x3bc;</italic> to obtain a similar response, as shown in <xref ref-type="fig" rid="F6">Figure&#x20;6D</xref>.</p>
<p>Lastly, the motor was found to exhibit a range of deadband voltages near zero that resulted in the motor being unresponsive. To determine the range of this deadband, a series of incrementally increasing voltages were applied to the motor, giving an approximate deadband range of &#xb1; 4V. The parameter values determined through this system identification process are summarized in <xref ref-type="table" rid="T2">Table&#x20;2</xref>.</p>
<table-wrap id="T2" position="float">
<label>TABLE 2</label>
<caption>
<p>Motor parameters identified through system identification for the Pololu 12&#xa0;V DC Motor (with 4.4 to 1 gear ration) and reaction&#x20;wheel.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th align="left">Parameter</th>
<th align="center">Symbol</th>
<th align="center">Value</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">Inductance</td>
<td align="center">
<italic>&#x3bc;</italic>
</td>
<td align="center">0.005&#xa0;H</td>
</tr>
<tr>
<td align="left">Generator constant</td>
<td align="center">
<italic>K</italic>
<sub>
<italic>e</italic>
</sub>
</td>
<td align="center">0.0506&#xa0;V&#x22c5;s/rad</td>
</tr>
<tr>
<td align="left">Torque constant</td>
<td align="center">
<italic>K</italic>
<sub>
<italic>&#x3c4;</italic>
</sub>
</td>
<td align="center">0.2137&#xa0;N&#x22c5;m/A</td>
</tr>
<tr>
<td align="left">Damping coefficient</td>
<td align="center">
<italic>&#x3b6;</italic>
<sub>
<italic>m</italic>
</sub>
</td>
<td align="center">&#x2212;1.1016&#x20;&#xd7; 10<sup>&#x2212;4</sup>&#xa0;N&#x22c5;m &#x22c5;s/rad</td>
</tr>
<tr>
<td align="left">Resistance</td>
<td align="center">
<italic>R</italic>
</td>
<td align="center">2.5&#xa0;&#x3a9;</td>
</tr>
<tr>
<td align="left">Inertia</td>
<td align="center">
<italic>J</italic>
</td>
<td align="center">1.7405&#x20;&#xd7; 10<sup>&#x2212;4&#x20;kg</sup> &#x22c5;m<sup>2</sup>
</td>
</tr>
<tr>
<td align="left">Deadband</td>
<td align="center">&#x2014;</td>
<td align="center">&#xb1; 4&#xa0;V</td>
</tr>
</tbody>
</table>
</table-wrap>
</sec>
<sec id="s4-2">
<title>4.2 DC Motor Torque Tracking Controller</title>
<p>To implement the LQG torque controller and state estimator for the DC motor, convert <xref ref-type="disp-formula" rid="e25">Eqs 25</xref>&#x2013;<xref ref-type="disp-formula" rid="e28">28</xref> into state space form where <inline-formula id="inf76">
<mml:math id="m109">
<mml:mi mathvariant="bold-italic">q</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mi>&#x3c4;</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:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> denotes the states of the motor and the output is <inline-formula id="inf77">
<mml:math id="m110">
<mml:mi mathvariant="normal">&#x3d2;</mml:mi>
<mml:mo>&#x3d;</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:math>
</inline-formula>. The continuous-time state space equations take the form<disp-formula id="e32">
<mml:math id="m111">
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">q</mml:mi>
</mml:mrow>
<mml:mo>&#x307;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mi mathvariant="bold-italic">A</mml:mi>
<mml:mi mathvariant="bold-italic">q</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi mathvariant="bold-italic">B</mml:mi>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
</mml:math>
<label>(32)</label>
</disp-formula>
<disp-formula id="e33">
<mml:math id="m112">
<mml:mi mathvariant="normal">&#x3d2;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi mathvariant="bold-italic">C</mml:mi>
<mml:mi mathvariant="bold-italic">q</mml:mi>
</mml:math>
<label>(33)</label>
</disp-formula>where<disp-formula id="e34">
<mml:math id="m113">
<mml:mi mathvariant="bold-italic">A</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3bc;</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3c4;</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3bc;</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mfrac>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>J</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b6;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi>J</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
<mml:mo>,</mml:mo>
<mml:mspace width="0.3333em"/>
<mml:mi mathvariant="bold-italic">B</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3c4;</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3bc;</mml:mi>
</mml:mrow>
</mml:mfrac>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
<mml:mo>,</mml:mo>
<mml:mspace width="0.3333em"/>
<mml:mtext>and</mml:mtext>
<mml:mspace width="0.3333em"/>
<mml:mi mathvariant="bold-italic">C</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>1</mml:mn>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
<mml:mo>.</mml:mo>
</mml:math>
<label>(34)</label>
</disp-formula>
</p>
<p>For implementation onboard the micro-controller, the continuous system <xref ref-type="disp-formula" rid="e32">Eqs 32,</xref> <xref ref-type="disp-formula" rid="e33">33</xref> is converted into a discrete-time system (with an addition of torque process noise and heading measurement noise):<disp-formula id="e35">
<mml:math id="m114">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">q</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mi mathvariant="bold">&#x3a6;</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">q</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:mi mathvariant="bold">&#x393;</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:mi mathvariant="bold-italic">&#x3be;</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
<label>(35)</label>
</disp-formula>
<disp-formula id="e36">
<mml:math id="m115">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="normal">&#x3d2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mi mathvariant="bold-italic">C</mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">q</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>&#x3b7;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
</mml:math>
<label>(36)</label>
</disp-formula>where (<xref ref-type="bibr" rid="B8">Crassidis and Junkins, 2011</xref>)<disp-formula id="e37">
<mml:math id="m116">
<mml:mi mathvariant="bold">&#x3a6;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="bold-italic">A</mml:mi>
<mml:mi mathvariant="normal">&#x394;</mml:mi>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mspace width="0.28em"/>
<mml:mo>,</mml:mo>
<mml:mspace width="1em"/>
<mml:mi mathvariant="bold">&#x393;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mo>&#x222b;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">&#x394;</mml:mi>
<mml:mi>t</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="bold-italic">A</mml:mi>
<mml:mi>&#x3c4;</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mi>d</mml:mi>
<mml:mi>&#x3c4;</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mi mathvariant="bold-italic">B</mml:mi>
<mml:mspace width="0.28em"/>
<mml:mo>,</mml:mo>
<mml:mspace width="1em"/>
<mml:mi mathvariant="bold-italic">&#x3be;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mn>1</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
<mml:mspace width="0.28em"/>
<mml:mo>,</mml:mo>
<mml:mspace width="2em"/>
</mml:math>
<label>(37)</label>
</disp-formula>
<italic>k</italic> is an integer indexing the discrete state, &#x394;<italic>t</italic>&#x20;&#x3d; 100<italic>Hz</italic> is the time-step of the microcontroller, <italic>w</italic>
<sub>
<italic>k</italic>
</sub> is zero-mean, Gaussian, additive process noise with variance <inline-formula id="inf78">
<mml:math id="m117">
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c3;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>w</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>, and <italic>&#x3b7;</italic>
<sub>
<italic>k</italic>
</sub> is zero-mean, Gaussian, additive measurement noise with variance <inline-formula id="inf79">
<mml:math id="m118">
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c3;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3b7;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>. We adopt the standard approach outlined in (<xref ref-type="bibr" rid="B8">Crassidis and Junkins, 2011</xref>) and (<xref ref-type="bibr" rid="B4">Brown and Hwang, 1997</xref>) to implement a discrete-time Kalman filter for the system <xref ref-type="disp-formula" rid="e35">Eqs 35,</xref> <xref ref-type="disp-formula" rid="e36">36</xref>. The estimated state <inline-formula id="inf80">
<mml:math id="m119">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">q</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula> is used in a linear-quadratic-regulator (LQR) feedback control law of the form <inline-formula id="inf81">
<mml:math id="m120">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="normal">&#x39b;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3ba;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">q</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">q</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>, where the <bold>
<italic>&#x3ba;</italic>
</bold> is a gain matrix found by solving the discrete-time algebraic Riccati equation and <bold>
<italic>q</italic>
</bold>
<sub>
<italic>d</italic>
</sub> are the desired state values. Numerical values used in the LQG controller and estimator design are given in <xref ref-type="table" rid="T3">Table&#x20;3</xref>.</p>
<table-wrap id="T3" position="float">
<label>TABLE 3</label>
<caption>
<p>Parameters used in a LQG controller and estimator.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th align="left">Parameter</th>
<th align="center">Symbol</th>
<th align="center">Value</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">Process noise variance</td>
<td align="center">
<inline-formula id="inf82">
<mml:math id="m121">
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c3;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="center">1&#x20;V<sup>2</sup>
</td>
</tr>
<tr>
<td align="left">Measurement noise variance</td>
<td align="center">
<inline-formula id="inf83">
<mml:math id="m122">
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3c3;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>&#x3b7;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="center">0.89&#x20;(rad/s)<sup>2</sup>
</td>
</tr>
<tr>
<td align="left">LQR gain</td>
<td align="center">
<bold>
<italic>&#x3ba;</italic>
</bold>
</td>
<td align="center">[&#x2212;9.57,0.24]<sup>
<italic>T</italic>
</sup>
</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>To evaluate the LQG torque controller/estimator, the control law <xref ref-type="disp-formula" rid="e9">Eq. 9</xref> was used to generate a reference torque for a step input change in desired heading. The performance of the torque tracking controller is shown in <xref ref-type="fig" rid="F7">Figure&#x20;7A</xref>, and the heading trajectory of the fish robot during this experiment is examined in the next section.</p>
<fig id="F7" position="float">
<label>FIGURE 7</label>
<caption>
<p>Experimental data from a closed loop heading controller <xref ref-type="disp-formula" rid="e9">Eq. 9</xref>: <bold>(A)</bold> the reference torque produced by <xref ref-type="disp-formula" rid="e9">Eq. 9</xref> and the estimated torque from the LQG controller. <bold>(B)</bold> fish robot&#x2019;s closed loop heading response to a step input reference heading.</p>
</caption>
<graphic xlink:href="fcteg-02-782121-g007.tif"/>
</fig>
</sec>
<sec id="s4-3">
<title>4.3 Heading Control Experimental Results</title>
<p>We first examine the accuracy of the closed-loop directional controller <xref ref-type="disp-formula" rid="e9">Eq. 9</xref>, where <italic>&#x3b8;</italic>
<sub>
<italic>d</italic>
</sub> is a desired heading. After testing <xref ref-type="disp-formula" rid="e9">Eq. 9</xref> on a single robotic fish, we found that the DC motor&#x2019;s deadband does not allow the average heading to completely converge to <italic>&#x3b8;</italic>
<sub>
<italic>d</italic>
</sub>. When the fish robot&#x2019;s heading is close to the desired heading, the voltage required to close the gap is too small and falls within the dead zone making the motor unresponsive. The accuracy of <xref ref-type="disp-formula" rid="e9">Eq. 9</xref> is limited on our testbed due to this voltage deadband, but can also be mitigated by choice of the values of the nonlinear control gains <italic>K</italic>
<sub>1</sub> and <italic>K</italic>
<sub>2</sub>. In both <xref ref-type="disp-formula" rid="e9">Eq. 9</xref> and <xref ref-type="disp-formula" rid="e17">Eq. 17</xref>, increasing the value of <italic>K</italic>
<sub>2</sub> makes the control laws more sensitive to relative heading errors and increases the torque required to minimize the error. Similarly <italic>K</italic>
<sub>1</sub> amplifies the torque and, therefore the voltage input required to keep the fish swimming. Tuning these control gains increases the accuracy of the aforementioned control laws. The experimental results of this test with a step input for <italic>&#x3b8;</italic>
<sub>
<italic>d</italic>
</sub> is shown in <xref ref-type="fig" rid="F7">Figure&#x20;7B</xref>. The fish robot&#x2019;s heading oscillates about a desired heading with a small persistent error between the average and desired headings. The control gains used in this experiment are <italic>K</italic>
<sub>1</sub> &#x3d; 0.5 and <italic>K</italic>
<sub>2</sub> &#x3d;&#x20;7.</p>
</sec>
<sec id="s4-4">
<title>4.4 Parallel Formation Experimental Results</title>
<p>To validate the theoretical results of the parallel formation control law <xref ref-type="disp-formula" rid="e17">Eq. 17</xref>, the results from six experiments are presented. The fish robots&#x2019; micro-controller uses IMU measurements for the heading and xBee radios for communication within the school. An overhead camera observes the positions of each fish robot; these were not used by the school during the experiments.</p>
<p>Four fish robots were initialized with random initial positions and orientations at the beginning of each parallel formation control experiment (implemented with gains <italic>K</italic>
<sub>1</sub> &#x3d; 3 and <italic>K</italic>
<sub>2</sub> &#x3d; 5). Consensus was achieved by the four fish with a small phase shift (up to 20 degrees) of the mean heading for each fish. This offset may be attributed to excess noise in angular velocity measurements and the aforementioned voltage dead zone. An example heading time-history from one of the experiments is shown in <xref ref-type="fig" rid="F8">Figure&#x20;8A</xref>.</p>
<fig id="F8" position="float">
<label>FIGURE 8</label>
<caption>
<p>Parallel formation control onboard sensor data: <bold>(A)</bold> orientation measurements from onboard IMU for each fish robot while achieving a parallel formation. <bold>(B)</bold> experimental parallel formation misalignment potential computed for six independent experiments.</p>
</caption>
<graphic xlink:href="fcteg-02-782121-g008.tif"/>
</fig>
<p>The excess noise in the angular velocity measurements caused large spikes to appear when computing the Lyapunov potential <xref ref-type="disp-formula" rid="e13">Eq. 13</xref> from experimental data. Thus, to illustrate the convergence of this potential, the <inline-formula id="inf84">
<mml:math id="m123">
<mml:mfrac>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mi mathvariant="bold-italic">&#x3c9;</mml:mi>
</mml:math>
</inline-formula> term was removed, leaving only the heading alignment term <inline-formula id="inf85">
<mml:math id="m124">
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>K</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mi>N</mml:mi>
</mml:mrow>
</mml:mfrac>
<mml:mo>&#x3c;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi>L</mml:mi>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x3e;</mml:mo>
</mml:math>
</inline-formula> plotted in <xref ref-type="fig" rid="F8">Figure&#x20;8B</xref> for each of the six experiments. As mentioned in <xref ref-type="sec" rid="s3">Section 3</xref>, the potential function does not decrease completely to zero when consensus is achieved because each robot converges to a different phase on the limit&#x20;cycle.</p>
<p>An example trajectory of the fish robots in <xref ref-type="fig" rid="F9">Figure&#x20;9A</xref> and the <xref ref-type="sec" rid="s11">Supplementary Material S1</xref> shows the fish robots achieving consensus and swimming in a parallel formation. However, since the ground truth orientations of the fish robots are not used, errors in the IMU measurements sometimes cause a subset of the school to swim in a different direction than the rest of the school, as shown in <xref ref-type="fig" rid="F9">Figure&#x20;9B</xref>. The error in IMU measurements may be caused by an erroneous calibration or magnetic anomalies in the water tank interfering with the onboard magnetometer.</p>
<fig id="F9" position="float">
<label>FIGURE 9</label>
<caption>
<p>Parallel formation control of fish robot ground truth trajectory: <bold>(A)</bold> school of robotic fish swimming in a parallel formation. <bold>(B)</bold> errors affect the IMU of one fish causing to swim in a different direction than the rest of the school.</p>
</caption>
<graphic xlink:href="fcteg-02-782121-g009.tif"/>
</fig>
</sec>
</sec>
<sec id="s5">
<title>5 Conclusion</title>
<p>Nonlinear control laws are proposed that stabilize parallel and circular formations in a model of <italic>N</italic> planar fish robots. The control design approach extends prior work on collective motion of self-propelled particles to a school of robotic fish with Chaplygin sleigh dynamics. The feedback control laws rely only on relative-state measurements between agents that interact according to a connected, undirected, communication graph and do not include feedback linearization of the agents&#x2019; dynamics. Implementing the parallel control law on a testbed of fish robots required conducting system identification experiments to characterize the motor dynamics and designing a torque tracking motor controller and estimator. Numerical simulations and experiments on a school of robotic fish demonstrate the proposed approach. In ongoing work, we seek to model the fluid interactions between fish robots and instrument the robotic fish with pressure sensors to exploit the hydrodynamic benefits of close-proximity swimming.</p>
</sec>
</body>
<back>
<sec id="s6">
<title>Data Availability Statement</title>
<p>The raw data supporting the conclusion of this article will be made available by the authors, without undue reservation.</p>
</sec>
<sec id="s7">
<title>Author Contributions</title>
<p>DP, AW, and PG contributed to conception and design of the study. AT performed the experiments and analyzed the experimental data. AT and AW wrote the experimental sections of the manuscript. All authors contributed to manuscript revision, read, and approved the submitted version.</p>
</sec>
<sec id="s8">
<title>Funding</title>
<p>ONR Grant No. 115239289 and NSF Grant No. 1756179.</p>
</sec>
<sec sec-type="COI-statement" id="s9">
<title>Conflict of Interest</title>
<p>The authors declare that the research was conducted in the absence of any commercial or financial relationships that could be construed as a potential conflict of interest.</p>
</sec>
<sec sec-type="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/fcteg.2021.782121/full#supplementary-material">https://www.frontiersin.org/articles/10.3389/fcteg.2021.782121/full&#x23;supplementary-material</ext-link>
</p>
<supplementary-material xlink:href="Video1.MP4" id="SM1" mimetype="application/MP4" 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>Berlinger</surname>
<given-names>F.</given-names>
</name>
<name>
<surname>Gauci</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Nagpal</surname>
<given-names>R.</given-names>
</name>
</person-group> (<year>2021</year>). <article-title>Implicit Coordination for 3D Underwater Collective Behaviors in a Fish-Inspired Robot Swarm</article-title>. <source>Sci. Robot</source> <volume>6</volume> (<issue>50</issue>), <fpage>eabd8668</fpage>. <pub-id pub-id-type="doi">10.1126/scirobotics.abd8668</pub-id> </citation>
</ref>
<ref id="B2">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Bloch</surname>
<given-names>A. M.</given-names>
</name>
</person-group> (<year>2003</year>). &#x201c;<article-title>The Chaplygin Sleigh</article-title>,&#x201d; in <source>Nonholonomic Mechanics and Control</source> (<publisher-loc>New York, NY</publisher-loc>: <publisher-name>Springer</publisher-name>), <fpage>25</fpage>&#x2013;<lpage>29</lpage>. </citation>
</ref>
<ref id="B3">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Brin&#xf3;n-Arranz</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Seuret</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Canudas-de Wit</surname>
<given-names>C.</given-names>
</name>
</person-group> (<year>2014</year>). <article-title>Cooperative Control Design for Time-Varying Formations of Multi-Agent Systems</article-title>. <source>IEEE Trans. Automatic Control.</source> <volume>59</volume> (<issue>8</issue>), <fpage>2283</fpage>&#x2013;<lpage>2288</lpage>. <pub-id pub-id-type="doi">10.1109/TAC.2014.2303213</pub-id> </citation>
</ref>
<ref id="B4">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Brown</surname>
<given-names>R. G.</given-names>
</name>
<name>
<surname>Hwang</surname>
<given-names>P. Y.</given-names>
</name>
</person-group> (<year>1997</year>). <source>Introduction to Random Signals and Applied Kalman Filtering: With MATLAB Exercises and Solutions</source>. <publisher-loc>New York, NY</publisher-loc>: <publisher-name>Wiley</publisher-name>, <fpage>214</fpage>&#x2013;<lpage>220</lpage>. </citation>
</ref>
<ref id="B5">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Cao</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Ren</surname>
<given-names>W.</given-names>
</name>
</person-group> (<year>2012</year>). &#x201c;<article-title>Finite-Time Consensus for Single-Integrator Kinematics with Unknown Inherent Nonlinear Dynamics under a Directed Interaction Graph</article-title>,&#x201d; in <conf-name>American Control Conf</conf-name>, <fpage>1603</fpage>&#x2013;<lpage>1608</lpage>. <pub-id pub-id-type="doi">10.1109/acc.2012.6315428</pub-id> </citation>
</ref>
<ref id="B6">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Cao</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Yu</surname>
<given-names>W.</given-names>
</name>
<name>
<surname>Ren</surname>
<given-names>W.</given-names>
</name>
<name>
<surname>Chen</surname>
<given-names>G.</given-names>
</name>
</person-group> (<year>2013</year>). <article-title>An Overview of Recent Progress in the Study of Distributed Multi-Agent Coordination</article-title>. <source>IEEE Trans. Ind. Inf.</source> <volume>9</volume> (<issue>1</issue>), <fpage>427</fpage>&#x2013;<lpage>438</lpage>. <pub-id pub-id-type="doi">10.1109/tii.2012.2219061</pub-id> </citation>
</ref>
<ref id="B7">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Chopra</surname>
<given-names>N.</given-names>
</name>
</person-group> (<year>2012</year>). <article-title>Output Synchronization on Strongly Connected Graphs</article-title>. <source>IEEE Trans. Automat. Contr.</source> <volume>57</volume> (<issue>11</issue>), <fpage>2896</fpage>&#x2013;<lpage>2901</lpage>. <pub-id pub-id-type="doi">10.1109/tac.2012.2193704</pub-id> </citation>
</ref>
<ref id="B8">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Crassidis</surname>
<given-names>J.&#x20;L.</given-names>
</name>
<name>
<surname>Junkins</surname>
<given-names>J.&#x20;L.</given-names>
</name>
</person-group> (<year>2011</year>). <source>Optimal Estimation of Dynamic Systems</source>. <publisher-loc>New York, NY</publisher-loc>: <publisher-name>CRC Press</publisher-name>. </citation>
</ref>
<ref id="B9">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Diestel</surname>
<given-names>R.</given-names>
</name>
</person-group> (<year>2000</year>). &#x201c;<article-title>The Basics</article-title>,&#x201d; in <source>Graph Theory</source> (<publisher-loc>New York, NY</publisher-loc>: <publisher-name>Springer</publisher-name>), <fpage>1</fpage>&#x2013;<lpage>28</lpage>. </citation>
</ref>
<ref id="B10">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Free</surname>
<given-names>B.</given-names>
</name>
<name>
<surname>Patnaik</surname>
<given-names>M. K.</given-names>
</name>
<name>
<surname>Paley</surname>
<given-names>D. A.</given-names>
</name>
</person-group> (<year>2017</year>). &#x201c;<article-title>Observability-Based Path-Planning and Flow-Relative Control of a Bioinspired Sensor Array in a Karman Vortex Street</article-title>,&#x201d; in <conf-name>American Control Conf</conf-name>, <conf-loc>Seattle, WA</conf-loc>, <conf-date>May 24&#x2013;26, 2017</conf-date>, <fpage>548</fpage>&#x2013;<lpage>554</lpage>. <pub-id pub-id-type="doi">10.23919/acc.2017.7963010</pub-id> </citation>
</ref>
<ref id="B11">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Free</surname>
<given-names>B. A.</given-names>
</name>
<name>
<surname>Lee</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Paley</surname>
<given-names>D. A.</given-names>
</name>
</person-group> (<year>2020</year>). <article-title>Bioinspired Pursuit with a Swimming Robot Using Feedback Control of an Internal Rotor</article-title>. <source>Bioinspir. Biomim.</source> <volume>15</volume> (<issue>3</issue>), <fpage>035005</fpage>. <pub-id pub-id-type="doi">10.1088/1748-3190/ab745e</pub-id> </citation>
</ref>
<ref id="B12">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Horn</surname>
<given-names>R. A.</given-names>
</name>
<name>
<surname>Johnson</surname>
<given-names>C. R.</given-names>
</name>
</person-group> (<year>1990</year>). <source>Matrix Analysis</source>. <publisher-loc>New York, NY</publisher-loc>: <publisher-name>Cambridge University Press</publisher-name>. </citation>
</ref>
<ref id="B13">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Jain</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Ghose</surname>
<given-names>D.</given-names>
</name>
</person-group> (<year>2019</year>). <article-title>Trajectory-Constrained Collective Circular Motion with Different Phase Arrangements</article-title>. <source>IEEE Trans. Automatic Control.</source> <volume>65</volume> (<issue>5</issue>), <fpage>2237</fpage>&#x2013;<lpage>2244</lpage>. <pub-id pub-id-type="doi">10.1109/TAC.2019.2940233</pub-id> </citation>
</ref>
<ref id="B14">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Justh</surname>
<given-names>E. W.</given-names>
</name>
<name>
<surname>Krishnaprasad</surname>
<given-names>P. S.</given-names>
</name>
</person-group> (<year>2004</year>). <article-title>Equilibria and Steering Laws for Planar Formations</article-title>. <source>Syst. Control. Lett.</source> <volume>52</volume> (<issue>1</issue>), <fpage>25</fpage>&#x2013;<lpage>38</lpage>. <pub-id pub-id-type="doi">10.1016/j.sysconle.2003.10.004</pub-id> </citation>
</ref>
<ref id="B15">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Kelly</surname>
<given-names>S. D.</given-names>
</name>
<name>
<surname>Fairchild</surname>
<given-names>M. J.</given-names>
</name>
<name>
<surname>Hassing</surname>
<given-names>P. M.</given-names>
</name>
<name>
<surname>Tallapragada</surname>
<given-names>P.</given-names>
</name>
</person-group> (<year>2012</year>). &#x201c;<article-title>Proportional Heading Control for Planar Navigation: The Chaplygin Beanie and Fishlike Robotic Swimming</article-title>,&#x201d; in <conf-name>American Control Conf</conf-name>, <conf-loc>Montreal, QC</conf-loc>, <conf-date>June 27&#x2013;29, 2012</conf-date>, <fpage>4885</fpage>&#x2013;<lpage>4890</lpage>. <pub-id pub-id-type="doi">10.1109/acc.2012.6315688</pub-id> </citation>
</ref>
<ref id="B16">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Kim</surname>
<given-names>S.-H.</given-names>
</name>
</person-group> (<year>2017</year>). <source>Electric Motor Control: DC, AC, and BLDC Motors</source>. <publisher-loc>Amsterdam, Netherlands</publisher-loc>: <publisher-name>Elsevier</publisher-name>. </citation>
</ref>
<ref id="B17">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Lee</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Free</surname>
<given-names>B.</given-names>
</name>
<name>
<surname>Santana</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Paley</surname>
<given-names>D. A.</given-names>
</name>
</person-group> (<year>2019</year>). &#x201c;<article-title>State-Feedback Control of an Internal Rotor for Propelling and Steering a Flexible Fish-Inspired Underwater Vehicle</article-title>,&#x201d; in <conf-name>American Control Conf</conf-name>, <conf-loc>Philadelphia, PA</conf-loc>, <conf-date>July 10&#x2013;12, 2019</conf-date>, <fpage>2011</fpage>&#x2013;<lpage>2016</lpage>. <pub-id pub-id-type="doi">10.23919/acc.2019.8814908</pub-id> </citation>
</ref>
<ref id="B18">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Li</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Fu</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Xie</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Zhang</surname>
<given-names>J.-F.</given-names>
</name>
</person-group> (<year>2011</year>). <article-title>Distributed Consensus with Limited Communication Data Rate</article-title>. <source>IEEE Trans. Automat. Contr.</source> <volume>56</volume> (<issue>2</issue>), <fpage>279</fpage>&#x2013;<lpage>292</lpage>. <pub-id pub-id-type="doi">10.1109/tac.2010.2052384</pub-id> </citation>
</ref>
<ref id="B19">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Moreau</surname>
<given-names>L.</given-names>
</name>
</person-group> (<year>2005</year>). <article-title>Stability of Multiagent Systems with Time-Dependent Communication Links</article-title>. <source>IEEE Trans. Automat. Contr.</source> <volume>50</volume> (<issue>2</issue>), <fpage>169</fpage>&#x2013;<lpage>182</lpage>. <pub-id pub-id-type="doi">10.1109/tac.2004.841888</pub-id> </citation>
</ref>
<ref id="B20">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Napora</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Paley</surname>
<given-names>D. A.</given-names>
</name>
</person-group> (<year>2013</year>). <article-title>Observer-Based Feedback Control for Stabilization of Collective Motion</article-title>. <source>IEEE Trans. Contr. Syst. Technol.</source> <volume>21</volume> (<issue>5</issue>), <fpage>1846</fpage>&#x2013;<lpage>1857</lpage>. <pub-id pub-id-type="doi">10.1109/tcst.2012.2205252</pub-id> </citation>
</ref>
<ref id="B21">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Olshevsky</surname>
<given-names>A.</given-names>
</name>
</person-group> (<year>2015</year>). <article-title>Linear Time Average Consensus on Fixed Graphs&#x2217;&#x2217;This Work Was Supported by NSF Award CMMI-1463262</article-title>. <source>IFAC-PapersOnLine</source> <volume>48</volume> (<issue>22</issue>), <fpage>94</fpage>&#x2013;<lpage>99</lpage>. <pub-id pub-id-type="doi">10.1016/j.ifacol.2015.10.313</pub-id> </citation>
</ref>
<ref id="B22">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Paley</surname>
<given-names>D. A.</given-names>
</name>
</person-group> (<year>2007</year>). <article-title>Cooperative Control of Collective Motion for Ocean Sampling with Autonomous Vehicles</article-title>. <comment>Ph.D. thesis</comment>. <publisher-loc>Princeton, NJ</publisher-loc>: <publisher-name>Princeton University</publisher-name>. </citation>
</ref>
<ref id="B23">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Paley</surname>
<given-names>D. A.</given-names>
</name>
</person-group> (<year>2008</year>). &#x201c;<article-title>Cooperative Control of an Autonomous Sampling Network in an External Flow Field</article-title>,&#x201d; in <conf-name>IEEE Conf. Decision and Control</conf-name>, <conf-loc>Cancun, Mexico</conf-loc>, <conf-date>December 9&#x2013;11, 2008</conf-date> (<publisher-name>IEEE</publisher-name>), <fpage>3095</fpage>&#x2013;<lpage>3100</lpage>. <pub-id pub-id-type="doi">10.1109/cdc.2008.4739077</pub-id> </citation>
</ref>
<ref id="B24">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Paley</surname>
<given-names>D. A.</given-names>
</name>
</person-group> (<year>2009</year>). <article-title>Stabilization of Collective Motion on a Sphere</article-title>. <source>Automatica</source> <volume>45</volume> (<issue>1</issue>), <fpage>212</fpage>&#x2013;<lpage>216</lpage>. <pub-id pub-id-type="doi">10.1016/j.automatica.2008.06.012</pub-id> </citation>
</ref>
<ref id="B25">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Pollard</surname>
<given-names>B.</given-names>
</name>
<name>
<surname>Fedonyuk</surname>
<given-names>V.</given-names>
</name>
<name>
<surname>Tallapragada</surname>
<given-names>P.</given-names>
</name>
</person-group> (<year>2019</year>). <article-title>Swimming on Limit Cycles with Nonholonomic Constraints</article-title>. <source>Nonlinear Dyn.</source> <volume>97</volume> (<issue>4</issue>), <fpage>2453</fpage>&#x2013;<lpage>2468</lpage>. <pub-id pub-id-type="doi">10.1007/s11071-019-05141-z</pub-id> </citation>
</ref>
<ref id="B26">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Ren</surname>
<given-names>W.</given-names>
</name>
<name>
<surname>Beard</surname>
<given-names>R. W.</given-names>
</name>
</person-group> (<year>2005</year>). <article-title>Consensus Seeking in Multiagent Systems under Dynamically Changing Interaction Topologies</article-title>. <source>IEEE Trans. Automat. Contr.</source> <volume>50</volume> (<issue>5</issue>), <fpage>655</fpage>&#x2013;<lpage>661</lpage>. <pub-id pub-id-type="doi">10.1109/tac.2005.846556</pub-id> </citation>
</ref>
<ref id="B27">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Ren</surname>
<given-names>W.</given-names>
</name>
<name>
<surname>Beard</surname>
<given-names>R. W.</given-names>
</name>
<name>
<surname>Atkins</surname>
<given-names>E. M.</given-names>
</name>
</person-group> (<year>2007</year>). <article-title>Information Consensus in Multivehicle Cooperative Control</article-title>. <source>IEEE Control. Syst. Mag.</source> <volume>27</volume> (<issue>2</issue>), <fpage>71</fpage>&#x2013;<lpage>82</lpage>. <pub-id pub-id-type="doi">10.1109/MCS.2007.338264</pub-id> </citation>
</ref>
<ref id="B28">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Reynolds</surname>
<given-names>C. W.</given-names>
</name>
</person-group> (<year>1987</year>). <article-title>Flocks, Herds and Schools: A Distributed Behavioral Model</article-title>. <source>SIGGRAPH Comput. Graph.</source> <volume>21</volume> (<issue>4</issue>), <fpage>25</fpage>&#x2013;<lpage>34</lpage>. <pub-id pub-id-type="doi">10.1145/37402.37406</pub-id> </citation>
</ref>
<ref id="B29">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Scardovi</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Sarlette</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Sepulchre</surname>
<given-names>R.</given-names>
</name>
</person-group> (<year>2007</year>). <article-title>Synchronization and Balancing on the <italic>N</italic>-Torus</article-title>. <source>Syst. Control. Lett.</source> <volume>56</volume> (<issue>5</issue>), <fpage>335</fpage>&#x2013;<lpage>341</lpage>. <pub-id pub-id-type="doi">10.1016/j.sysconle.2006.10.020</pub-id> </citation>
</ref>
<ref id="B30">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Sepulchre</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Paley</surname>
<given-names>D. A.</given-names>
</name>
<name>
<surname>Leonard</surname>
<given-names>N. E.</given-names>
</name>
</person-group> (<year>2007</year>). <article-title>Stabilization of Planar Collective Motion: All-To-All Communication</article-title>. <source>IEEE Trans. Automat. Contr.</source> <volume>52</volume> (<issue>5</issue>), <fpage>811</fpage>&#x2013;<lpage>824</lpage>. <pub-id pub-id-type="doi">10.1109/tac.2007.898077</pub-id> </citation>
</ref>
<ref id="B31">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Sepulchre</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Paley</surname>
<given-names>D. A.</given-names>
</name>
<name>
<surname>Leonard</surname>
<given-names>N. E.</given-names>
</name>
</person-group> (<year>2008</year>). <article-title>Stabilization of Planar Collective Motion with Limited Communication</article-title>. <source>IEEE Trans. Automat. Contr.</source> <volume>53</volume> (<issue>3</issue>), <fpage>706</fpage>&#x2013;<lpage>719</lpage>. <pub-id pub-id-type="doi">10.1109/tac.2008.919857</pub-id> </citation>
</ref>
<ref id="B32">
<citation citation-type="book">
<comment>[Dataset]</comment> <collab>The MathWorks</collab> (<year>2019</year>). <source>Track a Face in Scene</source>. </citation>
</ref>
<ref id="B33">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Vicsek</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Czir&#xf3;k</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Ben-Jacob</surname>
<given-names>E.</given-names>
</name>
<name>
<surname>Cohen</surname>
<given-names>I.</given-names>
</name>
<name>
<surname>Shochet</surname>
<given-names>O.</given-names>
</name>
</person-group> (<year>1995</year>). <article-title>Novel Type of Phase Transition in a System of Self-Driven Particles</article-title>. <source>Phys. Rev. Lett.</source> <volume>75</volume>, <fpage>1226</fpage>&#x2013;<lpage>1229</lpage>. <pub-id pub-id-type="doi">10.1103/physrevlett.75.1226</pub-id> </citation>
</ref>
<ref id="B34">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Yu</surname>
<given-names>X.</given-names>
</name>
<name>
<surname>Liu</surname>
<given-names>L.</given-names>
</name>
</person-group> (<year>2017</year>). <article-title>Cooperative Control for Moving-Target Circular Formation of Nonholonomic Vehicles</article-title>. <source>IEEE Trans. Automat. Contr.</source> <volume>62</volume> (<issue>7</issue>), <fpage>3448</fpage>&#x2013;<lpage>3454</lpage>. <pub-id pub-id-type="doi">10.1109/tac.2016.2614348</pub-id> </citation>
</ref>
<ref id="B35">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Wenwu Yu</surname>
<given-names>W.</given-names>
</name>
<name>
<surname>Guanrong Chen</surname>
<given-names>G.</given-names>
</name>
<name>
<surname>Ming Cao</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Kurths</surname>
<given-names>J.</given-names>
</name>
</person-group> (<year>2010</year>). <article-title>Second-order Consensus for Multiagent Systems with Directed Topologies and Nonlinear Dynamics</article-title>. <source>IEEE Trans. Syst. Man. Cybern. B</source> <volume>40</volume> (<issue>3</issue>), <fpage>881</fpage>&#x2013;<lpage>891</lpage>. <pub-id pub-id-type="doi">10.1109/tsmcb.2009.2031624</pub-id> </citation>
</ref>
<ref id="B36">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Yu</surname>
<given-names>X.</given-names>
</name>
<name>
<surname>Liu</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Feng</surname>
<given-names>G.</given-names>
</name>
</person-group> (<year>2018</year>). <article-title>Distributed Circular Formation Control of Nonholonomic Vehicles without Direct Distance Measurements</article-title>. <source>IEEE Trans. Automat. Contr.</source> <volume>63</volume> (<issue>8</issue>), <fpage>2730</fpage>&#x2013;<lpage>2737</lpage>. <pub-id pub-id-type="doi">10.1109/tac.2018.2790259</pub-id> </citation>
</ref>
<ref id="B37">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Zhang</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Tian</surname>
<given-names>Y.-P.</given-names>
</name>
</person-group> (<year>2009</year>). <article-title>Consentability and Protocol Design of Multi-Agent Systems with Stochastic Switching Topology</article-title>. <source>Automatica</source> <volume>45</volume> (<issue>5</issue>), <fpage>1195</fpage>&#x2013;<lpage>1201</lpage>. <pub-id pub-id-type="doi">10.1016/j.automatica.2008.11.005</pub-id> </citation>
</ref>
<ref id="B38">
<citation citation-type="confproc">
<person-group person-group-type="author">
<name>
<surname>Zhang</surname>
<given-names>F.</given-names>
</name>
<name>
<surname>Washington</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Paley</surname>
<given-names>D. A.</given-names>
</name>
</person-group> (<year>2016</year>). &#x201c;<article-title>A Flexible, Reaction-Wheel-Driven Fish Robot: Flow Sensing and Flow-Relative Control</article-title>,&#x201d; in <conf-name>American Control Conf</conf-name>, <conf-loc>Boston, MA</conf-loc>, <conf-date>July 6&#x2013;8, 2016</conf-date>, <fpage>1221</fpage>&#x2013;<lpage>1226</lpage>. <pub-id pub-id-type="doi">10.1109/acc.2016.7525084</pub-id> </citation>
</ref>
<ref id="B39">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Zhang</surname>
<given-names>Z.</given-names>
</name>
<name>
<surname>Yang</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Zhang</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Zhou</surname>
<given-names>F.</given-names>
</name>
<name>
<surname>Cen</surname>
<given-names>N.</given-names>
</name>
<name>
<surname>Li</surname>
<given-names>T.</given-names>
</name>
<etal/>
</person-group> (<year>2021</year>). <article-title>Global Vision-Based Formation Control of Soft Robotic Fish Swarm</article-title>. <source>Soft Robotics</source> <volume>8</volume> (<issue>3</issue>), <fpage>310</fpage>&#x2013;<lpage>318</lpage>. <pub-id pub-id-type="doi">10.1089/soro.2019.0174</pub-id> </citation>
</ref>
</ref-list>
</back>
</article>