<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD Journal Publishing DTD v2.3 20070202//EN" "journalpublishing.dtd">
<article article-type="research-article" dtd-version="2.3" xml:lang="EN" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink">
<front>
<journal-meta>
<journal-id journal-id-type="publisher-id">Front. Mech. Eng</journal-id>
<journal-title>Frontiers in Mechanical Engineering</journal-title>
<abbrev-journal-title abbrev-type="pubmed">Front. Mech. Eng</abbrev-journal-title>
<issn pub-type="epub">2297-3079</issn>
<publisher>
<publisher-name>Frontiers Media S.A.</publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id pub-id-type="publisher-id">1225828</article-id>
<article-id pub-id-type="doi">10.3389/fmech.2023.1225828</article-id>
<article-categories>
<subj-group subj-group-type="heading">
<subject>Mechanical Engineering</subject>
<subj-group>
<subject>Original Research</subject>
</subj-group>
</subj-group>
</article-categories>
<title-group>
<article-title>Force-controlled pose optimization and trajectory planning for chained Stewart platforms</article-title>
<alt-title alt-title-type="left-running-head">Beach et al.</alt-title>
<alt-title alt-title-type="right-running-head">
<ext-link ext-link-type="uri" xlink:href="https://doi.org/10.3389/fmech.2023.1225828">10.3389/fmech.2023.1225828</ext-link>
</alt-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname>Beach</surname>
<given-names>Benjamin</given-names>
</name>
<xref ref-type="aff" rid="aff1">
<sup>1</sup>
</xref>
<uri xlink:href="https://loop.frontiersin.org/people/2469430/overview"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Chapin</surname>
<given-names>William</given-names>
</name>
<xref ref-type="aff" rid="aff2">
<sup>2</sup>
</xref>
<uri xlink:href="https://loop.frontiersin.org/people/1197470/overview"/>
</contrib>
<contrib contrib-type="author" corresp="yes">
<name>
<surname>Chapin</surname>
<given-names>Samantha</given-names>
</name>
<xref ref-type="aff" rid="aff2">
<sup>2</sup>
</xref>
<xref ref-type="corresp" rid="c001">&#x2a;</xref>
<uri xlink:href="https://loop.frontiersin.org/people/1218796/overview"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Hildebrand</surname>
<given-names>Robert</given-names>
</name>
<xref ref-type="aff" rid="aff1">
<sup>1</sup>
</xref>
<uri xlink:href="https://loop.frontiersin.org/people/1593863/overview"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname>Komendera</surname>
<given-names>Erik</given-names>
</name>
<xref ref-type="aff" rid="aff2">
<sup>2</sup>
</xref>
<uri xlink:href="https://loop.frontiersin.org/people/1666008/overview"/>
</contrib>
</contrib-group>
<aff id="aff1">
<sup>1</sup>
<institution>Grado Department of Industrial and Systems Engineering</institution>, <institution>Virginia Tech</institution>, <addr-line>Blacksburg</addr-line>, <addr-line>VA</addr-line>, <country>United States</country>
</aff>
<aff id="aff2">
<sup>2</sup>
<institution>FASER Lab</institution>, <institution>Virginia Tech</institution>, <institution>Mechanical Engineering</institution>, <addr-line>Blacksburg</addr-line>, <addr-line>VA</addr-line>, <country>United States</country>
</aff>
<author-notes>
<fn fn-type="edited-by">
<p>
<bold>Edited by:</bold> <ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/699432/overview">Cl&#xe9;ment Gosselin</ext-link>, Laval University, Canada</p>
</fn>
<fn fn-type="edited-by">
<p>
<bold>Reviewed by:</bold> <ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/136921/overview">Yan Jin</ext-link>, Queen&#x2019;s University Belfast, United Kingdom</p>
<p>
<ext-link ext-link-type="uri" xlink:href="https://loop.frontiersin.org/people/1295443/overview">Gordon Roesler</ext-link>, Robots in Space LLC, United States</p>
</fn>
<corresp id="c001">&#x2a;Correspondence: Samantha Chapin, <email>sglassner@vt.edu</email>
</corresp>
</author-notes>
<pub-date pub-type="epub">
<day>24</day>
<month>11</month>
<year>2023</year>
</pub-date>
<pub-date pub-type="collection">
<year>2023</year>
</pub-date>
<volume>9</volume>
<elocation-id>1225828</elocation-id>
<history>
<date date-type="received">
<day>19</day>
<month>05</month>
<year>2023</year>
</date>
<date date-type="accepted">
<day>25</day>
<month>10</month>
<year>2023</year>
</date>
</history>
<permissions>
<copyright-statement>Copyright &#xa9; 2023 Beach, Chapin, Chapin, Hildebrand and Komendera.</copyright-statement>
<copyright-year>2023</copyright-year>
<copyright-holder>Beach, Chapin, Chapin, Hildebrand and Komendera</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>
<bold>Introduction:</bold> We study optimization methods for poses and movements of chained Stewart platforms (SPs) that we call an &#x201c;Assembler&#x201d; Robot. These chained SPs are parallel mechanisms that are stronger, stiffer, and more precise, on average, than their serial counterparts at the cost of a smaller range of motion. By linking these units in a series, their individual limitations are overcome while maintaining truss-like rigidity. This opens up potential uses in various applications, especially in complex space missions in conjunction with other robots.</p>
<p>
<bold>Methods:</bold> To enhance the efficiency and longevity of the Assembler Robot, we developed algorithms and optimization models. The main goal of these methodologies is to efficiently decide on favorable positions and movements that reduce force loads on the robot, consequently minimizing wear.</p>
<p>
<bold>Results:</bold> The optimized maneuvers of the interior plates of the Assembler result in more evenly distributed load forces through the legs of each constituent SP. This optimization allows for a larger workspace and a greater overall payload capacity. Our computations primarily focus on assemblers with four chained SPs.</p>
<p>
<bold>Discussion:</bold> Although our study primarily revolves around assemblers with four chained SPs, our methods are versatile and can be applied to an arbitrary number of SPs. Furthermore, these methodologies can be extended to general over-actuated truss-like robot architectures. The Assembler, designed to function collaboratively with several other robots, holds promise for a variety of space missions.</p>
</abstract>
<kwd-group>
<kwd>optimization</kwd>
<kwd>nonlinear programming</kwd>
<kwd>robotics</kwd>
<kwd>kinematics</kwd>
<kwd>Stewart platform</kwd>
<kwd>modular</kwd>
<kwd>forces</kwd>
</kwd-group>
<contract-num rid="cn001">FA9550-21-0107</contract-num>
<contract-sponsor id="cn001">Air Force Office of Scientific Research<named-content content-type="fundref-id">10.13039/100000181</named-content>
</contract-sponsor>
<custom-meta-wrap>
<custom-meta>
<meta-name>section-at-acceptance</meta-name>
<meta-value>Digital Manufacturing</meta-value>
</custom-meta>
</custom-meta-wrap>
</article-meta>
</front>
<body>
<sec id="s1">
<title>1 Introduction</title>
<p>Robotic space missions are complex, expensive endeavors, often resulting in multiple mission extensions or scope expansions to maximize the robotic system&#x2019;s potential over its useful lifespan. Ensuring that a system is precise and robust enough to accomplish its mission in addition to unknown future mission requirements drives up development and deployment costs significantly, especially due to one-off hardware design. The overall cost of system deployment can be driven down by the mass production of smaller, modular robots that can join together to enhance their capabilities. Specifically, we seek to use parallel mechanisms called SPs, which are typically stiffer, more precise, and more robust to vibration than their serial counterparts of similar quality, at the cost of a smaller range of motion (<xref ref-type="bibr" rid="B23">Majid et al., 2000</xref>). Linking these units in a series overcomes their individual limitations and yet maintains their trusslike rigidity, enabling their potential use for various purposes. We designate such a configuration as an &#x201c;Assembler&#x201d; robot. The origin of this idea came from previous research at NASA Langley Research Center which has also continued development in parallel with different physical Assembler hardware (<xref ref-type="bibr" rid="B7">Cooper et al., 2022</xref>; <xref ref-type="bibr" rid="B26">Moser and Cooper, 2019</xref>). While the number of SPs in a stack is arbitrary, the experimentation discussed in this article concerns stacks of four. A stack of SPs has the property that it is over-actuated, which implies that there is a continuum of internal plate poses for any pair of end plate poses. This allows internal plate poses be chosen to satisfy constraints and optimize a variety of metrics. The objective of this research is to maneuver the interior plates of the Assembler such that the load forces distributed through the legs of each constituent SP are balanced, allowing for a larger workspace and a greater overall payload capacity.</p>
<p>We propose to use these chained SPs as an alternative to robot serial arms, for eventual use in fully automated robot assembly on the Moon or in space. Each SP consists of a pair of plates with six legs in between. The structure is actuated simply by extending or contracting the linear actuator legs. An example of the structure is shown in <xref ref-type="fig" rid="F1">Figure 1</xref>.</p>
<fig id="F1" position="float">
<label>FIGURE 1</label>
<caption>
<p>Anatomy of an Assembler Robot. The robot is comprised of four chained six degrees of freedom (DOF) SPs, giving it a larger range of motion and total 24 DOF. Each SP is comprised of six linear actuators mounted between two plates, since the stacked SPs share plates the Assembler has a total of 5 plates that serve as the upper and lower boundaries of each SP. The legs are connected via ball joints that are mounted below and above each plate. Thus, the leg connections do not lie in the same plane as the plates.</p>
</caption>
<graphic xlink:href="fmech-09-1225828-g001.tif"/>
</fig>
<p>Stacks of SPs, like the Assembler, combine the strength and stability of truss-like SPs, with the reach that serially linked robots such as Universal Robotics UR-10 can provide without the mass inherent to large actuators responsible for driving serial mechanisms. The construction of an SP of the type presented in this paper - six linear actuators separating two parallel plates presents precision and extreme stiffness (<xref ref-type="bibr" rid="B21">Li et al., 2002</xref>) as linear actuators cannot be easily backdriven (and hold their positions with no power applied). Position holding lends itself to the optional application of the SP-Stack as semi-permanent long-term reconfigurable support truss structures. The high stiffness also means higher fundamental frequency and lower oscillation amplitude (i.e., cantilevering is less of an issue). The stacking of the individual platforms to make a larger robot extends the reach by multiplying the workspace configurations, yielding a 24 total DOF robot (or more, if necessary). This overactuation opens up optimization, as near-infinite internal configurations can yield the same end effector pose. In addition, the extreme overactuation present in the system allows for redundancy. If any individual actuator fails, the robot is capable of compensating for the failure, increasing the robustness of the system. The methods shown in this paper are applicable to a range of similarly configured truss-like robots, not limited to this particular 24DOF configuration. SP mechanisms are not perfect however, having poor passive compliance, limited velocity, and limited angular range of motion. The poor passive compliance can be compensated for with active compliance, but restricted angular range of motion is a limiting factor that must be considered in choosing applications for this system, though it can be partially compensated for with a spherical wrist at the end effector, or an off-axis turntable system at the base.</p>
<p>We propose an optimization approach to reduce structural forces in poses and throughout motion. The complexity of the problem stems from the serial combination of parallel kinematic structures (each SP), which can render difficult the problem of even finding feasible poses for a given end effector position and load. From an optimization perspective, the primary source of complexity stems from nonlinearity and nonconvexity of the feasible space, resulting from the trigonometric functions required to model the physical kinematic transformations throughout the structure, along with the many other bilinear and quadratic terms. These include coordinate distance computations to determine leg lengths, wrench and force computations, and coordinate transformations after the computation of the transformation matrices.</p>
<p>There have been many works in the literature exploring design optimization of individual SPs, including (<xref ref-type="bibr" rid="B6">Chen et al., 2007</xref>; <xref ref-type="bibr" rid="B2">Bangjun et al., 2012</xref>; <xref ref-type="bibr" rid="B20">Lei and Xiaolin, 2013</xref>; <xref ref-type="bibr" rid="B36">Toz and Kucuk, 2013</xref>; <xref ref-type="bibr" rid="B42">Xie et al., 2017</xref>; <xref ref-type="bibr" rid="B34">Sun and Lian, 2018</xref>; <xref ref-type="bibr" rid="B31">R&#xed;os et al., 2021</xref>). These works typically optimize the design of a single SP with respect to parameters such as stiffness, manipulability, and accuracy. In particular, (<xref ref-type="bibr" rid="B44">Zhang, 2005</xref>), designs and implements a variant of SP with passive control of leg forces. However, we found the literature on stacked SPs to be incredibly sparse, and were unable to find any prior works optimizing poses for stacked SP chains based on leg forces. There is a related field studying more general actuated truss structures, such as in (<xref ref-type="bibr" rid="B25">Miura and Furuya, 1988</xref>; <xref ref-type="bibr" rid="B9">Dorsey et al., 1992</xref>; <xref ref-type="bibr" rid="B43">Yokoi et al., 1992</xref>; <xref ref-type="bibr" rid="B41">Williams, 1995</xref>). Among other structures, these works study variable geometry truss (VGT) structures, which are similar to SP&#x2019;s, except that each plate is replaced with a triangle of three actuated legs, and the legs between &#x2018;plates&#x2019; are not actuated. (<xref ref-type="bibr" rid="B43">Yokoi et al., 1992</xref>; <xref ref-type="bibr" rid="B41">Williams, 1995</xref>) also studied a version of an SP where the plates are replaced with triangles of stiff legs. However, none of these works study the problem of controlling forces while maneuvering these devices.</p>
<p>For trajectory planning, state-of-the-art approaches include the random tree search-based method RRT (<xref ref-type="bibr" rid="B18">LaValle, 1998</xref>) and variants RRT-Connect (<xref ref-type="bibr" rid="B17">Kuffner and LaValle, 2000</xref>), RRT&#x2a; (<xref ref-type="bibr" rid="B16">Karaman and Frazzoli, 2011</xref>), RRT&#x2a;-SMART (<xref ref-type="bibr" rid="B15">Islam et al., 2012</xref>), among others. Other state-of-the-art approaches include CHOMP (<xref ref-type="bibr" rid="B45">Zucker et al., 2013</xref>), TrajOpt (<xref ref-type="bibr" rid="B33">Schulman et al., 2014</xref>), and ROMP (<xref ref-type="bibr" rid="B30">Quintero-Pena et al., 2021</xref>). A number of works have explored trajectory planning for individual SP&#x2019;s, including (<xref ref-type="bibr" rid="B28">Nguyen and Antrazi, 1990</xref>; <xref ref-type="bibr" rid="B27">Nguyen et al., 1991</xref>; <xref ref-type="bibr" rid="B8">Cortes and Simeon, 2003</xref>; <xref ref-type="bibr" rid="B12">Grosch et al., 2010</xref>; <xref ref-type="bibr" rid="B40">Wang et al., 2015</xref>; <xref ref-type="bibr" rid="B11">Ernandis, 2021</xref>). Several such works, such as (<xref ref-type="bibr" rid="B8">Cortes and Simeon, 2003</xref>; <xref ref-type="bibr" rid="B11">Ernandis, 2021</xref>), rely on variants of RRT. In one example (<xref ref-type="bibr" rid="B7">Cooper et al., 2022</xref>; <xref ref-type="bibr" rid="B8">Cortes and Simeon, 2003</xref>), even applies this method to an obstacle-avoiding trajectory planning problem for a 4-stack of SPs. (<xref ref-type="bibr" rid="B1">Balaban et al., 2019</xref>). performs stiffness optimization on a 2-D version of the stacked platform structure. Aside from RRT variants, some obstacle-avoiding trajectory planning approaches applied primarily to simple structures such as serial arms are introduced in (<xref ref-type="bibr" rid="B45">Zucker et al., 2013</xref>; <xref ref-type="bibr" rid="B33">Schulman et al., 2014</xref>; <xref ref-type="bibr" rid="B29">Osa et al., 2017</xref>). Prior works involving trust-region based approaches for trajectory planning, as used in this work, include (<xref ref-type="bibr" rid="B10">Dragan and Srinivasa, 2014</xref>; <xref ref-type="bibr" rid="B14">Ichnowski et al., 2020</xref>; <xref ref-type="bibr" rid="B30">Quintero-Pena et al., 2021</xref>) for serial arms, and (<xref ref-type="bibr" rid="B35">Szynkiewicz and B&#x142;aszczyk, 2011</xref>; <xref ref-type="bibr" rid="B32">Santos and da Silva, 2017</xref>; <xref ref-type="bibr" rid="B38">Volz and Graichen, 2018</xref>) for more difficult robots involving closed kinematic chains.</p>
<p>We were unable to find any works in the literature performing any sort of force-controlled trajectory planning of stacked SPs in three dimensions, with very few performing any sort of trajectory planning for stacked SPs. Such optimization can significantly improve maximum leg forces throughout the structure, thereby increasing the workspace of an SP under large loads.</p>
<sec id="s1-1">
<title>1.1 Contributions</title>
<sec id="s1-1-1">
<title>1.1.1 Pose Optimization</title>
<p>We present an optimization approach to solve the inverse kinematic pose optimization problem. We model the problem as a quadratically constrained quadratic program (QCQP). We are not aware of prior models for chained Stewart platforms, though for a single SP, (<xref ref-type="bibr" rid="B3">Bingul and Karah, 2012</xref>), gives a dynamic model. We propose two heuristics to generate initial poses with a given target end effector position and load: (1) a spline-based heuristic and (2) a simple closed-form initialization approach for which each SP has the same pose. Note that these heuristics might fail to generate a feasible pose. This is one of the inherent difficulties in the problem of even detecting if there is a kinematically valid pose given a certain end effector. We then optimize the QCQP by feeding the model a feasible initial solution to the local optimal solver IPOPT. The optimization process typically takes just over 1&#xa0;s on average for a single pose, for an Assembler consisting of four chained SPs. We computationally demonstrate the effectiveness of the approach, and demonstrate the effectiveness of the method in improving the force-valid range of motion of the assembler compared to the spline-based heuristic See (<xref ref-type="fig" rid="F2">Figure 2A</xref>).</p>
<fig id="F2" position="float">
<label>FIGURE 2</label>
<caption>
<p>
<bold>(A)</bold> Pose Optimization Flowchart <bold>(B)</bold> Trajectory Optimization Flowchart.</p>
</caption>
<graphic xlink:href="fmech-09-1225828-g002.tif"/>
</fig>
</sec>
<sec id="s1-1-2">
<title>1.1.2 Trajectory Optimization</title>
<p>We extend the pose optimization model to compute trajectories that reduce the overall force on the machine when moving between end effectors. We enable this possibility through a trust region subproblem and show that generates quality movements efficiently. We demonstrate that our approach significantly improves upon a naive transformation.</p>
<p>In other tests, our approach significantly outperforms an RRT&#x2a; implementation. We do not include the RRT&#x2a; in this paper as it was suboptimal to our trust region method See (<xref ref-type="fig" rid="F2">Figure 2B</xref>).</p>
</sec>
<sec id="s1-1-3">
<title>1.1.3 Outline</title>
<p>In <xref ref-type="sec" rid="s2">Section 2</xref> we describe the structure of the Assembler and its abilities in terms of movement and positions. We then introduce the forward and inverse kinematics problems for single SP&#x2019;s and the full Assembler, and mathematically define a kinematically valid SP. In <xref ref-type="sec" rid="s3-3">Section 3.3</xref>, we propose a <italic>spline-based</italic> construction heuristic (SIK) to produce valid poses. We also propose a simpler <italic>same-SP</italic> heuristic to produce starting solutions for the optimizer. In <xref ref-type="sec" rid="s3-4">Section 3.4</xref>, we propose an optimization model and simple initial-solution scheme (OPT) to directly generate locally force-optimal poses. In <xref ref-type="sec" rid="s4-2">Section 4.2</xref>, we propose a trust region approach for trajectory planning based on the optimization model. In <xref ref-type="sec" rid="s5-2">Section 5.2</xref>, we compare the effectiveness of the SIK and OPT schemes to quickly generate workable poses for the Assembler. In <xref ref-type="sec" rid="s5-3">Section 5.3</xref>, we compare the trust region trajectory planning scheme with a naive approach based on linearly interpolating leg lengths between the initial and target poses. Finally, in <xref ref-type="sec" rid="s5-4">Section 5.4</xref>, we demonstrate the effectiveness of the optimizer in improving the achievable range of motion of the Assembler.</p>
</sec>
</sec>
</sec>
<sec id="s2">
<title>2 Assembler robot, notation, and transformations</title>
<p>A <italic>Stewart platform</italic> consists of a pair of plates linked by six linear actuators, constituting a parallel mechanism with six degrees of freedom (DOF). The actuators for each platform are connected via ball joints on either end. We refer to the linear actuators as legs. The motor of each actuator is situated on the leg bottom (LB), while the shaft of the actuator is on the leg top (LT). We define the <italic>pose</italic> of a plate as its position and orientation in a given reference frame, and we characterize the pose of an Assembler via the poses of its plates in the Assembler&#x2019;s reference frame, also referred to as the <italic>global reference frame</italic>. That is, a pose is a list of plate positions <inline-formula id="inf1">
<mml:math id="m1">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> and rotations <inline-formula id="inf2">
<mml:math id="m2">
<mml:msubsup>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
</mml:mstyle>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> for each plate <italic>i</italic> with <italic>i</italic> &#x3d; 0, <italic>&#x2026;</italic>, <italic>N</italic>
<sub>
<italic>P</italic>
</sub>. See <xref ref-type="fig" rid="F3">Figure 3B</xref>. The pose of each SP can be expressed in terms of the pose of its top plate in the reference frame of its bottom plate. We primarily use this local &#x2018;SP-frame&#x2019; to mathematically define a kinematically valid SP. See <xref ref-type="fig" rid="F3">Figure 3C</xref> for examples of local reference frame variables.</p>
<fig id="F3" position="float">
<label>FIGURE 3</label>
<caption>
<p>
<bold>(A)</bold> Image of a linear actuator in two positions. The legs of the assembler are made from these linear actuators. Linear actuator has two parts: the motor (on the leg bottom) and the shaft (on the leg top). The actuator works by extending and contracting the shaft. For force computations, we record as data the distance from the bottom of the leg to the center of gravity of the motor, and from the top of the leg to the center of gravity of the shaft. <bold>(B)</bold> A section of the Assembler with several variable locations labeled in the global reference frame. Note that the center of gravity of plate <italic>i</italic> is <inline-formula id="inf3">
<mml:math id="m3">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>. Variables in the global reference frame are denoted that a superscript <inline-formula id="inf4">
<mml:math id="m4">
<mml:mi mathvariant="script">G</mml:mi>
</mml:math>
</inline-formula>. <bold>(C)</bold> The same pose, but rotated to look from the reference frame <inline-formula id="inf5">
<mml:math id="m5">
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
</mml:math>
</inline-formula> of SP <italic>i</italic> with respect to the bottom plate. We also occasionally use <inline-formula id="inf6">
<mml:math id="m6">
<mml:mi mathvariant="script">T</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
</mml:math>
</inline-formula> to denote the reference frame with respect to the top plate of the SP.</p>
</caption>
<graphic xlink:href="fmech-09-1225828-g003.tif"/>
</fig>
<p>Note that, crucially, a top plate pose is not uniquely defined by only the leg lengths (<xref ref-type="bibr" rid="B19">Lazard and Merlet, 1994</xref>; <xref ref-type="bibr" rid="B5">Charters et al., 2009</xref>).</p>
<p>An important pose is the <italic>resting pose</italic>. We define this as the pose where all the legs are set to be 50% of their total possible length, as a heuristic estimate of the center of a SP&#x2019;s workspace. We define parameters <bold>
<italic>L</italic>
</bold>
<sup>rest</sup> for each leg as the vector that leg follows when in resting pose. Note that, in the resting pose, due to the symmetry of the SP design used here, each plate is translated vertically with no rotation, so that <inline-formula id="inf7">
<mml:math id="m7">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn mathvariant="double-struck">0</mml:mn>
</mml:math>
</inline-formula> and <inline-formula id="inf8">
<mml:math id="m8">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>:</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn mathvariant="double-struck">0</mml:mn>
</mml:math>
</inline-formula>.</p>
<p>We use <inline-formula id="inf9">
<mml:math id="m9">
<mml:mn mathvariant="double-struck">0</mml:mn>
</mml:math>
</inline-formula> to denote a vector or matrix of zeros, and we leave size of this vector/matrix to be deduced by context.</p>
<p>Given a goal position for the end effector of the Assembler, the goal of this work is to quickly find kinematically valid poses and motions for a given Assembler while controlling the worst-case forces on the legs. We consider only mass-related forces and external forces applied to the end-effector of the Assembler, and neglect any external forces applied to other parts of the Assembler by e.g., wind.</p>
<p>To resolve torques resulting from the masses of each leg, we must compute the center of gravity (CoG) for each part the leg. Crucially, the CoG for a leg is not in the center of each leg; rather, each leg is a linear actuator consisting of two connected parts, a motor and a shaft. See <xref ref-type="fig" rid="F3">Figure 3A</xref>. The CoG of each part is a fixed distance from its attachment location. This fixed-distance property gives the model for the CoG a measure of mathematical complexity, as one cannot simply multiply the vector defining the leg&#x2019;s position by a fixed number to obtain the position of the center of gravity for each part. Rather, the unit vector defining the direction of the leg is multiplied by the fixed distance from the attachment location of a part to its CoG. In this work, the motor of each leg is connected to the bottom plate of its SP, while the shaft is connected to the top plate.</p>
<p>In the remainder of this section, we first define our notation and mathematics for coordinate transformations. We then define the forward kinematics and inverse kinematics problems for an Assembler and for a single SP, define a kinematically valid SP, and give some reasoning for the use of four SPs for the Assembler in this work.</p>
<sec id="s2-1">
<title>2.1 Notation</title>
<p>In this section, we introduce some useful notation and abbreviations to be used in the remainder of this work.</p>
<table-wrap id="udT1" position="float">
<caption>
<p>Shorthand: Here, we summarize our shorthand notation. TAA, SP, and KVC are used in text descriptions, while the rest are used in variable superscripts as object specifiers.</p>
</caption>
<table>
<tbody valign="top">
<tr>
<td align="left">TAA</td>
<td align="left">Translation-axis-angle</td>
</tr>
<tr>
<td align="left">SP</td>
<td align="left">Stewart Platform</td>
</tr>
<tr>
<td align="left">KVC</td>
<td align="left">Kinematic Validity Constraint</td>
</tr>
<tr>
<td align="left">CoG</td>
<td align="left">Center of Gravity</td>
</tr>
<tr>
<td align="left">BP</td>
<td align="left">Bottom Plate of SP</td>
</tr>
<tr>
<td align="left">TP</td>
<td align="left">Top Plate of SP</td>
</tr>
<tr>
<td align="left">P</td>
<td align="left">Plate</td>
</tr>
<tr>
<td align="left">LB</td>
<td align="left">Leg Bottom</td>
</tr>
<tr>
<td align="left">LT</td>
<td align="left">Leg Top</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>For parameter and variable definitions, we use the following notation,<disp-formula id="e1">
<mml:math id="m10">
<mml:mi>V</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi>r</mml:mi>
<mml:mi>T</mml:mi>
<mml:mi>y</mml:mi>
<mml:mi>p</mml:mi>
<mml:msubsup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">V arIndex,[V alIndex]</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mrow>
<mml:mtext>RefFrame</mml:mtext>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mtext>Optional</mml:mtext>
<mml:mo>)</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mo>,</mml:mo>
<mml:mtext>DesiredObject</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>specifier</mml:mtext>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>O</mml:mi>
<mml:mi>p</mml:mi>
<mml:mi>t</mml:mi>
<mml:mi>i</mml:mi>
<mml:mi>o</mml:mi>
<mml:mi>n</mml:mi>
<mml:mi>a</mml:mi>
<mml:mi>l</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:msubsup>
<mml:mo>,</mml:mo>
</mml:math>
<label>(1)</label>
</disp-formula>where RefFrame is the reference frame, <italic>VarIndex</italic> gives indices for the related object, and <italic>ValIndex</italic> gives vector and matrix indices. We implicitly define the reference frame of a plate by its leg attachment locations. The reference frame for each plate of an SP has its origin at the center of its exterior surface, the surface opposite its leg joints. In the Assembler stack, the top plate of each SP joins the bottom plate of the next at the plate centers, so that so that the two plates share the same origin, with the top SP rotated by 30&#xb0;. To simplify calculations, we treat the top bottom plate of a SP and the top plate of the preceding SP as a single plate, providing only a single reference frame. This is accomplished by rotating the leg attachment locations for the bottom SP by 30&#xb0; about the <italic>z</italic>-axis to obtain the leg attachment locations for the top SP.</p>
<table-wrap id="udT2" position="float">
<caption>
<p>Reference Frames: These three reference frames are used throughout the 536 paper.</p>
</caption>
<table>
<tbody valign="top">
<tr>
<td align="left">
<inline-formula id="inf10">
<mml:math id="m11">
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
</mml:math>
</inline-formula>
</td>
<td align="left">&#x2018;SP&#x2019; frame, the reference frame of the bottom plate of an SP</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf11">
<mml:math id="m12">
<mml:mi mathvariant="script">T</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
</mml:math>
</inline-formula>
</td>
<td align="left">Reference frame of the Top Plate of an SP</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf12">
<mml:math id="m13">
<mml:mi mathvariant="script">G</mml:mi>
</mml:math>
</inline-formula>
</td>
<td align="left">&#x2018;Global&#x2019; assembler frame, the reference frame of the bottom plate of the bottom SP</td>
</tr>
</tbody>
</table>
</table-wrap>
<table-wrap id="udT3" position="float">
<caption>
<p>Miscellaneous Notation: We aggregate some useful miscellaneous notation here for reference.</p>
</caption>
<table>
<tbody valign="top">
<tr>
<td align="left">
<inline-formula id="inf13">
<mml:math id="m14">
<mml:mn mathvariant="double-struck">0</mml:mn>
</mml:math>
</inline-formula>
</td>
<td align="left">A vector or matrix of zeros</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf14">
<mml:math id="m15">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
<td align="left">The 3 &#xd7; 3 identity matrix</td>
</tr>
<tr>
<td align="left">&#x22c4;</td>
<td align="left">The operator to apply a coordinate transformation <italic>T</italic> to a point <bold>p</bold>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf15">
<mml:math id="m16">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">e</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula>
</td>
<td align="left">The standard unit vectors for <italic>k</italic> &#x3d; 1, 2, 3, such that <inline-formula id="inf16">
<mml:math id="m17">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">e</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:math>
</inline-formula> and all other <inline-formula id="inf17">
<mml:math id="m18">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">e</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:math>
</inline-formula>
</td>
</tr>
</tbody>
</table>
</table-wrap>
</sec>
<sec id="s2-2">
<title>2.2 Coordinate transformations</title>
<p>We use &#x2016; &#x22c5;&#x2016; to denote the 2-norm (Euclidean norm). For a vector <bold>
<italic>v</italic>
</bold>, we use <inline-formula id="inf18">
<mml:math id="m19">
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
</mml:math>
</inline-formula> to denote <bold>
<italic>v</italic>
</bold>/&#x2016;<bold>
<italic>v</italic>
</bold>&#x2016;, that is, the unit direction of <bold>
<italic>v</italic>
</bold>. We define <inline-formula id="inf19">
<mml:math id="m20">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">e</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> for <italic>k</italic> &#x3d; 1, 2, 3 as the standard unit vectors with indices starting at 1. That is, <inline-formula id="inf20">
<mml:math id="m21">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">e</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mn>1,0,0</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>, <inline-formula id="inf21">
<mml:math id="m22">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">e</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mn>0,1,0</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>, and <inline-formula id="inf22">
<mml:math id="m23">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">e</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mn>0,0,1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>.</p>
<p>We use <bold>&#x3d2;</bold> to denote coordinate transformations via a vector containing the Translation-Axis-Angle representation (TAA)<disp-formula id="e2">
<mml:math id="m24">
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mi mathvariant="bold">r</mml:mi>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mo>&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mi>&#x3b8;</mml:mi>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mo>&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
<mml:mo>.</mml:mo>
</mml:math>
<label>(2)</label>
</disp-formula>The TAA format is used to represent position <bold>p</bold> and orientation data <bold>r</bold> in place of transformation matrices because total translational and rotational errors can be found by taking the norm of the top 3 and the bottom 3 components, respectively.</p>
<p>The related rotation matrix can be defined via Rodrigues&#x2019; formula as<disp-formula id="e3">
<mml:math id="m25">
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mo>:</mml:mo>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:msup>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>I</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mi>sin</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mi mathvariant="bold">r</mml:mi>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
</mml:mfenced>
<mml:mfrac>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mi mathvariant="bold">r</mml:mi>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
</mml:mfrac>
<mml:mo>&#x2b;</mml:mo>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>&#x2212;</mml:mo>
<mml:mi>cos</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mi mathvariant="bold">r</mml:mi>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mfenced>
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mi mathvariant="bold">r</mml:mi>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfrac>
<mml:mo>,</mml:mo>
</mml:math>
<label>(3)</label>
</disp-formula>where [<bold>r</bold>] is the vector cross-product operator for <bold>r</bold>
<disp-formula id="equ1">
<mml:math id="m26">
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x2254;</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:msub>
<mml:mrow>
<mml:mi>r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:msub>
<mml:mrow>
<mml:mi>r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:msub>
<mml:mrow>
<mml:mi>r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:math>
</disp-formula>
</p>
<p>so that, for any vector <bold>v</bold>, we have [<bold>r</bold>]<bold>v</bold> &#x3d; <bold>r</bold> &#xd7;<bold>v</bold>. We use the TAA scheme to represent reference frames in space due to its compactness, with the theoretically minimal six degrees of freedom, combined with the mathematical ease of converting the translational and rotational components to matrix transformation form. The matrix <bold>R</bold> is used to define transformation matrices via<disp-formula id="e4">
<mml:math id="m27">
<mml:mi mathvariant="bold">T</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mn mathvariant="double-struck">0</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>1</mml:mn>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
<mml:mo>.</mml:mo>
</mml:math>
<label>(4)</label>
</disp-formula>To apply the coordinate transformation defined by transformation matrix <bold>T</bold> to a point <inline-formula id="inf23">
<mml:math id="m28">
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mo>&#x303;</mml:mo>
</mml:mover>
</mml:mrow>
</mml:math>
</inline-formula>, we use<disp-formula id="e5">
<mml:math id="m29">
<mml:mi mathvariant="bold">T</mml:mi>
<mml:mo>&#x22c4;</mml:mo>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mo>&#x303;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mo>&#x2254;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi mathvariant="bold">T</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mo>&#x303;</mml:mo>
</mml:mover>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mn>1</mml:mn>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>:</mml:mo>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mo>&#x303;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mo>&#x2b;</mml:mo>
<mml:mi mathvariant="bold">p</mml:mi>
<mml:mo>.</mml:mo>
</mml:math>
<label>(5)</label>
</disp-formula>Where, for a vector <bold>
<italic>v</italic>
</bold>, we use a bracketed MATLAB style subscript to denote components; for example, we define <inline-formula id="inf24">
<mml:math id="m30">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>:</mml:mo>
<mml:mn>3</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>.</p>
</sec>
<sec id="s2-3">
<title>2.3 Forward and inverse kinematics</title>
<p>There are two primary problems of interest to solve for a general robot with an end-effector: the forward kinematics (FK) and inverse kinematics (IK) problems. The FK problem is to compute the end-effector pose given the actuator lengths. Conversely, the IK problem is to compute the actuator values given the end-effector pose.</p>
<p>For a single SP, the FK problem corresponds to computing the pose of the top plate w.r.t. the bottom plate given a vector of leg lengths. However, in general, the FK problem is difficult: it has multiple reachable solutions (<xref ref-type="bibr" rid="B19">Lazard and Merlet, 1994</xref>; <xref ref-type="bibr" rid="B5">Charters et al., 2009</xref>), most of which cannot be reversed, such as &#x201c;pretzeled&#x201d; poses for which the SP has twisted excessively, and spirals downwards until the legs collide. On the other hand, the IK problem corresponds to computing the leg lengths of the SP given the pose of the top plate w.r.t. the bottom plate. This computation is straightforward, with a simple closed-form solution, as described below. In this section, we describe all computations in the reference frame of the SP.</p>
<p>Define the pose of the top plate of an SP as <bold>T</bold>
<sup>TP</sup>, and let <italic>J</italic> be the set of legs for the SP. Then, for each leg of an SP, there are corresponding rest positions for the leg&#x2019;s joint attachment locations to the top and bottom plates. For a leg <italic>j</italic> &#x2208; <italic>J</italic>, these are <inline-formula id="inf25">
<mml:math id="m31">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> for the top plate and <inline-formula id="inf26">
<mml:math id="m32">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> for the bottom plate. These locations are defined in the reference frame of the corresponding plate, and are required for leg-vector and leg-length computations. We compute the coordinates of the top-plate leg joint locations via<disp-formula id="e6">
<mml:math id="m33">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>LT</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo>&#x22c4;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mspace width="1em"/>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>J</mml:mi>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(6)</label>
</disp-formula>Note that the bottom-plate joint attachment locations <bold>p</bold>
<sup>LB</sup> are known constants. Once joint locations have been determined, it is straightforward to calculate the resulting leg lengths by taking the magnitude of the positional displacement between corresponding leg joint pairs, as<disp-formula id="e7">
<mml:math id="m34">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">l</mml:mi>
<mml:mi mathvariant="normal">e</mml:mi>
<mml:mi mathvariant="normal">n</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>LT</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mspace width="1em"/>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>J</mml:mi>
<mml:mo>.</mml:mo>
</mml:math>
<label>(7)</label>
</disp-formula>The vector of leg lengths <inline-formula id="inf27">
<mml:math id="m35">
<mml:msub>
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">l</mml:mi>
<mml:mi mathvariant="normal">e</mml:mi>
<mml:mi mathvariant="normal">n</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>J</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula> is then the solution to the single-SP IK problem.</p>
<p>Considering that IK on an SP is a single step mathematical computation (<xref ref-type="bibr" rid="B22">Lynch and Park, 2017</xref>), it lends itself to rapid successive iteration. Solutions to the FK problem for SPs are based in this principle, with most algorithms performing calls to IK in order to numerically approximate the true position. However, as FK is not an integral component to the Assembler IK methodologies described in this paper, it is not described here in full. For further information, consult (<xref ref-type="bibr" rid="B24">Merlet, 2006</xref>).</p>
<p>For an Assembler consisting of a serial chain of stacked SP&#x2019;s, which are parallel kinematic structures, neither the FK or IK problems are straightforward to solve. For the IK problem, there is generally a continuous space (or set of disjoint continuous spaces) of feasible plate positions for a given end-effector position. Moreover, this space is difficult to characterize, and can contain many bad solutions, such as those with extreme SP poses or very high leg forces. As such, before computing the leg lengths, one must first choose a &#x2018;good&#x2019; solution for the plate positions from the space of feasible solutions. On the other hand, to solve the FK problem for an Assembler, one must individually solve the difficult FK problem for each SP.</p>
<p>In this work, we focus on solving the IK problem for an Assembler. We then extend our approach via a trust region method to solve point-to-point trajectory planning.</p>
</sec>
<sec id="s2-4">
<title>2.4 Kinematic validity constraints</title>
<p>In this section, we define what it means for an SP to have a valid pose. In this section, we will define constraints in the reference frame of the base plate of SP, so that the origin is the center of the bottom of the bottom plate of the SP, with no rotation. In effect, we omit the reference frame superscript <inline-formula id="inf28">
<mml:math id="m36">
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
</mml:math>
</inline-formula>, as defined in the following section.</p>
<p>Leg Length Bounds: The legs have minimum and maximum lengths that can be attained. For the robots we consider here, the legs all have uniform length bounds <italic>L</italic>
<sup>min</sup> and <italic>L</italic>
<sup>max</sup>, but this is easily changed in our model if more general situations are of interest. Formally, for a particular leg, let <inline-formula id="inf228">
<mml:math id="m328">
<mml:mrow>
<mml:msup>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
</mml:mstyle>
<mml:mi>LT</mml:mi>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula> and <bold>p</bold>
<sup>LB</sup> be the coordinates of the top and bottom connections of the leg. Then the vector <inline-formula id="inf229">
<mml:math id="m329">
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
</mml:mstyle>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
</mml:mstyle>
<mml:mi>LT</mml:mi>
</mml:msup>
<mml:mo>&#x2212;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mi>LB</mml:mi>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula> describes the direction and magnitude of the leg. This vector is then bounded in magnitude as<disp-formula id="e8">
<mml:math id="m37">
<mml:msup>
<mml:mrow>
<mml:mi>L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>min</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2264;</mml:mo>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
</mml:mstyle>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mo>&#x2264;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>.</mml:mo>
</mml:math>
<label>(8)</label>
</disp-formula>
</p>
<p>Note that, in the reference frame of the SP, the bottom-plate attachment locations <bold>p</bold>
<sup>LB</sup> are known constants.</p>
<p>Leg Angular Deviation: Each leg must not exceed a certain angular deviation from its normal resting pose, as this could break the ball joints in physical hardware. We must constrain the leg lengths in both the top and bottom pose.</p>
<p>Formally, for a particular leg, let <bold>p</bold>
<sup>LT,rest</sup> and <bold>p</bold>
<sup>LB,rest</sup> be the rest coordinates of the top and bottom connections of the leg. Then the vector <bold>
<italic>L</italic>
</bold>
<sup>rest</sup> &#x3d; <bold>p</bold>
<sup>LT,rest</sup> &#x2212; <bold>p</bold>
<sup>LB,rest</sup> describes the direction and magnitude of the leg in the resting pose.</p>
<p>The bottom-plate constraint for leg angle deviation is<disp-formula id="e9">
<mml:math id="m38">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mi>cos</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x2264;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
</mml:mfrac>
<mml:mo>&#x22c5;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
</mml:mfrac>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(9)</label>
</disp-formula>
</p>
<p>Similarly, we require the same constraints for the top plate angles. Let <bold>R</bold> be the rotation matrix defining the orientation of the top plate w.r.t. the bottom plate. Then the top-plate angles are defined as in <xref ref-type="disp-formula" rid="e9">(9)</xref>, except that the rest coordinates are pre-multiplied by <bold>R</bold> to move them to the top plate, yielding<disp-formula id="equ2">
<mml:math id="m39">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mi>cos</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x2264;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
</mml:mfrac>
<mml:mo>&#x22c5;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
</mml:mfrac>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
</disp-formula>Since rotation operations are distance-invariant, we have <inline-formula id="inf230">
<mml:math id="m330">
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
</mml:mstyle>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
</mml:math>
</inline-formula>, yielding<disp-formula id="e10">
<mml:math id="m40">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mi>cos</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x2264;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
</mml:mfrac>
<mml:mo>&#x22c5;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
</mml:mfrac>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(10)</label>
</disp-formula>
</p>
<p>Legs Point Up: To prevent legs from colliding with the base plate of an SP, we require that each leg is pointing &#x2018;up&#x2019;, so that the <italic>z</italic>-component <inline-formula id="inf231">
<mml:math id="m331">
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mn>3</mml:mn>
<mml:mo>]</mml:mo>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula> of <inline-formula id="inf232">
<mml:math id="m332">
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
</mml:mstyle>
</mml:mrow>
</mml:math>
</inline-formula> is nonnegative:<disp-formula id="e11">
<mml:math id="m41">
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2265;</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>.</mml:mo>
</mml:math>
<label>(11)</label>
</disp-formula>
</p>
<p>Extreme Pose Prevention: We wish to prevent extreme and difficult-to-reach poses for each SP, particularly &#x201c;pretzeling,&#x201d; a phenomenon where the top plate of an SP over-rotates in the <italic>z</italic>-direction, causing it to collapse, spinning down until the legs of the SP collide. See e.g., (<xref ref-type="bibr" rid="B44">Zhang, 2005</xref>; <xref ref-type="bibr" rid="B5">Charters et al., 2009</xref>) for more information on singularities, such as pretzeling, that can be encountered with some SP designs. To help prevent such extreme poses, we set a limit of <italic>&#x3b8;</italic>
<sup>
<bold>R</bold>,&#x2009;max</sup> for the action of the plate rotation matrix <bold>R</bold> on any principle unit vector <inline-formula id="inf29">
<mml:math id="m42">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">e</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula>, where <italic>k</italic> &#x2208; {1, 2, 3}. This corresponds to enforcing that each deviation angle <inline-formula id="inf30">
<mml:math id="m43">
<mml:msubsup>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2264;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>max</mml:mi>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>, which is equivalent to<disp-formula id="equ3">
<mml:math id="m44">
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">e</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
</mml:mstyle>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">e</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mi>cos</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">e</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msubsup>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
</mml:mstyle>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">e</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2265;</mml:mo>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">e</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
</mml:mstyle>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">e</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mi>cos</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>max</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfenced>
<mml:mo>.</mml:mo>
</mml:math>
</disp-formula>Now, since <inline-formula id="inf31">
<mml:math id="m45">
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">e</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mo>&#x3d;</mml:mo>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
</mml:mstyle>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">e</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:math>
</inline-formula>, and <inline-formula id="inf32">
<mml:math id="m46">
<mml:msubsup>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">e</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msubsup>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
</mml:mstyle>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">e</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula>, the <italic>k</italic>th diagonal element of <inline-formula id="inf233">
<mml:math id="m333">
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
</mml:mstyle>
</mml:mrow>
</mml:math>
</inline-formula>, this simplifies to<disp-formula id="e12">
<mml:math id="m47">
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2265;</mml:mo>
<mml:mi>cos</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>max</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfenced>
<mml:mo>.</mml:mo>
</mml:math>
<label>(12)</label>
</disp-formula>In this work, we use a maximum rotation of 60&#xb0;, or in radians, <inline-formula id="inf33">
<mml:math id="m48">
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>max</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi>&#x3c0;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula>.</p>
</sec>
<sec id="s2-5">
<title>2.5 Problem difficulty</title>
<p>For most cases, if forces are ignored, a feasible IK solution for the Assembler can be found very quickly. For example, with four chained Stewart platforms, and using the SP parameters and computers specified in the numerical results section, IPOPT will typically converge (or report a locally infeasible solution) within 0.1s, so that a feasible solution to reach goal poses in the workspace can usually be obtained via local optimization from several different initial solutions.</p>
<p>However, finding a globally optimal solution to the IK problem, in terms of e.g., minimizing the maximal leg forces, is far more difficult in general. Due to the nonconvexity of both the objective and constraints, there are often multiple locally optimal solutions. Moreover, these locally optimal solutions can differ greatly in solution quality, as seen in <xref ref-type="fig" rid="F4">Figure 4</xref>. When attempting a direct global solve of our QCQP model in <xref ref-type="sec" rid="s3-4">Section 3.4</xref> with Gurobi 9.1.1, applied to the Assembler with parameters defined in <xref ref-type="sec" rid="s5">Section 5</xref>, even directly optimizing an Assembler with only 2 SP&#x2019;s requires an inordinate amount of computational time (over an hour), despite the fact that the original problem has only six DOF, the pose of the middle plate, as the poses of the top and bottom plates are fixed.</p>
<fig id="F4" position="float">
<label>FIGURE 4</label>
<caption>
<p>An example of a goal pose with two very different locally optimal solutions in IPOPT, for the Assembler defined in <xref ref-type="sec" rid="s5">Section 5</xref> with a 5&#xa0;kg weight on the top plate. The red pose has a maximum leg force of 703N, while the green pose has a maximum leg force of only 282N. Axes units are in meters.</p>
</caption>
<graphic xlink:href="fmech-09-1225828-g004.tif"/>
</fig>
<p>Moreover, to demonstrate the potentially high number of locally optimal solutions, we optimized the 2-SP Assembler with a goal pose of <bold>p</bold> &#x3d; [0,0,0.65]<sup>
<italic>&#x22a4;</italic>
</sup> and <bold>r</bold> &#x3d; [0,0,0]<sup>
<italic>&#x22a4;</italic>
</sup>, so that a vertical pose is impossible due to the leg length lower-bounds. Using 100 randomized starting poses for the middle plate drawn from a normal distribution, and minimizing the maximal leg forces via IPOPT, we obtained 22 different locally optimal solutions, with maximum leg forces ranging from 457N to 519N.</p>
</sec>
<sec id="s2-6">
<title>2.6 Justification of four SPs in a stack</title>
<p>We choose the number of chained SP&#x2019;s for an Assembler so that it can reach a &#x2018;bent-over&#x2019; pose, with the end effector is in-plane with the bottom plate, facing downwards. This enables the assembler roughly a hemisphere of motion, allowing a reasonably large workspace while keeping internal forces under control. While adding additional SP&#x2019;s would increase the kinematic flexibility of motion in a zero-gravity environment, on Earth, it would also increase the loads on the legs particularly for the bottom SP, thereby shrinking the workspace of the Assembler due to excessive forces.</p>
<p>For the specifications of the SP used in this work, due to leg length and joint motion limitations, a minimum of four chained SP&#x2019;s are required to reach this bent-over pose. Thus, we use four chained SP&#x2019;s for the computational tests in this work.</p>
</sec>
</sec>
<sec id="s3">
<title>3 Assembler IK optimization</title>
<sec id="s3-1">
<title>3.1 Definitions</title>
<p>In this section, we formally define the notation used for variables and parameters needed for this work.</p>
<table-wrap id="udT4" position="float">
<caption>
<p>Sets</p>
</caption>
<table>
<thead>
<tr>
<td align="left">Size</td>
<td align="left">Description</td>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">
<italic>i</italic> &#x2208; <italic>I</italic>
</td>
<td align="left">&#x3d; 0, 1, <italic>&#x2026;</italic>, <italic>N</italic>
<sub>
<italic>P</italic>
</sub>: The plates</td>
</tr>
<tr>
<td align="left">
<italic>i</italic> &#x2208; <italic>I</italic>
<sup>P</sup>
</td>
<td align="left">&#x3d; 0, 1, <italic>&#x2026;</italic>, <italic>N</italic>
<sub>
<italic>P</italic>
</sub> &#x2212; 1: The SPs. Platform <italic>i</italic> connects plates <italic>i</italic> and <italic>i</italic> &#x2b; 1</td>
</tr>
<tr>
<td align="left">
<italic>j</italic> &#x2208; <italic>J</italic>
</td>
<td align="left">&#x3d; 1, 2, <italic>&#x2026;</italic>, 6: The legs for each SP.</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>To reduce notation definitions, we implicitly define some coordinate variables <bold>p</bold>, rotational variables <bold>r</bold>, and matrix variables <bold>R</bold> and <bold>T</bold> from <bold>&#x3d2;</bold> via <xref ref-type="disp-formula" rid="e2">(2)</xref>. We first define the sets of plates, SP&#x2019;s, and legs per SP in the table below.</p>
<table-wrap id="udT5" position="float">
<caption>
<p>Parameters</p>
</caption>
<table>
<thead>
<tr>
<td align="left">Parameter</td>
<td align="left">Size</td>
<td align="left">Description</td>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">
<inline-formula id="inf34">
<mml:math id="m49">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
<td align="left">
<inline-formula id="inf35">
<mml:math id="m50">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
<td align="left">Target global-frame TAA pose for the end effector</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf36">
<mml:math id="m51">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">
<inline-formula id="inf37">
<mml:math id="m52">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
<td align="left">SP-frame rest pose of the top plate for SP <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf38">
<mml:math id="m53">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">
<inline-formula id="inf39">
<mml:math id="m54">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
<td align="left">SP-frame position of bottom joint <italic>j</italic> &#x2208; <italic>J</italic> for SP <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf40">
<mml:math id="m55">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">
<inline-formula id="inf41">
<mml:math id="m56">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
<td align="left">Rest position of top joint <italic>j</italic> &#x2208; <italic>J</italic> w.r.t. top plate for SP <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf42">
<mml:math id="m57">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left"/>
<td align="left">
<inline-formula id="inf43">
<mml:math id="m58">
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>: SP-frame rest-position leg vector for <italic>j</italic> &#x2208; <italic>J</italic> for SP <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>
</td>
</tr>
<tr>
<td align="left">
<italic>&#x3b8;</italic>
<sup>max</sup>
</td>
<td align="left">
<inline-formula id="inf44">
<mml:math id="m59">
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:math>
</inline-formula>
</td>
<td align="left">Maximal angle deviation from rest position for any leg</td>
</tr>
<tr>
<td align="left">
<italic>&#x3b8;</italic>
<sup>
<bold>R</bold>,&#x2009;max</sup>
</td>
<td align="left">
<inline-formula id="inf45">
<mml:math id="m60">
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:math>
</inline-formula>
</td>
<td align="left">Maximal angle between <inline-formula id="inf46">
<mml:math id="m61">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>BP</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">e</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula> and <inline-formula id="inf47">
<mml:math id="m62">
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mi mathvariant="bold-italic">e</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula> for plate <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup> and <italic>k</italic> &#x2208; [1 : 3]</td>
</tr>
<tr>
<td align="left">(<italic>L</italic>
<sup>min</sup>, <italic>L</italic>
<sup>max</sup>)</td>
<td align="left">
<inline-formula id="inf48">
<mml:math id="m63">
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:math>
</inline-formula>
</td>
<td align="left">Bounds on the length of any leg</td>
</tr>
<tr>
<td align="left">
<italic>f</italic>
<sup>max</sup>
</td>
<td align="left">
<inline-formula id="inf49">
<mml:math id="m64">
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:math>
</inline-formula>
</td>
<td align="left">Upper bound on the compressive and tensile force on a leg</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf50">
<mml:math id="m65">
<mml:msubsup>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">
<inline-formula id="inf51">
<mml:math id="m66">
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:math>
</inline-formula>
</td>
<td align="left">Mass of plate <italic>i</italic> &#x2208; <italic>I</italic>
</td>
</tr>
<tr>
<td align="left">
<italic>m</italic>
<sup>LT</sup>
</td>
<td align="left">
<inline-formula id="inf52">
<mml:math id="m67">
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:math>
</inline-formula>
</td>
<td align="left">Mass of a leg motor</td>
</tr>
<tr>
<td align="left">
<italic>m</italic>
<sup>LB</sup>
</td>
<td align="left">
<inline-formula id="inf53">
<mml:math id="m68">
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:math>
</inline-formula>
</td>
<td align="left">Mass of a leg shaft</td>
</tr>
<tr>
<td align="left">
<italic>d</italic>
<sup>LT,CoG</sup>
</td>
<td align="left">
<inline-formula id="inf54">
<mml:math id="m69">
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:math>
</inline-formula>
</td>
<td align="left">Distance from the top joint to the CoG for a leg shaft</td>
</tr>
<tr>
<td align="left">
<italic>d</italic>
<sup>LB,CoG</sup>
</td>
<td align="left">
<inline-formula id="inf55">
<mml:math id="m70">
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:math>
</inline-formula>
</td>
<td align="left">Distance from the bottom joint to the CoG for a leg motor</td>
</tr>
<tr>
<td align="left">
<italic>g</italic>
</td>
<td align="left">
<inline-formula id="inf56">
<mml:math id="m71">
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:math>
</inline-formula>
</td>
<td align="left">Gravitational constant. For this work, we use Earth gravity, <inline-formula id="inf57">
<mml:math id="m72">
<mml:mi>g</mml:mi>
<mml:mo>&#x2248;</mml:mo>
<mml:mn>9.81</mml:mn>
<mml:mfrac>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>s</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula>
</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>Note that, as the Assembler studied in this work consists of <italic>N</italic>
<sub>
<italic>P</italic>
</sub> identical stacked SPs, there are really 2 plates between consecutive sets of legs, so that <inline-formula id="inf58">
<mml:math id="m73">
<mml:msubsup>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>2</mml:mn>
<mml:msubsup>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>2</mml:mn>
<mml:msubsup>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> for <italic>i</italic> &#x3d; 1, 2, <italic>&#x2026;</italic>, <italic>N</italic>
<sub>
<italic>P</italic>
</sub> &#x2212; 1. The problem variables and parameters are defined in their respective tables.</p>
<table-wrap id="udT6" position="float">
<caption>
<p>Variables</p>
</caption>
<table>
<thead>
<tr>
<td align="left">Variable</td>
<td align="left">Size</td>
<td align="left">Description</td>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">
<inline-formula id="inf59">
<mml:math id="m74">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">
<inline-formula id="inf60">
<mml:math id="m75">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
<td align="left">SP-frame pose of top plate for SP <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf61">
<mml:math id="m76">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">
<inline-formula id="inf62">
<mml:math id="m77">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
<td align="left">Global-frame pose of plate <italic>i</italic> &#x2208; <italic>I</italic>, where <inline-formula id="inf63">
<mml:math id="m78">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf64">
<mml:math id="m79">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">
<inline-formula id="inf65">
<mml:math id="m80">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
<td align="left">SP-frame position of top joint <italic>j</italic> &#x2208; <italic>J</italic> for SP <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf66">
<mml:math id="m81">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">
<inline-formula id="inf67">
<mml:math id="m82">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
<td align="left">Global-frame position of bottom joint <italic>j</italic> &#x2208; <italic>J</italic> for SP <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf68">
<mml:math id="m83">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">
<inline-formula id="inf69">
<mml:math id="m84">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
<td align="left">Global-frame position of top joint <italic>j</italic> &#x2208; <italic>J</italic> for SP <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf70">
<mml:math id="m85">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>CoG</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">
<inline-formula id="inf71">
<mml:math id="m86">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
<td align="left">Global-frame CoG position of motor for leg <italic>j</italic> &#x2208; <italic>J</italic> for SP <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf72">
<mml:math id="m87">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>CoG</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">
<inline-formula id="inf73">
<mml:math id="m88">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
<td align="left">Global-frame CoG position of shaft for leg <italic>j</italic> &#x2208; <italic>J</italic> for SP <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf74">
<mml:math id="m89">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left"/>
<td align="left">
<inline-formula id="inf75">
<mml:math id="m90">
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>; Global-frame leg vector for leg <italic>j</italic> &#x2208; <italic>J</italic>, SP <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf76">
<mml:math id="m91">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left"/>
<td align="left">
<inline-formula id="inf77">
<mml:math id="m92">
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>; SP-frame leg vector for leg <italic>j</italic> &#x2208; <italic>J</italic>, SP <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf78">
<mml:math id="m93">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">l</mml:mi>
<mml:mi mathvariant="normal">e</mml:mi>
<mml:mi mathvariant="normal">n</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left"/>
<td align="left">
<inline-formula id="inf79">
<mml:math id="m94">
<mml:mo>&#x3d;</mml:mo>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:math>
</inline-formula>; Leg length for leg <italic>j</italic> &#x2208; <italic>J</italic>, SP <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf206">
<mml:math id="m274">
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
<td align="left">
<inline-formula id="inf80">
<mml:math id="m95">
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:math>
</inline-formula>
</td>
<td align="left">Gravitational force on leg <italic>j</italic> &#x2208; <italic>J</italic> for SP <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf207">
<mml:math id="m275">
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mtext>max</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
<td align="left">
<inline-formula id="inf81">
<mml:math id="m96">
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:math>
</inline-formula>
</td>
<td align="left">Maximum force on any leg of the assembler</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf208">
<mml:math id="m276">
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>W</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula>
</td>
<td align="left">
<inline-formula id="inf82">
<mml:math id="m97">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
<td align="left">Global-frame wrench forces on the top plate of SP <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>
</td>
</tr>
<tr>
<td align="left"/>
<td align="left"/>
<td align="left">
<inline-formula id="inf83">
<mml:math id="m98">
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>W</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>W</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>,</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi>W</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>, where <inline-formula id="inf84">
<mml:math id="m99">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>W</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> relates to the torque and <inline-formula id="inf85">
<mml:math id="m100">
<mml:msubsup>
<mml:mrow>
<mml:mi>W</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> is the force</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf86">
<mml:math id="m101">
<mml:msub>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>J</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mtext>s</mml:mtext>
</mml:mstyle>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula>
</td>
<td align="left">
<inline-formula id="inf87">
<mml:math id="m102">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>6</mml:mn>
<mml:mo>&#xd7;</mml:mo>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
<td align="left">Spatial Jacobian related to leg-force computations for SP <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf88">
<mml:math id="m103">
<mml:msub>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>J</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mtext>t</mml:mtext>
</mml:mstyle>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula>
</td>
<td align="left"/>
<td align="left">
<inline-formula id="inf89">
<mml:math id="m104">
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>J</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mtext>s</mml:mtext>
</mml:mstyle>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>We assume that the Assembler is oriented so that gravity pulls directly downward in the reference frame of the Assembler, i.e., <bold>
<italic>g</italic>
</bold> &#x3d; [0,0,&#x2212;<italic>g</italic>]<sup>
<italic>&#x22a4;</italic>
</sup>. To handle different orientations of the Assembler, one needs only to redefine the gravity vector <bold>
<italic>g</italic>
</bold>. Note that each <bold>&#x3d2;</bold> transformation term implicitly defines corresponding TAA-form terms <bold>p</bold> and <bold>r</bold>, and matrix-form terms <bold>R</bold> and <bold>T</bold>. Finally, as the bottom plate is positioned at the origin of the global reference frame, we enforce that <inline-formula id="inf90">
<mml:math id="m105">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:mn mathvariant="double-struck">0</mml:mn>
</mml:math>
</inline-formula>.</p>
<p>In order to define a kinematically valid Assembler pose, we enforce the SP-frame kinematic validity constraints constraints in <xref ref-type="sec" rid="s2-4">Section 2.4</xref> for each SP, combined with the definition <inline-formula id="inf91">
<mml:math id="m106">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>, which ensures that the end-effector is where it should be.</p>
<p>This constraint is enforced with a small implicit tolerance within the nonlinear solver.</p>
</sec>
<sec id="s3-2">
<title>3.2 Force calculation</title>
<p>Force analysis follows the procedures set out in (<xref ref-type="bibr" rid="B22">Lynch and Park, 2017</xref>) with a few additional considerations.</p>
<p>For SP <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>, we can define the Jacobian with the relationship<disp-formula id="e13">
<mml:math id="m107">
<mml:msubsup>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>J</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>s</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#xd7;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2026;</mml:mo>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>6</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#xd7;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>6</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:msubsup>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2026;</mml:mo>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:msubsup>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>6</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:math>
<label>(13)</label>
</disp-formula>where <inline-formula id="inf92">
<mml:math id="m108">
<mml:msubsup>
<mml:mrow>
<mml:mover accent="true">
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mo stretchy="false">&#x302;</mml:mo>
</mml:mover>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> is the unit vector for <inline-formula id="inf93">
<mml:math id="m109">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>.</p>
<p>Given a wrench <italic>W</italic> defined in the global frame and acting on the SP end effector, the resultant forces on each of the SP&#x2019;s legs can be determined by the relation:<disp-formula id="e14">
<mml:math id="m110">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3c4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>:</mml:mo>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>J</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>s</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
<mml:msup>
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi mathvariant="normal">A</mml:mi>
<mml:mi mathvariant="normal">d</mml:mi>
<mml:mi mathvariant="normal">j</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
<mml:msub>
<mml:mrow>
<mml:mi>W</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
<label>(14)</label>
</disp-formula>where, as in (<xref ref-type="bibr" rid="B22">Lynch and Park, 2017</xref>), we define the matrix adjoint for a transformation matrix <bold>T</bold> [see <xref ref-type="disp-formula" rid="e4">(4)</xref>] as<disp-formula id="e15">
<mml:math id="m111">
<mml:mi mathvariant="normal">A</mml:mi>
<mml:mi mathvariant="normal">d</mml:mi>
<mml:mi mathvariant="normal">j</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi mathvariant="bold">T</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x2254;</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn mathvariant="double-struck">0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:math>
<label>(15)</label>
</disp-formula>For wrench computations, we first define the center of gravity for the motor and shaft of each leg <italic>j</italic> &#x2208; <italic>J</italic> for SP <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup> as<disp-formula id="e16">
<mml:math id="m112">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>CoG</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>LB</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>CoG</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mfrac>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
</mml:mfrac>
<mml:mo>&#x2b;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mspace width="1em"/>
<mml:mtext>&#x2009;and&#x2009;</mml:mtext>
<mml:mspace width="1em"/>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>CoG</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>LT</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>CoG</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mfrac>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
</mml:mfrac>
<mml:mo>&#x2b;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(16)</label>
</disp-formula>
</p>
<p>Then, to compute the global-frame wrenches <italic>W</italic>
<sub>
<italic>i</italic>
</sub> for each SP, we sum all the wrenches from forces applied on or above the platform by leg masses, platform masses, and the end effector load. For <italic>i</italic> &#x3d; 0, <italic>&#x2026;</italic>, <italic>N</italic>
<sub>
<italic>P</italic>
</sub> &#x2212; 2, this is computed as<disp-formula id="e17">
<mml:math id="m113">
<mml:msub>
<mml:mrow>
<mml:mi>W</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>W</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2b;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
<mml:mi mathvariant="bold">g</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mi mathvariant="bold">g</mml:mi>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x2b;</mml:mo>
<mml:mstyle displaystyle="true">
<mml:munder>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:munder>
</mml:mstyle>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>LT</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>CoG</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
<mml:mi mathvariant="bold">g</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mi mathvariant="bold">g</mml:mi>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x2b;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>CoG</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
<mml:mi mathvariant="bold">g</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mi mathvariant="bold">g</mml:mi>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mfenced>
<mml:mo>.</mml:mo>
</mml:math>
<label>(17)</label>
</disp-formula>For the last platform <italic>i</italic> &#x3d; <italic>N</italic>
<sub>
<italic>P</italic>
</sub> &#x2212; 1, this is computed as<disp-formula id="e18">
<mml:math id="m114">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:msub>
<mml:mrow>
<mml:mi>W</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>W</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>EE</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2b;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>T</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
<mml:mi mathvariant="bold">g</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mi mathvariant="bold">g</mml:mi>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(18)</label>
</disp-formula>Note that, as <bold>g</bold> &#x3d; (0,0,&#x2212;<italic>g</italic>)<sup>
<italic>&#x22a4;</italic>
</sup>, for any vector <inline-formula id="inf94">
<mml:math id="m115">
<mml:mi mathvariant="bold">p</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>, we have<disp-formula id="equ4">
<mml:math id="m116">
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mi mathvariant="bold">g</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>g</mml:mi>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:msub>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
<mml:mo>.</mml:mo>
</mml:math>
</disp-formula>
</p>
<p>Consequently, as <italic>W</italic>
<sup>EE</sup> is a parameter, and since the 3rd component of [<bold>p</bold>]<bold>
<italic>g</italic>
</bold> is zero, the 3rd-6th components of the wrench are known constants, while the first two depend linearly on the plate and leg locations.</p>
</sec>
<sec id="s3-3">
<title>3.3 IK heuristics</title>
<p>In this section, we introduce two heuristics for the initialization of SP poses.</p>
<sec id="s3-3-1">
<title>3.3.1 Spline-based IK</title>
<p>In this section, we introduce a splined kinematic approach, denoting a cubic spline originating at the platform base plate and ending at the end effector position. Define the following positions as helper points <inline-formula id="inf95">
<mml:math id="m117">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> and <inline-formula id="inf96">
<mml:math id="m118">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> from the formulas:<disp-formula id="e19">
<mml:math id="m119">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2254;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:mfrac>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>BP</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
<mml:mo>,</mml:mo>
<mml:mspace width="0.3333em"/>
<mml:mspace width="0.3333em"/>
<mml:mspace width="0.3333em"/>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2254;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>Base</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:mfrac>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>BP</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
<mml:mo>.</mml:mo>
</mml:math>
<label>(19)</label>
</disp-formula>Define the B-spline <inline-formula id="inf97">
<mml:math id="m120">
<mml:mi>p</mml:mi>
<mml:mo>:</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mn>0,1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
<mml:mo>&#x2192;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> as<disp-formula id="e20">
<mml:math id="m121">
<mml:mi>p</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi>x</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x2254;</mml:mo>
<mml:mi mathvariant="normal">S</mml:mi>
<mml:mi mathvariant="normal">p</mml:mi>
<mml:mi mathvariant="normal">l</mml:mi>
<mml:mi mathvariant="normal">i</mml:mi>
<mml:mi mathvariant="normal">n</mml:mi>
<mml:mi mathvariant="normal">e</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>Base</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfenced>
<mml:mo>.</mml:mo>
</mml:math>
<label>(20)</label>
</disp-formula>
</p>
<p>We use SciPy&#x2019;s B-spline interpolation (<xref ref-type="bibr" rid="B37">Virtanen et al., 2020</xref>), which requires a minimum of four points to produce the spline curve, these two helper points serve a dual purpose: ensure that spline function has enough input to produce the expected curve, and also to ensure that interior plates are placed behind the plane of the goal end effector, and above the plane of the base plate. The resulting spline function provides the positions of the interior <italic>N</italic>
<sub>
<italic>P</italic>
</sub> &#x2212; 1 plates via interpolation at <inline-formula id="inf98">
<mml:math id="m122">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:mi>p</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:mfenced>
<mml:mo>,</mml:mo>
</mml:math>
</inline-formula> for <italic>i</italic> &#x3d; 0, 1, <italic>&#x2026;</italic>, <italic>N</italic>
<sub>
<italic>P</italic>
</sub>. See <xref ref-type="fig" rid="F5">Figure 5</xref>.</p>
<fig id="F5" position="float">
<label>FIGURE 5</label>
<caption>
<p>Possible example of calculation of plate centers <inline-formula id="inf99">
<mml:math id="m123">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> via the B-Spline calculation. Base plate and top plate locations are given, then control points are computed by transforming the base plate and top plate locations towards the rest pose. The B-spline is calculated, and then plate locations are determined as equidistant spacing along the spline.</p>
</caption>
<graphic xlink:href="fmech-09-1225828-g005.tif"/>
</fig>
<p>We then recursively determine the rotation of the middle-most plate, and when there is an even number of plates left in the queue, we consider the two middle-most plates. The rotation of the middle-most plate(s) is then determined by an average of the rotation between the beginning and end plates, computed in TAA form in the reference frame of the beginning plate. Once the middle plate(s) rotation is determined, we recurse and determine the rotation of the next middle plate(s).</p>
<p>Within this heuristic, we consider a pose to be valid if all kinematic validity constraints, including the end-effector position, are satisfied within some small tolerance. If a pose fails kinematically, we attempt several recourse steps to correct the pose. In the event of failure (such as a calculated leg being too long), all legs are re-scaled such that the legs are within bounds, maintaining orientation, and the end effector position is recalculated accordingly.</p>
<p>Validation of the SP proceeds in steps, described in the following algorithm.</p>
</sec>
<sec id="s3-3-2">
<title>3.3.2 Same-SP initialization</title>
<p>We derive a simple initial guess for the Assembler pose by assuming that each SP has the same SP-frame pose <inline-formula id="inf100">
<mml:math id="m124">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:math>
</inline-formula>. It is then trivial to compute the SP-frame rotation matrices, as since all share the same axis of rotation, we have for two rotations <inline-formula id="inf101">
<mml:math id="m125">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>B</mml:mi>
<mml:mi>P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>T</mml:mi>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> and <inline-formula id="inf102">
<mml:math id="m126">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>B</mml:mi>
<mml:mi>P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>T</mml:mi>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> that<disp-formula id="equ5">
<mml:math id="m127">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>BP</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>BP</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>B</mml:mi>
<mml:mi>P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>T</mml:mi>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:msup>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>B</mml:mi>
<mml:mi>P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>T</mml:mi>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:msup>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>B</mml:mi>
<mml:mi>P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>T</mml:mi>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2b;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>B</mml:mi>
<mml:mi>P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>T</mml:mi>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:msup>
<mml:mo>.</mml:mo>
</mml:math>
</disp-formula>
</p>
<p>Thus, if <inline-formula id="inf103">
<mml:math id="m128">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>BP</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:math>
</inline-formula> for all <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>, we obtain<disp-formula id="equ6">
<mml:math id="m129">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:msup>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:msup>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
</mml:msup>
<mml:mo>.</mml:mo>
</mml:math>
</disp-formula>
</p>
<p>Thus, we simply compute <bold>r</bold> as<disp-formula id="equ7">
<mml:math id="m130">
<mml:mi mathvariant="bold">r</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfrac>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>.</mml:mo>
</mml:math>
</disp-formula>
</p>
<p>Next, to compute the shared translation vector <bold>p</bold>, we first note that<disp-formula id="equ8">
<mml:math id="m131">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msup>
</mml:math>
</disp-formula>
</p>
<p>and<disp-formula id="equ9">
<mml:math id="m132">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2b;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mi mathvariant="bold">p</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2b;</mml:mo>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
</mml:mfenced>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2b;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mi mathvariant="bold">p</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2b;</mml:mo>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfenced>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mstyle displaystyle="true">
<mml:munderover>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>l</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:munderover>
</mml:mstyle>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>l</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfenced>
<mml:mi mathvariant="bold">p</mml:mi>
<mml:mo>&#x2003;&#x2003;</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>I</mml:mi>
<mml:mo>,</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
</disp-formula>
</p>
<p>where <inline-formula id="inf104">
<mml:math id="m133">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> is the 3 &#xd7; 3 identity matrix, and notable that <inline-formula id="inf105">
<mml:math id="m134">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
</mml:msup>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> for any invertible 3 &#xd7; 3 matrix <bold>R</bold>. We then obtain <bold>p</bold> via a single cheap linear solve. To summarize, we compute <bold>r</bold> and <bold>p</bold>, and the resulting <inline-formula id="inf106">
<mml:math id="m135">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> and <inline-formula id="inf107">
<mml:math id="m136">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>&#x2019;s, via<disp-formula id="e21">
<mml:math id="m137">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfrac>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:msup>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mstyle displaystyle="true">
<mml:munderover>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:munderover>
</mml:mstyle>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfenced>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2003;&#x2003;</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>I</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mstyle displaystyle="true">
<mml:munderover>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>l</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:munderover>
</mml:mstyle>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>l</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfenced>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>I</mml:mi>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(21)</label>
</disp-formula>where, again, <bold>p</bold> is computed via a linear solve in the third equation. Note that this initialization can correspond to multiple solutions, as e.g., a 180-degree z-rotation can be achieved via four 45-degree or four &#x2212;45-degree z-rotations. Some examples of this phenomenon are shown in <xref ref-type="fig" rid="F6">Figure 6</xref>. As such, we try up to two solutions in TAA form. Given <inline-formula id="inf108">
<mml:math id="m138">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>, we first normalize <inline-formula id="inf109">
<mml:math id="m139">
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:math>
</inline-formula> to ensure <inline-formula id="inf110">
<mml:math id="m140">
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mo>&#x3c;</mml:mo>
<mml:mn>2</mml:mn>
<mml:mi>&#x3c0;</mml:mi>
</mml:math>
</inline-formula>. To this end, if <inline-formula id="inf111">
<mml:math id="m141">
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mo>&#x2208;</mml:mo>
<mml:mfenced open="[" close=")">
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mi>k</mml:mi>
<mml:mi>&#x3c0;</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mi>&#x3c0;</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:math>
</inline-formula> for some integer <italic>k</italic> &#x2265; 1, we apply<disp-formula id="equ10">
<mml:math id="m142">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2190;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mfrac>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>2</mml:mn>
<mml:mi>k</mml:mi>
<mml:mi>&#x3c0;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
</mml:mfrac>
<mml:mo>.</mml:mo>
</mml:math>
</disp-formula>
</p>
<fig id="F6" position="float">
<label>FIGURE 6</label>
<caption>
<p>Some examples of pose initialization results. The red poses are the originals, while the green poses are reflected. <bold>(A)</bold> First try yields extreme angles and flattened SP&#x2019;s; <bold>(B)</bold> reflected try yields inverted pose with legs clipping through the plates; <bold>(C)</bold> initializations yield mirrored poses. Axes units are in meters.</p>
</caption>
<graphic xlink:href="fmech-09-1225828-g006.tif"/>
</fig>
<p>Then, if we find that the resulting SP-frame translation vector <inline-formula id="inf112">
<mml:math id="m143">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> is too far (more than 60&#xb0;) from vertical, which is true if and only if<disp-formula id="equ11">
<mml:math id="m144">
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2264;</mml:mo>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mi mathvariant="bold">p</mml:mi>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mi>cos</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>&#x3c0;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mrow>
</mml:mfenced>
<mml:mo>,</mml:mo>
</mml:math>
</disp-formula>
</p>
<p>we reject the solution, and then try a second one. We obtain this second solution by reflecting the rotation <inline-formula id="inf113">
<mml:math id="m145">
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:math>
</inline-formula> about <italic>&#x3c0;</italic> to achieve the same rotation from the opposite direction, via<disp-formula id="equ12">
<mml:math id="m146">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2190;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mfrac>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mi>&#x3c0;</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">r</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
</mml:mfrac>
<mml:mo>.</mml:mo>
</mml:math>
</disp-formula>
</p>
<p>We have found computationally that this procedure consistently yields useful initial guesses for the optimizer, though the guesses are often kinematically invalid.</p>
</sec>
</sec>
<sec id="s3-4">
<title>3.4 Force-based IK optimization</title>
<p>We formulate the optimization problem for a stacked SP Assembler as a quadratically constrained quadratic program (QCQP). In this model, <inline-formula id="inf114">
<mml:math id="m147">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> and <inline-formula id="inf115">
<mml:math id="m148">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> are the driving decision variables, in that they uniquely specify a pose. The rest of the variables are derived directly from these. Note that, due to our choice of reference frame, we have <inline-formula id="inf116">
<mml:math id="m149">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>e</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mn mathvariant="double-struck">0</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:msup>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>, where <inline-formula id="inf117">
<mml:math id="m150">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> is the 3 &#xd7; 3 identity matrix.</p>
<p>Constraints related to kinematic validity are denoted via <bold>(KVC)</bold>; all other constraints establish definitions of intermediate variables.</p>
<p>Equations in this section are either labeled as (<italic>M&#x23;</italic>) to denote that they are used explicitly in the model, or as (<italic>&#x23;</italic>), to denote that this is just a calculation useful to deriving the model equations.</p>
<sec id="s3-4-1">
<title>3.4.1 Additional definitions</title>
<p>For the optimization model, we use all variables and parameters in <xref ref-type="sec" rid="s3-1">Section 3.1</xref> except <inline-formula id="inf118">
<mml:math id="m151">
<mml:msubsup>
<mml:mrow>
<mml:mi>J</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>s</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>, including only <bold>R</bold> and <bold>p</bold> for each <bold>&#x3d2;</bold> variable or parameter, and add the following additional variables. For clearer distinction between variables and parameters within this model, we will represent all variables using <inline-formula id="inf190">
<mml:math id="m257">
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mtext>blue</mml:mtext>
</mml:mstyle>
</mml:mrow>
</mml:math>
</inline-formula> text.</p>
</sec>
<sec id="s3-4-2">
<title>3.4.2 Constraints</title>
<p>Vector Norms: To model the two-norm <inline-formula id="inf119">
<mml:math id="m152">
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:math>
</inline-formula> of the leg length vector (which is equivalent to <inline-formula id="inf120">
<mml:math id="m153">
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:math>
</inline-formula>), we introduce intermediate variable <inline-formula id="inf121">
<mml:math id="m154">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">l</mml:mi>
<mml:mi mathvariant="normal">e</mml:mi>
<mml:mi mathvariant="normal">n</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>, then add the constraint<disp-formula id="eM1">
<mml:math id="m155">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">l</mml:mi>
<mml:mi mathvariant="normal">e</mml:mi>
<mml:mi mathvariant="normal">n</mml:mi>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mo>&#x3d;</mml:mo>
<mml:mstyle displaystyle="true">
<mml:munderover>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:munderover>
</mml:mstyle>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mspace width="1em"/>
<mml:mo>&#x2200;</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>J</mml:mi>
<mml:mo>.</mml:mo>
</mml:math>
<label>(M1)</label>
</disp-formula>
<disp-formula id="e22a">
<mml:math id="m156">
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mstyle>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
<mml:mo>&#x3d;</mml:mo>
<mml:mstyle displaystyle="true">
<mml:munderover>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:munderover>
</mml:mstyle>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>,</mml:mo>
</mml:math>
<label>(22a)</label>
</disp-formula>
<disp-formula id="e22b">
<mml:math id="m157">
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
<mml:msubsup>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>F</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:mstyle displaystyle="true">
<mml:munderover>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:munderover>
</mml:mstyle>
<mml:mstyle displaystyle="true">
<mml:munderover>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>l</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:munderover>
</mml:mstyle>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>l</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>.</mml:mo>
</mml:math>
<label>(22b)</label>
</disp-formula>
</p>
<p>Reference Frame Computations: The constraints in this section are needed to define <inline-formula id="inf122">
<mml:math id="m158">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>BP</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>&#x2019;s and <inline-formula id="inf123">
<mml:math id="m159">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>&#x2019;s. First, we express the global rotation matrices via their columns as<disp-formula id="eM2">
<mml:math id="m160">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mfenced open="" close="|">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo>:</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mspace width="0.17em"/>
</mml:mrow>
</mml:mfenced>
<mml:mspace width="0.17em"/>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo>:</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mspace width="0.17em"/>
<mml:mfenced open="|" close="">
<mml:mrow>
<mml:mspace width="0.17em"/>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo>:</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>3</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
</mml:mfenced>
<mml:mspace width="1em"/>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>I</mml:mi>
<mml:mo>.</mml:mo>
</mml:math>
<label>(M2)</label>
</disp-formula>Note that, as rotation matrices define an orthonormal right-handed coordinate system, it is sufficient to consider <inline-formula id="inf124">
<mml:math id="m161">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo>:</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> and <inline-formula id="inf125">
<mml:math id="m162">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo>:</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> as the driving variables, then compute <inline-formula id="inf126">
<mml:math id="m163">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo>:</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>3</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> as<disp-formula id="eM3">
<mml:math id="m164">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo>:</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>3</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo>:</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#xd7;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo>:</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>.</mml:mo>
</mml:math>
<label>(M3)</label>
</disp-formula>We then ensure the orthonormality of each <inline-formula id="inf127">
<mml:math id="m165">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo>:</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> and <inline-formula id="inf128">
<mml:math id="m166">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo>:</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> via<disp-formula id="eM4">
<mml:math id="m167">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msup>
<mml:mrow>
<mml:mfenced open="&#x2016;" close="&#x2016;">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo>:</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msup>
<mml:mrow>
<mml:mfenced open="&#x2016;" close="&#x2016;">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo>:</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo>:</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x22c5;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo>:</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(M4)</label>
</disp-formula>Next, to obtain the translation portion of each plate transformation in the SP frame, we inverse transform the global-frame point <inline-formula id="inf129">
<mml:math id="m168">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> by <inline-formula id="inf130">
<mml:math id="m169">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> by solving the forward transformation <inline-formula id="inf131">
<mml:math id="m170">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">T</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x22c4;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>, as defined in <xref ref-type="disp-formula" rid="e5">(5)</xref>, for the pre-transformed point <inline-formula id="inf132">
<mml:math id="m171">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>, yielding<disp-formula id="eM5">
<mml:math id="m172">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(M5)</label>
</disp-formula>We constrain that the bottom plate is at the origin in the global Assembler frame via<disp-formula id="eM6">
<mml:math id="m173">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mn mathvariant="double-struck">0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msup>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(M6)</label>
</disp-formula>Finally, we define the SP-frame rotation matrices <inline-formula id="inf133">
<mml:math id="m174">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>BP</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> via <inline-formula id="inf134">
<mml:math id="m175">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>BP</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>, yielding<disp-formula id="eM7">
<mml:math id="m176">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>BP</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(M7)</label>
</disp-formula>
</p>
<p>Moreover, any expressions of the form &#x2016;<bold>
<italic>v</italic>
</bold>&#x2016;<sup>2</sup>, <inline-formula id="inf135">
<mml:math id="m177">
<mml:mi mathvariant="bold-italic">v</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>, or <inline-formula id="inf136">
<mml:math id="m178">
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:msubsup>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>F</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>, <inline-formula id="inf137">
<mml:math id="m179">
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="double-struck">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>m</mml:mi>
<mml:mo>&#xd7;</mml:mo>
<mml:mi>m</mml:mi>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>, as in (<xref ref-type="disp-formula" rid="eM4">M4</xref>), (<xref ref-type="disp-formula" rid="equ23">T4</xref>), and (<xref ref-type="disp-formula" rid="equ20">T1</xref>), are substituted explicitly with the defining expressions.</p>
<p>Leg Attachment Locations: In (<xref ref-type="disp-formula" rid="eM8">M8</xref>), we define the SP-frame and global-frame locations of the leg attachments on the top/bottom plates for each SP according to <xref ref-type="disp-formula" rid="e6">(6)</xref>. Note that the position of the bottom leg attachments are known constants in local space. See also <xref ref-type="fig" rid="F3">Figure 3</xref>.<disp-formula id="eM8">
<mml:math id="m180">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>BP</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2b;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2200;</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>J</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>B</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2200;</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>J</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2b;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2200;</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2265;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>J</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2b;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2200;</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>J</mml:mi>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(M8)</label>
</disp-formula>
</p>
<p>Leg Centers of Gravity: To define the center of gravity for each leg <italic>j</italic> &#x2208; <italic>J</italic> for SP <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>, we start with <xref ref-type="disp-formula" rid="e16">(16)</xref>, multiply through by denominators, and rearrange, yielding<disp-formula id="eM9">
<mml:math id="m181">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">l</mml:mi>
<mml:mi mathvariant="normal">e</mml:mi>
<mml:mi mathvariant="normal">n</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>CoG</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>LB</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>CoG</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>,</mml:mo>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">l</mml:mi>
<mml:mi mathvariant="normal">e</mml:mi>
<mml:mi mathvariant="normal">n</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>CoG</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>d</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>LT</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>CoG</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(M9)</label>
</disp-formula>
</p>
<p>Leg Length Bounds: <bold>(KVC)</bold> We define the leg length bounding constraints via <xref ref-type="disp-formula" rid="e8">(8)</xref>, as<disp-formula id="eM10">
<mml:math id="m182">
<mml:msup>
<mml:mrow>
<mml:mi>L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>min</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2264;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">l</mml:mi>
<mml:mi mathvariant="normal">e</mml:mi>
<mml:mi mathvariant="normal">n</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2264;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>.</mml:mo>
</mml:math>
<label>(M10)</label>
</disp-formula>Note that the upper-bounding leg length constraints are second order cone constraints in terms of <inline-formula id="inf138">
<mml:math id="m183">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> and <inline-formula id="inf139">
<mml:math id="m184">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> (as the interiors of spheres), while the lower-bounding constraints are nonconvex as sphere exteriors.</p>
<p>Leg Angle Deviation: <bold>(KVC)</bold> The bottom-plate leg angle deviation constraints are defined via <xref ref-type="disp-formula" rid="e9">(9)</xref>, after multplying through by denominators, as The bottom-plate leg angle deviation constraints are defined via <xref ref-type="disp-formula" rid="e9">(9)</xref>, as<disp-formula id="eM11">
<mml:math id="m185">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">l</mml:mi>
<mml:mi mathvariant="normal">e</mml:mi>
<mml:mi mathvariant="normal">n</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mi>cos</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>&#x2264;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x22c5;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mspace width="1em"/>
<mml:mo>&#x2200;</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>J</mml:mi>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(M11)</label>
</disp-formula>while the top-plate constraints are defined via <xref ref-type="disp-formula" rid="e10">(10)</xref>, after multiplying through by denominators, as<disp-formula id="eM12">
<mml:math id="m186">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">l</mml:mi>
<mml:mi mathvariant="normal">e</mml:mi>
<mml:mi mathvariant="normal">n</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mi>cos</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>&#x2264;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x22c5;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>BP</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mspace width="1em"/>
<mml:mo>&#x2200;</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>J</mml:mi>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(M12)</label>
</disp-formula>
</p>
<p>Note that all leg angle deviation constraints are second-order cone constraints given fixed rotation matrices.</p>
<p>Continuous Translation Enforcement: <bold>(KVC)</bold> We enforce that legs do not break the surface of the bottom plate of any SP via <xref ref-type="disp-formula" rid="e11">(11)</xref>, as<disp-formula id="e23">
<mml:math id="m187">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>,</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2265;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>,</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
<label>(23)</label>
</disp-formula>
</p>
<p>Extreme Pose Prevention: <bold>(KVC)</bold> To help prevent extreme and difficult-to-reach poses for each SP, we enforce <xref ref-type="disp-formula" rid="e12">(12)</xref>, as<disp-formula id="e24">
<mml:math id="m188">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>k</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mtext>BP</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2265;</mml:mo>
<mml:mi>cos</mml:mi>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b8;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>max</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfenced>
<mml:mo>,</mml:mo>
<mml:mspace width="1em"/>
<mml:mi>k</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>1,2,3</mml:mn>
</mml:math>
<label>(24)</label>
</disp-formula>
</p>
<p>End Effector: <bold>(KVC)</bold> We enforce that the end effector pose is exactly as desired via<disp-formula id="eM13">
<mml:math id="m189">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo>:</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo>:</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo>:</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo>:</mml:mo>
<mml:mo>,</mml:mo>
<mml:mn>2</mml:mn>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(M13)</label>
</disp-formula>where <inline-formula id="inf140">
<mml:math id="m190">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> and <inline-formula id="inf141">
<mml:math id="m191">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> are computed from <inline-formula id="inf142">
<mml:math id="m192">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>.</p>
<p>Objective: The objective is to minimize maximal leg force<disp-formula id="eM14">
<mml:math id="m193">
<mml:mi>min</mml:mi>
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>.</mml:mo>
</mml:math>
<label>(M14)</label>
</disp-formula>where the constraints defining the maximum force <italic>&#x3c4;</italic>
<sup>max</sup> are introduced in <xref ref-type="sec" rid="s3-4-3">Section 3.4.3</xref>.</p>
<p>Initialization: As the model is solved only to local optimality via IPOPT due to the intractability of a global solve even with <italic>N</italic>
<sub>
<italic>P</italic>
</sub> &#x3d; 2, an initial solution for the pose is required. We choose to initialize via the same-SP initialization scheme in <xref ref-type="sec" rid="s3-3-2">Section 3.3.2</xref>, as it performed much better in our numerical testing when compared to the spline-based scheme in <xref ref-type="sec" rid="s3-3-1">Section 3.3.1</xref>, despite yielding valid poses less often before optimization.</p>
</sec>
<sec id="s3-4-3">
<title>3.4.3 Forces</title>
<p>Referring to <xref ref-type="disp-formula" rid="e15">(15)</xref>, the <italic>transposed adjoint</italic> of a transformation matrix <bold>T</bold> is<disp-formula id="e25">
<mml:math id="m194">
<mml:mi mathvariant="normal">A</mml:mi>
<mml:mi mathvariant="normal">d</mml:mi>
<mml:mi mathvariant="normal">j</mml:mi>
<mml:msup>
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:mi mathvariant="bold">T</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
<mml:msup>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mn mathvariant="double-struck">0</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
<mml:mo>.</mml:mo>
</mml:math>
<label>(25)</label>
</disp-formula>For shorthand, we let <inline-formula id="inf143">
<mml:math id="m195">
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">A</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>:</mml:mo>
<mml:mo>&#x3d;</mml:mo>
<mml:mi mathvariant="normal">A</mml:mi>
<mml:mi mathvariant="normal">d</mml:mi>
<mml:mi mathvariant="normal">j</mml:mi>
<mml:msup>
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">T</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> for each <italic>i</italic> &#x2208; <italic>I</italic>.</p>
<p>Each column of the transposed inverse Jacobian <inline-formula id="inf643">
<mml:math id="m695">
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:msup>
<mml:mrow>
<mml:mi>J</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>t</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mstyle>
</mml:mrow>
</mml:math>
</inline-formula> as in <xref ref-type="disp-formula" rid="e13">(13)</xref> via (<xref ref-type="disp-formula" rid="eM15">M15</xref>), can be computed as (see (<xref ref-type="bibr" rid="B22">Lynch and Park, 2017</xref>) for discussion on single SPs)<disp-formula id="eM15">
<mml:math id="m196">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">l</mml:mi>
<mml:mi mathvariant="normal">e</mml:mi>
<mml:mi mathvariant="normal">n</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:msup>
<mml:mrow>
<mml:mi>J</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>t</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo>:</mml:mo>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
<mml:mspace width="1em"/>
<mml:mo>&#x2200;</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>J</mml:mi>
<mml:mo>.</mml:mo>
</mml:math>
<label>(M15)</label>
</disp-formula>Note that <inline-formula id="inf144">
<mml:math id="m197">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="normal">l</mml:mi>
<mml:mi mathvariant="normal">e</mml:mi>
<mml:mi mathvariant="normal">n</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mo>&#x3d;</mml:mo>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:math>
</inline-formula> is the length of the corresponding leg, as modelled in (<xref ref-type="disp-formula" rid="eM1">M1</xref>).</p>
<p>To compute the global-frame wrenches for each SP, we use <xref ref-type="disp-formula" rid="e17">(17)</xref> for <italic>i</italic> &#x3d; 0, <italic>&#x2026;</italic>, <italic>N</italic>
<sub>
<italic>P</italic>
</sub> &#x2212; 2 and <xref ref-type="disp-formula" rid="e18">(18)</xref> for <italic>i</italic> &#x3d; <italic>N</italic>
<sub>
<italic>P</italic>
</sub> &#x2212; 1.</p>
<p>Finally, to compute the leg forces, and defining <inline-formula id="inf145">
<mml:math id="m198">
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="italic">&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:msub>
<mml:mo>,</mml:mo>
<mml:mo>&#x2026;</mml:mo>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="italic">&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> for each <italic>i</italic>, we use the vector constraints<disp-formula id="eM16">
<mml:math id="m199">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:msup>
<mml:mrow>
<mml:mi>J</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>t</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mi mathvariant="bold-italic">&#x3c4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">A</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>W</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2200;</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2265;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2200;</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>J</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msup>
<mml:mrow>
<mml:mi>&#x3c4;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>max</mml:mi>
</mml:mstyle>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2265;</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2200;</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>J</mml:mi>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(M16)</label>
</disp-formula>where the <italic>j</italic>th component of the resulting solution <inline-formula id="inf192">
<mml:math id="m259">
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula> is the force on the <italic>j</italic>th leg of the <italic>i</italic>th SP. We then minimize over <inline-formula id="inf193">
<mml:math id="m260">
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
</mml:math>
</inline-formula>.</p>
<p>Notice that <inline-formula id="inf194">
<mml:math id="m261">
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">A</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>W</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:math>
</inline-formula> can be written as:<disp-formula id="equ13">
<mml:math id="m200">
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">A</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>W</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:msup>
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:msup>
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
<mml:msup>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mn mathvariant="double-struck">0</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:msup>
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>W</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:msubsup>
<mml:mrow>
<mml:mi>W</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:msup>
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>W</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2b;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
<mml:msubsup>
<mml:mrow>
<mml:mi>W</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:msup>
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
<mml:msubsup>
<mml:mrow>
<mml:mi>W</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
<mml:mo>.</mml:mo>
</mml:math>
</disp-formula>
</p>
<p>Thus, the first constraint of (<xref ref-type="disp-formula" rid="eM16">M16</xref>) is equivalent to, and implemented as,<disp-formula id="eM17">
<mml:math id="m201">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:msup>
<mml:mrow>
<mml:mi>J</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>t</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold-italic">&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>W</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2b;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
<mml:msubsup>
<mml:mrow>
<mml:mi>W</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
<mml:msubsup>
<mml:mrow>
<mml:mi>W</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
<mml:mspace width="1em"/>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(M17)</label>
</disp-formula>Note that this constraint is bilinear in nature, since <inline-formula id="inf146">
<mml:math id="m202">
<mml:msubsup>
<mml:mrow>
<mml:mi>W</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> is a constant.</p>
<p>If <italic>w</italic>
<sub>2</sub> &#x2260; 0, we also enforce that the force on each leg does not exceed the maximum allowable force, via<disp-formula id="eM18">
<mml:math id="m203">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2264;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>f</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(M18)</label>
</disp-formula>
</p>
</sec>
<sec id="s3-4-4">
<title>3.4.4 Improving robustness</title>
<p>Due to the nature of iterative local nonlinear optimization via e.g., IPOPT, the equality constraints defining various intermediate variables such as leg lengths, rotation matrices, the inverse Jacobian etc., and even primary constraints such as end-effector position, can become violated as the solver attempts to resolve violations of the physical constraints defining a valid pose. We have observed that this can sometimes lead to instability within the optimizer, particularly if the end effector is moved from the goal position during optimization.</p>
<p>To address this instability while controlling for computational time, we implement an iterative-refinement scheme around the basic nonlinear optimizer. Here, we leverage the fact that the variables <inline-formula id="inf147">
<mml:math id="m204">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> uniquely define the Assembler. Thus, if an optimization seems to be converging slowly or returns with a &#x2018;locally infeasible&#x2019; status, we re-initialize the model every so often, and reset the end effector to the correct location.</p>
<p>To this end, we set the maximum total internal iteration count as 2,500. Every <italic>k</italic> iterations, if the solver has not yet converged, we stop the solve, re-initialize using the plate locations and corrected the end effector location, then continue. We start with <italic>k</italic> &#x3d; 500, but for each internal solver error we divide <italic>k</italic> in half and try again, with up to five such retries.</p>
<p>Occasionally, locally infeasible solutions can occur at valid poses, due to numerical difficulties in resolving force-related equality constraints. This results in sub-optimal, but kinematically valid, poses. When using IPOPT as the nonlinear solver, we have observed that the solver can often recover from such poses after re-initialization. Thus, to handle this contingency, on the first consecutive &#x2018;locally infeasible&#x2019; result, we deduct <italic>k</italic> iterations from the remaining total (as if the solver had run <italic>k</italic> iterations) and re-initialize as usual. On the second consecutive locally infeasible result for the same pose, we report an optimization failure due to local infeasibility within the solver.</p>
</sec>
</sec>
</sec>
<sec id="s4">
<title>4 Trajectory planning</title>
<p>The Assembler is designed to be a movable platform that can help with complicated operations. As such, it is important that it can move from one position to another. We will adapt the tools in the prior section to develop trajectory optimization techniques. We present two approaches: a na&#xef;ve direct transformation and a force optimization using trust regions. We also implemented an RRT&#x2a; version that hinges on sub-paths computed from the force optimization approach. However, our RRT&#x2a; did not produce as good results as the trust region method, so we do not include that in our description or results here.</p>
<p>Equations in this section are either labeled as (<italic>N&#x23;</italic>) (<italic>T&#x23;</italic>), or (<italic>&#x23;</italic>) to denote equations for na&#xef;ve method, trust method, or calculations, respectively.</p>
<sec id="s4-1">
<title>4.1 Na&#xef;ve direct transformation</title>
<p>We establish the simplest approach to move from one pose to another that we call the na&#xef;ve method. This approach is ignorant to force calculations, and thus is very prone to generating infeasible trajectories that violate the maximum force bounds. The approach simply uses a linear interpolation of the vector of leg lengths throughout the motion. For each target leg-length vector <inline-formula id="inf148">
<mml:math id="m205">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>, <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>, <italic>j</italic> &#x2208; <italic>J</italic>, the FK problem is solved to obtain the full trajectory planning solution. To solve this problem, we first attempt the widely-used Newton-Raphson approach, as in e.g., (<xref ref-type="bibr" rid="B28">Nguyen and Antrazi, 1990</xref>; <xref ref-type="bibr" rid="B24">Merlet, 2006</xref>). If this does not succeed, we then leverage a force-free version of the nonlinear optimizer to solve the FK problem, in which the end effector is allowed to move, and we optimize the squared leg-length-distance from the goal. More formally, to construct a QCQP model for the FK problem, we begin with the model in <xref ref-type="sec" rid="s3-4">Section 3.4</xref>, then remove all force-related constraints and the end effector constraint (<xref ref-type="disp-formula" rid="eM13">M13</xref>). We then optimize<disp-formula id="eN1">
<mml:math id="m206">
<mml:mi>min</mml:mi>
<mml:mstyle displaystyle="true">
<mml:munder>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:munder>
</mml:mstyle>
<mml:mstyle displaystyle="true">
<mml:munder>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>J</mml:mi>
</mml:mrow>
</mml:munder>
</mml:mstyle>
<mml:msup>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">L</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2212;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">L</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
<mml:mo>.</mml:mo>
</mml:math>
<label>(N1)</label>
</disp-formula>Note that the FK problem for the Assembler can decompose into separate FK problems for each SP.</p>
</sec>
<sec id="s4-2">
<title>4.2 Trust region optimization</title>
<p>We introduce a trust region method for trajectory planning of the SP. This algorithm first optimizes the starting and goal poses, then iteratively tries to make small steps towards the goal pose until it is sufficiently close, while trying to maintain forces that do not exceed those in the starting or ending poses.</p>
<sec id="s4-2-1">
<title>4.2.1 Additional definitions</title>
<p>To define the optimization problem for a single step, we first introduce the following additional parameters for the full optimization.</p>
<table-wrap id="udT7" position="float">
<caption>
<p>Additional parameters for trajectory planning problem.</p>
</caption>
<table>
<thead>
<tr>
<td align="left">Parameter</td>
<td align="left">Description</td>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">
<inline-formula id="inf149">
<mml:math id="m207">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>E</mml:mi>
<mml:mi>E</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>start</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
<td align="left">Starting end effector position</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf150">
<mml:math id="m208">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>E</mml:mi>
<mml:mi>E</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
<td align="left">Goal end effector position</td>
</tr>
<tr>
<td align="left">
<italic>&#x3bb;</italic>
<sup>force</sup> &#x2208; [0, 1]</td>
<td align="left">Coefficient for force-related objective terms</td>
</tr>
<tr>
<td align="left">
<italic>&#x3bb;</italic>
<sup>pose</sup> &#x2208; [0, 1]</td>
<td align="left">Coefficient for objective terms related to distance from the final goal pose</td>
</tr>
<tr>
<td align="left">
<italic>&#x3bb;</italic>
<sup>avg</sup> &#x2208; [0, 1]</td>
<td align="left">Additional multiplier for average-force-related objective term</td>
</tr>
<tr>
<td align="left">
<italic>&#x25b;</italic>
<sup>pos</sup>
</td>
<td align="left">Positional plate motion limit for each Stewart platform per iteration</td>
</tr>
<tr>
<td align="left">
<italic>&#x25b;</italic>
<sup>rot</sup>
</td>
<td align="left">Rotational plate motion limit for each Stewart platform per iteration</td>
</tr>
<tr>
<td align="left">
<bold>
<italic>F</italic>
</bold>
<sup>EE</sup>
</td>
<td align="left">The force vector applied to the end effector</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf151">
<mml:math id="m209">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>EE</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
<td align="left">The application point for <bold>
<italic>F</italic>
</bold>
<sup>EE</sup> w.r.t. the top plate of the assembler</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>Note that we normalize the non-negative objective weights with <italic>&#x3bb;</italic>
<sup>force</sup> &#x2b; <italic>&#x3bb;</italic>
<sup>pose</sup> &#x3d; 1. We then compute the full optimized starting and ending poses by solving the QCQP model in <xref ref-type="sec" rid="s3-4">Section 3.4</xref> with IPOPT, then compute the maximum force observed in either pose.</p>
<table-wrap id="udT8" position="float">
<caption>
<p>Computed initial state parameter for trajectory planning problem.</p>
</caption>
<table>
<thead>
<tr>
<td align="left">Parameter</td>
<td align="left">Description</td>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">
<inline-formula id="inf152">
<mml:math id="m210">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>start</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">Global-frame starting pose for plate <italic>i</italic> &#x2208; <italic>I</italic>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf153">
<mml:math id="m211">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>start</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">SP-frame starting pose for plate <italic>i</italic> &#x2208; <italic>I</italic>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf154">
<mml:math id="m212">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">Global-frame goal pose for plate <italic>i</italic> &#x2208; <italic>I</italic>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf155">
<mml:math id="m213">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">SP-frame goal pose for SP <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>
</td>
</tr>
<tr>
<td align="left">
<italic>f</italic>
<sup>max, ends</sup>
</td>
<td align="left">Maximum force in either path endpoint, the starting and goal poses</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>Note that, for practical use, the starting pose would be specified directly as the current pose of the Assembler.</p>
<p>For each iteration, we define the pose from the previous iteration as</p>
<table-wrap id="udT9" position="float">
<caption>
<p>Initial state parameters for the current iteration of the trust region trajectory planning method.</p>
</caption>
<table>
<thead>
<tr>
<td align="left">Parameter</td>
<td align="left">Description</td>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">
<inline-formula id="inf156">
<mml:math id="m214">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>init</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">Initial global-frame pose for plate <italic>i</italic> &#x2208; <italic>I</italic> for the current iteration</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf157">
<mml:math id="m215">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>init</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">Initial SP-frame pose for plate <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup> for the current iteration</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>Finally, we introduce the following additional variables for each iteration.</p>
<table-wrap id="udT10" position="float">
<caption>
<p>Additional variables for the current iteration of the trust region trajectory planning method.</p>
</caption>
<table>
<thead>
<tr>
<td align="left">Variable</td>
<td align="left">Description</td>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">
<inline-formula id="inf195">
<mml:math id="m262">
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:math>
</inline-formula>
<sup>viol</sup>
</td>
<td align="left">Maximum force above the maximum allowable force in any leg</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf196">
<mml:math id="m263">
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:math>
</inline-formula>
<sup>ends</sup>
</td>
<td align="left">Maximum force above <italic>f</italic>
<sup>max, ends</sup> in any leg</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf158">
<mml:math id="m216">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>abs</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">Absolute value of <inline-formula id="inf197">
<mml:math id="m264">
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:math>
</inline-formula>
<sub>
<italic>i</italic>,<italic>j</italic>
</sub> for leg <italic>i</italic> &#x2208; <italic>I</italic>
<sup>
<italic>P</italic>
</sup>, <italic>j</italic> &#x2208; <italic>J</italic>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf198">
<mml:math id="m265">
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>W</mml:mi>
</mml:mstyle>
</mml:math>
</inline-formula>
<sup>EE</sup>
</td>
<td align="left">End-effector wrench at the current pose</td>
</tr>
</tbody>
</table>
</table-wrap>
</sec>
<sec id="s4-2-2">
<title>4.2.2 Constraints</title>
<p>We begin with the model in <xref ref-type="sec" rid="s3-4">Section 3.4</xref>, omitting the end effector constraints (<xref ref-type="disp-formula" rid="eM13">M13</xref>) and the explicit force constraint (<xref ref-type="disp-formula" rid="eM18">M18</xref>). We also redefine the end effector wrench definition <italic>W</italic>
<sup>EE</sup> to account for the fact that the end effector is no longer at a fixed position.</p>
<p>We then add constraints to ensure that no plate moves a distance further than <italic>&#x25b;</italic>
<sup>pos</sup> from <inline-formula id="inf159">
<mml:math id="m217">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>init</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>, measured in two-norm, and rotates no further than <italic>&#x25b;</italic>
<sup>rot</sup> from <inline-formula id="inf160">
<mml:math id="m218">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>init</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>, measured in matrix Frobenius norm. The Frobenius norm was chosen for its superior performance and robustness compared to more direct angle-based measures in preliminary testing, combined with its simplicity and convexity. Finally, we add constraints to define <italic>&#x3c4;</italic>
<sup>viol</sup> and <italic>&#x3c4;</italic>
<sup>ends</sup>, then define the objective function.</p>
<p>Motion Limit: We ensure that positional and rotational motions are sufficiently controlled via<disp-formula id="equ20">
<mml:math id="m219">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>init</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:msubsup>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>F</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2264;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>rot</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>I</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2265;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>init</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2264;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mfenced open="(" close=")">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>pos</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>I</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2265;</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(T1)</label>
</disp-formula>Force Definitions: To define wrenches, we first define the now-variable rotational component <inline-formula id="inf202">
<mml:math id="m269">
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>W</mml:mi>
</mml:mstyle>
</mml:mrow>
</mml:math>
</inline-formula>
<sup>
<italic>R</italic>,EE</sup> of the end effector wrench <inline-formula id="inf203">
<mml:math id="m270">
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>W</mml:mi>
</mml:mstyle>
</mml:mrow>
</mml:math>
</inline-formula>
<sup>EE</sup> via<disp-formula id="equ21">
<mml:math id="m220">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>EE</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">v</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>EE</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2b;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>W</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>R</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>EE</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>m</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>EE</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
</mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold-italic">F</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>EE</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(T2)</label>
</disp-formula>where the translational component <italic>W</italic>
<sup>
<italic>P</italic>,EE</sup> &#x3d; <bold>
<italic>F</italic>
</bold>
<sup>EE</sup> of the wrench is constant. We then use <xref ref-type="disp-formula" rid="e18">(18)</xref> and <xref ref-type="disp-formula" rid="e17">(17)</xref> to define plate wrenches as before. Next, we define the additional required force-related variables with<disp-formula id="equ22">
<mml:math id="m221">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mtext>viol</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2265;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2212;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>f</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2200;</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>J</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mtext>ends</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2265;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2212;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>f</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>ends</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2200;</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>J</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>abs</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2265;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2200;</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>J</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>abs</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2265;</mml:mo>
<mml:mo>&#x2212;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2200;</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>J</mml:mi>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mtext>viol</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2265;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mtext>ends</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x2265;</mml:mo>
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(T3)</label>
</disp-formula>Note that, through <inline-formula id="inf412">
<mml:math id="m271">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mtext>viol</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:math>
</inline-formula>, the max-force constraints on the legs are moved to the objective with a high coefficient. For the purposes of balancing objective terms related to forces, distances, and rotation angles, we assume forces and distances are measured in SI units (i.e., Newtons and meters). Note that the rotation terms are unit-independent, as they are measured via Frobenius norms of unitary rotation matrices.</p>
</sec>
<sec id="s4-2-3">
<title>4.2.3 Objective</title>
<p>To assist in defining the objective functions, we define the following expressions for the sake of readability. These definitions are the &#x2018;distance-to-goal&#x2019; metrics for the objective function<disp-formula id="equ23">
<mml:math id="m222">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>-</mml:mo>
<mml:mtext>norm</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mstyle displaystyle="true">
<mml:munder>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:munder>
</mml:mstyle>
<mml:mstyle displaystyle="true">
<mml:munder>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>j</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>J</mml:mi>
</mml:mrow>
</mml:munder>
</mml:mstyle>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>abs</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>,</mml:mo>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="script">E</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mtext>pos</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mstyle displaystyle="true">
<mml:munder>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:munder>
</mml:mstyle>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msup>
<mml:mo>,</mml:mo>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="script">E</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mtext>rot</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:mstyle displaystyle="true">
<mml:munder>
<mml:mrow>
<mml:mo>&#x2211;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>I</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msup>
</mml:mrow>
</mml:munder>
</mml:mstyle>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:msubsup>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>F</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:msubsup>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(T4)</label>
</disp-formula>With these definitions, we define the objective function as<disp-formula id="equ24">
<mml:math id="m223">
<mml:mi>min</mml:mi>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3bb;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>force</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mtext>ends</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2b;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3bb;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>avg</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mn>6</mml:mn>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
</mml:mfrac>
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>-</mml:mo>
<mml:mtext>norm</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>1000</mml:mn>
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mtext>viol</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>&#x2b;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3bb;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>pose</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="script">E</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mtext>pos</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2b;</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:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="script">E</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mtext>rot</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
<mml:mo>.</mml:mo>
</mml:math>
<label>(T5)</label>
</disp-formula>Note that the decision to divide the <inline-formula id="inf161">
<mml:math id="m224">
<mml:msup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="script">E</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mtext>rot</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> by 4 serves to balance the position and rotation distance metrics, and performed well in preliminary testing compared to other coefficients. For Assemblers consisting of SP&#x2019;s of different sizes, this divisor should be re-scaled according to the size of the SP, while the choice of <italic>&#x3bb;</italic>
<sup>force</sup> should be re-scaled according to the weight of the SP.</p>
</sec>
<sec id="s4-2-4">
<title>4.2.4 Iteration</title>
<p>The trust region method proceeds by solving the problem described above until convergence. However, the process often stagnates, reaching positions where the objective to reduce forces overrides the objective to move towards the goal pose, or even moves in the wrong direction to improve average forces. When stagnation occurs due to high maximum forces, we divide <italic>&#x3bb;</italic>
<sup>force</sup> by 2, set <italic>&#x3bb;</italic>
<sup>pose</sup> &#x3d; 1 &#x2212; <italic>&#x3bb;</italic>
<sup>force</sup>, and try again with the same initial positions. Similarly, if either stagnation or motion in the wrong direction occurs due to average forces, we divide <italic>&#x3bb;</italic>
<sup>avg</sup> by 4 and try again with the same initial positions. The method converges when the distance between the current pose and the goal pose is small enough that the goal pose is a valid solution for the next iteration.</p>
<p>More formally, for the current iteration, define<disp-formula id="e26">
<mml:math id="m225">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="script">E</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>pos</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo>&#x3d;</mml:mo>
<mml:munder>
<mml:mrow>
<mml:mi>max</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>I</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2265;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:munder>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>init</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mo>,</mml:mo>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="script">E</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>rot</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo>&#x3d;</mml:mo>
<mml:munder>
<mml:mrow>
<mml:mi>max</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>I</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2265;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:munder>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>init</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>goal</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:msub>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>F</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(26)</label>
</disp-formula>Then <italic>convergence</italic> occurs when both <inline-formula id="inf162">
<mml:math id="m226">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="script">E</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>pos</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2264;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>pos</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> and <inline-formula id="inf163">
<mml:math id="m227">
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="script">E</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>rot</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2264;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>rot</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>. Early termination occurs if the process has stagnated or moved in the wrong direction too many times, or if too many iterations have been reached.</p>
<p>Due to the multi-objective nature of the trust region method, it is possible that insufficient progress towards the goal can occur during the solve. We call this a <italic>stagnation</italic> and formally define this to occur when one of the following criteria are met after optimizing:<disp-formula id="e27">
<mml:math id="m228">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:munder>
<mml:mrow>
<mml:mi>max</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>I</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2265;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:munder>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>init</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:mo>&#x2264;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>pos</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mn>100</mml:mn>
</mml:mrow>
</mml:mfrac>
<mml:mo>,</mml:mo>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:munder>
<mml:mrow>
<mml:mi>max</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x2208;</mml:mo>
<mml:mi>I</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>i</mml:mi>
<mml:mo>&#x2265;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
</mml:munder>
<mml:mo stretchy="false">&#x2016;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2212;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>init</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:msub>
<mml:mrow>
<mml:mo stretchy="false">&#x2016;</mml:mo>
</mml:mrow>
<mml:mrow>
<mml:mi>F</mml:mi>
</mml:mrow>
</mml:msub>
<mml:mo>&#x2264;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>rot</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:mrow>
<mml:mrow>
<mml:mn>100</mml:mn>
</mml:mrow>
</mml:mfrac>
<mml:mo>.</mml:mo>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(27)</label>
</disp-formula>Even if <italic>&#x3bb;</italic>
<sup>avg</sup> &#x3d; 0, stagnation can occur in the optimizer if <inline-formula id="inf204">
<mml:math id="m272">
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
</mml:math>
</inline-formula> <sup>max</sup> &#x3d; <italic>f</italic> <sup>max, ends</sup> and further progress requires forces above <italic>f</italic>
<sup> max, ends</sup>. Thus, if stagnation occurs, we conclude that the average-force term is the culprit only if <inline-formula id="inf205">
<mml:math id="m273">
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
</mml:math>
</inline-formula>
<sup> max</sup> &#x2264; <italic>f</italic>
<sup> max, ends</sup> &#x2212; 0.001, where the 1&#xa0;mN subtraction is added to be conservative, helping to prevent the algorithm from stagnating with repeated, futile reductions of <italic>&#x3bb;</italic>
<sup>avg</sup>.</p>
<p>We define a step to be in the <italic>wrong direction</italic> if both the positional and rotational components of the motion have moved somewhat away from the goal pose, i.e., if for an iteration <italic>k</italic> we have <inline-formula id="inf164">
<mml:math id="m229">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="script">E</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>pos</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2265;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="script">E</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>pos</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>1</mml:mn>
<mml:msup>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>4</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula> and <inline-formula id="inf165">
<mml:math id="m230">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="script">E</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>rot</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2265;</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="script">E</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi>max</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>rot</mml:mtext>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x2b;</mml:mo>
<mml:mn>1</mml:mn>
<mml:msup>
<mml:mrow>
<mml:mn>0</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>4</mml:mn>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>. We allow motion in the wrong direction in order to reduce maximum leg forces that seemed excessive, i.e., if <inline-formula id="inf905">
<mml:math id="m973">
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
</mml:math>
</inline-formula>
<sup> max</sup> &#x3e; <italic>f</italic>
<sup> max, ends</sup>. If we reject the motion step, then the position-related terms in the objective function have worsened while the max-force-related terms have not improved, and so the average force term must be the culprit.</p>
<p>Define the maximum allowed number of stagnated iterations as <italic>n</italic>
<sup>max, stag</sup>, and define the maximum number of iterations as <italic>k</italic>
<sup>max</sup>. The iteration then proceeds as in <xref ref-type="statement" rid="Algorithm_1">Algorithm 1</xref>. For shorthand, we define the solution path as a list of poses from the starting pose to the goal pose. As defined in <xref ref-type="sec" rid="s2">Section 2</xref>, a <italic>pose</italic> is the corresponding list of <inline-formula id="inf166">
<mml:math id="m231">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>&#x2019;s and <inline-formula id="inf167">
<mml:math id="m232">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi mathvariant="bold">R</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">G</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>&#x2019;s.</p>
<p>
<statement content-type="algorithm" id="Algorithm_1">
<label>Algorithm 1</label>
<p>General procedure for trust-region trajectory planning method.<list list-type="simple">
<list-item>
<p>
<bold>Input:</bold> A starting position <italic>pose</italic>
<sup>start</sup> and ending position <italic>pose</italic>
<sup>ends</sup>.</p>
</list-item>
<list-item>
<p>
<bold>Output:</bold> An integer <italic>K</italic> and a sequence of poses <italic>pose</italic>
<sub>0</sub>, <italic>&#x2026;</italic>, pose<sub>
<italic>k</italic>
</sub>
</p>
</list-item>
<list-item>
<p>1 <italic>n</italic>
<sup>stag</sup> &#x2190; 0, <italic>k</italic> &#x2190; 1, <italic>pose</italic>
<sub>0</sub> &#x2190; <italic>pose</italic>
<sup>start</sup>
</p>
</list-item>
<list-item>
<p>2 <bold>while</bold> <italic>not converged and</italic> <italic>n</italic>
<sup>stag</sup> &#x3c; <italic>n</italic>
<sup>max, stag</sup> <italic>and</italic> <italic>k</italic> &#x2264; <italic>k</italic>
<sup>max</sup> <bold>do</bold>
</p>
</list-item>
<list-item>
<p>3 <italic>pose</italic>
<sup>init</sup> &#x2190; <italic>pose</italic>
<sub>
<italic>k</italic>&#x2212;1</sub>
</p>
</list-item>
<list-item>
<p>4 Solve the trust region problem from position <italic>pose</italic>
<sup>init</sup> to compute solution <italic>pose</italic>
</p>
</list-item>
<list-item>
<p>5 <bold>if</bold> <italic>stagnation detected or (wrong direction detected and</italic> <inline-formula id="inf168">
<mml:math id="m233">
<mml:msubsup>
<mml:mrow>
<mml:mstyle displaystyle="false" mathcolor="blue">
<mml:mi>&#x3c4;</mml:mi>
</mml:mstyle>
</mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>&#x2212;</mml:mo>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="italic">ends</mml:mi>
</mml:mrow>
</mml:msubsup>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
</mml:math>
</inline-formula>
<italic>)</italic> <bold>then</bold>
</p>
</list-item>
<list-item>
<p>6 <bold>if</bold> <italic>wrong direction</italic> <bold>then</bold>
</p>
</list-item>
<list-item>
<p>7 <inline-formula id="inf169">
<mml:math id="m234">
<mml:msup>
<mml:mrow>
<mml:mi>&#x3bb;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>avg</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2190;</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:msup>
<mml:mrow>
<mml:mi>&#x3bb;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>avg</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>, <italic>n</italic>
<sup>stag</sup> &#x2190; <italic>n</italic>
<sup>stag</sup> &#x2b; 1</p>
</list-item>
<list-item>
<p>8 <bold>else</bold>
</p>
</list-item>
<list-item>
<p>9 <inline-formula id="inf170">
<mml:math id="m235">
<mml:msup>
<mml:mrow>
<mml:mi>&#x3bb;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>force</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo>&#x2190;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
<mml:msup>
<mml:mrow>
<mml:mi>&#x3bb;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>force</mml:mtext>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>, <italic>&#x3bb;</italic>
<sup>pose</sup> &#x2190; 1 &#x2212; <italic>&#x3bb;</italic>
<sup>force</sup>, <italic>n</italic>
<sup>stag</sup> &#x2190; <italic>n</italic>
<sup>stag</sup> &#x2b; 1</p>
</list-item>
<list-item>
<p>10 <bold>end if</bold>
</p>
</list-item>
<list-item>
<p>11 <bold>else</bold>
</p>
</list-item>
<list-item>
<p>12 <italic>pose</italic>
<sub>
<italic>k</italic>
</sub> &#x2190; <italic>pose</italic>, <italic>k</italic> &#x2190; <italic>k</italic> &#x2b; 1</p>
</list-item>
<list-item>
<p>13 <bold>end if</bold>
</p>
</list-item>
<list-item>
<p>14 <bold>end while</bold>
</p>
</list-item>
<list-item>
<p>15 <bold>if</bold> <italic>converged</italic> <bold>then</bold>
</p>
</list-item>
<list-item>
<p>16 <italic>pose</italic>
<sub>
<italic>k</italic>
</sub> &#x2190; <italic>pose</italic>
<sup>goal</sup>
</p>
</list-item>
<list-item>
<p>17 <bold>end if</bold>
</p>
</list-item>
</list>
</p>
</statement>
</p>
<p>To improve the consistency of this algorithm, we run it within a backtracking scheme: if convergence fails, then we assume the iteration got sidetracked by forces, and restart after dividing <italic>&#x3bb;</italic>
<sup>force</sup> by 4, for up to 5 total restarts. Then, if convergence succeeds, but maximal mid-path forces exceed maximum path-endpoint forces, we run again with <italic>pose</italic>
<sup>start</sup> and <italic>pose</italic>
<sup>ends</sup> switched to try to find a better path. We only keep this reversed solution if it converges and yields better worst-case mid-path forces.</p>
</sec>
</sec>
</sec>
<sec id="s5">
<title>5 Experimental results</title>
<p>The results in <xref ref-type="sec" rid="s5-2">Section 5.2</xref> and <xref ref-type="sec" rid="s5-3">5.3</xref> were coded in Python 3.7, while the optimization steps were performed in IPOPT 3.11.1 (<xref ref-type="bibr" rid="B39">W&#xe4;chter and Biegler, 2005</xref>) via Pyomo 5.7 (<xref ref-type="bibr" rid="B13">Hart et al., 2011</xref>; <xref ref-type="bibr" rid="B4">Bynum et al., 2021</xref>). They were run on a laptop running Windows 10 with 32&#xa0;GB of RAM, using an Intel Core i7-9750H CPU processor (2.6GHz, 6 Cores, 12 threads). Additional computations were run on a desktop computer running Windows 10 with 64&#xa0;GB of RAM, using an AMD Ryzen 9 3900X 12-Core processsor running at 3.79&#xa0;Ghz.</p>
<p>For these computational studies, we use the following parameters. All parameters are given in SI units, i.e., kilograms, meters, seconds, and Newtons for masses, distances, time, and forces, respectively.</p>
<table-wrap id="udT11" position="float">
<caption>
<p>Experimental Results Parameters.</p>
</caption>
<table>
<thead>
<tr>
<td align="left">Parameter</td>
<td align="left">Value</td>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="left">
<italic>N</italic>
<sub>
<italic>P</italic>
</sub>
</td>
<td align="left">4</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf171">
<mml:math id="m236">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">&#x3d2;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>TP</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">[0,0,0.5069351,0,0,0]<sup>
<italic>&#x22a4;</italic>
</sup>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf172">
<mml:math id="m237">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">
<inline-formula id="inf173">
<mml:math id="m238">
<mml:msup>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mn>0.150037</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>0.150037</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.040202</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.109834</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.109834</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.040202</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.040202</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>0.040202</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>0.150037</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>0.109834</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.109834</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.150037</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mn>0.016637</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>0.016637</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>0.016637</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>0.016637</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>0.016637</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>0.016637</mml:mn>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf174">
<mml:math id="m239">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">
<inline-formula id="inf175">
<mml:math id="m240">
<mml:msup>
<mml:mrow>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mn>0.109834</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>0.109834</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>0.040202</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.150037</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.150037</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>0.040202</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.109834</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>0.109834</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>0.150037</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>0.040202</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.040202</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.150037</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.016637</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.016637</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.016637</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.016637</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.016637</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</mml:mo>
<mml:mn>0.016637</mml:mn>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:mrow>
<mml:mrow>
<mml:mo>&#x22a4;</mml:mo>
</mml:mrow>
</mml:msup>
</mml:math>
</inline-formula>
</td>
</tr>
<tr>
<td align="left">
<italic>&#x3b8;</italic>
<sup>max</sup>
</td>
<td align="left">55&#xb0;</td>
</tr>
<tr>
<td align="left">
<italic>&#x3b8;</italic>
<sup>
<bold>R</bold>,&#x2009;max</sup>
</td>
<td align="left">60&#xb0;</td>
</tr>
<tr>
<td align="left">(<italic>L</italic>
<sup>min</sup>, <italic>L</italic>
<sup>max</sup>)</td>
<td align="left">(0.38044, 0.580434)</td>
</tr>
<tr>
<td align="left">
<italic>f</italic>
<sup>max</sup>
</td>
<td align="left">889.644</td>
</tr>
<tr>
<td align="left">
<inline-formula id="inf176">
<mml:math id="m241">
<mml:msubsup>
<mml:mrow>
<mml:mi>m</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>&#x3d;</mml:mo>
<mml:mn>0</mml:mn>
<mml:mo>:</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>N</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>P</mml:mi>
</mml:mrow>
</mml:msub>
</mml:mrow>
<mml:mo stretchy="false">)</mml:mo>
</mml:mrow>
</mml:mrow>
<mml:mrow>
<mml:mtext>P</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>
</td>
<td align="left">[7.235,14.47,14.47,14.47,7.235]<sup>
<italic>&#x22a4;</italic>
</sup>
</td>
</tr>
<tr>
<td align="left">
<italic>m</italic>
<sup>LT</sup>
</td>
<td align="left">0.15</td>
</tr>
<tr>
<td align="left">
<italic>m</italic>
<sup>LB</sup>
</td>
<td align="left">0.2</td>
</tr>
<tr>
<td align="left">
<italic>d</italic>
<sup>LT,CoG</sup>
</td>
<td align="left">0.05</td>
</tr>
<tr>
<td align="left">
<italic>d</italic>
<sup>LB,CoG</sup>
</td>
<td align="left">0.089</td>
</tr>
<tr>
<td align="left">
<italic>g</italic>
</td>
<td align="left">9.81</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>For even <italic>i</italic>, The values of <inline-formula id="inf177">
<mml:math id="m242">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> and <inline-formula id="inf178">
<mml:math id="m243">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> are equal to <inline-formula id="inf179">
<mml:math id="m244">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula> and <inline-formula id="inf180">
<mml:math id="m245">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:math>
</inline-formula>, respectively. For odd <italic>i</italic>, we have<disp-formula id="e28">
<mml:math id="m246">
<mml:mtable class="array">
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>odd</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">B</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LB</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="right">
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
<mml:mtd columnalign="left">
<mml:mo>&#x3d;</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>odd</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:msubsup>
<mml:mrow>
<mml:mi mathvariant="bold">p</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi>j</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mi mathvariant="script">T</mml:mi>
<mml:mi mathvariant="script">P</mml:mi>
<mml:mo>,</mml:mo>
<mml:mtext>LT</mml:mtext>
<mml:mo>,</mml:mo>
<mml:mtext>rest</mml:mtext>
</mml:mrow>
</mml:msubsup>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:math>
<label>(28)</label>
</disp-formula>
</p>
<p>Where <italic>R</italic>
<sup>odd</sup> is a 30-degree rotation about the <italic>z</italic>-axis,<disp-formula id="e29">
<mml:math id="m247">
<mml:msup>
<mml:mrow>
<mml:mi>R</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>odd</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo>&#x3d;</mml:mo>
<mml:mfenced open="[" close="]">
<mml:mrow>
<mml:mtable class="matrix">
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mfrac>
<mml:mrow>
<mml:msqrt>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msqrt>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mo>&#x2212;</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:mtd>
<mml:mtd columnalign="center">
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mfrac>
<mml:mrow>
<mml:mn>1</mml:mn>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mfrac>
<mml:mrow>
<mml:msqrt>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:msqrt>
</mml:mrow>
<mml:mrow>
<mml:mn>2</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>0</mml:mn>
</mml:mtd>
</mml:mtr>
<mml:mtr>
<mml:mtd columnalign="center">
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>0</mml:mn>
</mml:mtd>
<mml:mtd columnalign="center">
<mml:mn>1</mml:mn>
</mml:mtd>
</mml:mtr>
</mml:mtable>
</mml:mrow>
</mml:mfenced>
</mml:math>
<label>(29)</label>
</disp-formula>
</p>
<sec id="s5-1">
<title>5.1 Pose generation</title>
<p>We describe the procedure for generating the dataset of poses that we use to generate end-effector goal positions for the computational studies in this work. This generation begins with the generation of individual random poses for the intended SP configuration. Given that the target 4-SP Assembler consists of four separate robots, poses can be generated by applying kinematic operations on each constituent SP separately, then stacking them, resulting in a full pose for the Assembler.</p>
<p>Pose generation for the individual SPs came in two varieties: Uniform and Extreme. Uniform poses were generated by applying the FK algorithm to a SP with a set of leg lengths uniformly generated from their minimum and maximum extensions. Configurations that resulted in an error or were at the &#x201c;home&#x201d; position (via error correction) were discounted, and iteration continued until a set number of poses (for the purpose of this paper, 10,000) were generated. Extreme poses followed the same procedure, with the added caveat that poses which did not meet a minimum measure of rotation magnitude of 30-degrees were also rejected, leaving only poses with the requisite tilt factor. Tilt was selected as being more important than translation because a tilt in one platform has a much greater change potential in a stack end effector than does translation.</p>
<p>Once individual SP poses were completed, the 4-SP stacked poses could be constructed. There were three categories of poses which we trialed: Uniform, Extreme, and Repeated. Uniform poses drew from the aforementioned uniform individual poses, while Extreme drew from the extreme poses. For both, four poses are chosen at random from their constituent files and applied to create a stacked pose. The end effector position (topmost plate of the topmost SP) is recorded, along with the plate positions and leg lengths of all constituent platforms. The Repeated poses differ slightly in generation. They too draw from the extreme pose file, but only one individual SP pose is chosen, and is applied to each platform in the stack, such that the ultimate pose is severely biased towards tilt in the direction of the constituent SP pose. For the purposes of this analysis, each type of pose generator produced three files consisting of 100, 1,000, and 10,000 poses respectively. The 100 pose file is intended purely for testing, whereas the two larger datasets for each type were earmarked for analysis.</p>
</sec>
<sec id="s5-2">
<title>5.2 Pose optimization</title>
<p>In this section, we compare the SIK and OPT methods for solving the IK problem on the instances generated in <xref ref-type="sec" rid="s5-1">Section 5.1</xref>. We also include the force-related information for the initially generated poses (GEN) as a reference.</p>
<p>
<xref ref-type="table" rid="T1">Table 1</xref> summarizes the performance of the SIK and OPT methods on various instances, while <xref ref-type="table" rid="T2">Table 2</xref> summarizes some additional performance characteristics determined during meta-analysis. A pose is said to be <italic>valid</italic> the end effector and base plates are in the correct pose, and all constraints related to kinematic validity are satisfied. A valid pose is said to be <italic>force-valid</italic> if the maximum-force constraints are also satisfied. The Avg % and Avg Max % Reduced metrics measure the percent reduction of forces out of the instances for which both methods yield kinematically valid poses. The % Improved metric measures the percentage of poses for which OPT yielded a better pose then SIK, out of the poses for which at least one of the methods yielded a valid pose. Finally, the Avg OPT Time metric measures the average time required for the OPT method to terminate, regardless of termination status.</p>
<table-wrap id="T1" position="float">
<label>TABLE 1</label>
<caption>
<p>Performance metrics for SIK and OPT, out of 10,000 random poses.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th align="center">Dataset</th>
<th align="center">Solver</th>
<th align="right">Valid poses</th>
<th align="right">Force-valid poses</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="center">Uniform</td>
<td align="center">GEN</td>
<td align="right">10,000</td>
<td align="right">627</td>
</tr>
<tr>
<td align="left">
</td>
<td align="center">SIK</td>
<td align="right">9,048</td>
<td align="right">4,416</td>
</tr>
<tr>
<td align="left"/>
<td align="center">OPT</td>
<td align="right">10,000</td>
<td align="right">9,895</td>
</tr>
<tr>
<td align="center">Extreme</td>
<td align="center">GEN</td>
<td align="right">10,000</td>
<td align="right">323</td>
</tr>
<tr>
<td align="left">
</td>
<td align="center">SIK</td>
<td align="right">8,905</td>
<td align="right">3,459</td>
</tr>
<tr>
<td align="left"/>
<td align="center">OPT</td>
<td align="right">10,000</td>
<td align="right">9,903</td>
</tr>
<tr>
<td align="center">Repeated</td>
<td align="center">GEN</td>
<td align="right">10,000</td>
<td align="right">1,479</td>
</tr>
<tr>
<td align="left">
</td>
<td align="center">SIK</td>
<td align="right">2,191</td>
<td align="right">187</td>
</tr>
<tr>
<td align="left"/>
<td align="center">OPT</td>
<td align="right">10,000</td>
<td align="right">8,317</td>
</tr>
</tbody>
</table>
</table-wrap>
<table-wrap id="T2" position="float">
<label>TABLE 2</label>
<caption>
<p>Improvement of OPT over SIK, along with average computational time for 10,000 random poses.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th align="center">Dataset</th>
<th align="right">Avg (%)Reduced</th>
<th align="right">Avg max (%)Reduced</th>
<th align="right">% improved</th>
<th align="right">Avg OPT time (s)</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td align="center">Uniform</td>
<td align="right">34.03</td>
<td align="right">57.4</td>
<td align="right">100</td>
<td align="right">1.15</td>
</tr>
<tr>
<td align="center">Extreme</td>
<td align="right">33.85</td>
<td align="right">58.51</td>
<td align="right">100</td>
<td align="right">1.18</td>
</tr>
<tr>
<td align="center">Repeated</td>
<td align="right">37.81</td>
<td align="right">64.67</td>
<td align="right">100</td>
<td align="right">1.19</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>Note that the optimizer is always able to find kinematically valid poses when initialized via the same-SP approach, even when the initial guesses are not kinematically valid. This effectiveness is especially noticeable for poses from the difficult Repeated datasets, for the success rate from SIK was only about 22%.</p>
<p>
<xref ref-type="fig" rid="F7">Figure 7</xref> showcases the force-performance for the SIK and OPT approaches. From the figure, note that, particularly for the repeated dataset, the problems yielding kinematically valid poses for SIK are significantly less likely to yield force-invalid poses in OPT.</p>
<fig id="F7" position="float">
<label>FIGURE 7</label>
<caption>
<p>Pose comparison of OPT, GENerated, and SIK forces, considering the poses for which both approaches yielded kinematically valid poses. <bold>(A)</bold> Comparison of maximum leg forces, <bold>(B)</bold> Factor of improvement of OPT over each method. Forces are in Newtons. The mass of the actuators and Assembler plates as well as a 5&#xa0;kg mass at the final End Effector are taken to account in the experiments.</p>
</caption>
<graphic xlink:href="fmech-09-1225828-g007.tif"/>
</fig>
<p>
<xref ref-type="fig" rid="F8">Figure 8</xref> showcases the computational performance of the optimizer over the Extreme and Repeated instances. The Uniform performance plot is omitted due to its strong similarity to the Extreme plot, but with one outlier requiring more than 16s. Note that the time-performance for the Repeated poses is more polarized than for other datasets: &#x223c;55% (vs. &#x223c;40%) of poses solve in less than 1s, but &#x223c;10% (vs. &#x223c;3%) require more than 2s to solve.</p>
<fig id="F8" position="float">
<label>FIGURE 8</label>
<caption>
<p>Computation times for OPT over 10,000 poses for the Extreme and Repeated instance families.</p>
</caption>
<graphic xlink:href="fmech-09-1225828-g008.tif"/>
</fig>
<p>From <xref ref-type="table" rid="T1">Table 1</xref> and <xref ref-type="fig" rid="F7">Figure 7</xref>, we see a very strong degree of improvement in the resulting forces compared to the SIK heuristic. The forces are at least halved between 70% and 80% of the time, with improvement factors over 8 in some cases. This improvement, combined with the fast computation times observed in <xref ref-type="fig" rid="F8">Figure 8</xref>, renders the OPT approach a viable method for the generation of force-optimized poses for SPs. Note that, in terms of forces, even the SIK approach was typically able to find much better poses than were initially generated, when it succeeded in generating a kinematically valid pose.</p>
</sec>
<sec id="s5-3">
<title>5.3 Trajectory planning</title>
<p>In this section, we demonstrate the effectiveness of the trust region method, then showcase how this method can be used in conjunction with RRT&#x2a; to obtain good obstacle-avoiding paths very quickly after pre-processing.</p>
<p>To demonstrate the effectiveness of the trust region method, we showcase a difficult motion: a transition between opposite bent-over poses. We showcase using the thin-plated SP with <italic>&#x25b;</italic>
<sup>pos</sup> &#x3d; 0.2, <inline-formula id="inf181">
<mml:math id="m248">
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>rot</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi>&#x3c0;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>3</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula>, <italic>&#x3bb;</italic>
<sup>force</sup> &#x3d; 0.04, <italic>&#x3bb;</italic>
<sup>pose</sup> &#x3d; 0.96, and <italic>&#x3bb;</italic>
<sup>avg</sup> &#x3d; 0.05. The sample motion, along with a plot showing the progression of the motion in terms of the forces and the maximum plate global-frame distances from any plate to the ending pose, is shown in <xref ref-type="fig" rid="F9">Figure 9</xref>.</p>
<fig id="F9" position="float">
<label>FIGURE 9</label>
<caption>
<p>Force-controlled transition between bent-over poses using trust region method. (Left) Axes units are in meters. (Right) Force in Newtons. The mass of the actuators and Assembler plates as well as a 5&#xa0;kg mass at the final End Effector are taken to account in the experiments.</p>
</caption>
<graphic xlink:href="fmech-09-1225828-g009.tif"/>
</fig>
<p>To demonstrate the consistency and performance of the trust region method, we compare the trust region method with the direct transformation and the RRT&#x2a; approach.</p>
<p>A comparison trajectory planning results for all datasets are shown in <xref ref-type="table" rid="T3">Table 3</xref>. The settings used for the trust-region method were <italic>&#x25b;</italic>
<sup>pos</sup> &#x3d; 0.1, <inline-formula id="inf182">
<mml:math id="m249">
<mml:msup>
<mml:mrow>
<mml:mi>&#x3b5;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mtext>rot</mml:mtext>
</mml:mrow>
</mml:msup>
<mml:mo>&#x3d;</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mi>&#x3c0;</mml:mi>
</mml:mrow>
<mml:mrow>
<mml:mn>6</mml:mn>
</mml:mrow>
</mml:mfrac>
</mml:math>
</inline-formula>, <italic>&#x3bb;</italic>
<sup>force</sup> &#x3d; 0.04, <italic>&#x3bb;</italic>
<sup>pose</sup> &#x3d; 0.96, and <italic>&#x3bb;</italic>
<sup>avg</sup> &#x3d; 0.05. Some primary metrics of the solution are given as<list list-type="simple">
<list-item>
<p>1. Behaved: A path is considered <italic>behaved</italic> if the maximum leg forces mid-motion do not exceed the maximum forces at the starting or ending pose.</p>
</list-item>
<list-item>
<p>2. Force-Valid: A path is considered <italic>force-valid</italic> if either all leg forces are valid throughout the motion, or if the path is behaved with excessive leg forces at either the starting or ending pose.</p>
</list-item>
<list-item>
<p>3. Avg OPT Time: The average optimization time across all tests.</p>
</list-item>
</list>
</p>
<table-wrap id="T3" position="float">
<label>TABLE 3</label>
<caption>
<p>Comparison of trajectory planning results for trust-region vs. na&#xef;ve FK, out of 1,000 random poses.</p>
</caption>
<table>
<thead valign="top">
<tr>
<th align="center">Dataset</th>
<th align="center">Method</th>
<th align="right">% behaved</th>
<th align="right">% force-valid</th>
<th align="right">Avg OPT time (s)</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td rowspan="2" align="center">Uniform</td>
<td align="center">Trust</td>
<td align="right">100</td>
<td align="right">100</td>
<td align="right">15.06</td>
</tr>
<tr>
<td align="center">Na&#xef;ve</td>
<td align="right">1.0</td>
<td align="right">78.5</td>
<td align="right">7.79</td>
</tr>
<tr>
<td rowspan="2" align="center">Extreme</td>
<td align="center">Trust</td>
<td align="right">99.9</td>
<td align="right">100</td>
<td align="right">15.35</td>
</tr>
<tr>
<td align="center">Na&#xef;ve</td>
<td align="right">1.3</td>
<td align="right">75.1</td>
<td align="right">8.34</td>
</tr>
<tr>
<td rowspan="2" align="center">Repeated</td>
<td align="center">Trust</td>
<td align="right">99.8</td>
<td align="right">100</td>
<td align="right">22.20</td>
</tr>
<tr>
<td align="center">Na&#xef;ve</td>
<td align="right">0.3</td>
<td align="right">19.7</td>
<td align="right">9.08</td>
</tr>
</tbody>
</table>
</table-wrap>
<p>We show a more complete picture of the maximum leg forces resulting from the two approaches in <xref ref-type="fig" rid="F10">Figure 10</xref>, and compare the motion energies in <xref ref-type="fig" rid="F11">Figure 11</xref>. To estimate the motion energies, we assume that extending a leg under tensile forces and contracting a leg under compression forces are free operations, and count only the portions of the motions that require energy input.</p>
<fig id="F10" position="float">
<label>FIGURE 10</label>
<caption>
<p>Comparison of maximum forces between trajectory planning methods. <bold>(A)</bold> Comparison of maximum forces, <bold>(B)</bold> Factor of improvement of trust-region method over na&#xef;ve interpolated FK. The green line represents the maximum allowed force.</p>
</caption>
<graphic xlink:href="fmech-09-1225828-g010.tif"/>
</fig>
<fig id="F11" position="float">
<label>FIGURE 11</label>
<caption>
<p>Comparison of motion energies between trajectory planning methods. <bold>(A)</bold> Comparison of motion energies, <bold>(B)</bold> Extra-energy factor of trust-region method over na&#xef;ve interpolated FK.</p>
</caption>
<graphic xlink:href="fmech-09-1225828-g011.tif"/>
</fig>
<p>The results reveal that the trust region method is far more consistent, with maximum forces only rarely exceeding those at the end effectors (in 0.1% of cases), and with maximum-force improvements as high as a factor of 5. However, the gains in maximum forces and consistency come at a price: the motion energies tend to be far higher, exceeding the more direct motions by as much as a factor of 7. Furthermore, the na&#xef;ve approach solves roughly twice as quickly as the trust region approach. Thus, in practice, we recommend first computing the na&#xef;ve motion, then applying the trust region method if the motion is either near-infeasible or very poorly behaved, with mid-motion max-forces far higher then endpoint max-forces.</p>
<p>Note that, in practice, any leg motion requires some baseline motor energy usage even under zero net forces, which would further strengthen the energy advantage gained from the shorter na&#xef;ve motions.</p>
</sec>
<sec id="s5-4">
<title>5.4 Range of motion analysis</title>
<p>Using a stochastic method, we analyzed the range of motion for the SIK method for both the thin and thick-plated SPs. The results are shown in <xref ref-type="fig" rid="F12">Figure 12</xref>.</p>
<fig id="F12" position="float">
<label>FIGURE 12</label>
<caption>
<p>Range of motion approximation for the test Assembler used in our computational experiments. Axes units are in meters. Plot shows points where the end-effector can be located. Note that there is a hole in the middle of this image since certain shorter end-effector points are not reachable.</p>
</caption>
<graphic xlink:href="fmech-09-1225828-g012.tif"/>
</fig>
<p>For a single SP, the simplified range of motion (ROM) methodology is to create a number of concentric scaled unit spheres centered at the platform&#x2019;s rest pose (a sphere with a certain number of points evenly distributed about its exterior surface) and calculate IK for each point, along with perturbing the rotations at the extremes. Points that succeed are admitted into the ROM cloud, and those that do not are discarded. The final ROM graphic is created by utilizing the technique Alpha-Shapes in order to create a concave hull illustrating the reachability of the platform.</p>
</sec>
</sec>
<sec sec-type="conclusion" id="s6">
<title>6 Conclusion</title>
<p>We have presented a fast approach for the force-optimization of stacked SPs that can significantly improve their range of motion under heavy loads. In particular, the optimization step can result in reductions of the worst-case leg forces by as much as an order of magnitude in some cases. Further, we have presented a fast, consistent trust-region trajectory planning approaches based on this pose optimization scheme, and demonstrated the effectiveness of the approach in comparison to a simple length-based optimization approach.</p>
<p>In the future, the ultimate goal is to use these stacked SP structures to perform automated assembly operations. To improve on the pose optimization approach, we suggest exploring the use of more robust heuristics in conjunction with the local optimizer proposed in this work. For example, to improve pose optimization given fixed base and end-effector positions, one could quickly compute rough bounds on the possible poses for the middle plates, then apply heuristics such as a genetic algorithm or a bidirectional search, with frequent or intermittent local optimization steps, to quickly hone in on a solution. Alternatively, one could construct some fast heuristic for generating randomized feasible or near-feasible poses for a fixed end-effector position, then locally optimize a moderate number of random poses in parallel to seek a stronger solution with limited additional computational cost.</p>
<p>Lastly, it may be possible to make our objective function for the trajectory optimization more realistic. Our objective tracks the amount of energy used over time. However, since the amperage needed for expansion and contraction of the leg joints is a nonlinear function of the movement, we may be able to study this function using our hardware to model a better objective function that reflects the amperage used for each movement. This will require further hardware experimentation.</p>
</sec>
</body>
<back>
<sec sec-type="data-availability" id="s7">
<title>Data availability statement </title>
<p>The raw data supporting the conclusion of this article will be made available by the authors, without undue reservation.</p>
</sec>
<sec id="s8">
<title>Author contributions </title>
<p>BB is responsible for the force-based inverse kinematics optimization math, pose optimization, and trust-based trajectory planning. WC is responsible for determining the kinematic constraints for the Stewart platform chain, force calculations, pose generation, and trajectory planning. SC created a hardware load-cell equipped Stewart platform to test the force feedback and use data to verify the mathematical model. RH and EK are advisors for this project and provided ideas and guidance on approaches in addition to writing and editing the manuscript. All authors contributed to the article and approved the submitted version.</p>
</sec>
<sec id="s9">
<title>Funding </title>
<p>Some of this material is based on work supported by NASA via contract 80LARC20P0020 for the &#x201c;Assemblers: A modular and reconfigurable manipulation system for autonomous in-space assembly&#x201d; project. Additionally, this material was also partially based on work sponsored by the Northrop Grumman Undergraduate Research Experience in Industrial &#x26; Systems Engineering at Virginia Tech project. Any opinions, findings, and conclusion or recommendations expressed in this material are those of the authors and do not necessarily reflect the views of the Northrop Grumman Corporation. RH and BB are funded by AFOSR grant FA9550-21-0107.</p>
</sec>
<sec sec-type="COI-statement" id="s10">
<title>Conflict of interest </title>
<p>The authors declare that the research was conducted in the absence of any commercial or financial relationships that could be construed as a potential conflict of interest.</p>
</sec>
<sec sec-type="disclaimer" id="s11">
<title>Publisher&#x2019;s note</title>
<p>All claims expressed in this article are solely those of the authors and do not necessarily represent those of their affiliated organizations, or those of the publisher, the editors and the reviewers. Any product that may be evaluated in this article, or claim that may be made by its manufacturer, is not guaranteed or endorsed by the publisher.</p>
</sec>
<sec id="s13">
<title>Author disclaimer</title>
<p>Any opinions, findings, and conclusion or recommendations expressed in this material are those of the authors and do not necessarily reflect the views of the Air Force Office of Scientific Research.</p>
</sec>
<sec id="s12">
<title>Supplementary material</title>
<p>The Supplementary Material for this article can be found online at: <ext-link ext-link-type="uri" xlink:href="https://www.frontiersin.org/articles/10.3389/fmech.2023.1225828/full#supplementary-material">https://www.frontiersin.org/articles/10.3389/fmech.2023.1225828/full&#x23;supplementary-material</ext-link>
</p>
<supplementary-material xlink:href="DataSheet1.zip" id="SM1" mimetype="application/zip" xmlns:xlink="http://www.w3.org/1999/xlink"/>
</sec>
<ref-list>
<title>References</title>
<ref id="B1">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Balaban</surname>
<given-names>D.</given-names>
</name>
<name>
<surname>Cooper</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Komendera</surname>
<given-names>E.</given-names>
</name>
</person-group> (<year>2019</year>). &#x201c;<article-title>Inverse kinematics and sensitivity minimization of an n-stack Stewart platform</article-title>,&#x201d; in <source>2019 IEEE/RSJ international conference on intelligent robots and systems (IROS)</source> (<publisher-name>IEEE</publisher-name>), <fpage>6794</fpage>&#x2013;<lpage>6799</lpage>.</citation>
</ref>
<ref id="B2">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Bangjun</surname>
<given-names>L.</given-names>
</name>
<name>
<surname>Likun</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Tingtao</surname>
<given-names>M.</given-names>
</name>
</person-group> (<year>2012</year>). &#x201c;<article-title>Improving dynamic performance of Stewart platforms through optimal design based on evolutionary multi-objective optimization algorithms</article-title>,&#x201d; in <source>Proceedings of the 1st international conference on mechanical engineering and material science</source> (<publisher-name>Atlantis Press</publisher-name>), <fpage>294</fpage>&#x2013;<lpage>298</lpage>.</citation>
</ref>
<ref id="B3">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Bingul</surname>
<given-names>Z.</given-names>
</name>
<name>
<surname>Karah</surname>
<given-names>O.</given-names>
</name>
</person-group> (<year>2012</year>). &#x201c;<article-title>Dynamic modeling and simulation of Stewart platform</article-title>,&#x201d; in <source>Serial and parallel robot manipulators - kinematics, dynamics, control and optimization</source> (<publisher-name>InTech</publisher-name>), <fpage>19</fpage>&#x2013;<lpage>42</lpage>.</citation>
</ref>
<ref id="B4">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Bynum</surname>
<given-names>M. L.</given-names>
</name>
<name>
<surname>Hackebeil</surname>
<given-names>G. A.</given-names>
</name>
<name>
<surname>Hart</surname>
<given-names>W. E.</given-names>
</name>
<name>
<surname>Laird</surname>
<given-names>C. D.</given-names>
</name>
<name>
<surname>Nicholson</surname>
<given-names>B. L.</given-names>
</name>
<name>
<surname>Siirola</surname>
<given-names>J. D.</given-names>
</name>
<etal/>
</person-group> (<year>2021</year>). <source>Pyomo&#x2013;optimization modeling in python</source>. <edition>67third edition</edition>. <publisher-name>Springer Science &#x26; Business Media</publisher-name>.</citation>
</ref>
<ref id="B5">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Charters</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Enguica</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Freitas</surname>
<given-names>P.</given-names>
</name>
</person-group> (<year>2009</year>). <article-title>Detecting singularities of Stewart platforms</article-title>. <source>Mathematics-in-Industry Case Stud. J.</source> <volume>1</volume>, <fpage>66</fpage>&#x2013;<lpage>80</lpage>.</citation>
</ref>
<ref id="B6">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Chen</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Chen</surname>
<given-names>W.</given-names>
</name>
<name>
<surname>Liu</surname>
<given-names>J.</given-names>
</name>
</person-group> (<year>2007</year>). <article-title>Optimal design of Stewart platform safety mechanism</article-title>. <source>Chin. J. Aeronautics</source> <volume>20</volume> (<issue>4</issue>), <fpage>370</fpage>&#x2013;<lpage>377</lpage>. <pub-id pub-id-type="doi">10.1016/s1000-9361(07)60057-0</pub-id>
</citation>
</ref>
<ref id="B7">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Cooper</surname>
<given-names>J. R.</given-names>
</name>
<name>
<surname>Neilan</surname>
<given-names>J. H.</given-names>
</name>
<name>
<surname>Mahlin</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>WhiteAssemblers</surname>
<given-names>L. M</given-names>
</name>
</person-group> (<year>2022</year>). <source>A modular, reconfigurable manipulator for autonomous in-space assembly</source>.</citation>
</ref>
<ref id="B8">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Cortes</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Simeon</surname>
<given-names>T.</given-names>
</name>
</person-group> (<year>2003</year>). <source>2003 IEEE international conference on robotics and automation (cat. No.03CH37422)</source>. <publisher-name>IEEE</publisher-name>, <fpage>4354</fpage>&#x2013;<lpage>4359</lpage>.<article-title>Probabilistic motion planning for parallel mechanisms</article-title>
</citation>
</ref>
<ref id="B9">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Dorsey</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Sutter</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Wu</surname>
<given-names>K.</given-names>
</name>
</person-group> (<year>1992</year>). <source>Structurally adaptive space crane concept for assembling space systems on orbit</source>. <publisher-name>NASA Langley Research Center</publisher-name>. <comment>Technical report</comment>.</citation>
</ref>
<ref id="B10">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Dragan</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Srinivasa</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2014</year>). <article-title>Integrating human observer inferences into robot motion planning</article-title>. <source>Auton. Robots</source> <volume>37</volume> (<issue>4</issue>), <fpage>351</fpage>&#x2013;<lpage>368</lpage>. <pub-id pub-id-type="doi">10.1007/s10514-014-9408-x</pub-id>
</citation>
</ref>
<ref id="B11">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Ernandis</surname>
<given-names>R.</given-names>
</name>
</person-group> (<year>2021</year>). <source>PhD thesis</source>. <publisher-loc>College Park</publisher-loc>: <publisher-name>University of Maryland</publisher-name>.<article-title>Sampling based motion planning for minimizing position uncertainty with Stewart platforms</article-title>
</citation>
</ref>
<ref id="B12">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Grosch</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Gregorio</surname>
<given-names>R. D.</given-names>
</name>
<name>
<surname>Lopez</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Thomas</surname>
<given-names>F.</given-names>
</name>
</person-group> (<year>2010</year>). &#x201c;<article-title>Motion planning for a novel reconfigurable parallel manipulator with lockable revolute joints</article-title>,&#x201d; in <source>2010 IEEE international conference on robotics and automation</source> (<publisher-name>IEEE</publisher-name>), <fpage>4697</fpage>&#x2013;<lpage>4702</lpage>.</citation>
</ref>
<ref id="B13">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Hart</surname>
<given-names>W. E.</given-names>
</name>
<name>
<surname>Watson</surname>
<given-names>J.-P.</given-names>
</name>
<name>
<surname>Woodruff</surname>
<given-names>D. L.</given-names>
</name>
</person-group> (<year>2011</year>). <article-title>Pyomo: modeling and solving mathematical programs in python</article-title>. <source>Math. Program. Comput.</source> <volume>3</volume> (<issue>3</issue>), <fpage>219</fpage>&#x2013;<lpage>260</lpage>. <pub-id pub-id-type="doi">10.1007/s12532-011-0026-8</pub-id>
</citation>
</ref>
<ref id="B14">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Ichnowski</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Avigal</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Satish</surname>
<given-names>V.</given-names>
</name>
<name>
<surname>Goldberg</surname>
<given-names>K.</given-names>
</name>
</person-group> (<year>2020</year>). <article-title>Deep learning can accelerate grasp-optimized motion planning</article-title>. <source>Sci. Robot.</source> <volume>5</volume> (<issue>48</issue>), <fpage>eabd7710</fpage>. <pub-id pub-id-type="doi">10.1126/scirobotics.abd7710</pub-id>
</citation>
</ref>
<ref id="B15">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Islam</surname>
<given-names>F.</given-names>
</name>
<name>
<surname>Nasir</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Malik</surname>
<given-names>U.</given-names>
</name>
<name>
<surname>Ayaz</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Hasan</surname>
<given-names>O.</given-names>
</name>
</person-group> (<year>2012</year>). <source>RRT&#x2a;-Smart: rapid convergence implementation of RRT&#x2a; towards optimal solution</source>. <publisher-name>IEEE</publisher-name>.</citation>
</ref>
<ref id="B16">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Karaman</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Frazzoli</surname>
<given-names>E.</given-names>
</name>
</person-group> (<year>2011</year>). <article-title>Sampling-based algorithms for optimal motion planning</article-title>. <source>Int. J. Rob. Res.</source> <volume>30</volume> (<issue>7</issue>), <fpage>846</fpage>&#x2013;<lpage>894</lpage>. <pub-id pub-id-type="doi">10.1177/0278364911406761</pub-id>
</citation>
</ref>
<ref id="B17">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Kuffner</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>LaValle</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2000</year>). <article-title>RRT-connect: an efficient approach to single-query path planning</article-title>. In <source>Proceedings 2000 ICRA. Millennium conference. IEEE international conference on robotics and automation. Symposia proceedings (cat. No.00CH37065)</source>. <publisher-name>IEEE</publisher-name>, <volume>2</volume>, <fpage>995</fpage>&#x2013;<lpage>1001</lpage>.</citation>
</ref>
<ref id="B18">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>LaValle</surname>
<given-names>S. M.</given-names>
</name>
</person-group> (<year>1998</year>). <source>Rapidly-exploring random trees: a new tool for path planning</source>. <comment>The annual research report</comment>.</citation>
</ref>
<ref id="B19">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Lazard</surname>
<given-names>D.</given-names>
</name>
<name>
<surname>Merlet</surname>
<given-names>J.-P.</given-names>
</name>
</person-group> (<year>1994</year>). <source>The (true) Stewart platform has 12 configurations</source>, <fpage>2160</fpage>&#x2013;<lpage>2165</lpage>.</citation>
</ref>
<ref id="B20">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Lei</surname>
<given-names>Z.</given-names>
</name>
<name>
<surname>Xiaolin</surname>
<given-names>D.</given-names>
</name>
</person-group> (<year>2013</year>). &#x201c;<article-title>Optimize the redundant 6-DOF Stewart platform based on ant colony optimization</article-title>,&#x201d; in <source>Proceedings of 2013 3rd international conference on computer science and network technology</source> (<publisher-name>IEEE</publisher-name>), <fpage>1238</fpage>&#x2013;<lpage>1241</lpage>.</citation>
</ref>
<ref id="B21">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Li</surname>
<given-names>Y.-W.</given-names>
</name>
<name>
<surname>Wang</surname>
<given-names>J.-S.</given-names>
</name>
<name>
<surname>Wang</surname>
<given-names>L.-P.</given-names>
</name>
</person-group> (<year>2002</year>). <article-title>Stiffness analysis of a Stewart platform-based parallel kinematic machine</article-title>. <source>Proc. 2002 IEEE Int. Conf. Robotics Automation (Cat. No.02CH37292)</source> <volume>4</volume>, <fpage>3672</fpage>&#x2013;<lpage>3677</lpage>.</citation>
</ref>
<ref id="B22">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Lynch</surname>
<given-names>K. M.</given-names>
</name>
<name>
<surname>Park</surname>
<given-names>F. C.</given-names>
</name>
</person-group> (<year>2017</year>). <source>Modern robotics: mechanics, planning, and control</source>. <publisher-loc>Cambridge, UK</publisher-loc>: <publisher-name>Cambridge University Press</publisher-name>. <comment>OCLC: ocn983881868</comment>.</citation>
</ref>
<ref id="B23">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Majid</surname>
<given-names>M. Z. A.</given-names>
</name>
<name>
<surname>Huang</surname>
<given-names>Z.</given-names>
</name>
<name>
<surname>Yao</surname>
<given-names>Y. L.</given-names>
</name>
</person-group> (<year>2000</year>). <article-title>Workspace analysis of a six-degrees of freedom, three-prismatic- prismatic-spheric-revolute parallel manipulator</article-title>. <source>Int. J. Adv. Manuf. Technol.</source> <volume>16</volume> (<issue>6</issue>), <fpage>441</fpage>&#x2013;<lpage>449</lpage>. <pub-id pub-id-type="doi">10.1007/s001700050176</pub-id>
</citation>
</ref>
<ref id="B24">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Merlet</surname>
<given-names>J. P.</given-names>
</name>
</person-group> (<year>2006</year>). <source>Parallel robots</source>. <publisher-name>Springer</publisher-name>.</citation>
</ref>
<ref id="B25">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Miura</surname>
<given-names>K.</given-names>
</name>
<name>
<surname>Furuya</surname>
<given-names>H.</given-names>
</name>
</person-group> (<year>1988</year>). <article-title>Adaptive structure concept for future space applications</article-title>. <source>AIAA J.</source> <volume>26</volume> (<issue>8</issue>), <fpage>995</fpage>&#x2013;<lpage>1002</lpage>. <pub-id pub-id-type="doi">10.2514/3.10002</pub-id>
</citation>
</ref>
<ref id="B26">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Moser</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Cooper</surname>
<given-names>J.</given-names>
</name>
</person-group> (<year>2019</year>). <source>A reinforcement learning approach for the autonomous assembly of in-space habitats and infrastructures in uncertain environments. 22nd IAA Symposium on Human Exploration of the Solar System</source>. <publisher-name>International Astronautical Conference</publisher-name>.</citation>
</ref>
<ref id="B27">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Nguyen</surname>
<given-names>C.</given-names>
</name>
<name>
<surname>Antrazi</surname>
<given-names>S.</given-names>
</name>
<name>
<surname>Zhou</surname>
<given-names>Z.-L.</given-names>
</name>
<name>
<surname>Campbell</surname>
<given-names>C.</given-names>
</name>
</person-group> (<year>1991</year>). &#x201c;<article-title>Experimental study of motion control and trajectory planning for a Stewart Platform robot manipulator</article-title>,&#x201d; in <source>Proceedings. 1991 IEEE international conference on robotics and automation</source> (<publisher-name>IEEE Comput. Soc. Press</publisher-name>), <volume>2</volume>, <fpage>1873</fpage>&#x2013;<lpage>1878</lpage>.</citation>
</ref>
<ref id="B28">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Nguyen</surname>
<given-names>C. C.</given-names>
</name>
<name>
<surname>Antrazi</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>1990</year>). <source>Trajectory planning and control of a 6 dof manipulator with Stewart platform-based mechanism</source>. <publisher-name>NASA Goddard Space Flight Center</publisher-name>. <comment>Technical report</comment>.</citation>
</ref>
<ref id="B29">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Osa</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Esfahani</surname>
<given-names>A. M. G.</given-names>
</name>
<name>
<surname>Stolkin</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Lioutikov</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Peters</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Neumann</surname>
<given-names>G.</given-names>
</name>
</person-group> (<year>2017</year>). <article-title>Guiding trajectory optimization by demonstrated distributions</article-title>. <source>IEEE Robot. Autom. Lett.</source> <volume>2</volume> (<issue>2</issue>), <fpage>819</fpage>&#x2013;<lpage>826</lpage>. <pub-id pub-id-type="doi">10.1109/lra.2017.2653850</pub-id>
</citation>
</ref>
<ref id="B30">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Quintero-Pena</surname>
<given-names>C.</given-names>
</name>
<name>
<surname>Kyrillidis</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Kavraki</surname>
<given-names>L. E.</given-names>
</name>
</person-group> (<year>2021</year>). <source>Robust optimization-based motion planning for high-DOF robots under sensing uncertainty</source>. <publisher-name>IEEE</publisher-name>.</citation>
</ref>
<ref id="B31">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>R&#xed;os</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Hern&#xe1;ndez</surname>
<given-names>E. E.</given-names>
</name>
<name>
<surname>Valdez</surname>
<given-names>S. I.</given-names>
</name>
</person-group> (<year>2021</year>). <article-title>A two-stage mono- and multi-objective method for the optimization of general UPS parallel manipulators</article-title>. <source>Mathematics</source> <volume>9</volume> (<issue>5</issue>), <fpage>543</fpage>. <pub-id pub-id-type="doi">10.3390/math9050543</pub-id>
</citation>
</ref>
<ref id="B32">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Santos</surname>
<given-names>J. C.</given-names>
</name>
<name>
<surname>da Silva</surname>
<given-names>M. M.</given-names>
</name>
</person-group> (<year>2017</year>). <source>Investigation of motion planning methods with a kinematically redundant manipulator</source>.</citation>
</ref>
<ref id="B33">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Schulman</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Duan</surname>
<given-names>Y.</given-names>
</name>
<name>
<surname>Ho</surname>
<given-names>J.</given-names>
</name>
<name>
<surname>Lee</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Awwal</surname>
<given-names>I.</given-names>
</name>
<name>
<surname>Bradlow</surname>
<given-names>H.</given-names>
</name>
<etal/>
</person-group> (<year>2014</year>). <article-title>Motion planning with sequential convex optimization and convex collision checking</article-title>. <source>Int. J. Robotics Res.</source> <volume>33</volume> (<issue>9</issue>), <fpage>1251</fpage>&#x2013;<lpage>1270</lpage>. <pub-id pub-id-type="doi">10.1177/0278364914528132</pub-id>
</citation>
</ref>
<ref id="B34">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Sun</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Lian</surname>
<given-names>B.</given-names>
</name>
</person-group> (<year>2018</year>). <article-title>Stiffness and mass optimization of parallel kinematic machine</article-title>. <source>Mech. Mach. Theory</source> <volume>120</volume>, <fpage>73</fpage>&#x2013;<lpage>88</lpage>. <pub-id pub-id-type="doi">10.1016/j.mechmachtheory.2017.09.014</pub-id>
</citation>
</ref>
<ref id="B35">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Szynkiewicz</surname>
<given-names>W.</given-names>
</name>
<name>
<surname>B&#x142;aszczyk</surname>
<given-names>J.</given-names>
</name>
</person-group> (<year>2011</year>). <article-title>Optimization-based approach to path planning for closed chain robot systems</article-title>. , <volume>21</volume>(<issue>4</issue>):<fpage>659</fpage>&#x2013;<lpage>670</lpage>. <pub-id pub-id-type="doi">10.2478/v10006-011-0052-8</pub-id>
</citation>
</ref>
<ref id="B36">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Toz</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Kucuk</surname>
<given-names>S.</given-names>
</name>
</person-group> (<year>2013</year>). <article-title>Dexterous workspace optimization of an asymmetric six-degree of freedom Stewart&#x2013;Gough platform type manipulator</article-title>. <source>Robotics Aut. Syst.</source> <volume>61</volume> (<issue>12</issue>), <fpage>1516</fpage>&#x2013;<lpage>1528</lpage>. <pub-id pub-id-type="doi">10.1016/j.robot.2013.07.004</pub-id>
</citation>
</ref>
<ref id="B37">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Virtanen</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Gommers</surname>
<given-names>R.</given-names>
</name>
<name>
<surname>Oliphant</surname>
<given-names>T. E.</given-names>
</name>
<name>
<surname>Haberland</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Reddy</surname>
<given-names>T.</given-names>
</name>
<name>
<surname>Cournapeau</surname>
<given-names>D.</given-names>
</name>
<etal/>
</person-group> (<year>2020</year>). <article-title>SciPy 1.0: fundamental algorithms for scientific computing in Python</article-title>. <source>Nat. Methods</source> <volume>17</volume>, <fpage>261</fpage>&#x2013;<lpage>272</lpage>. <pub-id pub-id-type="doi">10.1038/s41592-019-0686-2</pub-id>
</citation>
</ref>
<ref id="B38">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Volz</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Graichen</surname>
<given-names>K.</given-names>
</name>
</person-group> (<year>2018</year>). <source>An optimization-based approach to dual-arm motion planning with closed kinematics</source>. <publisher-name>IEEE</publisher-name>.</citation>
</ref>
<ref id="B39">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>W&#xe4;chter</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Biegler</surname>
<given-names>L. T.</given-names>
</name>
</person-group> (<year>2005</year>). <article-title>On the implementation of an interior-point filter line-search algorithm for large-scale nonlinear programming</article-title>. <source>Math. Program.</source> <volume>106</volume> (<issue>1</issue>), <fpage>25</fpage>&#x2013;<lpage>57</lpage>. <pub-id pub-id-type="doi">10.1007/s10107-004-0559-y</pub-id>
</citation>
</ref>
<ref id="B40">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Wang</surname>
<given-names>P.</given-names>
</name>
<name>
<surname>Yang</surname>
<given-names>H.</given-names>
</name>
<name>
<surname>Xue</surname>
<given-names>K.</given-names>
</name>
</person-group> (<year>2015</year>). <article-title>Jerk-optimal trajectory planning for Stewart platform in joint space</article-title>. In <source>2015 IEEE international conference on mechatronics and automation (ICMA)</source>, <fpage>1932</fpage>&#x2013;<lpage>1937</lpage>. <publisher-name>IEEE</publisher-name>.</citation>
</ref>
<ref id="B41">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Williams</surname>
<given-names>R. L.</given-names>
</name>
</person-group> (<year>1995</year>). &#x201c;<article-title>Survey of active truss modules</article-title>,&#x201d; in <source>Volume 1: 21st design automation conference</source> (<publisher-name>American Society of Mechanical Engineers</publisher-name>).</citation>
</ref>
<ref id="B42">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Xie</surname>
<given-names>Z.</given-names>
</name>
<name>
<surname>Li</surname>
<given-names>G.</given-names>
</name>
<name>
<surname>Liu</surname>
<given-names>G.</given-names>
</name>
<name>
<surname>Zhao</surname>
<given-names>J.</given-names>
</name>
</person-group> (<year>2017</year>). <article-title>Optimal design of a Stewart platform using the global transmission index under determinate constraint of workspace</article-title>. <source>Adv. Mech. Eng.</source> <volume>9</volume> (<issue>10</issue>), <fpage>168781401772088</fpage>. <pub-id pub-id-type="doi">10.1177/1687814017720880</pub-id>
</citation>
</ref>
<ref id="B43">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Yokoi</surname>
<given-names>K.</given-names>
</name>
<name>
<surname>Komoriya</surname>
<given-names>K.</given-names>
</name>
<name>
<surname>Tanie</surname>
<given-names>K.</given-names>
</name>
</person-group> (<year>1992</year>). <article-title>A method for solving inverse kinematics of variable structure truss arm with high redundancy</article-title>. <source>J. Intelligent Material Syst. Struct.</source> <volume>3</volume> (<issue>4</issue>), <fpage>631</fpage>&#x2013;<lpage>645</lpage>. <pub-id pub-id-type="doi">10.1177/1045389x9200300406</pub-id>
</citation>
</ref>
<ref id="B44">
<citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname>Zhang</surname>
<given-names>B.</given-names>
</name>
</person-group> (<year>2005</year>). <source>Design and implementation of A 6 dof parallel manipulator with passive force control</source>. <comment>PhD thesis</comment>, <publisher-name>University of Florida</publisher-name>.</citation>
</ref>
<ref id="B45">
<citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname>Zucker</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Ratliff</surname>
<given-names>N.</given-names>
</name>
<name>
<surname>Dragan</surname>
<given-names>A.</given-names>
</name>
<name>
<surname>Pivtoraiko</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Klingensmith</surname>
<given-names>M.</given-names>
</name>
<name>
<surname>Dellin</surname>
<given-names>C.</given-names>
</name>
<etal/>
</person-group> (<year>2013</year>). <article-title>Chomp: covariant Hamiltonian optimization for motion planning</article-title>. <source>Int. J. Robotics Res.</source> <volume>32</volume> (<issue>9</issue>), <fpage>1164</fpage>&#x2013;<lpage>1193</lpage>. <pub-id pub-id-type="doi">10.1177/0278364913488805</pub-id>
</citation>
</ref>
</ref-list>
</back>
</article>