<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD Journal Publishing DTD v2.3 20070202//EN" "journalpublishing.dtd">
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" article-type="research-article">
<front>
<journal-meta>
<journal-id journal-id-type="publisher-id">Front. Robot. AI</journal-id>
<journal-title>Frontiers in Robotics and AI</journal-title>
<abbrev-journal-title abbrev-type="pubmed">Front. Robot. AI</abbrev-journal-title>
<issn pub-type="epub">2296-9144</issn>
<publisher>
<publisher-name>Frontiers Media S.A.</publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id pub-id-type="doi">10.3389/frobt.2020.558027</article-id>
<article-categories>
<subj-group subj-group-type="heading">
<subject>Robotics and AI</subject>
<subj-group>
<subject>Original Research</subject>
</subj-group>
</subj-group>
</article-categories>
<title-group>
<article-title>Model Reference Predictive Adaptive Control for Large-Scale Soft Robots</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name><surname>Hyatt</surname> <given-names>Phillip</given-names></name>
<uri xlink:href="http://loop.frontiersin.org/people/684221/overview"/>
</contrib>
<contrib contrib-type="author">
<name><surname>Johnson</surname> <given-names>Curtis C.</given-names></name>
<uri xlink:href="http://loop.frontiersin.org/people/998621/overview"/>
</contrib>
<contrib contrib-type="author" corresp="yes">
<name><surname>Killpack</surname> <given-names>Marc D.</given-names></name>
<xref ref-type="corresp" rid="c001"><sup>&#x0002A;</sup></xref>
<uri xlink:href="http://loop.frontiersin.org/people/386260/overview"/>
</contrib>
</contrib-group>
<aff><institution>Robotics and Dynamics Lab, Department of Mechanical Engineering, Brigham Young University</institution>, <addr-line>Provo, UT</addr-line>, <country>United States</country></aff>
<author-notes>
<fn fn-type="edited-by"><p>Edited by: Concepci&#x000F3;n A. Monje, Universidad Carlos III de Madrid, Spain</p></fn>
<fn fn-type="edited-by"><p>Reviewed by: Cosimo Della Santina, Delft University of Technology, Netherlands; Surya Girinatha Nurzaman, Monash University Malaysia, Malaysia</p></fn>
<corresp id="c001">&#x0002A;Correspondence: Marc D. Killpack <email>marc_killpack&#x00040;byu.edu</email></corresp>
<fn fn-type="other" id="fn001"><p>This article was submitted to Soft Robotics, a section of the journal Frontiers in Robotics and AI</p></fn></author-notes>
<pub-date pub-type="epub">
<day>05</day>
<month>10</month>
<year>2020</year>
</pub-date>
<pub-date pub-type="collection">
<year>2020</year>
</pub-date>
<volume>7</volume>
<elocation-id>558027</elocation-id>
<history>
<date date-type="received">
<day>02</day>
<month>05</month>
<year>2020</year>
</date>
<date date-type="accepted">
<day>19</day>
<month>08</month>
<year>2020</year>
</date>
</history>
<permissions>
<copyright-statement>Copyright &#x000A9; 2020 Hyatt, Johnson and Killpack.</copyright-statement>
<copyright-year>2020</copyright-year>
<copyright-holder>Hyatt, Johnson and Killpack</copyright-holder>
<license xlink:href="http://creativecommons.org/licenses/by/4.0/"><p>This is an open-access article distributed under the terms of the Creative Commons Attribution License (CC BY). The use, distribution or reproduction in other forums is permitted, provided the original author(s) and the copyright owner(s) are credited and that the original publication in this journal is cited, in accordance with accepted academic practice. No use, distribution or reproduction is permitted which does not comply with these terms.</p></license>
</permissions>
<abstract><p>Past work has shown model predictive control (MPC) to be an effective strategy for controlling continuum joint soft robots using basic lumped-parameter models. However, the inaccuracies of these models often mean that an integral control scheme must be combined with MPC. In this paper we present a novel dynamic model formulation for continuum joint soft robots that is more accurate than previous models yet remains tractable for fast MPC. This model is based on a piecewise constant curvature (PCC) assumption and a relatively new kinematic representation that allows for computationally efficient state prediction. However, due to the difficulty in determining model parameters (e.g., inertias, damping, and spring effects) as well as effects common in continuum joint soft robots (hysteresis, complex pressure dynamics, etc.), we submit that regardless of the model selected, most model-based controllers of continuum joint soft robots would benefit from online model adaptation. Therefore, in this paper we also present a form of adaptive model predictive control based on model reference adaptive control (MRAC). We show that like MRAC, model reference predictive adaptive control (MRPAC) is able to compensate for &#x0201C;parameter mismatch" such as unknown inertia values. Our experiments also show that like MPC, MRPAC is robust to &#x0201C;structure mismatch&#x0201D; such as unmodeled disturbance forces not represented in the form of the adaptive regressor model. Experiments in simulation and hardware show that MRPAC outperforms individual MPC and MRAC.</p></abstract>
<kwd-group>
<kwd>model predictive control</kwd>
<kwd>adaptive control</kwd>
<kwd>continuum robot</kwd>
<kwd>dynamic modeling</kwd>
<kwd>MRAC</kwd>
<kwd>parameter mismatch</kwd>
<kwd>structure mismatch</kwd>
<kwd>soft robot</kwd>
</kwd-group>
<counts>
<fig-count count="9"/>
<table-count count="1"/>
<equation-count count="36"/>
<ref-count count="38"/>
<page-count count="14"/>
<word-count count="9829"/>
</counts>
</article-meta>
</front>
<body>
<sec sec-type="intro" id="s1">
<title>1. Introduction</title>
<p>Large-scale soft robots hold promise as platforms that are safe for human and delicate environments, and are able to accomplish tasks for which rigid robots are ill-suited. Some tasks for which large-scale soft robots are uniquely capable include whole-arm wiping tasks, reaching through unmodeled cluttered environments, and any task where incidental unmodeled contact is likely or desirable. Continuum joint soft robots have specifically been modeled after examples in nature that excel at these types of tasks (anteaters, octopi, elephants, etc.).</p>
<p>One major obstacle to the use of continuum joint soft robots is the lack of accurate models to enable model-based control. Because flexible continuum joints are not necessarily constrained to rotate about a single well-defined axis, even the kinematic modeling of these robots is relatively complex when compared to rigid robots. The rigid-body dynamics equation that govern the motion of traditional robots are further complicated in pneumatically-actuated continuum joint soft robots by pressure dynamics, energy storage and dissipation in the joints, as well as buckling in some load cases. These factors make the accurate modeling and model-based control of continuum joint soft robots very difficult.</p>
<p>In this work we present a novel dynamic model of a continuum joint robot that can be evaluated fast enough for real-time model predictive control (MPC). This novel dynamic model is in fact a small extension of well-established dynamic model of continuum joint robots based on piecewise constant curvature (PCC) approximations, and a relatively new choice of configuration variables. While only derived for a one joint robot (two degree of freedom), the ideas in this paper are extensible to continuum joint robots with multiple actuated joints.</p>
<p>We also present a form of adaptive MPC that can update our model in order to improve dynamic performance and eliminate steady state error. The adaptive law and much of the theoretical basis for this controller are derived from model reference adaptive control (MRAC) techniques.</p>
<p>The structure of this paper is as follows: section 2 presents the state of the art in continuum soft robot modeling and control, as well as the hardware, models and methods specific to this work; section 3 explains our hypotheses about the new model and proposed controller as well as the design of the experiments performed; section 4 shows the results of the experiments performed and discusses their importance; section 5 discusses the importance of the presented work to the field and provides suggestions for future work.</p>
<sec>
<title>1.1. Related Work</title>
<p>There is a significant body of work relative to accurately modeling the kinematics and dynamics of soft robots. In Renda et al. (<xref ref-type="bibr" rid="B25">2012</xref>) and Thuruthel et al. (<xref ref-type="bibr" rid="B31">2016</xref>) the continuum joint is modeled using Cosserat-beam theory. In Kang et al. (<xref ref-type="bibr" rid="B17">2011</xref>) and Khalil et al. (<xref ref-type="bibr" rid="B18">2007</xref>) methods based on recursive Newton-Euler approaches are used, while in Tatlicioglu et al. (<xref ref-type="bibr" rid="B29">2007</xref>) and Godage et al. (<xref ref-type="bibr" rid="B13">2011</xref>) dynamic equations are derived using Lagrangian mechanics. In Zheng et al. (<xref ref-type="bibr" rid="B38">2012</xref>) and Giri and Walker (<xref ref-type="bibr" rid="B12">2011</xref>) lumped parameter models are derived by dividing the continuum joint into a number of finite length sections. The trade-off between accuracy and computational complexity in these methods can be seen by varying the number of the finite sections. The authors of Walker (<xref ref-type="bibr" rid="B35">2013</xref>) provide a more comprehensive review of dynamic models for soft and continuum joint robots. Notably, there has also been work to show that learned models can represent soft robot dynamics as in Thuruthel et al. (<xref ref-type="bibr" rid="B32">2017</xref>).</p>
<p>In Mochiyama and Suzuki (<xref ref-type="bibr" rid="B22">2002</xref>) and Mochiyama and Suzuki (<xref ref-type="bibr" rid="B23">2003</xref>) the authors derive the dynamic equations of a continuum arm by integrating over infinitesimal disks and using the method of Lagrange. No assumptions of constant curvature are made. These works are similar to the modeling efforts presented in this paper, the main differences being our choice of generalized coordinates and our assumption of constant curvature. These two differences allow us to derive closed-form analytical expressions for the terms in our equations of motion such as the mass and Coriolis matrices.</p>
<p>In Falkenhahn et al. (<xref ref-type="bibr" rid="B10">2014</xref>) and Falkenhahn et al. (<xref ref-type="bibr" rid="B11">2015</xref>) the authors derive simpler models based on the PCC assumption. However, they neglect generalized forces caused by rotational inertias. They also model the mass of each PCC section as being concentrated at a point that is fixed in some coordinate frame. In Della Santina et al. (<xref ref-type="bibr" rid="B9">2020b</xref>), the authors derive a similar PCC-based model (also neglecting rotational inertia) and then match it to a dynamically equivalent rigid body model. Because the mass and inertia of the joints used in our work are non-negligible, we model the mass as distributed uniformly throughout infinitesimal disks and the center of mass of each joint is calculated analytically assuming uniform density. This approach yields closed-form equations of motion for the continuum joint while more accurately representing the dynamics by including the effects of rotational inertia. This approach also illustrates to a greater extent the effect of dynamic models that include rotational inertia on the performance of highly underdamped systems when compared to the work found in Della Santina et al. (<xref ref-type="bibr" rid="B9">2020b</xref>).</p>
<p>Control strategies for soft robots vary from open-loop control such as in Shepherd et al. (<xref ref-type="bibr" rid="B26">2011</xref>) and Tolley et al. (<xref ref-type="bibr" rid="B33">2014</xref>) to Reinforcement Learning (Zhang et al., <xref ref-type="bibr" rid="B36">2017</xref>) to model predictive control (Best et al., <xref ref-type="bibr" rid="B4">2016</xref>). In Hyatt et al. (<xref ref-type="bibr" rid="B16">2019</xref>) and Hyatt and Killpack (<xref ref-type="bibr" rid="B14">2020</xref>) the authors demonstrate the performance of MPC on the same joints used for this work. These implementations of MPC used a learned model of the dynamics based on a less-accurate representation of the continuum joint dynamics. The model inaccuracy that resulted in less aggressive control in that work prompted the development of the more accurate model and adaptive control techniques presented in this paper.</p>
<p>Given a dynamic model of the correct form, the nature of soft robots is still such that certain parameters of that model may be difficult to estimate. In terms of adaptive control for soft robots, the most similar to our work is Trumi&#x00107; et al. (<xref ref-type="bibr" rid="B34">2020</xref>), where they use a similar formulation of MRAC (although with a different dynamic model and no optimal control law). Although not common in soft robotics, combining MPC and adaptive control is beginning to be an established control strategy where the strengths of MPC are combined with a variety of adaptive control schemes (see Adetola et al., <xref ref-type="bibr" rid="B2">2009</xref>; Kim, <xref ref-type="bibr" rid="B19">2010</xref>; Chowdhary et al., <xref ref-type="bibr" rid="B7">2013</xref>; Bujarbaruah et al., <xref ref-type="bibr" rid="B6">2018</xref>; Pereida and Schoellig, <xref ref-type="bibr" rid="B24">2018</xref>; Abdollahi and Chowdhary, <xref ref-type="bibr" rid="B1">2019</xref>; Zhang and Shi, <xref ref-type="bibr" rid="B37">2020</xref>). The method developed in this paper is a unique form of adaptive MPC that borrows ideas from model reference adaptive control (MRAC) for robot manipulators (Slotine and Li, <xref ref-type="bibr" rid="B27">1987</xref>). Specifically, our work can be considered an extension to the adaptive MPC presented in Terry et al. (<xref ref-type="bibr" rid="B30">2019</xref>). The main extensions are an adaptive law formulated specifically for robot manipulators and a regressor based on a more accurate continuum joint dynamic model. These extensions allow greater flexibility to adapt both the parameters and structure of the model.</p>
</sec>
</sec>
<sec sec-type="materials and methods" id="s2">
<title>2. Materials and Methods</title>
<sec>
<title>2.1. Robot Platform Description and Modeling</title>
<p>The robot used for this work is composed of a continuum joint such as the one seen in <xref ref-type="fig" rid="F1">Figure 1</xref>. These joints are made of four separate pressure-controlled chambers surrounding a relatively inextensible central cable. The two antagonistically placed pairs of pressure chambers allow the joint to bend about two axes. We choose to model the kinematics of this joint using arcs of constant curvature. Each arc, which traces out the path in space occupied by the inextensible spine, can be defined using three variables as described in Allen et al. (<xref ref-type="bibr" rid="B3">2020</xref>) (see similar derivation in Della Santina et al., <xref ref-type="bibr" rid="B8">2020a</xref>). These variables are the length of the in-extensible spine (<italic>h</italic>) and two components of the axis-angle vector that describes the rotation from the bottom of the joint to the top. Because the joint cannot twist about the inextensible spine (to which the <italic>z</italic> axis is tangent) the axis-angle vector consists of only two non-zero variables which we call <italic>u</italic> and <italic>v</italic>. These values are labeled in <xref ref-type="fig" rid="F1">Figure 1</xref> and correspond to the rotation about the <italic>x</italic> and <italic>y</italic> axes, respectively. We assume that the spine is perfectly inextensible so that <italic>h</italic> in this work becomes a constant kinematic parameter.</p>
<fig id="F1" position="float">
<label>Figure 1</label>
<caption><p>A continuum joint robot such as the one used for this work. The variables <inline-formula><mml:math id="M1"><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover></mml:math></inline-formula>, &#x003D5;, <italic>u</italic>, <italic>v</italic>, and <italic>h</italic> are labeled for reference.</p></caption>
<graphic xlink:href="frobt-07-558027-g0001.tif"/>
</fig>
<p>First we note some useful kinematic relationships. Because <italic>u</italic> and <italic>v</italic> are the non-zero elements of the axis-angle vector we can write</p>
<disp-formula id="E1"><label>(1)</label><mml:math id="M2"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mi>&#x003D5;</mml:mi><mml:mo>=</mml:mo><mml:msqrt><mml:mrow><mml:msup><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mo>&#x0002B;</mml:mo><mml:msup><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:msqrt></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>where &#x003D5; is the magnitude of the axis-angle vector [<italic>u, v</italic>, 0]<sup><italic>T</italic></sup>, or total bend angle (see <xref ref-type="fig" rid="F2">Figure 2</xref>).</p>
<fig id="F2" position="float">
<label>Figure 2</label>
<caption><p>A 3D schematic to illustrate the kinematic relationships used in the presented model derivation. <inline-formula><mml:math id="M3"><mml:mover accent="true"><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover></mml:math></inline-formula> is the axis-angle vector which can be decomposed into components parallel with the base frame b. Note that <inline-formula><mml:math id="M4"><mml:mover accent="true"><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover></mml:math></inline-formula> points in the negative <italic>x</italic><sub><italic>b</italic></sub> direction and that <inline-formula><mml:math id="M5"><mml:mover accent="true"><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover></mml:math></inline-formula> points in the positive <italic>y</italic><sub><italic>b</italic></sub> direction. The magnitude of the axis-angle vector <inline-formula><mml:math id="M6"><mml:mover accent="true"><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover></mml:math></inline-formula> is also the total bend angle.</p></caption>
<graphic xlink:href="frobt-07-558027-g0002.tif"/>
</fig>
<p>Although the joint is modeled as an arc with an arc length of <italic>h</italic>, we often want to refer to a position at some intermediate point along the arc. We denote an intermediate length along the arc using the variable <italic>l</italic> where <italic>l</italic> can take on any value between 0 and <italic>h</italic> (see <xref ref-type="fig" rid="F3">Figure 3</xref>). Note that a frame tangent to the arc at a length <italic>l</italic> rotates as <italic>l</italic> is increased, therefore &#x003D5;<sub><italic>l</italic></sub>, <italic>u</italic><sub><italic>l</italic></sub>, and <italic>v</italic><sub><italic>l</italic></sub> are not constant along the entire arc. However, we note that the vector <inline-formula><mml:math id="M7"><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover></mml:math></inline-formula> from the base of the joint to the center of curvature is the same for all points along the arc because the center of curvature does not move. At any point <italic>l</italic> along the arc this vector can be calculated as</p>
<disp-formula id="E2"><label>(2)</label><mml:math id="M8"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:msubsup><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msubsup></mml:mrow></mml:mfrac><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable style="text-align:axis;" equalrows="false" columnlines="none none none none none none none none none" equalcolumns="false" class="array"><mml:mtr><mml:mtd><mml:msub><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mo>-</mml:mo><mml:msub><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mn>0</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow><mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>Because the magnitude of this vector <inline-formula><mml:math id="M9"><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover><mml:mo stretchy="false">&#x02016;</mml:mo></mml:math></inline-formula> is the radius of curvature, we may also relate &#x003D5; and <italic>l</italic> using the arc-length formula</p>
<disp-formula id="E3"><label>(3)</label><mml:math id="M10"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:msub><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover><mml:mo stretchy="false">&#x02016;</mml:mo></mml:mrow></mml:mfrac></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>We now wish to derive a means by which we can calculate <italic>u</italic><sub><italic>l</italic></sub> and <italic>v</italic><sub><italic>l</italic></sub> at any point <italic>l</italic> along the arc given only <italic>l</italic>, <italic>h</italic>, and <italic>u</italic> and <italic>v</italic> at the end of the arc. Given a point that lies at a distance <italic>l</italic> along the arc, we may say using Equation (2)</p>
<disp-formula id="E4"><label>(4)</label><mml:math id="M11"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mtext>&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;</mml:mtext><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mfrac><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:msubsup><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msubsup></mml:mrow></mml:mfrac><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable style="text-align:axis;" equalrows="false" columnlines="none none none none none none none none none" equalcolumns="false" class="array"><mml:mtr><mml:mtd><mml:msub><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mo>-</mml:mo><mml:msub><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mn>0</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:mi>h</mml:mi></mml:mrow><mml:mrow><mml:msubsup><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msubsup></mml:mrow></mml:mfrac><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable style="text-align:axis;" equalrows="false" columnlines="none none none none none none none none none" equalcolumns="false" class="array"><mml:mtr><mml:mtd><mml:msub><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mo>-</mml:mo><mml:msub><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mn>0</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow><mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>Replacing &#x003D5; terms using Equation (3) we obtain</p>
<disp-formula id="E5"><label>(5)</label><mml:math id="M12"><mml:mtable columnalign='left'><mml:mtr><mml:mtd><mml:mfrac><mml:mrow><mml:mi>l</mml:mi><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mover accent='true'><mml:mi>&#x003C1;</mml:mi><mml:mo>&#x02192;</mml:mo></mml:mover><mml:msup><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mn>2</mml:mn></mml:msup></mml:mrow><mml:mrow><mml:msup><mml:mi>l</mml:mi><mml:mn>2</mml:mn></mml:msup></mml:mrow></mml:mfrac><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi>v</mml:mi><mml:mi>l</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mo>&#x02212;</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mi>l</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mn>0</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:mi>h</mml:mi><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mover accent='true'><mml:mi>&#x003C1;</mml:mi><mml:mo>&#x02192;</mml:mo></mml:mover><mml:msup><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mn>2</mml:mn></mml:msup></mml:mrow><mml:mrow><mml:msup><mml:mi>h</mml:mi><mml:mn>2</mml:mn></mml:msup></mml:mrow></mml:mfrac><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi>v</mml:mi><mml:mi>h</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mo>&#x02212;</mml:mo><mml:msub><mml:mi>u</mml:mi><mml:mi>h</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mn>0</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mtext>&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;</mml:mtext><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi>v</mml:mi><mml:mi>l</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mi>l</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mn>0</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow><mml:mo>=</mml:mo><mml:mfrac><mml:mi>l</mml:mi><mml:mi>h</mml:mi></mml:mfrac><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi>v</mml:mi><mml:mi>h</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:msub><mml:mi>u</mml:mi><mml:mi>h</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mn>0</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow><mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>Differentiating with respect to time yields the relationship</p>
<disp-formula id="E6"><label>(6)</label><mml:math id="M13"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable style="text-align:axis;" equalrows="false" columnlines="none none none none none none none none none" equalcolumns="false" class="array"><mml:mtr><mml:mtd><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mn>0</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:mfrac><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable style="text-align:axis;" equalrows="false" columnlines="none none none none none none none none none" equalcolumns="false" class="array"><mml:mtr><mml:mtd><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mn>0</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>In other words, the generalized coordinates <italic>u</italic><sub><italic>l</italic></sub> and <italic>v</italic><sub><italic>l</italic></sub> and their time derivatives vary linearly along the length of the arc. This becomes a very useful property of this kinematic representation when deriving equations of motion.</p>
<fig id="F3" position="float">
<label>Figure 3</label>
<caption><p>A side view of the kinematic model of a continuum joint showing trigonometric relationships between variables.</p></caption>
<graphic xlink:href="frobt-07-558027-g0003.tif"/>
</fig>
<p>Using the method of Lagrange, the equations of motion for a system of rigid bodies take the form</p>
<disp-formula id="E7"><label>(7)</label><mml:math id="M14"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mi>M</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x000A8;</mml:mo></mml:mover><mml:mo>&#x0002B;</mml:mo><mml:mi>C</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>,</mml:mo><mml:mi>q</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>&#x0002B;</mml:mo><mml:mi>g</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mo>=</mml:mo><mml:mi>&#x003C4;</mml:mi></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>where <italic>M</italic>(<italic>q</italic>) is the mass matrix, <inline-formula><mml:math id="M15"><mml:mi>C</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>,</mml:mo><mml:mi>q</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:math></inline-formula> is the Coriolis matrix, <italic>g</italic>(<italic>q</italic>) is a vector of gravity torques, <italic>q</italic> is a vector of the generalized coordinates, and &#x003C4; is a vector of the generalized torques including friction terms. These matrices are derived using partial derivatives of kinetic and potential energy terms. Since partial derivatives are easily taken using a symbolic mathematics toolbox such as Sympy (see Meurer et al., <xref ref-type="bibr" rid="B21">2017</xref>), the problem of dynamic modeling is reduced to the selection of generalized coordinates and the representation of kinetic and potential energy.</p>
<p>In order to accurately express kinetic and potential energy we choose to model the continuum joint, as many have done before, with an infinite set of infinitesimally small disks. However, the assumption of constant curvature, the choice of generalized coordinates, and current tools in symbolic math libraries allows us to produce analytical expressions for <italic>M</italic>, <italic>C</italic>, and <italic>g</italic>, whereas previous methods have not yielded these closed-form expressions.</p>
<p>We can define the kinetic energy of an infinitesimally thin disc at a length <italic>l</italic> along the arc as</p>
<disp-formula id="E8"><label>(8)</label><mml:math id="M16"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:msub><mml:mrow><mml:mi>T</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>=</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">(</mml:mo><mml:mrow><mml:mi>&#x003BC;</mml:mi><mml:mtext>d</mml:mtext><mml:mi>l</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:msubsup><mml:mrow><mml:mover accent='true'><mml:mi>p</mml:mi><mml:mo>&#x0002E;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mi>T</mml:mi></mml:mrow></mml:msubsup><mml:msub><mml:mrow><mml:mover accent='true'><mml:mi>p</mml:mi><mml:mo>&#x0002E;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>&#x0002B;</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:msubsup><mml:mrow><mml:mi>&#x003C9;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mi>T</mml:mi></mml:mrow></mml:msubsup><mml:mi>I</mml:mi><mml:msub><mml:mrow><mml:mi>&#x003C9;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mtext>&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;</mml:mtext><mml:mo>=</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">(</mml:mo><mml:mrow><mml:mi>&#x003BC;</mml:mi><mml:mtext>d</mml:mtext><mml:mi>l</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:msubsup><mml:mrow><mml:mover accent='true'><mml:mi>p</mml:mi><mml:mo>&#x0002E;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mi>T</mml:mi></mml:mrow></mml:msubsup><mml:msub><mml:mrow><mml:mover accent='true'><mml:mi>p</mml:mi><mml:mo>&#x0002E;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>&#x0002B;</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:msubsup><mml:mrow><mml:mi>&#x003C9;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mi>T</mml:mi></mml:mrow></mml:msubsup><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable style="text-align:axis;" equalrows="false" columnlines="none none none none none none none none none" equalcolumns="false" class="array"><mml:mtr><mml:mtd><mml:mfrac><mml:mrow><mml:mi>&#x003BC;</mml:mi><mml:mtext>d</mml:mtext><mml:mi>l</mml:mi><mml:msup><mml:mrow><mml:mi>r</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow><mml:mrow><mml:mn>4</mml:mn></mml:mrow></mml:mfrac></mml:mtd><mml:mtd><mml:mn>0</mml:mn></mml:mtd><mml:mtd><mml:mn>0</mml:mn></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mn>0</mml:mn></mml:mtd><mml:mtd><mml:mfrac><mml:mrow><mml:mi>&#x003BC;</mml:mi><mml:mtext>d</mml:mtext><mml:mi>l</mml:mi><mml:msup><mml:mrow><mml:mi>r</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow><mml:mrow><mml:mn>4</mml:mn></mml:mrow></mml:mfrac></mml:mtd><mml:mtd><mml:mn>0</mml:mn></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mn>0</mml:mn></mml:mtd><mml:mtd><mml:mn>0</mml:mn></mml:mtd><mml:mtd><mml:mfrac><mml:mrow><mml:mi>&#x003BC;</mml:mi><mml:mtext>d</mml:mtext><mml:mi>l</mml:mi><mml:msup><mml:mrow><mml:mi>r</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:mfrac></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow><mml:msub><mml:mrow><mml:mi>&#x003C9;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mtext>&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;</mml:mtext><mml:mo>=</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">(</mml:mo><mml:mrow><mml:mi>&#x003BC;</mml:mi><mml:mtext>d</mml:mtext><mml:mi>l</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:msubsup><mml:mrow><mml:mover accent='true'><mml:mi>p</mml:mi><mml:mo>&#x0002E;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mi>T</mml:mi></mml:mrow></mml:msubsup><mml:msub><mml:mrow><mml:mover accent='true'><mml:mi>p</mml:mi><mml:mo>&#x0002E;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>&#x0002B;</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:mrow><mml:mo>[</mml:mo></mml:mrow><mml:mfrac><mml:mrow><mml:mi>&#x003BC;</mml:mi><mml:mtext>d</mml:mtext><mml:mi>l</mml:mi><mml:msup><mml:mrow><mml:mi>r</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow><mml:mrow><mml:mn>4</mml:mn></mml:mrow></mml:mfrac><mml:msubsup><mml:mrow><mml:mi>&#x003C9;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi><mml:mo>,</mml:mo><mml:mi>x</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msubsup><mml:mo>&#x0002B;</mml:mo><mml:mfrac><mml:mrow><mml:mi>&#x003BC;</mml:mi><mml:mtext>d</mml:mtext><mml:mi>l</mml:mi><mml:msup><mml:mrow><mml:mi>r</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow><mml:mrow><mml:mn>4</mml:mn></mml:mrow></mml:mfrac><mml:msubsup><mml:mrow><mml:mi>&#x003C9;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msubsup><mml:mo>&#x0002B;</mml:mo><mml:mfrac><mml:mrow><mml:mi>&#x003BC;</mml:mi><mml:mtext>d</mml:mtext><mml:mi>l</mml:mi><mml:msup><mml:mrow><mml:mi>r</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:mfrac><mml:msubsup><mml:mrow><mml:mi>&#x003C9;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi><mml:mo>,</mml:mo><mml:mi>z</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msubsup><mml:mrow><mml:mo>]</mml:mo></mml:mrow></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mtext>&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;</mml:mtext><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:mi>&#x003BC;</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:mfrac><mml:mrow><mml:mrow><mml:mo>[</mml:mo></mml:mrow><mml:msubsup><mml:mrow><mml:mover accent='true'><mml:mi>p</mml:mi><mml:mo>&#x0002E;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mi>T</mml:mi></mml:mrow></mml:msubsup><mml:msub><mml:mrow><mml:mover accent='true'><mml:mi>p</mml:mi><mml:mo>&#x0002E;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>&#x0002B;</mml:mo><mml:msup><mml:mrow><mml:mi>r</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mrow><mml:mo stretchy="false">(</mml:mo></mml:mrow><mml:mfrac><mml:mrow><mml:mn>1</mml:mn></mml:mrow><mml:mrow><mml:mn>4</mml:mn></mml:mrow></mml:mfrac><mml:msubsup><mml:mrow><mml:mi>&#x003C9;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi><mml:mo>,</mml:mo><mml:mi>x</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msubsup><mml:mo>&#x0002B;</mml:mo><mml:mfrac><mml:mrow><mml:mn>1</mml:mn></mml:mrow><mml:mrow><mml:mn>4</mml:mn></mml:mrow></mml:mfrac><mml:msubsup><mml:mrow><mml:mi>&#x003C9;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msubsup><mml:mo>&#x0002B;</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:msubsup><mml:mrow><mml:mi>&#x003C9;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi><mml:mo>,</mml:mo><mml:mi>z</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msubsup><mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mrow><mml:mo>]</mml:mo></mml:mrow></mml:mrow><mml:mtext>d</mml:mtext><mml:mi>l</mml:mi></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>where &#x003BC; is the linear density of the disc, d<italic>l</italic> is some infinitesimal length, <inline-formula><mml:math id="M17"><mml:mover accent='true'><mml:mi>p</mml:mi><mml:mo>&#x0002E;</mml:mo></mml:mover></mml:math></inline-formula><sub><italic>l</italic></sub> is the velocity of the center of the disc, &#x003C9;<sub><italic>l</italic></sub> is the angular velocity of the disc expressed in the disc frame, and <italic>I</italic> is the inertia of the infinitesimally thin disc expressed in the disc frame.</p>
<p>The linear and angular velocity of each disc (<inline-formula><mml:math id="M18"><mml:mover accent='true'><mml:mi>p</mml:mi><mml:mo>&#x0002E;</mml:mo></mml:mover></mml:math></inline-formula><sub><italic>l</italic></sub> and &#x003C9;<sub><italic>l</italic></sub>) can be found using a configuration dependent jacobian <italic>J</italic> (meaning it is a function of joint configuration variables <italic>u</italic><sub><italic>l</italic></sub> and <italic>v</italic><sub><italic>l</italic></sub>) that is defined such that</p>
<disp-formula id="E9"><label>(9)</label><mml:math id="M19"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable style="text-align:axis;" equalrows="false" columnlines="none none none none none none none none none" equalcolumns="false" class="array"><mml:mtr><mml:mtd><mml:msub><mml:mrow><mml:mover accent='true'><mml:mi>p</mml:mi><mml:mo>&#x0002E;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:msub><mml:mrow><mml:mi>&#x003C9;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow><mml:mo>=</mml:mo><mml:mi>J</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:msub><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:mi>l</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable style="text-align:axis;" equalrows="false" columnlines="none none none none none none none none none" equalcolumns="false" class="array"><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:msub><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:msub><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable style="text-align:axis;" equalrows="false" columnlines="none none none none none none none none none" equalcolumns="false" class="array"><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:msub><mml:mrow><mml:mi>p</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:msub><mml:mrow><mml:mi>&#x003C9;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow><mml:mo>=</mml:mo><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable style="text-align:axis;" equalrows="false" columnlines="none none none none none none none none none" equalcolumns="false" class="array"><mml:mtr><mml:mtd><mml:msub><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mrow><mml:msub><mml:mrow><mml:mover accent='true'><mml:mi>p</mml:mi><mml:mo>&#x0002E;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:msub><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:msub><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:mi>l</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:msub><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mrow><mml:msub><mml:mrow><mml:mi>&#x003C9;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:msub><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:msub><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:mi>l</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable style="text-align:axis;" equalrows="false" columnlines="none none none none none none none none none" equalcolumns="false" class="array"><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:msub><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:msub><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable style="text-align:axis;" equalrows="false" columnlines="none none none none none none none none none" equalcolumns="false" class="array"><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:msub><mml:mrow><mml:mi>p</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:msub><mml:mrow><mml:mi>&#x003C9;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow><mml:mo>=</mml:mo><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable style="text-align:axis;" equalrows="false" columnlines="none none none none none none none none none" equalcolumns="false" class="array"><mml:mtr><mml:mtd><mml:msub><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mrow><mml:msub><mml:mrow><mml:mover accent='true'><mml:mi>p</mml:mi><mml:mo>&#x0002E;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:msub><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:msub><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:mi>l</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:msub><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mrow><mml:msub><mml:mrow><mml:mi>&#x003C9;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:msub><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:msub><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:mi>l</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable style="text-align:axis;" equalrows="false" columnlines="none none none none none none none none none" equalcolumns="false" class="array"><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:msub><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:msub></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:msub><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:msub></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow><mml:mfrac><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:mfrac><mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>A definition of this Jacobian for the choice of <italic>u</italic> and <italic>v</italic> as generalized coordinates can be found in Allen et al. (<xref ref-type="bibr" rid="B3">2020</xref>).</p>
<p>Using this relationship, we see that we can simplify the expression for kinetic energy (Equation 8) by scaling portions of the jacobian. The new inertia-weighted jacobian is defined as</p>
<disp-formula id="E10"><label>(10)</label><mml:math id="M20"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:msub><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mrow><mml:mtext>weighted</mml:mtext></mml:mrow></mml:msub><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:msub><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:mi>l</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mo>=</mml:mo><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable style="text-align:axis;" equalrows="false" columnlines="none none none none none none none none none" equalcolumns="false" class="array"><mml:mtr><mml:mtd><mml:msqrt><mml:mrow><mml:mi>&#x003BC;</mml:mi></mml:mrow></mml:msqrt><mml:msub><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mrow><mml:msub><mml:mrow><mml:mover accent='true'><mml:mi>p</mml:mi><mml:mo>&#x0002E;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>l</mml:mi><mml:mo>,</mml:mo><mml:mi>x</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:msqrt><mml:mrow><mml:mi>&#x003BC;</mml:mi></mml:mrow></mml:msqrt><mml:msub><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mrow><mml:msub><mml:mrow><mml:mover accent='true'><mml:mi>p</mml:mi><mml:mo>&#x0002E;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>l</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:msqrt><mml:mrow><mml:mi>&#x003BC;</mml:mi></mml:mrow></mml:msqrt><mml:msub><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mrow><mml:msub><mml:mrow><mml:mover accent='true'><mml:mi>p</mml:mi><mml:mo>&#x0002E;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>l</mml:mi><mml:mo>,</mml:mo><mml:mi>z</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mfrac><mml:mrow><mml:msqrt><mml:mrow><mml:mi>&#x003BC;</mml:mi></mml:mrow></mml:msqrt><mml:mi>r</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:mfrac><mml:msub><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mrow><mml:msub><mml:mrow><mml:mi>&#x003C9;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi><mml:mo>,</mml:mo><mml:mi>x</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mfrac><mml:mrow><mml:msqrt><mml:mrow><mml:mi>&#x003BC;</mml:mi></mml:mrow></mml:msqrt><mml:mi>r</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:mfrac><mml:msub><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mrow><mml:msub><mml:mrow><mml:mi>&#x003C9;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi><mml:mo>,</mml:mo><mml:mi>y</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mfrac><mml:mrow><mml:msqrt><mml:mrow><mml:mi>&#x003BC;</mml:mi></mml:mrow></mml:msqrt><mml:mi>r</mml:mi></mml:mrow><mml:mrow><mml:msqrt><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msqrt></mml:mrow></mml:mfrac><mml:msub><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mrow><mml:msub><mml:mrow><mml:mi>&#x003C9;</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi><mml:mo>,</mml:mo><mml:mi>z</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:msub></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>allowing us to rewrite Equation (8) for the kinetic energy of a disc as</p>
<disp-formula id="E11"><label>(11)</label><mml:math id="M21"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:msub><mml:mrow><mml:mi>T</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>=</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:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>T</mml:mi></mml:mrow></mml:msup><mml:msub><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mrow><mml:mtext>weighted</mml:mtext></mml:mrow></mml:msub><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:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:mi>l</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow><mml:mrow><mml:mi>T</mml:mi></mml:mrow></mml:msup><mml:msub><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mrow><mml:mtext>weighted</mml:mtext></mml:mrow></mml:msub><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:msub><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:mi>l</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mtext>d</mml:mtext><mml:mi>l</mml:mi><mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>By treating a continuum joint as a series of infinitesimal disks and integrating the kinetic energy of each disc along the length of the arc we can write the total kinetic energy of a joint as</p>
<disp-formula id="E12"><label>(12)</label><mml:math id="M22"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mi>T</mml:mi><mml:mo>=</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:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mi>T</mml:mi></mml:mrow></mml:msup><mml:mrow><mml:mrow><mml:mo>[</mml:mo></mml:mrow><mml:mstyle displaystyle="true"><mml:msubsup><mml:mrow><mml:mo>&#x0222B;</mml:mo></mml:mrow><mml:mrow><mml:mn>0</mml:mn></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:msubsup></mml:mstyle><mml:msub><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mrow><mml:mtext>weighted</mml:mtext></mml:mrow></mml:msub><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:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:mi>l</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow><mml:mrow><mml:mi>T</mml:mi></mml:mrow></mml:msup><mml:msub><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mrow><mml:mtext>weighted</mml:mtext></mml:mrow></mml:msub><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:msub><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mi>l</mml:mi></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:mi>l</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mtext>d</mml:mtext><mml:mi>l</mml:mi><mml:mrow><mml:mo>]</mml:mo></mml:mrow></mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>We note here that the Jacobian can be expressed analytically at every point along the joint as a function of <italic>l</italic> and the configuration variables <italic>u</italic><sub><italic>l</italic></sub> and <italic>v</italic><sub><italic>l</italic></sub> (which are <inline-formula><mml:math id="M23"><mml:mfrac><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:mfrac><mml:msub><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:msub></mml:math></inline-formula> and <inline-formula><mml:math id="M24"><mml:mfrac><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:mfrac><mml:msub><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:msub></mml:math></inline-formula>, respectively) thanks to Equation (5). Given this analytical expression for <italic>J</italic><sub>weighted</sub> we can integrate this expression with respect to <italic>l</italic> over the definite bounds 0 to <italic>h</italic> to get an analytical expression for <inline-formula><mml:math id="M25"><mml:msubsup><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mrow><mml:mtext>weighted</mml:mtext></mml:mrow><mml:mrow><mml:mi>T</mml:mi></mml:mrow></mml:msubsup><mml:msub><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mrow><mml:mtext>weighted</mml:mtext></mml:mrow></mml:msub></mml:math></inline-formula>, which we recognize as the joint space inertia matrix or mass matrix <italic>M</italic>.</p>
<p>We use the symbolic mathematics library Sympy (see Meurer et al., <xref ref-type="bibr" rid="B21">2017</xref>) to calculate <inline-formula><mml:math id="M26"><mml:msubsup><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mrow><mml:mtext>weighted</mml:mtext></mml:mrow><mml:mrow><mml:mi>T</mml:mi></mml:mrow></mml:msubsup><mml:msub><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mrow><mml:mtext>weighted</mml:mtext></mml:mrow></mml:msub></mml:math></inline-formula>, and to integrate this expression analytically between the definite bounds 0 and <italic>h</italic> in order to obtain <italic>M</italic>(<italic>q</italic>). Once <italic>M</italic>(<italic>q</italic>) has been obtained symbolically, it is then relatively straightforward to take partial derivatives using Sympy in order to obtain an expression for the Coriolis matrix <inline-formula><mml:math id="M27"><mml:mi>C</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>,</mml:mo><mml:mi>q</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:math></inline-formula> from Equation (7) using the method outlined in Bruno et al. (<xref ref-type="bibr" rid="B5">2010</xref>). The resulting coefficients that multiply <inline-formula><mml:math id="M28"><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:math></inline-formula> to calculate the Coriolis matrix are commonly called the Christmases symbols of the first kind.</p>
<p>In order to find the gravity torques (<italic>g</italic>) we must first find the vector from the joint base to the joint center of mass (<inline-formula><mml:math id="M29"><mml:mover accent="true"><mml:mrow><mml:mi>p</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover></mml:math></inline-formula>). By inspection we can see that a joint&#x00027;s center of mass must project down onto the vector <inline-formula><mml:math id="M30"><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover></mml:math></inline-formula> which is from the center of curvature to the base of the joint, however the vector to the center of mass must also contain some component in the <italic>z</italic> direction (orthogonal to the plane of the bottom plate of the joint). We find the components of the center of mass vector <inline-formula><mml:math id="M31"><mml:mover accent="true"><mml:mrow><mml:mi>p</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover></mml:math></inline-formula> by again dividing the joint into a series of infinitesimal disks of height d<italic>l</italic>.</p>
<p>Using the definition of the center of mass assuming the joint has uniform density along its length, the portion of <inline-formula><mml:math id="M32"><mml:mover accent="true"><mml:mrow><mml:mi>p</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover></mml:math></inline-formula> along the <italic>z</italic> axis is given by</p>
<disp-formula id="E13"><label>(13)</label><mml:math id="M33"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:mi>z</mml:mi></mml:mrow><mml:mo>&#x0002D;</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:msubsup><mml:mrow><mml:mo>&#x0222B;</mml:mo></mml:mrow><mml:mrow><mml:mn>0</mml:mn></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:msubsup><mml:mi>z</mml:mi><mml:mtext>d</mml:mtext><mml:mi>V</mml:mi></mml:mrow><mml:mrow><mml:msubsup><mml:mrow><mml:mo>&#x0222B;</mml:mo></mml:mrow><mml:mrow><mml:mn>0</mml:mn></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:msubsup><mml:mtext>d</mml:mtext><mml:mi>V</mml:mi></mml:mrow></mml:mfrac></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>Using the trigonometric relationship seen in <xref ref-type="fig" rid="F3">Figure 3</xref>, namely</p>
<disp-formula id="E14"><label>(14)</label><mml:math id="M34"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mi>z</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mo>=</mml:mo><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mtext>sin</mml:mtext><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mfrac><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:mfrac><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>as well as the volume formula for an infinitesimally thin disc</p>
<disp-formula id="E15"><label>(15)</label><mml:math id="M35"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mtext>d</mml:mtext><mml:mi>V</mml:mi><mml:mo>=</mml:mo><mml:mi>&#x003C0;</mml:mi><mml:msup><mml:mrow><mml:mi>r</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mtext>d</mml:mtext><mml:mi>l</mml:mi><mml:mo>,</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>we can now integrate to find <inline-formula><mml:math id="M36"><mml:mover accent="true"><mml:mrow><mml:mi>z</mml:mi></mml:mrow><mml:mo>&#x0002D;</mml:mo></mml:mover></mml:math></inline-formula>:</p>
<disp-formula id="E16"><label>(16)</label><mml:math id="M37"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:mi>z</mml:mi></mml:mrow><mml:mo>&#x0002D;</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:msubsup><mml:mrow><mml:mo>&#x0222B;</mml:mo></mml:mrow><mml:mrow><mml:mn>0</mml:mn></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:msubsup><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mtext>sin</mml:mtext><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mfrac><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:mfrac><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mi>&#x003C0;</mml:mi><mml:msup><mml:mrow><mml:mi>r</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mtext>d</mml:mtext><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:msubsup><mml:mrow><mml:mo>&#x0222B;</mml:mo></mml:mrow><mml:mrow><mml:mn>0</mml:mn></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:msubsup><mml:mi>&#x003C0;</mml:mi><mml:msup><mml:mrow><mml:mi>r</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mtext>d</mml:mtext><mml:mi>l</mml:mi></mml:mrow></mml:mfrac></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:mi>z</mml:mi></mml:mrow><mml:mo>&#x0002D;</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:mi>&#x003C0;</mml:mi><mml:msup><mml:mrow><mml:mi>r</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover><mml:mo stretchy="false">&#x02016;</mml:mo><mml:msubsup><mml:mrow><mml:mo>&#x0222B;</mml:mo></mml:mrow><mml:mrow><mml:mn>0</mml:mn></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:msubsup><mml:mtext>sin</mml:mtext><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mfrac><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:mfrac><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mtext>d</mml:mtext><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mi>&#x003C0;</mml:mi><mml:msup><mml:mrow><mml:mi>r</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mi>h</mml:mi></mml:mrow></mml:mfrac></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:mi>z</mml:mi></mml:mrow><mml:mo>&#x0002D;</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:mo>-</mml:mo><mml:mrow><mml:mo>[</mml:mo></mml:mrow><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mfrac><mml:mrow><mml:mi>h</mml:mi></mml:mrow><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow></mml:mfrac><mml:mtext>cos</mml:mtext><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mfrac><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:mfrac><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:msubsup><mml:mrow><mml:mrow><mml:mo>]</mml:mo></mml:mrow></mml:mrow><mml:mrow><mml:mn>0</mml:mn></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:msubsup></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:mfrac></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:mi>z</mml:mi></mml:mrow><mml:mo>&#x0002D;</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:mo>-</mml:mo><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover><mml:mo stretchy="false">&#x02016;</mml:mo></mml:mrow><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow></mml:mfrac><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mtext>cos</mml:mtext><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mo>-</mml:mo><mml:mn>1</mml:mn></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>Recognizing that <inline-formula><mml:math id="M38"><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:mi>h</mml:mi></mml:mrow><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow></mml:mfrac></mml:math></inline-formula>,</p>
<disp-formula id="E17"><label>(17)</label><mml:math id="M39"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:mi>z</mml:mi></mml:mrow><mml:mo>&#x0002D;</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:mi>h</mml:mi></mml:mrow><mml:mrow><mml:msup><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:mfrac><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mn>1</mml:mn><mml:mo>-</mml:mo><mml:mtext>cos</mml:mtext><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>In order to find the component of <inline-formula><mml:math id="M40"><mml:mover accent="true"><mml:mrow><mml:mi>p</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover></mml:math></inline-formula> that lies in the plane of <italic>u</italic> and <italic>v</italic> we follow a similar procedure. We will use <italic>x</italic> to represent the portion of <inline-formula><mml:math id="M41"><mml:mover accent="true"><mml:mrow><mml:mi>p</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover></mml:math></inline-formula> that lies along <inline-formula><mml:math id="M42"><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover></mml:math></inline-formula>. Using the trigonometric relationship seen in <xref ref-type="fig" rid="F3">Figure 3</xref>, namely</p>
<disp-formula id="E18"><label>(18)</label><mml:math id="M43"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mi>x</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mo>=</mml:mo><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mn>1</mml:mn><mml:mo>-</mml:mo><mml:mtext>cos</mml:mtext><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mfrac><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:mfrac><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mo>,</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>we can now integrate to find <inline-formula><mml:math id="M44"><mml:mover accent="true"><mml:mrow><mml:mi>x</mml:mi></mml:mrow><mml:mo>&#x0002D;</mml:mo></mml:mover></mml:math></inline-formula>:</p>
<disp-formula id="E19"><label>(19)</label><mml:math id="M45"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:mi>x</mml:mi></mml:mrow><mml:mo>&#x0002D;</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:msubsup><mml:mrow><mml:mo>&#x0222B;</mml:mo></mml:mrow><mml:mrow><mml:mn>0</mml:mn></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:msubsup><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mn>1</mml:mn><mml:mo>-</mml:mo><mml:mtext>cos</mml:mtext><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mfrac><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:mfrac><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mi>&#x003C0;</mml:mi><mml:msup><mml:mrow><mml:mi>r</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mtext>d</mml:mtext><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:msubsup><mml:mrow><mml:mo>&#x0222B;</mml:mo></mml:mrow><mml:mrow><mml:mn>0</mml:mn></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:msubsup><mml:mi>&#x003C0;</mml:mi><mml:msup><mml:mrow><mml:mi>r</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mtext>d</mml:mtext><mml:mi>l</mml:mi></mml:mrow></mml:mfrac></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:mi>x</mml:mi></mml:mrow><mml:mo>&#x0002D;</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:mi>&#x003C0;</mml:mi><mml:msup><mml:mrow><mml:mi>r</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover><mml:mo stretchy="false">&#x02016;</mml:mo><mml:msubsup><mml:mrow><mml:mo>&#x0222B;</mml:mo></mml:mrow><mml:mrow><mml:mn>0</mml:mn></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:msubsup><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mn>1</mml:mn><mml:mo>-</mml:mo><mml:mtext>cos</mml:mtext><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mfrac><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:mfrac><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mtext>d</mml:mtext><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mi>&#x003C0;</mml:mi><mml:msup><mml:mrow><mml:mi>r</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mi>h</mml:mi></mml:mrow></mml:mfrac></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:mi>x</mml:mi></mml:mrow><mml:mo>&#x0002D;</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mrow><mml:mo>[</mml:mo></mml:mrow><mml:mi>l</mml:mi><mml:mo>-</mml:mo><mml:mfrac><mml:mrow><mml:mi>h</mml:mi></mml:mrow><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow></mml:mfrac><mml:mtext>sin</mml:mtext><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mfrac><mml:mrow><mml:mi>l</mml:mi></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:mfrac><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:msubsup><mml:mrow><mml:mrow><mml:mo>]</mml:mo></mml:mrow></mml:mrow><mml:mrow><mml:mn>0</mml:mn></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:msubsup></mml:mrow><mml:mrow><mml:mi>h</mml:mi></mml:mrow></mml:mfrac></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:mi>x</mml:mi></mml:mrow><mml:mo>&#x0002D;</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover><mml:mo stretchy="false">&#x02016;</mml:mo></mml:mrow><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow></mml:mfrac><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>&#x003D5;</mml:mi><mml:mo>-</mml:mo><mml:mtext>sin</mml:mtext><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>Recognizing that <inline-formula><mml:math id="M46"><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover><mml:mo stretchy="false">&#x02016;</mml:mo><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:mi>h</mml:mi></mml:mrow><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow></mml:mfrac></mml:math></inline-formula>,</p>
<disp-formula id="E20"><label>(20)</label><mml:math id="M47"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:mi>x</mml:mi></mml:mrow><mml:mo>&#x0002D;</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:mi>h</mml:mi></mml:mrow><mml:mrow><mml:msup><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:mfrac><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>&#x003D5;</mml:mi><mml:mo>-</mml:mo><mml:mtext>sin</mml:mtext><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>Using the derived equations for <inline-formula><mml:math id="M48"><mml:mover accent="true"><mml:mrow><mml:mi>z</mml:mi></mml:mrow><mml:mo>&#x0002D;</mml:mo></mml:mover></mml:math></inline-formula>, <inline-formula><mml:math id="M49"><mml:mover accent="true"><mml:mrow><mml:mi>x</mml:mi></mml:mrow><mml:mo>&#x0002D;</mml:mo></mml:mover></mml:math></inline-formula>, and the normalized version of <inline-formula><mml:math id="M50"><mml:mover accent="true"><mml:mrow><mml:mi>&#x003C1;</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover></mml:math></inline-formula> we obtain the vector from the base of the joint to the center of mass:</p>
<disp-formula id="E21"><label>(21)</label><mml:math id="M51"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:mi>p</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mfrac><mml:mrow><mml:mi>h</mml:mi></mml:mrow><mml:mrow><mml:msup><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:mfrac><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable style="text-align:axis;" equalrows="false" columnlines="none none none none none none none none none" equalcolumns="false" class="array"><mml:mtr><mml:mtd><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>&#x003D5;</mml:mi><mml:mo>-</mml:mo><mml:mtext>sin</mml:mtext><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mfrac><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow></mml:mfrac></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>&#x003D5;</mml:mi><mml:mo>-</mml:mo><mml:mtext>sin</mml:mtext><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mfrac><mml:mrow><mml:mo>-</mml:mo><mml:mi>u</mml:mi></mml:mrow><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow></mml:mfrac></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mn>1</mml:mn><mml:mo>-</mml:mo><mml:mtext>cos</mml:mtext><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>&#x003D5;</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow><mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>The potential energy of the joint due to gravity is simply the dot product of this vector, expressed in the inertial frame, with the gravity vector (<inline-formula><mml:math id="M52"><mml:mover accent="true"><mml:mrow><mml:mi>G</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover></mml:math></inline-formula>) expressed in the same frame:</p>
<disp-formula id="E22"><label>(22)</label><mml:math id="M53"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mi>V</mml:mi><mml:mo>=</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>p</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover><mml:mo>&#x000B7;</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>G</mml:mi></mml:mrow><mml:mo>&#x02192;</mml:mo></mml:mover><mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>Having calculated the potential energy due to gravity, the gravity torques are calculated simply by taking the negative partial derivative of <italic>V</italic> with respect to <italic>q</italic>:</p>
<disp-formula id="E23"><label>(23)</label><mml:math id="M54"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mi>g</mml:mi><mml:mo>=</mml:mo><mml:mo>-</mml:mo><mml:mfrac><mml:mrow><mml:mo>&#x02202;</mml:mo><mml:mi>V</mml:mi></mml:mrow><mml:mrow><mml:mo>&#x02202;</mml:mo><mml:mi>q</mml:mi></mml:mrow></mml:mfrac><mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>The method above has yielded analytical expressions for <italic>M</italic>, <italic>C</italic>, and <italic>g</italic> with the generalized coordinates <italic>u</italic> and <italic>v</italic>. Although complex, these closed-form expressions can be exported from the Sympy library into C code that can be evaluated within microseconds, allowing for real-time model-based control of these continuum joints.</p>
<p>In the absence of applied pressures, the joints used for this paper tend to drive themselves toward an equilibrium position at roughly <italic>u</italic> &#x0003D; <italic>v</italic> &#x0003D; 0 with slight overshoot and brief oscillation. This spring force could have been modeled as a part of the potential energy, however we choose to model the spring and damping separately from the traditional Lagrangian equations of motion. We approximate the spring forces as a linear spring term <italic>K</italic><sub>spring</sub><italic>q</italic> and friction as a linear viscous damping term <inline-formula><mml:math id="M55"><mml:msub><mml:mrow><mml:mi>K</mml:mi></mml:mrow><mml:mrow><mml:mtext>d</mml:mtext></mml:mrow></mml:msub><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:math></inline-formula>. Including these terms, the final model used is,</p>
<disp-formula id="E24"><label>(24)</label><mml:math id="M56"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mi>M</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x000A8;</mml:mo></mml:mover><mml:mo>&#x0002B;</mml:mo><mml:mi>C</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>,</mml:mo><mml:mi>q</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>&#x0002B;</mml:mo><mml:mi>g</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mo>=</mml:mo><mml:mi>&#x003C4;</mml:mi><mml:mo>-</mml:mo><mml:msub><mml:mrow><mml:mi>K</mml:mi></mml:mrow><mml:mrow><mml:mtext>d</mml:mtext></mml:mrow></mml:msub><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>-</mml:mo><mml:msub><mml:mrow><mml:mi>K</mml:mi></mml:mrow><mml:mrow><mml:mtext>spring</mml:mtext></mml:mrow></mml:msub><mml:mi>q</mml:mi></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
</sec>
<sec>
<title>2.2. Development of Model Reference Predictive Adaptive Control</title>
<p>In this section we give brief overviews of both MPC and MRAC in order to clarify notation and establish a background for the development of MRPAC. For in-depth explanations of MPC and MRAC we refer the interested reader to Hyatt et al. (<xref ref-type="bibr" rid="B15">2020</xref>) and Lavretsky and Wise (<xref ref-type="bibr" rid="B20">2013</xref>) respectively.</p>
<sec>
<title>2.2.1. Model Predictive Control</title>
<p>Any dynamic system may be represented in state variable form as</p>
<disp-formula id="E25"><label>(25)</label><mml:math id="M57"><mml:mrow><mml:mstyle mathvariant='bold'><mml:mover accent='true'><mml:mtext>x</mml:mtext><mml:mo>&#x0002E;</mml:mo></mml:mover></mml:mstyle><mml:mo>=</mml:mo><mml:mstyle mathvariant='bold'><mml:mtext>A</mml:mtext></mml:mstyle><mml:mo stretchy='false'>(</mml:mo><mml:mstyle mathvariant='bold'><mml:mtext>x</mml:mtext></mml:mstyle><mml:mo>,</mml:mo><mml:mstyle mathvariant='bold'><mml:mtext>u</mml:mtext></mml:mstyle><mml:mo stretchy='false'>)</mml:mo><mml:mstyle mathvariant='bold'><mml:mtext>x</mml:mtext></mml:mstyle><mml:mo>+</mml:mo><mml:mstyle mathvariant='bold'><mml:mtext>B</mml:mtext></mml:mstyle><mml:mo stretchy='false'>(</mml:mo><mml:mstyle mathvariant='bold'><mml:mtext>x</mml:mtext></mml:mstyle><mml:mo>,</mml:mo><mml:mstyle mathvariant='bold'><mml:mtext>u</mml:mtext></mml:mstyle><mml:mo stretchy='false'>)</mml:mo><mml:mstyle mathvariant='bold'><mml:mtext>u</mml:mtext></mml:mstyle><mml:mo>+</mml:mo><mml:mstyle mathvariant='bold'><mml:mtext>w</mml:mtext></mml:mstyle><mml:mo stretchy='false'>(</mml:mo><mml:mstyle mathvariant='bold'><mml:mtext>x</mml:mtext></mml:mstyle><mml:mo>,</mml:mo><mml:mstyle mathvariant='bold'><mml:mtext>u</mml:mtext></mml:mstyle><mml:mo stretchy='false'>)</mml:mo></mml:mrow></mml:math></disp-formula>
<p>where <bold>x</bold> is the vector of states, <bold>u</bold> is the vector of system inputs, and <bold>w</bold> is a vector of offsets or disturbances. By linearizing this system and using any discretization method (Euler, semi-implicit Euler, matrix exponential, etc.) we can create a linear discretized state space model:</p>
<disp-formula id="E26"><label>(26)</label><mml:math id="M58"><mml:mrow><mml:msub><mml:mstyle mathvariant='bold'><mml:mtext>x</mml:mtext></mml:mstyle><mml:mrow><mml:mstyle mathvariant='bold'><mml:mtext>k</mml:mtext></mml:mstyle><mml:mo>+</mml:mo><mml:mstyle mathvariant='bold'><mml:mn>1</mml:mn></mml:mstyle></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mstyle mathvariant='bold'><mml:mtext>A</mml:mtext></mml:mstyle><mml:mstyle mathvariant='bold'><mml:mtext>d</mml:mtext></mml:mstyle></mml:msub><mml:msub><mml:mstyle mathvariant='bold'><mml:mtext>x</mml:mtext></mml:mstyle><mml:mstyle mathvariant='bold'><mml:mtext>k</mml:mtext></mml:mstyle></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mstyle mathvariant='bold'><mml:mtext>B</mml:mtext></mml:mstyle><mml:mstyle mathvariant='bold'><mml:mtext>d</mml:mtext></mml:mstyle></mml:msub><mml:msub><mml:mstyle mathvariant='bold'><mml:mtext>u</mml:mtext></mml:mstyle><mml:mstyle mathvariant='bold'><mml:mtext>k</mml:mtext></mml:mstyle></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mstyle mathvariant='bold'><mml:mtext>w</mml:mtext></mml:mstyle><mml:mstyle mathvariant='bold'><mml:mtext>d</mml:mtext></mml:mstyle></mml:msub><mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>
<p>The above equation can be used to forward simulate the states of our system, given initial conditions and inputs. In MPC these discretized dynamic equations are the constraints of our optimization while <bold>x<sub>k</sub></bold> and <bold>u<sub>k</sub></bold> are the optimization variables. In an MPC solver predicting over a horizon of <italic>T</italic> time steps, a trajectory optimization may be formulated as:</p>
<disp-formula id="E27"><label>(27)</label><mml:math id="M59"><mml:mtable columnalign='left'><mml:mtr><mml:mtd><mml:mi>J</mml:mi><mml:mo stretchy='false'>(</mml:mo><mml:mstyle mathvariant='bold'><mml:mtext>x</mml:mtext></mml:mstyle><mml:mo>,</mml:mo><mml:mstyle mathvariant='bold'><mml:mtext>u</mml:mtext></mml:mstyle><mml:mo stretchy='false'>)</mml:mo><mml:mo>=</mml:mo><mml:mstyle displaystyle='true'><mml:munderover><mml:mo>&#x02211;</mml:mo><mml:mrow><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn></mml:mrow><mml:mi>T</mml:mi></mml:munderover><mml:mrow><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:msup><mml:mrow><mml:mo stretchy='false'>(</mml:mo><mml:msub><mml:mstyle mathvariant='bold'><mml:mtext>x</mml:mtext></mml:mstyle><mml:mrow><mml:mstyle mathvariant='bold'><mml:mi>g</mml:mi><mml:mi>o</mml:mi><mml:mi>a</mml:mi><mml:mi>l</mml:mi></mml:mstyle></mml:mrow></mml:msub><mml:mo>&#x02212;</mml:mo><mml:msub><mml:mstyle mathvariant='bold'><mml:mtext>x</mml:mtext></mml:mstyle><mml:mstyle mathvariant='bold'><mml:mtext>k</mml:mtext></mml:mstyle></mml:msub><mml:mo stretchy='false'>)</mml:mo></mml:mrow><mml:mi>T</mml:mi></mml:msup><mml:mi>Q</mml:mi><mml:mo stretchy='false'>(</mml:mo><mml:msub><mml:mstyle mathvariant='bold'><mml:mtext>x</mml:mtext></mml:mstyle><mml:mrow><mml:mstyle mathvariant='bold'><mml:mi>g</mml:mi><mml:mi>o</mml:mi><mml:mi>a</mml:mi><mml:mi>l</mml:mi></mml:mstyle></mml:mrow></mml:msub><mml:mo>&#x02212;</mml:mo><mml:msub><mml:mstyle mathvariant='bold'><mml:mtext>x</mml:mtext></mml:mstyle><mml:mstyle mathvariant='bold'><mml:mtext>k</mml:mtext></mml:mstyle></mml:msub><mml:mo stretchy='false'>)</mml:mo></mml:mrow></mml:mrow></mml:mrow></mml:mstyle></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mtext>&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;</mml:mtext><mml:mrow><mml:mrow><mml:mo>+</mml:mo><mml:msup><mml:mrow><mml:mo stretchy='false'>(</mml:mo><mml:msub><mml:mstyle mathvariant='bold'><mml:mtext>u</mml:mtext></mml:mstyle><mml:mrow><mml:mstyle mathvariant='bold'><mml:mi>g</mml:mi><mml:mi>o</mml:mi><mml:mi>a</mml:mi><mml:mi>l</mml:mi></mml:mstyle></mml:mrow></mml:msub><mml:mo>&#x02212;</mml:mo><mml:msub><mml:mstyle mathvariant='bold'><mml:mtext>u</mml:mtext></mml:mstyle><mml:mstyle mathvariant='bold'><mml:mtext>k</mml:mtext></mml:mstyle></mml:msub><mml:mo stretchy='false'>)</mml:mo></mml:mrow><mml:mi>T</mml:mi></mml:msup><mml:mi>R</mml:mi><mml:mo stretchy='false'>(</mml:mo><mml:msub><mml:mstyle mathvariant='bold'><mml:mtext>u</mml:mtext></mml:mstyle><mml:mrow><mml:mstyle mathvariant='bold'><mml:mi>g</mml:mi><mml:mi>o</mml:mi><mml:mi>a</mml:mi><mml:mi>l</mml:mi></mml:mstyle></mml:mrow></mml:msub><mml:mo>&#x02212;</mml:mo><mml:msub><mml:mstyle mathvariant='bold'><mml:mtext>u</mml:mtext></mml:mstyle><mml:mstyle mathvariant='bold'><mml:mtext>k</mml:mtext></mml:mstyle></mml:msub><mml:mo stretchy='false'>)</mml:mo></mml:mrow><mml:mo>]</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mtext>&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;</mml:mtext><mml:mi>s</mml:mi><mml:mo>.</mml:mo><mml:mi>t</mml:mi><mml:mo>.</mml:mo></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mtext>&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;</mml:mtext><mml:msub><mml:mstyle mathvariant='bold'><mml:mtext>x</mml:mtext></mml:mstyle><mml:mrow><mml:mstyle mathvariant='bold'><mml:mtext>k</mml:mtext></mml:mstyle><mml:mo>+</mml:mo><mml:mstyle mathvariant='bold'><mml:mn>1</mml:mn></mml:mstyle></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:msub><mml:mstyle mathvariant='bold'><mml:mtext>A</mml:mtext></mml:mstyle><mml:mstyle mathvariant='bold'><mml:mtext>d</mml:mtext></mml:mstyle></mml:msub><mml:msub><mml:mstyle mathvariant='bold'><mml:mtext>x</mml:mtext></mml:mstyle><mml:mstyle mathvariant='bold'><mml:mtext>k</mml:mtext></mml:mstyle></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mstyle mathvariant='bold'><mml:mtext>B</mml:mtext></mml:mstyle><mml:mstyle mathvariant='bold'><mml:mtext>d</mml:mtext></mml:mstyle></mml:msub><mml:msub><mml:mstyle mathvariant='bold'><mml:mtext>u</mml:mtext></mml:mstyle><mml:mstyle mathvariant='bold'><mml:mtext>k</mml:mtext></mml:mstyle></mml:msub><mml:mo>+</mml:mo><mml:msub><mml:mstyle mathvariant='bold'><mml:mtext>w</mml:mtext></mml:mstyle><mml:mstyle mathvariant='bold'><mml:mtext>d</mml:mtext></mml:mstyle></mml:msub><mml:mtext>&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;</mml:mtext><mml:mo>&#x02200;</mml:mo><mml:mtext>&#x000A0;&#x000A0;&#x000A0;&#x000A0;&#x000A0;</mml:mtext><mml:mi>k</mml:mi><mml:mo>=</mml:mo><mml:mn>0</mml:mn><mml:mo>,</mml:mo><mml:mn>...</mml:mn><mml:mo>,</mml:mo><mml:mi>T</mml:mi><mml:mo>&#x02212;</mml:mo><mml:mn>1</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>where <italic>J</italic> is the objective function value, <bold>x<sub>goal</sub></bold> and <bold>u<sub>goal</sub></bold> are the goal states and inputs respectively. Other constraints may easily be added to this formulation to place bounds on inputs or states. By defining a quadratic cost function and enforcing only linear dynamics constraints we have defined a convex optimization problem suitable for solution using a very fast convex solver. We choose to use the state of the art solver OSQP (from Stellato et al., <xref ref-type="bibr" rid="B28">2017</xref>) for our implementation of MPC. In order to lengthen the horizon of MPC and decrease solve times we also use the input parameterization technique presented in Hyatt et al. (<xref ref-type="bibr" rid="B15">2020</xref>).</p>
<p>MPC solves the above trajectory optimization for the entire horizon of length <italic>T</italic>, however only the first input (<bold>u<sub>0</sub></bold>) is applied to the system. After applying this input, the optimization is solved again using state information that is updated from sensor feedback. The discrete-time model can also be updated with a new linearization centered at the new operating point. This process is repeated with MPC only ever applying the first input, but solving over an entire horizon of value <italic>T</italic>. The fact that MPC re-solves the trajectory optimization problem with the most current state and model information is what leads to MPC being robust to model error as will be shown hereafter.</p>
</sec>
<sec>
<title>2.2.2. Model Reference Adaptive Control</title>
<p>MRAC is a form of adaptive control that seeks to drive a system to behave like a reference system. Because we are interested in controlling continuum joint soft robots we specifically follow the implementation of MRAC outlined in Slotine and Li (<xref ref-type="bibr" rid="B27">1987</xref>) which is specific to robot manipulators. In this derivation of MRAC for manipulators, the authors take advantage of several special properties of manipulator dynamics. Firstly, they express the mass matrix, coriolis matrix, and gravity torques as being linear in certain manipulator parameters. Stated mathematically:</p>
<disp-formula id="E28"><label>(28)</label><mml:math id="M60"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mi>M</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x000A8;</mml:mo></mml:mover><mml:mo>&#x0002B;</mml:mo><mml:mi>C</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>,</mml:mo><mml:mi>q</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>&#x0002B;</mml:mo><mml:mi>g</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mo>=</mml:mo><mml:mi>Y</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x000A8;</mml:mo></mml:mover><mml:mo>,</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>,</mml:mo><mml:mi>q</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mi>a</mml:mi><mml:mo>=</mml:mo><mml:mi>&#x003C4;</mml:mi></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>where <inline-formula><mml:math id="M61"><mml:mi>Y</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x000A8;</mml:mo></mml:mover><mml:mo>,</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>,</mml:mo><mml:mi>q</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:math></inline-formula> is the <italic>n</italic>x<italic>p</italic> regressor and <italic>a</italic> is a <italic>p</italic>x1 vector containing the manipulator dynamic parameters which may be unknown or changing over time. In rigid body manipulators it can be shown that <italic>a</italic> contains the link masses, inertias, and the positions of centers of mass. Using the soft robot continuum joint dynamic model from section 2.1 to derive <italic>M</italic>, <italic>C</italic>, and <italic>g</italic> it can be seen by inspection that all of these terms are linear in the joint mass <italic>m</italic>, as well as square of the joint radius <italic>r</italic><sup>2</sup> and joint height <italic>h</italic><sup>2</sup>.</p>
<p>In Slotine and Li (<xref ref-type="bibr" rid="B27">1987</xref>) the authors present a method by which joint accelerations need not be measured or estimated in order to calculate the regressor. Instead they exploit several properties of manipulator dynamics in order to rewrite the regressor as a function of joint positions (<italic>q</italic>), joint velocities (<inline-formula><mml:math id="M62"><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:math></inline-formula>), reference system velocities (<inline-formula><mml:math id="M63"><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>ref</mml:mtext></mml:mrow></mml:msub></mml:math></inline-formula>), and reference system accelerations (<inline-formula><mml:math id="M64"><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x000A8;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>ref</mml:mtext></mml:mrow></mml:msub></mml:math></inline-formula>):</p>
<disp-formula id="E29"><label>(29)</label><mml:math id="M65"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mi>&#x003C4;</mml:mi><mml:mo>=</mml:mo><mml:mi>Y</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>q</mml:mi><mml:mo>,</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>ref</mml:mtext></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x000A8;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>ref</mml:mtext></mml:mrow></mml:msub></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mi>a</mml:mi><mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>The reference system includes a set of differential equations that describe a system of our choosing with desirable characteristics (such as being a 2nd-order critically damped system with a desired rise time). This is useful in practice because while accurate measurements or estimates of joint accelerations are hard to obtain, the acceleration of the reference system is a calculated value that we know perfectly.</p>
<p>When using MRAC, we generally do not know the parameter vector <italic>a</italic> perfectly (especially for soft robots), so we desire to estimate it. We will denote our estimate <inline-formula><mml:math id="M66"><mml:mover accent='true'><mml:mi>a</mml:mi><mml:mo>&#x0005E;</mml:mo></mml:mover></mml:math></inline-formula>. The adaptive parameter vector <inline-formula><mml:math id="M67"><mml:mover accent='true'><mml:mi>a</mml:mi><mml:mo>&#x0005E;</mml:mo></mml:mover></mml:math></inline-formula> is adapted according to the law:</p>
<disp-formula id="E30"><label>(30)</label><mml:math id="M68"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mover accent='true'><mml:mover accent='true'><mml:mi>a</mml:mi><mml:mo>&#x0005E;</mml:mo></mml:mover><mml:mo>&#x0002E;</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mo>-</mml:mo><mml:msup><mml:mrow><mml:mo>&#x00393;</mml:mo></mml:mrow><mml:mrow><mml:mo>-</mml:mo><mml:mn>1</mml:mn></mml:mrow></mml:msup><mml:mi>Y</mml:mi><mml:msup><mml:mrow><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>q</mml:mi><mml:mo>,</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>ref</mml:mtext></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x000A8;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>ref</mml:mtext></mml:mrow></mml:msub></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow><mml:mrow><mml:mi>T</mml:mi></mml:mrow></mml:msup><mml:mi>s</mml:mi></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>where</p>
<disp-formula id="E31"><label>(31)</label><mml:math id="M69"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mi>s</mml:mi><mml:mo>=</mml:mo><mml:mover accent="true"><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x0007E;</mml:mo></mml:mover></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>&#x0002B;</mml:mo><mml:mo>&#x0039B;</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x0007E;</mml:mo></mml:mover></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x0007E;</mml:mo></mml:mover></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>-</mml:mo><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>ref</mml:mtext></mml:mrow></mml:msub></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x0007E;</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mi>q</mml:mi><mml:mo>-</mml:mo><mml:msub><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mrow><mml:mtext>ref</mml:mtext></mml:mrow></mml:msub><mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>The terms <inline-formula><mml:math id="M70"><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x0007E;</mml:mo></mml:mover></mml:math></inline-formula> and <inline-formula><mml:math id="M71"><mml:mover accent="true"><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x0007E;</mml:mo></mml:mover></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:math></inline-formula> are the position and velocity tracking errors with respect to the response of the reference system, and so therefore <italic>s</italic> is a sort of weighted tracking error term. &#x00393; can be thought of as the learning rate of the adaptive controller.</p>
<p>The final step in manipulator MRAC as explained in Slotine and Li (<xref ref-type="bibr" rid="B27">1987</xref>) guarantees that not only parameter error, but also position error will be driven to zero. In order to ensure this, the final control law for MRAC is defined as:</p>
<disp-formula id="E32"><label>(32)</label><mml:math id="M72"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mi>&#x003C4;</mml:mi><mml:mo>=</mml:mo><mml:mi>Y</mml:mi><mml:msup><mml:mrow><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>q</mml:mi><mml:mo>,</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>ref</mml:mtext></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x000A8;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>ref</mml:mtext></mml:mrow></mml:msub></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow><mml:mrow><mml:mi>T</mml:mi></mml:mrow></mml:msup><mml:mover accent='true'><mml:mi>a</mml:mi><mml:mo>&#x0005E;</mml:mo></mml:mover><mml:mo>-</mml:mo><mml:msub><mml:mrow><mml:mi>K</mml:mi></mml:mrow><mml:mrow><mml:mtext>d</mml:mtext></mml:mrow></mml:msub><mml:mi>s</mml:mi></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>Note that because <italic>s</italic> is a weighted sum of our position and velocity tracking errors, the matrices <italic>K</italic><sub><italic>D</italic></sub> and &#x0039B; can be thought of as a feedback controller on position error. This feedback term, in addition to the feed-forward term from the adaptive parameters, helps to decrease steady-state position error.</p>
<p>In the above equations, &#x00393;, &#x0039B;, and <italic>K</italic><sub><italic>D</italic></sub> are all tuning parameters used to determine how quickly the adaptive parameters can change and how quickly position error is driven to zero. In general, selecting higher values for the tuning parameters causes the adaptive parameters to change more quickly and the tracking error to decrease more quickly. However, as one may expect, increasing these values to be too high can lead to instability.</p>
<p>Defining <inline-formula><mml:math id="M73"><mml:mi>f</mml:mi><mml:mo>=</mml:mo><mml:mi>M</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x000A8;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>ref</mml:mtext></mml:mrow></mml:msub><mml:mo>&#x0002B;</mml:mo><mml:mi>C</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>,</mml:mo><mml:mi>q</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>ref</mml:mtext></mml:mrow></mml:msub><mml:mo>&#x0002B;</mml:mo><mml:mi>g</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mo>&#x0002B;</mml:mo><mml:msub><mml:mrow><mml:mi>K</mml:mi></mml:mrow><mml:mrow><mml:mtext>d</mml:mtext></mml:mrow></mml:msub><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>&#x0002B;</mml:mo><mml:msub><mml:mrow><mml:mi>K</mml:mi></mml:mrow><mml:mrow><mml:mtext>spring</mml:mtext></mml:mrow></mml:msub><mml:mi>q</mml:mi></mml:math></inline-formula>, the regressor used for the continuum joint soft robot in this work is of the form:</p>
<disp-formula id="E33"><label>(33)</label><mml:math id="M74"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mi>Y</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>q</mml:mi><mml:mo>,</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>ref</mml:mtext></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x000A8;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>ref</mml:mtext></mml:mrow></mml:msub></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mo>=</mml:mo><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable style="text-align:axis;" equalrows="false" columnlines="none none none none none none none none none" equalcolumns="false" class="array"><mml:mtr><mml:mtd><mml:mfrac><mml:mrow><mml:mo>&#x02202;</mml:mo><mml:mi>f</mml:mi></mml:mrow><mml:mrow><mml:mo>&#x02202;</mml:mo><mml:mi>m</mml:mi></mml:mrow></mml:mfrac></mml:mtd><mml:mtd><mml:mfrac><mml:mrow><mml:mo>&#x02202;</mml:mo><mml:mi>f</mml:mi></mml:mrow><mml:mrow><mml:mo>&#x02202;</mml:mo><mml:msup><mml:mrow><mml:mi>h</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:mfrac></mml:mtd><mml:mtd><mml:mfrac><mml:mrow><mml:mo>&#x02202;</mml:mo><mml:mi>f</mml:mi></mml:mrow><mml:mrow><mml:mo>&#x02202;</mml:mo><mml:msup><mml:mrow><mml:mi>r</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:mfrac></mml:mtd><mml:mtd><mml:mfrac><mml:mrow><mml:mo>&#x02202;</mml:mo><mml:mi>f</mml:mi></mml:mrow><mml:mrow><mml:mo>&#x02202;</mml:mo><mml:mi>q</mml:mi></mml:mrow></mml:mfrac></mml:mtd><mml:mtd><mml:mfrac><mml:mrow><mml:mo>&#x02202;</mml:mo><mml:mi>f</mml:mi></mml:mrow><mml:mrow><mml:mo>&#x02202;</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mrow></mml:mfrac></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow><mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
</sec>
<sec>
<title>2.2.3. Model Reference Predictive Adaptive Control</title>
<p>MRPAC combines the strengths of both MPC and MRAC to yield a model-based optimal controller that can adapt its model online, but remains robust to unmodeled disturbances. As with MPC we begin with a model of the system, however this time we explicitly model the error in our model as a torque disturbance term:</p>
<disp-formula id="E34"><label>(34)</label><mml:math id="M75"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mrow><mml:mstyle mathvariant="bold"><mml:mtext>x</mml:mtext></mml:mstyle></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>=</mml:mo><mml:mstyle mathvariant="bold"><mml:mtext>A</mml:mtext></mml:mstyle><mml:mstyle mathvariant="bold"><mml:mtext>x</mml:mtext></mml:mstyle><mml:mo>&#x0002B;</mml:mo><mml:mstyle mathvariant="bold"><mml:mtext>B</mml:mtext></mml:mstyle><mml:mstyle mathvariant="bold"><mml:mtext>u</mml:mtext></mml:mstyle><mml:mo>&#x0002B;</mml:mo><mml:mstyle mathvariant="bold"><mml:mtext>w</mml:mtext></mml:mstyle><mml:mo>&#x0002B;</mml:mo><mml:msub><mml:mrow><mml:mi>&#x003C4;</mml:mi></mml:mrow><mml:mrow><mml:mtext>disturbance</mml:mtext></mml:mrow></mml:msub><mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>If the error in our model is simply due to incorrect estimates of the manipulator parameters, then we should be able to represent this disturbance exactly using the same regressor as MRAC, namely:</p>
<disp-formula id="E35"><label>(35)</label><mml:math id="M76"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:msub><mml:mrow><mml:mi>&#x003C4;</mml:mi></mml:mrow><mml:mrow><mml:mtext>disturbance</mml:mtext></mml:mrow></mml:msub><mml:mo>=</mml:mo><mml:mo>-</mml:mo><mml:mi>Y</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>q</mml:mi><mml:mo>,</mml:mo><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>ref</mml:mtext></mml:mrow></mml:msub><mml:mo>,</mml:mo><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x000A8;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>ref</mml:mtext></mml:mrow></mml:msub></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mover accent='true'><mml:mi>a</mml:mi><mml:mo>&#x0005E;</mml:mo></mml:mover><mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>The negative sign is necessary because we adapt the parameters in <inline-formula><mml:math id="M77"><mml:mover accent='true'><mml:mi>a</mml:mi><mml:mo>&#x0005E;</mml:mo></mml:mover></mml:math></inline-formula> according to the MRAC adaptation law. MRAC&#x00027;s adaptation law is designed to estimate a torque that, when applied to the system, will &#x0201C;cancel out" the system&#x00027;s dynamics. In MRPAC we want to represent the system&#x00027;s dynamics instead of the torque needed to cancel them out. These two quantities are opposite in sign, hence the negative sign shown here.</p>
<p>It is important to note that in MRPAC we are using the regressor and adaptive parameters to represent our model error, while in MRAC they are used to represent the system dynamics in their entirety. We therefore can not expect <inline-formula><mml:math id="M78"><mml:mover accent='true'><mml:mi>a</mml:mi><mml:mo>&#x0005E;</mml:mo></mml:mover></mml:math></inline-formula> to contain the same values for MRAC and MRPAC. In fact, if given a perfect model, <inline-formula><mml:math id="M79"><mml:mover accent='true'><mml:mi>a</mml:mi><mml:mo>&#x0005E;</mml:mo></mml:mover></mml:math></inline-formula> should theoretically remain zero for MRPAC. This is because given a perfect model, MRPAC, like MPC, should track perfectly from the beginning and <inline-formula><mml:math id="M80"><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x0007E;</mml:mo></mml:mover></mml:math></inline-formula> and <inline-formula><mml:math id="M81"><mml:mover accent="true"><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo>&#x0007E;</mml:mo></mml:mover></mml:mrow><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:math></inline-formula> will remain zero. As one can see from the adaptive law in Equation (30), as long as these tracking errors remain zero, the adaptive parameters will not change.</p>
<p>Also, it is important to note that &#x00393; and &#x0039B; are the only tuning parameters for the estimation of <inline-formula><mml:math id="M82"><mml:mover accent='true'><mml:mi>a</mml:mi><mml:mo>&#x0005E;</mml:mo></mml:mover></mml:math></inline-formula> in MRPAC. While in MRAC there is an error term multiplied by <italic>K</italic><sub><italic>D</italic></sub> in order to ensure that position error is decreased, in MPC the tracking error is decreased by virtue of the optimization that seeks to minimize error.</p>
<p>In order to make a fair comparison between MRAC and MRPAC we use the same regressor for both controllers.</p>
</sec>
</sec>
</sec>
<sec id="s3">
<title>3. Description of Experiments</title>
<p>Adaptive control techniques are useful in the case where we do not know a complete and accurate model of our system a priori. After all, if we did have a complete and accurate model then we could perfectly predict the behavior of our system for model-based control techniques. We will classify all modeling error into two categories: parameter mismatch and structure mismatch. Parameter mismatch correspond to terms, physical phenomena, or parameters in our model that we are accounting for, but whose values are uncertain or unknown. For example inertias, damping coefficients, and spring coefficients may be parameter mismatch. Structure mismatch in our model corresponds to phenomena that occur in the real system, but are not represented in our model for whatever reason. If we assume all spring and damping elements in our system are linear while they are in fact non-linear, then we do not have the ability to represent the non-linear effect of the spring and this non-linear effect is structure mismatch.</p>
<sec>
<title>3.1. Simulation Experiments</title>
<p>In the simulation portion of the experiments, a simulation is created using the model outlined in section 2.1 and this simulated system is controlled using three different controllers. The goal of each controller is to drive the system to follow a reference trajectory generated by a reference system. The three controllers implemented are MPC, MRAC, and the MRPAC algorithm detailed in section 2.2.3.</p>
<p>The reference system used for these experiments can be thought of as two uncoupled, critically-damped mass-spring-damper systems each modeled by the equation:</p>
<disp-formula id="E36"><label>(36)</label><mml:math id="M83"><mml:mtable class="eqnarray" columnalign="left"><mml:mtr><mml:mtd><mml:mi>m</mml:mi><mml:mover accent='true'><mml:mi>x</mml:mi><mml:mo>&#x000A8;</mml:mo></mml:mover><mml:mo>&#x0002B;</mml:mo><mml:mi>b</mml:mi><mml:mover accent='true'><mml:mi>x</mml:mi><mml:mo>&#x0002E;</mml:mo></mml:mover><mml:mo>&#x0002B;</mml:mo><mml:mi>k</mml:mi><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mrow><mml:mi>x</mml:mi><mml:mo>-</mml:mo><mml:mi>r</mml:mi></mml:mrow><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mo>=</mml:mo><mml:mn>0</mml:mn><mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<p>The masses (of mass <italic>m</italic>) are driven by the springs to the reference positions (<italic>r</italic>) and the damping coefficient (<italic>b</italic>) is always chosen such that the system is critically damped (<inline-formula><mml:math id="M84"><mml:mi>b</mml:mi><mml:mo>=</mml:mo><mml:msqrt><mml:mrow><mml:mn>4</mml:mn><mml:mi>m</mml:mi><mml:mi>k</mml:mi></mml:mrow></mml:msqrt></mml:math></inline-formula>). The rise time of the reference system can be altered by varying the spring constant (<italic>k</italic>). We choose a rise time such that the system has settled to steady state within about 1 s.</p>
<p>As mentioned in the adaptive control literature, model parameter estimation and adaptive control schemes require sufficient &#x0201C;excitation&#x0201D; in order to converge or to adapt. We provide this excitation by changing the reference positions (<italic>r</italic>) of our system every 2 s. Reference positions are drawn from a uniform distribution bounded above and below by <inline-formula><mml:math id="M85"><mml:mo>-</mml:mo><mml:mfrac><mml:mrow><mml:mi>&#x003C0;</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn><mml:msqrt><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msqrt></mml:mrow></mml:mfrac></mml:math></inline-formula> and <inline-formula><mml:math id="M86"><mml:mfrac><mml:mrow><mml:mi>&#x003C0;</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn><mml:msqrt><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msqrt></mml:mrow></mml:mfrac></mml:math></inline-formula>. These bounds are chosen so that the resulting total bend angle (<inline-formula><mml:math id="M87"><mml:mi>&#x003D5;</mml:mi><mml:mo>=</mml:mo><mml:msqrt><mml:mrow><mml:msup><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mo>&#x0002B;</mml:mo><mml:msup><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:msqrt></mml:math></inline-formula>) is never greater than <inline-formula><mml:math id="M88"><mml:mfrac><mml:mrow><mml:mi>&#x003C0;</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:mfrac></mml:math></inline-formula> radians.</p>
<sec>
<title>3.1.1. Case 1: Perfect Regressor (Parameter Mismatch)</title>
<p>The first experiment performed is designed to show the performance of all three controllers in the case where the regressor can fully describe the dynamics of the system (e.g., there is no structure mismatch). The hypothesis to be tested is that given a perfect regressor (speaking in terms of form and not initial values), both MRAC and MRPAC should be able to compensate for the system&#x00027;s dynamics perfectly and should drive the system to follow the reference trajectory exactly. For MPC, since it cannot adapt its model we expect that increasing model error (but not adding additional unmodeled terms) will lead to increasing tracking error.</p>
<p>To test this hypothesis we control the same system using the three controllers outlined in section 2.2 (i.e., MPC, MRAC, and MRPAC) and provide MRAC and MRPAC each with the same regressor. Because MPC and MRPAC require a discretized model, we introduce model error in order to see the effect on their performance. The method used for introducing model error is to make our estimates of <italic>h</italic>, <italic>m</italic>, <italic>K</italic><sub>spring</sub>, <italic>K</italic><sub><italic>damper</italic></sub> a scalar multiple of their simulated value. Because MRAC does not utilize a model apart from the regressor, it is invariant to model error. All adaptive parameters for MRAC and MRPAC are initialized at zero.</p>
<p>Each controller is run in simulation for 5 min of &#x0201C;excitation&#x0201D; (new reference commands every 2 s) in order to allow the adaptive parameters to settle. After 5 min of &#x0201C;excitation&#x0201D; the performance of each controller is evaluated during one additional minute. Because MPC is not adapting at all, this excitation period makes no difference in its performance. The integral of the position error during the 1 min evaluation is shown in <xref ref-type="fig" rid="F4">Figure 4</xref> as a function of the model error. As an example, the joint trajectories during the evaluation using a modeling error scalar of 1.5 are shown in <xref ref-type="fig" rid="F5">Figure 5</xref>. Note that the green line cannot be seen because it is directly beneath the blue and red lines.</p>
<fig id="F4" position="float">
<label>Figure 4</label>
<caption><p>Tracking error sensitivity to model error for all three controllers in simulation.</p></caption>
<graphic xlink:href="frobt-07-558027-g0004.tif"/>
</fig>
<fig id="F5" position="float">
<label>Figure 5</label>
<caption><p>Joint trajectory tracking using all three controllers in simulation. This is for the case of errors in the model parameters used for MPC and MRPAC. Note that the reference trajectory corresponds to <italic>q</italic><sub>ref</sub>, the position states of our dynamic reference system defined in Equation (36). Also note that the performance of MRAC and MRPAC is indistinguishable.</p></caption>
<graphic xlink:href="frobt-07-558027-g0005.tif"/>
</fig>
</sec>
<sec>
<title>3.1.2. Case 2: Imperfect Regressor (Structure Mismatch)</title>
<p>The second experiment performed is designed to show the performance of all three controllers in the case where the regressor cannot fully describe the dynamics of the system. The hypothesis to be tested is that neither MRAC nor MRPAC should be able to adapt for the system&#x00027;s dynamics perfectly given an imperfect regressor, and both should therefore struggle to drive the system to follow the reference trajectory exactly. However, because MPC has been shown to be robust to modeling error, both MPC and MRPAC should be more robust to the unmodeled forces that affect the dynamics.</p>
<p>To test this hypothesis, instead of simulating a system in which a spring force drives the joint toward the zero configuration, we simulate a system in which the spring force drives the joint toward a non-zero configuration. This is a phenomenon observed in real soft robot hardware because of slight inconsistencies in the manufacturing of the plastic bellows. This offset spring force can be thought of as a constant torque that is applied to the joint in one direction. Because the regressor does not contain any terms that correspond to a constant torque offset, this force cannot be represented by the regressor and therefore constitutes a &#x0201C;structure mismatch.&#x0201D; While we <italic>do</italic> actually know about this constant offset and likely would include a constant term in the regressor, we anticipate that there will be forces which we do not know about or whose form is unknown for any real soft robot. This simple experiment allows us to see the potential effects of these completely unmodeled forces.</p>
<p>In order to see the sensitivity of each controller to this unmodeled force that cannot be represented with the regressor, we vary the spring force equilibrium offset between <italic>u</italic> &#x0003D; <italic>v</italic> &#x0003D; 0.05 rad and <italic>u</italic> &#x0003D; <italic>v</italic> &#x0003D; 0.25 rad. We do this for each setting of % model error tested in the first experiment, yielding a surface of tracking error that is a function of both a scaled model error (parameter mismatch) as well as an unmodeled constant torque (structure mismatch).</p>
<p>Again, after 5 min of &#x0201C;excitation&#x0201D; the performance of each controller is evaluated during one additional minute. The integrated position error during the evaluation minute is shown in <xref ref-type="fig" rid="F6">Figure 6</xref> as a function of the model error. As an example, the joint trajectories during the minute evaluation using a spring offset of <italic>u</italic> &#x0003D; <italic>v</italic> &#x0003D; 0.25 are seen in <xref ref-type="fig" rid="F7">Figure 7</xref>.</p>
<fig id="F6" position="float">
<label>Figure 6</label>
<caption><p>Simulated tracking error sensitivity to unmodeled offset forces/torques (structure mismatch) if the rest of the model is perfect.</p></caption>
<graphic xlink:href="frobt-07-558027-g0006.tif"/>
</fig>
<fig id="F7" position="float">
<label>Figure 7</label>
<caption><p>Simulated joint trajectory tracking of all three controllers with a perfect model besides an unmodeled offset torque. Note that the reference trajectory corresponds to <italic>q</italic><sub>ref</sub>, the position states of our dynamic reference system defined in Equation (36). Also note that the performance of MPC and MRPAC is indistinguishable.</p></caption>
<graphic xlink:href="frobt-07-558027-g0007.tif"/>
</fig>
</sec>
</sec>
<sec>
<title>3.2. Hardware Experiments</title>
<p>In order to validate both simulations, we implement the same three controllers (MPC, MRAC, and MRPAC) on the soft continuum joint shown in <xref ref-type="fig" rid="F1">Figure 1</xref> and compare their performance.</p>
<p>The soft continuum joint used for this experiment is actuated by four plastic bellows, each of which can be controlled independently. A pressure difference in each of the bellows causes a rotation about one or both of the joint&#x00027;s axes. The angle about each of these axes (denoted u and v in <xref ref-type="fig" rid="F1">Figure 1</xref>) is the robot&#x00027;s position and are the variables that we attempt to control. We expect this hardware platform to illustrate the sensitivity of each controller to both parameter mismatch and structure mismatch.</p>
<p>Both sources of error are present in hardware. Because no system identification was performed previously, the aforementioned model parameters such as <italic>h</italic>, <italic>m</italic>, <italic>r</italic>, <italic>K</italic><sub>spring</sub>, and <italic>K</italic><sub>d</sub> are not known perfectly. Additionally, the continuum joint exhibits unknown non-linear behavior near the extremes of its range of motion or in certain directions, where its stiffness or damping vary non-linearly with respect to <italic>u</italic> and <italic>v</italic>. In addition to the non-linear effects, we observe the effects of various offset forces in the plastic bellows used to actuate the joint. For example, even with equal pressures in each of the four bellows, the continuum joint remains slightly bent, indicating the presence of some constant unmodeled forces. For our simulations (see section 3.1.2) we represented this as a constant spring offset, but the actual source of this offset is unknown. In order to allow the adaptive control methods to compensate for this constant offset force we add to the regressor an identity matrix. This identity matrix means that the adaptive parameters that multiply it will be mapped directly to generalized torques in the dynamic model.</p>
<p>We track the orientation of a frame on top of the joint relative to a frame below the joint in order to estimate the state of the joint in real-time. We reuse the same reference trajectory from the simulation with one minor change: the command changes every 5 s instead of every two. This was adjusted in an attempt to be conservative with experimental hardware and software while still validating the performance of each controller.</p>
<p>As in the simulation experiments, we excite the system with the same 150 commands used in simulation (12.5 min) before evaluating each of the controllers for the last 30 commands (2.5 min). The joint trajectories for this evaluation period are shown in <bold>Figure 9</bold>.</p>
</sec>
</sec>
<sec sec-type="results" id="s4">
<title>4. Results</title>
<sec>
<title>4.1. Simulation Experiments</title>
<sec>
<title>4.1.1. Case 1: Perfect Regressor (Parameter Mismatch)</title>
<p>The first experiment was designed to see the sensitivity of each controller to parameter mismatch, or model error where at least the form of the model is known. The results of this experiment can be seen in <xref ref-type="fig" rid="F4">Figure 4</xref>. An example of the joint angle trajectories achieved by each controller is shown in <xref ref-type="fig" rid="F5">Figure 5</xref>. As expected, MRAC is unaffected by this kind of model error because MRAC was initialized with all parameters equal to zero and adapted the parameters to their values based on the MRAC adaptation law. We see that given a correct form of the model, MRAC is able to find a very good model and track the reference trajectory with very little error. When MPC is given a perfect model, we see that it performs better than either MRAC or MRPAC, reducing tracking error to near zero over the entire evaluation period of 60 s. However, we see that it is the most sensitive to model error, especially when inertial, damping, and spring effects are underestimated.</p>
<p>The data presented in <xref ref-type="fig" rid="F4">Figure 4</xref> seem to validate the hypothesis that MRAC and MRPAC can both compensate for model error, given a model with the perfect form. We see that MRPAC is able to perform almost identically to MRAC in all cases except when inertial, damping, and spring effects are grossly underestimated. Upon further inspection of the data we found that for this case the adaptive parameters for MRPAC had not quite settled during the 5 min excitation period and that given more time, the tracking performance of MRPAC again approached that of MRAC. This is an interesting and important note - that where MPC performs worst, MRPAC has the most tracking error to overcome, and therefore may take longer to converge its adaptive parameters to a steady state. This suggests that the tuning of &#x00393; and &#x0039B; as well as the transient response of the adaptive terms of these controllers are important topics of future research.</p>
</sec>
<sec>
<title>4.1.2. Case 2: Imperfect Regressor (Structure Mismatch)</title>
<p>The second experiment was designed to see the sensitivity of each controller to structure mismatch, or model error where the form of the model is not known. The results of this experiment can be seen in <xref ref-type="fig" rid="F6">Figure 6</xref>. An example of the joint angle trajectories achieved by each controller is shown in <xref ref-type="fig" rid="F7">Figure 7</xref>. As can be seen from the figure, every controller&#x00027;s performance suffers because of this additional modeling error, however MRAC is by far the most sensitive. Note that the x axis of the plot denotes the value of both <italic>u</italic> and <italic>v</italic>, and the entire bend angle is equal to <inline-formula><mml:math id="M89"><mml:mi>&#x003D5;</mml:mi><mml:mo>=</mml:mo><mml:msqrt><mml:mrow><mml:msup><mml:mrow><mml:mi>u</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup><mml:mo>&#x0002B;</mml:mo><mml:msup><mml:mrow><mml:mi>v</mml:mi></mml:mrow><mml:mrow><mml:mn>2</mml:mn></mml:mrow></mml:msup></mml:mrow></mml:msqrt></mml:math></inline-formula>. Keeping this in mind, with a spring offset of about 4&#x000B0; (<italic>u</italic> &#x0003D; <italic>v</italic> &#x0003D; 0.05 radians) MRAC&#x00027;s tracking performance is worse than MPC with 50% error on estimates of masses, lengths and spring and damper coefficients. This represents a very significant decrease in performance due to a relatively small, but completely unmodeled, disturbance. This is the main motivation behind the development of MRPAC. MRPAC can be seen from this figure to inherit from MPC insensitivity to completely unmodeled disturbances or dynamics, and can be seen from <xref ref-type="fig" rid="F4">Figure 4</xref> to inherit from MRAC insensitivity to partially modeled disturbances or dynamics.</p>
<p>We can vary the magnitude of both scalar modeling error as well as the unmodeled spring offset in order to develop a surface of tracking error that is a function of both parameter mismatch and structure mismatch. This surface can be seen in <xref ref-type="fig" rid="F8">Figure 8</xref>. This is useful information because in reality we are likely to encounter both types of unknowns instead of just one. From the figure we can see that MRPAC consistently has the lowest tracking error of the three controllers, except when MPC has a perfect model or when the model used for MRPAC grossly underestimates inertial, damping, and spring effects. As stated earlier, we have observed that the performance of MRPAC can be improved in the latter case by allowing it to adapt for longer. However, these experimental results outline an important fact, which is that the transient responses of the adaptive terms of MRAC and MRPAC are not the same for the same &#x00393; and &#x0039B; values. The exact differences between them and the exact reasons remain for future work.</p>
<fig id="F8" position="float">
<label>Figure 8</label>
<caption><p>Simulated joint trajectory tracking error as a function of both model parameter error (parameter mismatch) and a spring offset error (structure mismatch).</p></caption>
<graphic xlink:href="frobt-07-558027-g0008.tif"/>
</fig>
</sec>
</sec>
<sec>
<title>4.2. Hardware Experiments</title>
<p>The joint trajectories for the hardware experiments are shown in <xref ref-type="fig" rid="F9">Figure 9</xref> and the integral of the position tracking error is reported in <xref ref-type="table" rid="T1">Table 1</xref>. It is important to note that, unlike for the simulation, we cannot separate the perfect regressor and imperfect regressor cases on real hardware. Because of the nature of the continuum joint, we expect some combination of both cases to influence the controller performance results.</p>
<fig id="F9" position="float">
<label>Figure 9</label>
<caption><p>Joint trajectory tracking of all three controllers in hardware. Note that the reference trajectory corresponds to <italic>q</italic><sub>ref</sub>, the position states of our dynamic reference system defined in Equation (36).</p></caption>
<graphic xlink:href="frobt-07-558027-g0009.tif"/>
</fig>
<table-wrap position="float" id="T1">
<label>Table 1</label>
<caption><p>Position tracking error statistics for all three controllers during the 2.5 min evaluation.</p></caption>
<table frame="hsides" rules="groups">
<thead><tr>
<th/>
<th valign="top" align="center"><bold>Integrated error</bold></th>
<th valign="top" align="center"><bold>Mean error</bold></th>
<th valign="top" align="center"><bold>Median error</bold></th>
<th valign="top" align="center"><bold>Std. Dev. of error</bold></th>
</tr>
</thead>
<tbody>
<tr>
<td valign="top" align="left">MPC</td>
<td valign="top" align="center">18.24</td>
<td valign="top" align="center">&#x02013;0.0043</td>
<td valign="top" align="center">&#x02013;0.0037</td>
<td valign="top" align="center">0.1198</td>
</tr>
<tr>
<td valign="top" align="left">MRAC</td>
<td valign="top" align="center">21.63</td>
<td valign="top" align="center">&#x02013;0.0027</td>
<td valign="top" align="center">&#x02013;0.0005</td>
<td valign="top" align="center">0.1829</td>
</tr>
<tr>
<td valign="top" align="left">MRPAC</td>
<td valign="top" align="center">9.529</td>
<td valign="top" align="center">&#x02013;0.0009</td>
<td valign="top" align="center">&#x02013;0.0002</td>
<td valign="top" align="center">0.0924</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>Generally, we see from the results that MPC struggles to eliminate steady state error. This matches the simulated behavior in <xref ref-type="fig" rid="F5">Figure 5</xref> and is expected because MPC does not have the ability to compensate for modeling errors that exist in the continuum joint. MRAC and MRPAC, on the other hand, do have the ability to compensate for modeling errors. Consequently they both track the steady state reference trajectory much closer than MPC. This indicates that the hypothesis presented in section 3.1.1 is demonstratively true at least for this hardware platform. MRAC and MRPAC certainly compensate for the modeling errors and drive the system to follow the reference trajectory. In hardware however, we see that neither controller is capable of following the reference trajectory <italic>exactly</italic>. In other words, we do not see in hardware the same performance as we see in the simulation results in <xref ref-type="fig" rid="F5">Figure 5</xref>, where both trajectories deviate very little from the reference. This is because in addition to the modeling error (parameter mismatch) for which MRAC and MRPAC can compensate, there are still system dynamics for which they cannot fully compensate (structure mismatch).</p>
<p>The effect of structure mismatch in simulation is shown in <xref ref-type="fig" rid="F6">Figure 6</xref>. Tracking error increases for all control methods as the magnitude of these modeling errors increase, but they increase dramatically for MRAC, hence its poor simulation performance exhibited in <xref ref-type="fig" rid="F7">Figure 7</xref>. Importantly, this same pattern emerges in our hardware experiments. There are several instances during the evaluation period where unknown forces cause deviation from the reference trajectory. For examples of this, see the upper plot (<italic>u</italic>) of <xref ref-type="fig" rid="F9">Figure 9</xref> at 65, 100, and 135 s and the bottom plot (<italic>v</italic>) at 30, 45, and 95 s. All controllers are negatively affected, but MPC and MRPAC are more robust than MRAC. In other words, when encountering such disturbances, MRAC is forced to artificially adapt dynamic parameters in an attempt to eliminate the error. In contrast, MPC and MRPAC are better able to respond to disturbances because they re-solve the trajectory optimization over the whole time horizon, not just a single time step. These results support the hypothesis outlined in section 3.1.2 as well. MRAC and MRPAC do not track the reference trajectory perfectly because of the unknown disturbances but MPC and MRPAC are quantifiably more robust to the structure mismatch.</p>
<p>The results reported in <xref ref-type="table" rid="T1">Table 1</xref> add a quantitative performance analysis in addition to the qualitative analysis from <xref ref-type="fig" rid="F9">Figure 9</xref>. From the table we can see that MRPAC accumulates about half of the integrated tracking error of the other two controllers during the 1 min evaluation. It is interesting to note that MPC and MRAC have similar integrated tracking error, although qualitatively their trajectories look different. While MPC has a good transient response and large steady state error, MRAC has a poor transient response and small steady state error. This is also reflected in the statistics, since MRAC has lower mean and median error than MPC, but a higher standard deviation. According to these results, it seems that MRPAC has taken the strengths of the two approaches yielding a good transient response and smaller steady state error.</p>
</sec>
</sec>
<sec id="s5">
<title>5. Conclusions and Future Work</title>
<p>In this paper we have presented a novel dynamic modeling approach for one joint of a continuum joint robot. We have shown that while not linear in the same parameters as rigid robots, joint accelerations using this model can be shown to be linear in other dynamic and kinematic parameters. This linearity in model parameters can be exploited for system identification, or as we show later in the paper, for adaptive control. Future work in the area of continuum joint dynamic modeling may include system identification on hardware, as well as verification that the proposed model accurately describes the joint&#x00027;s dynamics. While the presented model is only valid for one joint, another straightforward extension to this work would be to derive dynamic models using the same ideas and assumptions (constant curvature assumptions, <italic>u</italic> and <italic>v</italic> parameterization) in order to derive a dynamic model for a robot with many joints and links.</p>
<p>In this paper we have also shown that MPC is an effective control strategy for maintaining robustness to unmodeled forces and/or dynamics. Medium to high fidelity models (such as the one presented in this paper) are promising as a means of reducing these unmodeled disturbances, but take time and effort to develop with possibly very small gains in performance. Even equipped with a perfect model, determining soft robot model kinematic and dynamic parameters accurately is a formidable task and these parameters may also change over time. As such, our presented control strategy, MRPAC, contributes a novel approach to overcoming these challenges by adapting the dynamic model while still leveraging the benefits of MPC.</p>
<p>Specifically, MRPAC inherits two invaluable traits: the adaptive capabilities of MRAC and the robustness of MPC. As a result, MRPAC outperforms both MPC and MRAC on a soft continuum joint, where both parameter mismatch (such as unknown spring and damper coefficients) and structure mismatch (such as unmodeled external forces or offsets) exist. MRPAC successfully compensates for modeling errors to eliminate steady state error while also demonstrating robustness to modeling disturbances.</p>
<p>Future research into MRPAC should include investigation into how to identify a minimal regressor that accurately represents a system&#x00027;s dynamics. Although not discussed in this work, the time taken by MRAC and MRPAC to converge to steady-state adaptive parameters was notably different. For MRPAC it depended heavily on the initial model parameters. The exact differences between the transient response of each control method as well as investigation into the reasons for these differences is left to future work. While our approach has shown promising results, we also did not compare it to other adaptive MPC formulations. Nor do we make the claim that it is the best adaptive MPC formulation. Future work should likely include a comparison between our approach and other existing methods.</p>
<p>Although the problems of accurate soft robot modeling and control remain interesting and unsolved problems, we believe that the dynamic model and adaptive control methods presented in this work represent an important contribution as a new approach to soft robot control.</p>
</sec>
<sec sec-type="data-availability-statement" id="s6">
<title>Data Availability Statement</title>
<p>The data of this article will be available upon request to the corresponding author.</p>
</sec>
<sec id="s7">
<title>Author Contributions</title>
<p>PH and CJ participated in this research as partial fulfillment of their degrees from Brigham Young University. Furthermore, CJ participated in the data collection, problem formulation, and paper writing. MK participated in this research as an advising professor. All authors contributed to the article and approved the submitted version.</p>
</sec>
<sec id="s8">
<title>Conflict of Interest</title>
<p>The authors declare that the research was conducted in the absence of any commercial or financial relationships that could be construed as a potential conflict of interest.</p>
</sec>
</body>
<back>
<ref-list>
<title>References</title>
<ref id="B1">
<citation citation-type="journal"><person-group person-group-type="author"><name><surname>Abdollahi</surname> <given-names>A.</given-names></name> <name><surname>Chowdhary</surname> <given-names>G.</given-names></name></person-group> (<year>2019</year>). <article-title>Adaptive-optimal control under time-varying stochastic uncertainty using past learning</article-title>. <source>Int. J. Adapt. Control Signal Process.</source> <volume>33</volume>, <fpage>1803</fpage>&#x02013;<lpage>1824</lpage>. <pub-id pub-id-type="doi">10.1002/acs.3061</pub-id></citation></ref>
<ref id="B2">
<citation citation-type="journal"><person-group person-group-type="author"><name><surname>Adetola</surname> <given-names>V.</given-names></name> <name><surname>DeHaan</surname> <given-names>D.</given-names></name> <name><surname>Guay</surname> <given-names>M.</given-names></name></person-group> (<year>2009</year>). <article-title>Adaptive model predictive control for constrained nonlinear systems</article-title>. <source>Syst. Control Lett.</source> <volume>58</volume>, <fpage>320</fpage>&#x02013;<lpage>326</lpage>. <pub-id pub-id-type="doi">10.1016/j.sysconle.2008.12.002</pub-id></citation></ref>
<ref id="B3">
<citation citation-type="book"><person-group person-group-type="author"><name><surname>Allen</surname> <given-names>T. F.</given-names></name> <name><surname>Rupert</surname> <given-names>L.</given-names></name> <name><surname>Duggan</surname> <given-names>T. R.</given-names></name> <name><surname>Hein</surname> <given-names>G.</given-names></name> <name><surname>Albert</surname> <given-names>K.</given-names></name></person-group> (<year>2020</year>). <article-title>Closed-form non-singular constant-curvature continuum manipulator kinematics</article-title>, in <source>2020 3rd IEEE International Conference on Soft Robotics</source> (<publisher-loc>New Haven, CT</publisher-loc>: <publisher-name>RoboSoft</publisher-name>), <fpage>410</fpage>&#x02013;<lpage>416</lpage>. <pub-id pub-id-type="doi">10.1109/RoboSoft48309.2020.9116015</pub-id></citation></ref>
<ref id="B4">
<citation citation-type="journal"><person-group person-group-type="author"><name><surname>Best</surname> <given-names>C. M.</given-names></name> <name><surname>Gillespie</surname> <given-names>M. T.</given-names></name> <name><surname>Hyatt</surname> <given-names>P.</given-names></name> <name><surname>Rupert</surname> <given-names>L.</given-names></name> <name><surname>Sherrod</surname> <given-names>V.</given-names></name> <name><surname>Killpack</surname> <given-names>M. D.</given-names></name></person-group> (<year>2016</year>). <article-title>A new soft robot control method: Using model predictive control for a pneumatically actuated humanoid</article-title>. <source>IEEE Robot. Autom. Magaz.</source> <volume>23</volume>, <fpage>75</fpage>&#x02013;<lpage>84</lpage>. <pub-id pub-id-type="doi">10.1109/MRA.2016.2580591</pub-id></citation></ref>
<ref id="B5">
<citation citation-type="book"><person-group person-group-type="author"><name><surname>Bruno</surname> <given-names>S.</given-names></name> <name><surname>Sciavicco</surname> <given-names>L.</given-names></name> <name><surname>Villani</surname> <given-names>L.</given-names></name> <name><surname>Oriolo</surname> <given-names>G.</given-names></name></person-group> (<year>2010</year>). <source>Robotics: Modelling, Planning and Control</source>. <publisher-loc>London</publisher-loc>: <publisher-name>Springer Science &#x00026; Business Media</publisher-name>.</citation></ref>
<ref id="B6">
<citation citation-type="book"><person-group person-group-type="author"><name><surname>Bujarbaruah</surname> <given-names>M.</given-names></name> <name><surname>Zhang</surname> <given-names>X.</given-names></name> <name><surname>Rosolia</surname> <given-names>U.</given-names></name> <name><surname>Borrelli</surname> <given-names>F.</given-names></name></person-group> (<year>2018</year>). <article-title>Adaptive mpc for iterative tasks</article-title>, in <source>2018 IEEE Conference on Decision and Control (CDC)</source> (<publisher-loc>Miami Beach, FL</publisher-loc>), <fpage>6322</fpage>&#x02013;<lpage>6327</lpage>. <pub-id pub-id-type="doi">10.1109/CDC.2018.8618694</pub-id></citation></ref>
<ref id="B7">
<citation citation-type="book"><person-group person-group-type="author"><name><surname>Chowdhary</surname> <given-names>G.</given-names></name> <name><surname>M&#x000FC;hlegg</surname> <given-names>M.</given-names></name> <name><surname>How</surname> <given-names>J. P.</given-names></name> <name><surname>Holzapfel</surname> <given-names>F.</given-names></name></person-group> (<year>2013</year>). <article-title>Concurrent learning adaptive model predictive control</article-title>, in <source>Advances in Aerospace Guidance, Navigation and Control</source>, eds <person-group person-group-type="editor"><name><surname>Chu</surname> <given-names>Q.</given-names></name> <name><surname>Mulder</surname> <given-names>B.</given-names></name> <name><surname>Choukroun</surname> <given-names>D.</given-names></name> <name><surname>van Kampen</surname> <given-names>E. J.</given-names></name> <name><surname>de Visser</surname> <given-names>C.</given-names></name> <name><surname>Looye</surname> <given-names>G.</given-names></name></person-group> (<publisher-loc>Delft; Berlin; Heidelberg</publisher-loc>: <publisher-name>Springer</publisher-name>), <fpage>29</fpage>&#x02013;<lpage>47</lpage>. <pub-id pub-id-type="doi">10.1007/978-3-642-38253-6_3</pub-id></citation></ref>
<ref id="B8">
<citation citation-type="journal"><person-group person-group-type="author"><name><surname>Della Santina</surname> <given-names>C.</given-names></name> <name><surname>Bicchi</surname> <given-names>A.</given-names></name> <name><surname>Rus</surname> <given-names>D.</given-names></name></person-group> (<year>2020a</year>). <article-title>On an improved state parametrization for soft robots with piecewise constant curvature and its use in model based control</article-title>. <source>IEEE Robot. Autom Lett.</source> <volume>5</volume>, <fpage>1001</fpage>&#x02013;<lpage>1008</lpage>. <pub-id pub-id-type="doi">10.1109/LRA.2020.2967269</pub-id></citation></ref>
<ref id="B9">
<citation citation-type="journal"><person-group person-group-type="author"><name><surname>Della Santina</surname> <given-names>C.</given-names></name> <name><surname>Katzschmann</surname> <given-names>R. K.</given-names></name> <name><surname>Bicchi</surname> <given-names>A.</given-names></name> <name><surname>Rus</surname> <given-names>D.</given-names></name></person-group> (<year>2020b</year>). <article-title>Model-based dynamic feedback control of a planar soft robot: trajectory tracking and interaction with the environment</article-title>. <source>Int. J. Robot. Res.</source> <volume>39</volume>, <fpage>490</fpage>&#x02013;<lpage>513</lpage>. <pub-id pub-id-type="doi">10.1177/0278364919897292</pub-id></citation></ref>
<ref id="B10">
<citation citation-type="book"><person-group person-group-type="author"><name><surname>Falkenhahn</surname> <given-names>V.</given-names></name> <name><surname>Mahl</surname> <given-names>T.</given-names></name> <name><surname>Hildebrandt</surname> <given-names>A.</given-names></name> <name><surname>Neumann</surname> <given-names>R.</given-names></name> <name><surname>Sawodny</surname> <given-names>O.</given-names></name></person-group> (<year>2014</year>). <article-title>Dynamic modeling of constant curvature continuum robots using the euler-lagrange formalism</article-title>, in <source>2014 IEEE/RSJ International Conference on Intelligent Robots and Systems</source> (<publisher-loc>Chicago, IL</publisher-loc>), <fpage>2428</fpage>&#x02013;<lpage>2433</lpage>. <pub-id pub-id-type="doi">10.1109/IROS.2014.6942892</pub-id></citation></ref>
<ref id="B11">
<citation citation-type="journal"><person-group person-group-type="author"><name><surname>Falkenhahn</surname> <given-names>V.</given-names></name> <name><surname>Mahl</surname> <given-names>T.</given-names></name> <name><surname>Hildebrandt</surname> <given-names>A.</given-names></name> <name><surname>Neumann</surname> <given-names>R.</given-names></name> <name><surname>Sawodny</surname> <given-names>O.</given-names></name></person-group> (<year>2015</year>). <article-title>Dynamic modeling of bellows-actuated continuum robots using the euler&#x02013;lagrange formalism</article-title>. <source>IEEE Trans. Robot.</source> <volume>31</volume>, <fpage>1483</fpage>&#x02013;<lpage>1496</lpage>. <pub-id pub-id-type="doi">10.1109/TRO.2015.2496826</pub-id></citation></ref>
<ref id="B12">
<citation citation-type="book"><person-group person-group-type="author"><name><surname>Giri</surname> <given-names>N.</given-names></name> <name><surname>Walker</surname> <given-names>I. D.</given-names></name></person-group> (<year>2011</year>). <article-title>Three module lumped element model of a continuum arm section</article-title>, in <source>2011 IEEE/RSJ International Conference on Intelligent Robots and Systems</source> (<publisher-loc>San Francisco, CA</publisher-loc>), <fpage>4060</fpage>&#x02013;<lpage>4065</lpage>. <pub-id pub-id-type="doi">10.1109/IROS.2011.6094909</pub-id></citation></ref>
<ref id="B13">
<citation citation-type="book"><person-group person-group-type="author"><name><surname>Godage</surname> <given-names>I. S.</given-names></name> <name><surname>Branson</surname> <given-names>D. T.</given-names></name> <name><surname>Guglielmino</surname> <given-names>E.</given-names></name> <name><surname>Medrano-Cerda</surname> <given-names>G. A.</given-names></name> <name><surname>Caldwell</surname> <given-names>D. G.</given-names></name></person-group> (<year>2011</year>). <article-title>Shape function-based kinematics and dynamics for variable length continuum robotic arms</article-title>, in <source>IEEE International Conference on Robotics and Automation</source> (<publisher-loc>Shanghai</publisher-loc>), <fpage>452</fpage>&#x02013;<lpage>457</lpage>. <pub-id pub-id-type="doi">10.1109/ICRA.2011.5979607</pub-id></citation></ref>
<ref id="B14">
<citation citation-type="journal"><person-group person-group-type="author"><name><surname>Hyatt</surname> <given-names>P.</given-names></name> <name><surname>Killpack</surname> <given-names>M. D.</given-names></name></person-group> (<year>2020</year>). <article-title>Real-time nonlinear model predictive control of robots using a graphics processing unit</article-title>. <source>IEEE Robot. Autom. Lett.</source> <volume>5</volume>, <fpage>1468</fpage>&#x02013;<lpage>1475</lpage>. <pub-id pub-id-type="doi">10.1109/LRA.2020.2965393</pub-id></citation></ref>
<ref id="B15">
<citation citation-type="journal"><person-group person-group-type="author"><name><surname>Hyatt</surname> <given-names>P.</given-names></name> <name><surname>Williams</surname> <given-names>C. S.</given-names></name> <name><surname>Killpack</surname> <given-names>M. D.</given-names></name></person-group> (<year>2020</year>). <article-title>Parameterized and gpu-parallelized real-time model predictive control for high degree of freedom robots</article-title>. <source>arXiv preprint</source> arXiv:2001.04931.</citation></ref>
<ref id="B16">
<citation citation-type="journal"><person-group person-group-type="author"><name><surname>Hyatt</surname> <given-names>P.</given-names></name> <name><surname>Wingate</surname> <given-names>D.</given-names></name> <name><surname>Killpack</surname> <given-names>M. D.</given-names></name></person-group> (<year>2019</year>). <article-title>Model-based control of soft actuators using learned non-linear discrete-time models</article-title>. <source>Front. Robot. AI</source> <volume>6</volume>:<fpage>22</fpage>. <pub-id pub-id-type="doi">10.3389/frobt.2019.00022</pub-id></citation></ref>
<ref id="B17">
<citation citation-type="book"><person-group person-group-type="author"><name><surname>Kang</surname> <given-names>R.</given-names></name> <name><surname>Kazakidi</surname> <given-names>A.</given-names></name> <name><surname>Guglielmino</surname> <given-names>E.</given-names></name> <name><surname>Branson</surname> <given-names>D. T.</given-names></name> <name><surname>Tsakiris</surname> <given-names>D. P.</given-names></name> <name><surname>Ekaterinaris</surname> <given-names>J. A.</given-names></name> <etal/></person-group>. (<year>2011</year>). <article-title>Dynamic model of a hyper-redundant, octopus-like manipulator for underwater applications</article-title>, in <source>2011 IEEE/RSJ International Conference on Intelligent Robots and Systems</source> (<publisher-loc>San Francisco, CA</publisher-loc>), <fpage>4054</fpage>&#x02013;<lpage>4059</lpage>. <pub-id pub-id-type="doi">10.1109/IROS.2011.6094468</pub-id></citation></ref>
<ref id="B18">
<citation citation-type="journal"><person-group person-group-type="author"><name><surname>Khalil</surname> <given-names>W.</given-names></name> <name><surname>Member</surname> <given-names>S.</given-names></name> <name><surname>Gallot</surname> <given-names>G.</given-names></name></person-group> (<year>2007</year>). <article-title>Dynamic modeling and simulation of a 3-D serial Eel-Like robot</article-title>. <source>IEEE Trans. Syst. Man Cybern. Part C</source> <volume>37</volume>, <fpage>1259</fpage>&#x02013;<lpage>1268</lpage>. <pub-id pub-id-type="doi">10.1109/TSMCC.2007.905831</pub-id></citation></ref>
<ref id="B19">
<citation citation-type="book"><person-group person-group-type="author"><name><surname>Kim</surname> <given-names>J.-S.</given-names></name></person-group> (<year>2010</year>). <article-title>Recent advances in adaptive mpc</article-title>, in <source>ICCAS 2010</source> (<publisher-loc>Gyeonggi-do</publisher-loc>), <fpage>218</fpage>&#x02013;<lpage>222</lpage>. <pub-id pub-id-type="doi">10.1109/ICCAS.2010.5669892</pub-id></citation></ref>
<ref id="B20">
<citation citation-type="book"><person-group person-group-type="author"><name><surname>Lavretsky</surname> <given-names>E.</given-names></name> <name><surname>Wise</surname> <given-names>K. A.</given-names></name></person-group> (<year>2013</year>) <article-title>Robust adaptive control</article-title>, in <source>Robust and Adaptive Control. Advanced Textbooks in Control Signal Processing</source> (<publisher-loc>London</publisher-loc>: <publisher-name>Springer</publisher-name>). <pub-id pub-id-type="doi">10.1007/978-1-4471-4396-3_11</pub-id></citation></ref>
<ref id="B21">
<citation citation-type="journal"><person-group person-group-type="author"><name><surname>Meurer</surname> <given-names>A.</given-names></name> <name><surname>Smith</surname> <given-names>C. P.</given-names></name> <name><surname>Paprocki</surname> <given-names>M.</given-names></name> <name><surname>&#x0010C;ert&#x000ED;k</surname> <given-names>O.</given-names></name> <name><surname>Kirpichev</surname> <given-names>S. B.</given-names></name> <name><surname>Rocklin</surname> <given-names>M.</given-names></name> <etal/></person-group>. (<year>2017</year>). <article-title>Sympy: symbolic computing in python</article-title>. <source>PeerJ Comput. Sci.</source> <volume>3</volume>:<fpage>e103</fpage>. <pub-id pub-id-type="doi">10.7717/peerj-cs.103</pub-id></citation></ref>
<ref id="B22">
<citation citation-type="book"><person-group person-group-type="author"><name><surname>Mochiyama</surname> <given-names>H.</given-names></name> <name><surname>Suzuki</surname> <given-names>T.</given-names></name></person-group> (<year>2002</year>). <article-title>Dynamical modelling of a hyper-flexible manipulator</article-title>, in <source>Proceedings of the 41st SICE Annual Conference. SICE 2002.</source>, Vol. <volume>3</volume> (<publisher-loc>Osaka</publisher-loc>), <fpage>1505</fpage>&#x02013;<lpage>1510</lpage>. <pub-id pub-id-type="doi">10.1109/SICE.2002.1196530</pub-id></citation></ref>
<ref id="B23">
<citation citation-type="book"><person-group person-group-type="author"><name><surname>Mochiyama</surname> <given-names>H.</given-names></name> <name><surname>Suzuki</surname> <given-names>T.</given-names></name></person-group> (<year>2003</year>). <article-title>Kinematics and dynamics of a cable-like hyper-flexible manipulator</article-title>, in <source>2003 IEEE International Conference on Robotics and Automation (Cat. No. 03CH37422)</source>, Vol. <volume>3</volume> (<publisher-loc>Taipei</publisher-loc>), <fpage>3672</fpage>&#x02013;<lpage>3677</lpage>. <pub-id pub-id-type="doi">10.1109/ROBOT.2003.1242160</pub-id></citation></ref>
<ref id="B24">
<citation citation-type="book"><person-group person-group-type="author"><name><surname>Pereida</surname> <given-names>K.</given-names></name> <name><surname>Schoellig</surname> <given-names>A. P.</given-names></name></person-group> (<year>2018</year>). <article-title>Adaptive model predictive control for high-accuracy trajectory tracking in changing conditions</article-title>, in <source>2018 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)</source> (<publisher-loc>Madrid</publisher-loc>), <fpage>7831</fpage>&#x02013;<lpage>7837</lpage>. <pub-id pub-id-type="doi">10.1109/IROS.2018.8594267</pub-id></citation></ref>
<ref id="B25">
<citation citation-type="journal"><person-group person-group-type="author"><name><surname>Renda</surname> <given-names>F.</given-names></name> <name><surname>Cianchetti</surname> <given-names>M.</given-names></name> <name><surname>Giorelli</surname> <given-names>M.</given-names></name> <name><surname>Arienti</surname> <given-names>A.</given-names></name> <name><surname>Laschi</surname> <given-names>C.</given-names></name></person-group> (<year>2012</year>). <article-title>A 3D steady-state model of a tendon-driven continuum soft manipulator inspired by the octopus arm</article-title>. <source>Bioinspir. Biomimet.</source> <volume>7</volume>:<fpage>025006</fpage>. <pub-id pub-id-type="doi">10.1088/1748-3182/7/2/025006</pub-id><pub-id pub-id-type="pmid">22617222</pub-id></citation></ref>
<ref id="B26">
<citation citation-type="journal"><person-group person-group-type="author"><name><surname>Shepherd</surname> <given-names>R. F.</given-names></name> <name><surname>Ilievski</surname> <given-names>F.</given-names></name> <name><surname>Choi</surname> <given-names>W.</given-names></name> <name><surname>Morin</surname> <given-names>S. A.</given-names></name> <name><surname>Stokes</surname> <given-names>A. A.</given-names></name> <name><surname>Mazzeo</surname> <given-names>A. D.</given-names></name> <etal/></person-group>. (<year>2011</year>). <article-title>Multigait soft robot</article-title>. <source>Proc. Natl. Acad. Sci.U.S.A.</source> <volume>108</volume>, <fpage>20400</fpage>&#x02013;<lpage>20403</lpage>. <pub-id pub-id-type="doi">10.1073/pnas.1116564108</pub-id><pub-id pub-id-type="pmid">22123978</pub-id></citation></ref>
<ref id="B27">
<citation citation-type="journal"><person-group person-group-type="author"><name><surname>Slotine</surname> <given-names>J. J. E.</given-names></name> <name><surname>Li</surname> <given-names>W.</given-names></name></person-group> (<year>1987</year>). <article-title>on the adaptive control of robot manipulators</article-title>. <source>Int. J. Robot. Res.</source> <volume>6</volume>, <fpage>49</fpage>&#x02013;<lpage>59</lpage>.</citation></ref>
<ref id="B28">
<citation citation-type="journal"><person-group person-group-type="author"><name><surname>Stellato</surname> <given-names>B.</given-names></name> <name><surname>Banjac</surname> <given-names>G.</given-names></name> <name><surname>Goulart</surname> <given-names>P.</given-names></name> <name><surname>Bemporad</surname> <given-names>A.</given-names></name> <name><surname>Boyd</surname> <given-names>S.</given-names></name></person-group> (<year>2017</year>). <article-title>OSQP: an operator splitting solver for quadratic programs</article-title>. <source>ArXiv e-prints</source>.</citation></ref>
<ref id="B29">
<citation citation-type="book"><person-group person-group-type="author"><name><surname>Tatlicioglu</surname> <given-names>E.</given-names></name> <name><surname>Walker</surname> <given-names>I. D.</given-names></name> <name><surname>Dawson</surname> <given-names>D. M.</given-names></name></person-group> (<year>2007</year>). <article-title>New dynamic models for planar extensible continuum robot manipulators</article-title>, in <source>2007 IEEE/RSJ International Conference on Intelligent Robots and Systems</source> (<publisher-loc>San Diego, CA</publisher-loc>), <fpage>1485</fpage>&#x02013;<lpage>1490</lpage>. <pub-id pub-id-type="doi">10.1109/IROS.2007.4399334</pub-id></citation></ref>
<ref id="B30">
<citation citation-type="book"><person-group person-group-type="author"><name><surname>Terry</surname> <given-names>J. S.</given-names></name> <name><surname>Whitaker</surname> <given-names>J.</given-names></name> <name><surname>Beard</surname> <given-names>R. W.</given-names></name> <name><surname>Killpack</surname> <given-names>M. D.</given-names></name></person-group> (<year>2019</year>). <article-title>Adaptive control of large-scale soft robot manipulators with unknown payloads</article-title>, in <source>Proceedings of the ASME 2019 Dynamic Systems and Control Conference</source>, Vol. <volume>3</volume> (<publisher-loc>Park City, UT</publisher-loc>: <publisher-name>ASME</publisher-name>). <pub-id pub-id-type="doi">10.1115/DSCC2019-9037</pub-id></citation></ref>
<ref id="B31">
<citation citation-type="book"><person-group person-group-type="author"><name><surname>Thuruthel</surname> <given-names>T.</given-names></name> <name><surname>Falotico</surname> <given-names>E.</given-names></name> <name><surname>Cianchetti</surname> <given-names>M.</given-names></name> <name><surname>Renda</surname> <given-names>F.</given-names></name> <name><surname>Laschi</surname> <given-names>C.</given-names></name></person-group> (<year>2016</year>). <article-title>Learning global inverse statics solution for a redundant soft robot)</article-title>, in <source>Proceedings of the 13th International Conference on Informatics in Control, Automation and Robotics</source> (<publisher-loc>Lisbon</publisher-loc>), <fpage>303</fpage>&#x02013;<lpage>310</lpage>. <pub-id pub-id-type="doi">10.5220/0005979403030310</pub-id></citation></ref>
<ref id="B32">
<citation citation-type="journal"><person-group person-group-type="author"><name><surname>Thuruthel</surname> <given-names>T. G.</given-names></name> <name><surname>Falotico</surname> <given-names>E.</given-names></name> <name><surname>Renda</surname> <given-names>F.</given-names></name> <name><surname>Laschi</surname> <given-names>C.</given-names></name></person-group> (<year>2017</year>). <article-title>Learning dynamic models for open loop predictive control of soft robotic manipulators</article-title>. <source>Bioinspir. Biomimet.</source> <volume>12</volume>:<fpage>066003</fpage>. <pub-id pub-id-type="doi">10.1088/1748-3190/aa839f</pub-id><pub-id pub-id-type="pmid">28767049</pub-id></citation></ref>
<ref id="B33">
<citation citation-type="journal"><person-group person-group-type="author"><name><surname>Tolley</surname> <given-names>M. T.</given-names></name> <name><surname>Shepherd</surname> <given-names>R. F.</given-names></name> <name><surname>Mosadegh</surname> <given-names>B.</given-names></name> <name><surname>Galloway</surname> <given-names>K. C.</given-names></name> <name><surname>Wehner</surname> <given-names>M.</given-names></name> <name><surname>Karpelson</surname> <given-names>M.</given-names></name> <etal/></person-group>. (<year>2014</year>). <article-title>A resilient, untethered soft robot</article-title>. <source>Soft Robot.</source> <volume>1</volume>, <fpage>213</fpage>&#x02013;<lpage>223</lpage>. <pub-id pub-id-type="doi">10.1089/soro.2014.0008</pub-id></citation></ref>
<ref id="B34">
<citation citation-type="journal"><person-group person-group-type="author"><name><surname>Trumi&#x00107;</surname> <given-names>M.</given-names></name> <name><surname>Jovanovi&#x00107;</surname> <given-names>K.</given-names></name> <name><surname>Fagiolini</surname> <given-names>A.</given-names></name></person-group> (<year>2020</year>). <article-title>Decoupled nonlinear adaptive control of position and stiffness for pneumatic soft robots</article-title>. <source>Int. J. Robot. Res.</source> <pub-id pub-id-type="doi">10.1177/0278364920903787</pub-id></citation></ref>
<ref id="B35">
<citation citation-type="journal"><person-group person-group-type="author"><name><surname>Walker</surname> <given-names>I. D.</given-names></name></person-group> (<year>2013</year>). <article-title>Continuous backbone &#x0201C;Continuum&#x0201D; robot manipulators</article-title>. <source>ISRN Robot.</source> <volume>2013</volume>, <fpage>1</fpage>&#x02013;<lpage>19</lpage>. <pub-id pub-id-type="doi">10.5402/2013/726506</pub-id></citation></ref>
<ref id="B36">
<citation citation-type="book"><person-group person-group-type="author"><name><surname>Zhang</surname> <given-names>H.</given-names></name> <name><surname>Cao</surname> <given-names>R.</given-names></name> <name><surname>Zilberstein</surname> <given-names>S.</given-names></name> <name><surname>Wu</surname> <given-names>F.</given-names></name> <name><surname>Chen</surname> <given-names>X.</given-names></name></person-group> (<year>2017</year>). <article-title>Toward effective soft robot control via reinforcement learning</article-title>, in <source>Intelligent Robotics and Applications. ICIRA 2017. Lecture Notes in Computer Science</source>, Vol. <volume>10462</volume>, eds <person-group person-group-type="editor"><name><surname>Huang</surname> <given-names>Y.</given-names></name> <name><surname>Wu</surname> <given-names>H.</given-names></name> <name><surname>Liu</surname> <given-names>H.</given-names></name> <name><surname>Yin</surname> <given-names>Z.</given-names></name></person-group> (<publisher-loc>Wuhan; Cham</publisher-loc>: <publisher-name>Springer</publisher-name>). <pub-id pub-id-type="doi">10.1007/978-3-319-65289-4_17</pub-id></citation></ref>
<ref id="B37">
<citation citation-type="journal"><person-group person-group-type="author"><name><surname>Zhang</surname> <given-names>K.</given-names></name> <name><surname>Shi</surname> <given-names>Y.</given-names></name></person-group> (<year>2020</year>). <article-title>Adaptive model predictive control for a class of constrained linear systems with parametric uncertainties</article-title>. <source>Automatica</source> <volume>117</volume>:<fpage>108974</fpage>. <pub-id pub-id-type="doi">10.1016/j.automatica.2020.108974</pub-id></citation></ref>
<ref id="B38">
<citation citation-type="book"><person-group person-group-type="author"><name><surname>Zheng</surname> <given-names>T.</given-names></name> <name><surname>Branson</surname> <given-names>D. T.</given-names></name> <name><surname>Kang</surname> <given-names>R.</given-names></name> <name><surname>Cianchetti</surname> <given-names>M.</given-names></name> <name><surname>Guglielmino</surname> <given-names>E.</given-names></name> <name><surname>Follador</surname> <given-names>M.</given-names></name> <etal/></person-group>. (<year>2012</year>). <article-title>Dynamic continuum arm model for use with underwater robotic manipulators inspired by <italic>Octopus vulgaris</italic></article-title>, in <source>2012 IEEE International Conference on Robotics and Automation</source> (<publisher-loc>Saint Paul, MN</publisher-loc>), <fpage>5289</fpage>&#x02013;<lpage>5294</lpage>. <pub-id pub-id-type="doi">10.1109/ICRA.2012.6224685</pub-id></citation></ref>
</ref-list>
<fn-group>
<fn fn-type="financial-disclosure"><p><bold>Funding.</bold> This material is based upon work supported by the National Science Foundation under Grant no. 1935312.</p>
</fn>
</fn-group>
</back>
</article>