<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD Journal Archiving and Interchange DTD v2.3 20070202//EN" "archivearticle.dtd">
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" article-type="data-paper">
<front>
<journal-meta>
<journal-id journal-id-type="publisher-id">Front. Robot. AI</journal-id>
<journal-title>Frontiers in Robotics and AI</journal-title>
<abbrev-journal-title abbrev-type="pubmed">Front. Robot. AI</abbrev-journal-title>
<issn pub-type="epub">2296-9144</issn>
<publisher>
<publisher-name>Frontiers Media S.A.</publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id pub-id-type="doi">10.3389/frobt.2018.00024</article-id>
<article-categories>
<subj-group subj-group-type="heading">
<subject>Robotics and AI</subject>
<subj-group>
<subject>Code</subject>
</subj-group>
</subj-group>
</article-categories>
<title-group>
<article-title>Optimization-Based Controllers for Robotics Applications (OCRA): The Case of iCub&#x02019;s Whole-Body Control</article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name><surname>Eljaik</surname> <given-names>Jorhabib G.</given-names></name>
<uri xlink:href="https://frontiersin.org/people/u/189645"/>
</contrib>
<contrib contrib-type="author">
<name><surname>Lober</surname> <given-names>Ryan</given-names></name>
<uri xlink:href="https://frontiersin.org/people/u/309219"/>
</contrib>
<contrib contrib-type="author">
<name><surname>Hoarau</surname> <given-names>Antoine</given-names></name>
<uri xlink:href="https://frontiersin.org/people/u/539245"/>
</contrib>
<contrib contrib-type="author" corresp="yes">
<name><surname>Padois</surname> <given-names>Vincent</given-names></name>
<xref ref-type="corresp" rid="fn001">&#x0002A;</xref>
<uri xlink:href="https://frontiersin.org/people/u/165250"/>
</contrib>
</contrib-group>
<aff><institution>Sorbonne Universit&#x000E9;, CNRS UMR 7222, Institut des Syst&#x000E8;mes Intelligents et de Robotique, ISIR</institution>, <addr-line>Paris</addr-line>, <country>France</country></aff>
<author-notes>
<fn fn-type="edited-by"><p>Edited by: Ugo Pattacini, Fondazione Istituto Italiano di Technologia, Italy</p></fn>
<fn fn-type="edited-by"><p>Reviewed by: Carlo Ciliberto, University College London, United Kingdom; Matej Hoffmann, Czech Technical University in Prague, Czechia</p></fn>
<corresp id="fn001">&#x0002A;Correspondence: Vincent Padois, <email>vincent.padois&#x00040;sorbonne-universite.fr</email></corresp>
<fn fn-type="other" id="fn002"><p>Specialty section: This article was submitted to Humanoid Robotics, a section of the journal Frontiers in Robotics and AI</p></fn>
</author-notes>
<pub-date pub-type="epub">
<day>29</day>
<month>03</month>
<year>2018</year>
</pub-date>
<pub-date pub-type="collection">
<year>2018</year>
</pub-date>
<volume>5</volume>
<elocation-id>24</elocation-id>
<history>
<date date-type="received">
<day>04</day>
<month>08</month>
<year>2017</year>
</date>
<date date-type="accepted">
<day>28</day>
<month>02</month>
<year>2018</year>
</date>
</history>
<permissions>
<copyright-statement>Copyright &#x000A9; 2018 Eljaik, Lober, Hoarau and Padois.</copyright-statement>
<copyright-year>2018</copyright-year>
<copyright-holder>Eljaik, Lober, Hoarau and Padois</copyright-holder>
<license xlink:href="https://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 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>OCRA stands for Optimization-based Control for Robotics Applications. It consists of a set of platform-independent libraries which facilitates the development of optimization-based controllers for articulated robots. Hierarchical, weighted, and hybrid control strategies can easily be implemented using these tools. The generic interfaces provided by OCRA allow different robots to use the exact same controllers. OCRA also allows users to specify high-level objectives via tasks. These tasks provide an intuitive way of generating complex behaviors and can be specified in XML format. To illustrate the use of OCRA, an implementation of interest to this research topic for the humanoid robot iCub is presented. OCRA stands for Optimization-based Control for Robotics Applications. It consists of a set of platform-independent libraries which facilitates the development of optimization-based controllers for articulated robots. Hierarchical, weighted, and hybrid control strategies can easily be implemented using these tools. The generic interfaces provided by OCRA allow different robots to use the exact same controllers. OCRA also allows users to specify high-level objectives via tasks. These tasks provide an intuitive way of generating complex behaviors and can be specified in XML format. To illustrate the use of OCRA, an implementation of interest to this research topic for the humanoid robot iCub is presented.</p>
</abstract>
<kwd-group>
<kwd>whole-body controller</kwd>
<kwd>iCub</kwd>
<kwd>optimization</kwd>
<kwd>tasks</kwd>
<kwd>hierarchical</kwd>
<kwd>code:c&#x0002B;&#x0002B;</kwd>
</kwd-group>
<contract-num rid="cn01">600716</contract-num>
<contract-sponsor id="cn01">Seventh Framework Programme<named-content content-type="fundref-id">http://dx.doi.org/10.13039/100011102</named-content></contract-sponsor>
<counts>
<fig-count count="3"/>
<table-count count="7"/>
<equation-count count="7"/>
<ref-count count="20"/>
<page-count count="10"/>
<word-count count="6676"/>
</counts>
</article-meta>
</front>
<body>
<sec id="S1" sec-type="introduction">
<label>1</label> <title>Introduction</title>
<p>Whole-body control (WBC) is a research direction in robotics, where humanoids are faced with the problem of executing multiple tasks simultaneously. As stated by the IEEE Technical Committee on Whole-Body Control:
<disp-quote>
<p>A control system that is specifically designed to guarantee the execution of a single task, even if it uses all the joints of a robot, cannot be considered WBC.</p></disp-quote></p>
<p>This is indeed the core of the software introduced in this work, but it goes further by drawing additional requirements from the identification of typical concerns in the control of articulated robots, such as (1) standardization of the problem formulation, which is done in the form of an optimization problem; (2) flexibility in the solver choice; (3) independence of tasks from the problem formulation with user-friendly ways to introduce them; (4) addition of constraints, contact modeling and support for both fixed and floating-base robots. OCRA draws its origins from these design requirements. It stands for Optimization-based Control for Robotics Applications and consists of a set of platform-independent libraries which facilitates the development of optimization-based controllers. It builds on top of ORC which was originally a framework developed by CEA-List,<xref ref-type="fn" rid="fn1"><sup>1</sup></xref> later used at the Institute of Intelligent Systems and Robotics (ISIR) to develop whole-body controllers with simulations on XDE (Salini et al., <xref ref-type="bibr" rid="B17">2013</xref>).</p>
<p>Examples of software addressing similar problems include the Stack of Tasks (SOT) (Mansard et al., <xref ref-type="bibr" rid="B7">2009</xref>), OpenSOT (Rocchi et al., <xref ref-type="bibr" rid="B14">2015</xref>), and CoDyCo<xref ref-type="fn" rid="fn2"><sup>2</sup></xref> controllers (Nori et al., <xref ref-type="bibr" rid="B9">2015</xref>). Nevertheless, they either lack the level of desired flexibility or do not meet the proposed design requirements. SOT and OpenSOT use strictly hiearchical methods, and while OpenSOT is intended for torque-controlled robots similar to OCRA, SOT originally targets velocity-controlled robots. When it comes to solvers, OpenSOT relies solely on QPOases while SOT&#x02019;s controller and solver are tight together.</p>
<p>Another software that has been used in the formulation of this type of controllers is Roboptim (<xref ref-type="bibr" rid="B13">2016</xref>). It is, however, an optimization framework for robotics and it is up to the user to formulate the control problem, workout the prioritization strategy and address the different components to achieve a whole-body controller.</p>
<p>CoDyCo&#x02019;s controllers on the other hand, although aimed at WBC, are tailored to be task-specific and do not constitute a WBC library.</p>
<p>OCRA has been designed to exploit a client&#x02013;server paradigm, where the <italic>server</italic> is responsible for running the whole-body controller, send control inputs to the robot and host user-defined tasks, while the <italic>client</italic> is built by the user according to their needs on task servoing, planning, or higher-level control.</p>
<p>OCRA contributes to the building of the iCub mindware through the implementation of an <italic>iCub server</italic> along with communication utilities for the construction of clients. It facilitates the creation of a vast type of whole-body behaviors, with special attention to interaction. It also addresses the needs of different types of users, from the advanced one who desires to implement particular low-level control laws, to the more practical one who prefers to state at the metatask-level.</p>
<p>In Section <xref ref-type="sec" rid="S2">2</xref>, a generic overview of the main design requirements and features of OCRA, along with a list of software dependencies is presented. Section <xref ref-type="sec" rid="S3">3</xref> introduces the main concepts involved in optimization-based control which allow the reader to have a deeper insight in the inner workings of the software. Concepts such as tasks, constraints, quadratic programming based control (and motivations for its use), prioritization strategies, and optimization solver are covered. Section <xref ref-type="sec" rid="S4">4</xref> spans OCRA&#x02019;s structure, shedding light on its libraries and the main classes they are composed of as well as how these were used for iCub implementations. The same section continues with a more in-depth description of the iCub server and a generic client through sequence diagrams, as well as a brief explanation on how to automatically build a template client. Finally, Section <xref ref-type="sec" rid="S5">5</xref> draws final conclusions.</p>
</sec>
<sec id="S2">
<label>2</label> <title>OCRA</title>
<p>OCRA is a set of libraries and tools for the implementation of QP-based whole-body controllers for torque/force-controlled articulated robots. Robots like the humanoid iCub or the KUKA Light Weight Robot (LWR) manipulators (floating/fixed base) can be controlled using this open source software. In particular, for the iCub, the set of necessary libraries is implemented and distributed.</p>
<p>One main design requirement from OCRA&#x02019;s inception is that (1) it should be heavily task-oriented. This means, that a user can specify a set of tasks to be performed by the robot, e.g., <italic>follow a CoM trajectory, while maintaining balance and make one hand follow another trajectory</italic> and (2) the specifications of these tasks have to be easy to provide. This is achieved through an XML file that we call the <italic>tasks set</italic>.</p>
<p>Features that make OCRA flexible include: the possibility to choose between different types of tasks and their prioritization strategies; two different optimization solvers; various types of constraints and the tools to create a client&#x02013;server architecture, where the <italic>server</italic> runs a reactive controller with the tasks and constraints, and one or more <italic>clients</italic> perform the computation of the right instantaneous tasks values through local trajectory controllers (e.g., PIDs), motion planning, model predictive control, or any higher-level control schemes.</p>
<p>The required dependencies of this software are given in Table <xref ref-type="table" rid="T1">1</xref>.</p>
<table-wrap position="float" id="T1">
<label>Table 1</label>
<caption><p>Required dependencies table for <monospace>ocra</monospace> and <monospace>ocra-icub.</monospace></p></caption>
<table frame="hsides" rules="groups">
<thead>
<tr>
<th valign="top" align="left"><italic>Dependency</italic></th>
<th valign="top" align="center"><italic>Minimum version</italic></th>
<th valign="top" align="center"><italic>ocra</italic></th>
<th valign="top" align="center"><italic>ocra-icub</italic></th>
</tr>
</thead>
<tbody>
<tr>
<td valign="top" align="left">YARP</td>
<td valign="top" align="center">2.3</td>
<td valign="top" align="center">&#x02713;</td>
<td valign="top" align="center">&#x02713;</td>
</tr>
<tr>
<td valign="top" align="left">Eigen</td>
<td valign="top" align="center">3.2</td>
<td valign="top" align="center">&#x02713;</td>
<td valign="top" align="center">&#x02713;</td>
</tr>
<tr>
<td valign="top" align="left">orocos_kdl</td>
<td valign="top" align="center">1.2</td>
<td valign="top" align="center">&#x02713;</td>
<td valign="top" align="center">&#x02713;</td>
</tr>
<tr>
<td valign="top" align="left">iDynTree</td>
<td valign="top" align="center">0.4.0</td>
<td align="center"/>
<td valign="top" align="center">&#x02713;</td>
</tr>
<tr>
<td valign="top" align="left">yarpWholeBodyInterface</td>
<td valign="top" align="center">0.35</td>
<td align="center"/>
<td valign="top" align="center">&#x02713;</td>
</tr>
<tr>
<td valign="top" align="left">Boost</td>
<td valign="top" align="center">1.64</td>
<td valign="top" align="center">&#x02713;</td>
<td valign="top" align="center">&#x02713;</td>
</tr>
<tr>
<td valign="top" align="left">CMake</td>
<td valign="top" align="center">2.8.11</td>
<td valign="top" align="center">&#x02713;</td>
<td valign="top" align="center">&#x02713;</td>
</tr>
<tr>
<td valign="top" align="left">TinyXML</td>
<td valign="top" align="center">2.6.2</td>
<td valign="top" align="center">&#x02713;</td>
<td align="center"/>
</tr>
<tr>
<td valign="top" align="left">YCM</td>
<td valign="top" align="center">0.4.0</td>
<td align="center"/>
<td valign="top" align="center">&#x02713;</td>
</tr>
</tbody>
</table>
<table-wrap-foot>
<p><italic>For the sake of clarity, it is not shown that <monospace>ocra</monospace> is naturally a dependency of <monospace>ocra-icub</monospace></italic>.</p>
</table-wrap-foot>
</table-wrap>
</sec>
<sec id="S3">
<label>3</label> <title>Optimization-Based Control</title>
<p>Traditionally, redundancy resolutions for robotic control problems find analytical solutions by ensuring that lower-priority tasks are executed in the null-space of higher-priority tasks. In prioritized inverse kinematics, acceleration or torque based control, the jacobian of low-priority tasks is projected onto the null-space of higher-priority ones (Khatib, <xref ref-type="bibr" rid="B5">1987</xref>; Sentis and Khatib, <xref ref-type="bibr" rid="B20">2006</xref>; Peters et al., <xref ref-type="bibr" rid="B12">2008</xref>). Inequality constraints are, however, difficult to deal with in these approaches. They are usually transformed into avoidance tasks, which try to prevent the robot from hitting the original constraint (Khatib, <xref ref-type="bibr" rid="B4">1986</xref>; Padois et al., <xref ref-type="bibr" rid="B11">2007</xref>). This type of active avoidance (passive or active) method is doomed to fail as the number of constraints is necessarily higher than the number of DOF (2<italic>n</italic> joints limits for an <italic>n</italic> DOF robot) and it thus requires to make decision reactively about which avoidance tasks should be used in order to guarantee the respect of all constraints while still achieving the operational tasks in the most efficient way possible (Padois, <xref ref-type="bibr" rid="B10">2016</xref>).</p>
<p>OCRA resorts to convex optimization for the formulation of the whole-body controller, as it has been stated multiple times before this point. The controller is written as a linearly constrained quadratic multi-objective optimization problem where strict or soft hierarchies are used to express the priorities between the tasks. <italic>Linearly constrained</italic> due to the constraints being strictly linear (or linearized if not), <italic>quadratic</italic> because each objective is the quadratic error of a task and <italic>multi-objective</italic> because multiple tasks are combined. The result of this optimization are the optimal actuation inputs to the system (i.e., joint torques) given the set of prioritized tasks to be performed and the constraints that have to be respected. Among these constraint, this optimization problem includes inequality constraints, coming from control input saturations or any other variable which should never cross certain limits. Under these conditions, the solution space can be proved convex and finding the optimal solution to the whole-body control problem is equivalent to finding the set of active constraints. In fact, methods in which optimization is avoided end up using algorithms that pretty much search for this active set, not explicitly and in a suboptimal way. It is then indisputable that the strong background in convex optimization outruns analytical methods used to heuristically activate constraints.</p>
<p>The primary concern of this section is to present the necessary equations and relationships to understand the critical aspects of the types of controllers which can be developed with OCRA. Generally speaking, an optimization-based controller formulates the control problem as one of minimizing control objective functions while respecting the control constraints. Specifically, the problem is formulated as a convex linearly constrained QP using the second-order rigid body dynamics of the robot. Therefore, the control objectives (Tasks) are expressed as either accelerations, torques, or wrenches, allowing for complex dynamic interactions with the environment, and the control constraints are expressed directly in the QP as linear equalities and inequalities.</p>
<sec id="S3-1">
<label>3.1</label> <title>Tasks</title>
<p>Tasks allow users to decompose complex whole-body behaviors into atomic control objectives, which can be planned by a user or automatically with planners. Here, a task represents a control objective for the robot, and more specifically, an error between some desired task value and the current value of the task in terms of the control variable. These tasks are expressed as the squared norm of these errors in either accelerations, torques, or wrenches and can be expressed in both joint and operational-space. In Section <xref ref-type="sec" rid="S3-4">3.4</xref>, the expression of these tasks in terms of the control variables is provided, but Table <xref ref-type="table" rid="T2">2</xref>, below, shows their standard formulations.</p>
<table-wrap position="float" id="T2">
<label>Table 2</label>
<caption><p>Different types of tasks.</p></caption>
<table frame="hsides" rules="groups">
<thead>
<tr>
<th valign="top" align="left">Task</th>
<th valign="top" align="center">Definition</th>
</tr>
</thead>
<tbody>
<tr>
<td valign="top" align="left">Operational-space acceleration</td>
<td valign="top" align="center"><inline-formula><mml:math id="M6"><mml:mtext mathvariant="italic">T</mml:mtext><mml:mspace width="0.3em" class="thinspace"/><mml:mfenced separators="" open="(" close=")"><mml:mrow><mml:msup><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BE;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-op">&#x000A8;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>des</mml:mtext></mml:mrow></mml:msup></mml:mrow></mml:mfenced><mml:mspace width="0.3em" class="thinspace"/><mml:mo class="MathClass-rel">&#x0003D;</mml:mo><mml:mfenced separators="" open="&#x02225;" close="&#x02225;"><mml:mrow><mml:mtext mathvariant="italic">J</mml:mtext><mml:mrow><mml:mo class="MathClass-open">(</mml:mo><mml:mrow><mml:mtext mathvariant="bold-italic">q</mml:mtext></mml:mrow><mml:mo class="MathClass-close">)</mml:mo></mml:mrow><mml:mover accent="true"><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BD;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-op">&#x002D9;</mml:mo></mml:mover><mml:mo class="MathClass-bin">&#x0002B;</mml:mo><mml:mover accent="true"><mml:mrow><mml:mtext mathvariant="italic">J</mml:mtext></mml:mrow><mml:mo class="MathClass-op">&#x002D9;</mml:mo></mml:mover><mml:mrow><mml:mo class="MathClass-open">(</mml:mo><mml:mrow><mml:mtext mathvariant="bold-italic">q</mml:mtext><mml:mo class="MathClass-punc">,</mml:mo><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BD;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-close">)</mml:mo></mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BD;</mml:mn></mml:mstyle><mml:mo class="MathClass-bin">&#x02212;</mml:mo><mml:msup><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BE;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-op">&#x000A8;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>des</mml:mtext></mml:mrow></mml:msup></mml:mrow></mml:mfenced></mml:math></inline-formula></td>
</tr>
<tr>
<td valign="top" align="left">Joint-space acceleration</td>
<td valign="top" align="center"><inline-formula><mml:math id="M7"><mml:mtext mathvariant="italic">T</mml:mtext><mml:mspace width="0.3em" class="thinspace"/><mml:mfenced separators="" open="(" close=")"><mml:mrow><mml:msup><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BD;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-op">&#x002D9;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>des</mml:mtext></mml:mrow></mml:msup></mml:mrow></mml:mfenced><mml:mspace width="0.3em" class="thinspace"/><mml:mo class="MathClass-rel">&#x0003D;</mml:mo><mml:mfenced separators="" open="&#x02225;" close="&#x02225;"><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BD;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-op">&#x002D9;</mml:mo></mml:mover><mml:mo class="MathClass-bin">&#x02212;</mml:mo><mml:msup><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BD;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-op">&#x002D9;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>des</mml:mtext></mml:mrow></mml:msup></mml:mrow></mml:mfenced></mml:math></inline-formula></td>
</tr>
<tr>
<td valign="top" align="left">Operational-space wrench</td>
<td valign="top" align="center"><inline-formula><mml:math id="M8"><mml:mrow><mml:mi>T</mml:mi><mml:msup><mml:mo stretchy='false'>(</mml:mo><mml:mi>e</mml:mi></mml:msup><mml:msup><mml:mi mathvariant="bold">&#x003C9;</mml:mi><mml:mrow><mml:mtext>des</mml:mtext></mml:mrow></mml:msup><mml:mo stretchy='false'>)</mml:mo><mml:mo>=</mml:mo><mml:mrow><mml:mo>&#x02016;</mml:mo><mml:mrow><mml:msup><mml:mrow></mml:mrow><mml:mi>e</mml:mi></mml:msup><mml:mi mathvariant="bold">&#x003C9;</mml:mi><mml:msup><mml:mo>&#x02212;</mml:mo><mml:mi>e</mml:mi></mml:msup><mml:msup><mml:mi mathvariant="bold">&#x003C9;</mml:mi><mml:mrow><mml:mtext>des</mml:mtext></mml:mrow></mml:msup></mml:mrow><mml:mo>&#x02016;</mml:mo></mml:mrow></mml:mrow></mml:math></inline-formula></td>
</tr>
<tr>
<td valign="top" align="left">Joint torque</td>
<td valign="top" align="center"><inline-formula><mml:math id="M9"><mml:mtext mathvariant="italic">T</mml:mtext><mml:mspace width="0.3em" class="thinspace"/><mml:mfenced separators="" open="(" close=")"><mml:mrow><mml:msup><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003C4;</mml:mn></mml:mstyle></mml:mrow><mml:mrow><mml:mtext>des</mml:mtext></mml:mrow></mml:msup></mml:mrow></mml:mfenced><mml:mspace width="0.3em" class="thinspace"/><mml:mo class="MathClass-rel">&#x0003D;</mml:mo><mml:mfenced separators="" open="&#x02225;" close="&#x02225;"><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003C4;</mml:mn></mml:mstyle><mml:mo class="MathClass-bin">&#x02212;</mml:mo><mml:msup><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003C4;</mml:mn></mml:mstyle></mml:mrow><mml:mrow><mml:mtext>des</mml:mtext></mml:mrow></mml:msup></mml:mrow></mml:mfenced></mml:math></inline-formula></td>
</tr>
</tbody>
</table>
<table-wrap-foot>
<p><italic>Superscript &#x0201C;des&#x0201D; stands for desired</italic>.</p>
</table-wrap-foot>
</table-wrap>
<p>In Table <xref ref-type="table" rid="T2">2</xref>, <bold><italic>&#x003BD;</italic></bold> and <inline-formula><mml:math id="M21"><mml:mover accent="true"><mml:mi mathvariant="bold-italic">&#x003BD;</mml:mi><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:math></inline-formula> are the generalized velocities and accelerations of the robot. They can be more or less directly related to the derivatives of the generalized coordinates <bold><italic>q</italic></bold>. Indeed, for robots whose root link can float freely in Cartesian space, e.g., humanoids, it is necessary to consider the pose of the root link w.r.t. the world reference frame. The primary method for doing so is to account for the root link pose directly in the generalized coordinates, <bold><italic>q</italic></bold>, of the robot (Sentis and Khatib, <xref ref-type="bibr" rid="B19">2005</xref>; Mistry et al., <xref ref-type="bibr" rid="B8">2010</xref>). The terms <italic>J</italic> and <inline-formula><mml:math  id="M22"><mml:mover accent="true"><mml:mi mathvariant="bold-italic">J</mml:mi><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:math></inline-formula> are link Jacobians and their derivatives. The variable <italic><sup>e</sup></italic><bold><italic>&#x003C9;</italic></bold> represents an external wrench, and <bold><italic>&#x003C4;</italic></bold>, the system torques, while <inline-formula><mml:math id="M23"><mml:mover accent="true"><mml:mi mathvariant="bold-italic">&#x003BE;</mml:mi><mml:mo>&#x000A8;</mml:mo></mml:mover></mml:math></inline-formula> is operational-space acceleration. The corresponding <italic>desired</italic> values of each term in Table <xref ref-type="table" rid="T2">2</xref> should not be confused with the raw trajectory given by the user (subscript <italic>ref</italic>). These set-points are used as inputs to a task-level PD controller in the case of operational-space acceleration tasks and a PI in the case of wrench (<italic><sup>e</sup></italic><bold><italic>&#x003C9;</italic></bold>) tasks, such that:
<disp-formula id="E1"><label>(1)</label><mml:math id="M1"><mml:mtable columnalign="left" class="align"><mml:mtr><mml:mtd columnalign="right" class="align-odd"><mml:msup><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BE;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-op">&#x000A8;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>des</mml:mtext></mml:mrow></mml:msup><mml:mrow><mml:mo class="MathClass-open">(</mml:mo><mml:mrow><mml:mi>t</mml:mi><mml:mo class="MathClass-bin">&#x0002B;</mml:mo><mml:mn>&#x00394;</mml:mn><mml:mi>t</mml:mi></mml:mrow><mml:mo class="MathClass-close">)</mml:mo></mml:mrow><mml:mo class="MathClass-rel">&#x0003D;</mml:mo><mml:msup><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BE;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-op">&#x000A8;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>ref</mml:mtext></mml:mrow></mml:msup><mml:mrow><mml:mo class="MathClass-open">(</mml:mo><mml:mrow><mml:mi>t</mml:mi><mml:mo class="MathClass-bin">&#x0002B;</mml:mo><mml:mn>&#x00394;</mml:mn><mml:mi>t</mml:mi></mml:mrow><mml:mo class="MathClass-close">)</mml:mo></mml:mrow><mml:mo class="MathClass-bin">&#x0002B;</mml:mo><mml:msub><mml:mrow><mml:mi>K</mml:mi></mml:mrow><mml:mrow><mml:mi>p</mml:mi></mml:mrow></mml:msub><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003F5;</mml:mn></mml:mstyle><mml:mrow><mml:mo class="MathClass-open">(</mml:mo><mml:mrow><mml:mi>t</mml:mi></mml:mrow><mml:mo class="MathClass-close">)</mml:mo></mml:mrow><mml:mo class="MathClass-bin">&#x0002B;</mml:mo><mml:msub><mml:mrow><mml:mi>K</mml:mi></mml:mrow><mml:mrow><mml:mi>d</mml:mi></mml:mrow></mml:msub><mml:mover accent="true"><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003F5;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-op">&#x002D9;</mml:mo></mml:mover><mml:mrow><mml:mo class="MathClass-open">(</mml:mo><mml:mrow><mml:mi>t</mml:mi></mml:mrow><mml:mo class="MathClass-close">)</mml:mo></mml:mrow><mml:mo class="MathClass-punc">,</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math>
</disp-formula>
<disp-formula id="E2"><label>(2)</label><mml:math id="M2"><mml:mtable columnalign="left" class="align"><mml:mtr><mml:mtd columnalign="right" class="align-odd"><mml:msup><mml:mtext>&#x02009;</mml:mtext><mml:mrow><mml:mi>e</mml:mi></mml:mrow></mml:msup><mml:msup><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003C9;</mml:mn></mml:mstyle></mml:mrow><mml:mrow><mml:mtext>des</mml:mtext></mml:mrow></mml:msup><mml:mrow><mml:mo class="MathClass-open">(</mml:mo><mml:mrow><mml:mi>t</mml:mi><mml:mo class="MathClass-bin">&#x0002B;</mml:mo><mml:mn>&#x00394;</mml:mn><mml:mi>t</mml:mi></mml:mrow><mml:mo class="MathClass-close">)</mml:mo></mml:mrow><mml:msup><mml:mrow><mml:mo class="MathClass-rel">&#x0003D;</mml:mo></mml:mrow><mml:mrow><mml:mi>e</mml:mi></mml:mrow></mml:msup><mml:msup><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003C9;</mml:mn></mml:mstyle></mml:mrow><mml:mrow><mml:mtext>ref</mml:mtext></mml:mrow></mml:msup><mml:mrow><mml:mo class="MathClass-open">(</mml:mo><mml:mrow><mml:mi>t</mml:mi><mml:mo class="MathClass-bin">&#x0002B;</mml:mo><mml:mn>&#x00394;</mml:mn><mml:mi>t</mml:mi></mml:mrow><mml:mo class="MathClass-close">)</mml:mo></mml:mrow><mml:mo class="MathClass-bin">&#x0002B;</mml:mo><mml:msub><mml:mrow><mml:mi>K</mml:mi></mml:mrow><mml:mrow><mml:mi>p</mml:mi></mml:mrow></mml:msub><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003F5;</mml:mn></mml:mstyle><mml:mrow><mml:mo class="MathClass-open">(</mml:mo><mml:mrow><mml:mi>t</mml:mi></mml:mrow><mml:mo class="MathClass-close">)</mml:mo></mml:mrow><mml:mo class="MathClass-bin">&#x0002B;</mml:mo><mml:msub><mml:mrow><mml:mi>K</mml:mi></mml:mrow><mml:mrow><mml:mi>i</mml:mi></mml:mrow></mml:msub><mml:mo class="MathClass-op">&#x0222B;</mml:mo><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003F5;</mml:mn></mml:mstyle><mml:mrow><mml:mo class="MathClass-open">(</mml:mo><mml:mrow><mml:mi>t</mml:mi></mml:mrow><mml:mo class="MathClass-close">)</mml:mo></mml:mrow><mml:mi>d</mml:mi><mml:mi>t</mml:mi><mml:mo class="MathClass-punc">,</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math>
</disp-formula> where <inline-formula><mml:math id="M3"><mml:msup><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BE;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-op">&#x000A8;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>ref</mml:mtext></mml:mrow></mml:msup></mml:math></inline-formula> and <italic><sup>e</sup></italic><bold><italic>&#x003C9;</italic></bold><sup>ref</sup> are feedforward terms, while <bold><italic>&#x003F5;</italic></bold> and <inline-formula><mml:math id="M24"><mml:mover accent="true"><mml:mi>&#x003F5;</mml:mi><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:math></inline-formula> are pose error and its derivative (these being representation dependant). <italic>K<sub>p</sub></italic>, <italic>K<sub>d</sub></italic>, and <italic>K<sub>i</sub></italic> are proportional, derivative, and integral gains and by default, <inline-formula><mml:math id="M4"><mml:msub><mml:mrow><mml:mi>K</mml:mi></mml:mrow><mml:mrow><mml:mi>d</mml:mi></mml:mrow></mml:msub><mml:mo class="MathClass-rel">&#x0003D;</mml:mo><mml:mn>2</mml:mn><mml:msqrt><mml:mrow><mml:msub><mml:mrow><mml:mi>K</mml:mi></mml:mrow><mml:mrow><mml:mi>p</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:msqrt></mml:math></inline-formula>. Task servoing is necessary to compensate for drift and tracking errors associated with using second-order control techniques. Additionally, it is often the case that only position values are specified by the user, and these must be converted to accelerations&#x02014;task servoing provides this service. For joint-space accelerations the servoing is done in similar fashion as for <inline-formula><mml:math id="M5"><mml:msup><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BE;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-op">&#x000A8;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>des</mml:mtext></mml:mrow></mml:msup></mml:math></inline-formula>.</p>
</sec>
<sec id="S3-2">
<label>3.2</label> <title>Constraints</title>
<p>As with all real world control problems, there are limits to what the system being controlled can do. For example, the control input is typically bounded, which for robots with revolute joints means that the torque which can be generated by the actuators is limited to plus or minus some value. Likewise, the joints themselves generally have limited operating ranges for various mechanical reasons. In addition to these common limiting factors, it may be reasonable to maintain the robot in some region of its state space that will ease control, e.g., avoid slipage of the contact points or avoid contact with the environment.</p>
<p>In Table <xref ref-type="table" rid="T3">3</xref>, the &#x02022;<sub>min</sub> and &#x02022;<sub>max</sub> values represent the lower and upper limits of a variable. The term <inline-formula><mml:math id="M10"><mml:msup><mml:mrow><mml:msub><mml:mrow><mml:mi>C</mml:mi></mml:mrow><mml:mrow><mml:msub><mml:mrow><mml:mi>c</mml:mi></mml:mrow><mml:mrow><mml:mi>j</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:msub></mml:mrow><mml:mrow><mml:mi>e</mml:mi></mml:mrow></mml:msup><mml:msub><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003C9;</mml:mn></mml:mstyle></mml:mrow><mml:mrow><mml:mi>j</mml:mi></mml:mrow></mml:msub><mml:mo class="MathClass-rel">&#x02264;</mml:mo><mml:mn>0</mml:mn></mml:math></inline-formula> represents the linearized friction cone constraint for a point contact, and <inline-formula><mml:math id="M11"><mml:msup><mml:mtext>&#x02009;</mml:mtext><mml:mrow><mml:mi>e</mml:mi></mml:mrow></mml:msup><mml:mi>J</mml:mi><mml:mrow><mml:mo class="MathClass-open">(</mml:mo><mml:mrow><mml:mi>q</mml:mi></mml:mrow><mml:mo class="MathClass-close">)</mml:mo></mml:mrow><mml:mover accent="true"><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BD;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-op">&#x002D9;</mml:mo></mml:mover><mml:msup><mml:mrow><mml:mo class="MathClass-bin">&#x0002B;</mml:mo></mml:mrow><mml:mrow><mml:mi>e</mml:mi></mml:mrow></mml:msup><mml:mover accent="true"><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mo class="MathClass-op">&#x002D9;</mml:mo></mml:mover><mml:mrow><mml:mo class="MathClass-open">(</mml:mo><mml:mrow><mml:mi>q</mml:mi><mml:mo class="MathClass-punc">,</mml:mo><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BD;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-close">)</mml:mo></mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BD;</mml:mn></mml:mstyle><mml:mo class="MathClass-rel">&#x0003D;</mml:mo><mml:mn>0</mml:mn></mml:math></inline-formula>, its coupled &#x0201C;no motion&#x0201D; constraint, which ensures that the contact does not move. For details on these constraint expressions and the way to express them through linearization as functions of joint torques or generalized acceleration, the reader is directed to Salini et al. (<xref ref-type="bibr" rid="B18">2011</xref>). In addition to these nearly universal robotic constraints, particular care must be taken to ensure that the motions generated by the controller respect the system dynamics, i.e., the equations of motion.</p>
<table-wrap position="float" id="T3">
<label>Table 3</label>
<caption><p>Possible constraints in OCRA.</p></caption>
<table frame="hsides" rules="groups">
<thead>
<tr>
<th valign="top" align="left"><italic>General constraint</italic></th>
<th valign="top" align="center"><italic>Equation</italic></th>
</tr>
</thead>
<tbody>
<tr>
<td valign="top" align="left">Actuator limits</td>
<td valign="top" align="center"><bold><italic>&#x003C4;</italic></bold><sub>min</sub>&#x02009;&#x02264;&#x02009;<bold><italic>&#x003C4;</italic></bold>&#x02009;&#x02264;&#x02009;<bold><italic>&#x003C4;</italic></bold><sub>max</sub></td>
</tr>
<tr>
<td valign="top" align="left">Joint position limits</td>
<td valign="top" align="center"><bold><italic>q</italic></bold><sub>min</sub>&#x02009;&#x02264;&#x02009;<bold><italic>q</italic></bold>&#x02009;&#x02264;&#x02009;<bold><italic>q</italic></bold><sub>max</sub></td>
</tr>
<tr>
<td valign="top" align="left">Joint velocity limits</td>
<td valign="top" align="center"><inline-formula><mml:math id="M12"><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BD;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-op">&#x002D9;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>min</mml:mtext></mml:mrow></mml:msub><mml:mo class="MathClass-rel">&#x02264;</mml:mo><mml:mover accent="true"><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BD;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-op">&#x002D9;</mml:mo></mml:mover><mml:mo class="MathClass-rel">&#x02264;</mml:mo><mml:msub><mml:mrow><mml:mover accent="true"><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BD;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-op">&#x002D9;</mml:mo></mml:mover></mml:mrow><mml:mrow><mml:mtext>max</mml:mtext></mml:mrow></mml:msub></mml:math></inline-formula></td>
</tr>
<tr>
<td valign="top" align="left">Contact constraints</td>
<td valign="top" align="center"><inline-formula><mml:math id="M13"><mml:msup><mml:mrow><mml:msub><mml:mrow><mml:mtext mathvariant="italic">C</mml:mtext></mml:mrow><mml:mrow><mml:msub><mml:mrow><mml:mtext mathvariant="italic">c</mml:mtext></mml:mrow><mml:mrow><mml:mtext mathvariant="italic">j</mml:mtext></mml:mrow></mml:msub></mml:mrow></mml:msub></mml:mrow><mml:mrow><mml:mtext mathvariant="italic">e</mml:mtext></mml:mrow></mml:msup><mml:msub><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003C9;</mml:mn></mml:mstyle></mml:mrow><mml:mrow><mml:mtext mathvariant="italic">j</mml:mtext></mml:mrow></mml:msub><mml:mo class="MathClass-rel">&#x02264;</mml:mo><mml:mtext>0</mml:mtext></mml:math></inline-formula></td>
</tr>
<tr>
<td align="left"/>
<td valign="top" align="center"><inline-formula><mml:math id="M14"><mml:msup><mml:mtext>&#x02009;</mml:mtext><mml:mrow><mml:mtext mathvariant="italic">e</mml:mtext></mml:mrow></mml:msup><mml:mtext mathvariant="italic">J</mml:mtext><mml:mrow><mml:mo class="MathClass-open">(</mml:mo><mml:mrow><mml:mtext mathvariant="bold-italic">q</mml:mtext></mml:mrow><mml:mo class="MathClass-close">)</mml:mo></mml:mrow><mml:mover accent="true"><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BD;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-op">&#x002D9;</mml:mo></mml:mover><mml:msup><mml:mrow><mml:mo class="MathClass-bin">&#x0002B;</mml:mo></mml:mrow><mml:mrow><mml:mtext mathvariant="italic">e</mml:mtext></mml:mrow></mml:msup><mml:mover accent="true"><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mo class="MathClass-op">&#x002D9;</mml:mo></mml:mover><mml:mrow><mml:mo class="MathClass-open">(</mml:mo><mml:mrow><mml:mtext mathvariant="bold-italic">q</mml:mtext><mml:mo class="MathClass-punc">,</mml:mo><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BD;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-close">)</mml:mo></mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BD;</mml:mn></mml:mstyle><mml:mo class="MathClass-rel">&#x0003D;</mml:mo><mml:mtext>0</mml:mtext></mml:math></inline-formula></td>
</tr>
</tbody>
</table>
</table-wrap>
</sec>
<sec id="S3-3">
<label>3.3</label> <title>Dynamics</title>
<p>The principle constraint of the controllers in OCRA is that of the system dynamics. This means that any solution found must be dynamically feasible, and consequently, respect the equations of motion,
<disp-formula id="E3"><label>(3)</label><mml:math id="M15"><mml:mrow><mml:mi>M</mml:mi><mml:mo stretchy="false">(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo stretchy="false">)</mml:mo><mml:mover accent="true"><mml:mi mathvariant="bold-italic">&#x003BD;</mml:mi><mml:mo>&#x002D9;</mml:mo></mml:mover><mml:mo>+</mml:mo><mml:munder><mml:munder><mml:mrow><mml:mi>C</mml:mi><mml:mo stretchy="false">(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>,</mml:mo><mml:mi mathvariant="bold-italic">&#x003BD;</mml:mi><mml:mo stretchy="false">)</mml:mo><mml:mi mathvariant="bold-italic">&#x003BD;</mml:mi><mml:mo>+</mml:mo><mml:mi mathvariant="bold-italic">g</mml:mi><mml:mo stretchy="false">(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mo stretchy="true">&#x0FE38;</mml:mo></mml:munder><mml:mrow><mml:mi>n</mml:mi><mml:mo stretchy="false">(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>,</mml:mo><mml:mi>&#x003BD;</mml:mi><mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:munder><mml:mo>=</mml:mo><mml:msup><mml:mi>S</mml:mi><mml:mi>&#x022A4;</mml:mi></mml:msup><mml:mi mathvariant="bold">&#x003C4;</mml:mi><mml:msup><mml:mo>+</mml:mo><mml:mi>e</mml:mi></mml:msup><mml:msup><mml:mi>J</mml:mi><mml:mi>&#x022A4;</mml:mi></mml:msup><mml:msup><mml:mrow><mml:mo stretchy="false">(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mi>e</mml:mi></mml:msup><mml:mi mathvariant="bold">&#x003C9;</mml:mi></mml:mrow></mml:math></disp-formula>
<disp-formula id="E4"><label>(4)</label><mml:math id="M16"><mml:mtable columnalign="left" class="align"><mml:mtr><mml:mtd columnalign="right" class="align-odd"><mml:mi>M</mml:mi><mml:mrow><mml:mo class="MathClass-open">(</mml:mo><mml:mrow><mml:mtext mathvariant="bold-italic">q</mml:mtext></mml:mrow><mml:mo class="MathClass-close">)</mml:mo></mml:mrow><mml:mover accent="true"><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BD;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-op">&#x002D9;</mml:mo></mml:mover><mml:mo class="MathClass-bin">&#x0002B;</mml:mo><mml:mtext mathvariant="bold-italic">n</mml:mtext><mml:mrow><mml:mo class="MathClass-open">(</mml:mo><mml:mrow><mml:mtext mathvariant="bold-italic">q</mml:mtext><mml:mo class="MathClass-punc">,</mml:mo><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003BD;</mml:mn></mml:mstyle></mml:mrow><mml:mo class="MathClass-close">)</mml:mo></mml:mrow><mml:mo class="MathClass-rel">&#x0003D;</mml:mo><mml:msup><mml:mrow><mml:mi>S</mml:mi></mml:mrow><mml:mrow><mml:mo class="MathClass-rel">&#x022A4;</mml:mo></mml:mrow></mml:msup><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003C4;</mml:mn></mml:mstyle><mml:msup><mml:mrow><mml:mo class="MathClass-bin">&#x0002B;</mml:mo></mml:mrow><mml:mrow><mml:mi>e</mml:mi></mml:mrow></mml:msup><mml:msup><mml:mrow><mml:mi>J</mml:mi></mml:mrow><mml:mrow><mml:mo class="MathClass-rel">&#x022A4;</mml:mo></mml:mrow></mml:msup><mml:msup><mml:mrow><mml:mrow><mml:mo class="MathClass-open">(</mml:mo><mml:mrow><mml:mtext mathvariant="bold-italic">q</mml:mtext></mml:mrow><mml:mo class="MathClass-close">)</mml:mo></mml:mrow></mml:mrow><mml:mrow><mml:mi>e</mml:mi></mml:mrow></mml:msup><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003C9;</mml:mn></mml:mstyle><mml:mo class="MathClass-punc">.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math>
</disp-formula></p>
<p>In (3), <italic>M</italic>(<bold><italic>q</italic></bold>) is the generalized mass matrix, <italic>C</italic>(<bold><italic>q</italic></bold>, <bold><italic>&#x003BD;</italic></bold>)<bold><italic>&#x003BD;</italic></bold> and <bold><italic>g</italic></bold>(<bold><italic>q</italic></bold>) are the Coriolis-centrifugal and gravitational terms, <italic>S</italic> is a selection matrix indicating the actuated degrees of freedom, <italic><sup>e</sup></italic><bold><italic>&#x003C9;</italic></bold> is the concatenation of the external contact wrenches, and <italic><sup>e</sup>J</italic> their concatenated Jacobians. Grouping <italic>C</italic>(<bold><italic>q</italic></bold>, <bold><italic>&#x003BD;</italic></bold>)<bold><italic>&#x003BD;</italic></bold> and <bold><italic>g</italic></bold>(<bold><italic>q</italic></bold>) together into <bold><italic>n</italic></bold>(<bold><italic>q</italic></bold>, <bold><italic>&#x003BD;</italic></bold>), we can simplify the equations to (4). Additionally, the variables <inline-formula><mml:math id="M25"><mml:mover accent="true"><mml:mi mathvariant="bold-italic">&#x003BD;</mml:mi><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:math></inline-formula>, &#x003C4;, and <italic><sup>e</sup></italic><bold><italic>&#x003C9;</italic></bold>, can be grouped into the same vector,
<disp-formula id="E5"><label>(5)</label><mml:math id="M17"><mml:mrow><mml:mi>x</mml:mi><mml:mo>=</mml:mo><mml:mrow><mml:mo>[</mml:mo><mml:mrow><mml:mtable><mml:mtr><mml:mtd><mml:mover accent="true"><mml:mi mathvariant="bold">&#x003BD;</mml:mi><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mi mathvariant="bold">&#x003C4;</mml:mi></mml:mtd></mml:mtr><mml:mtr><mml:mtd><mml:mrow><mml:msup> <mml:mrow></mml:mrow> <mml:mi>e</mml:mi></mml:msup><mml:mi mathvariant="bold">&#x003C9;</mml:mi><mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow><mml:mo>]</mml:mo></mml:mrow></mml:mrow></mml:math>
</disp-formula> forming the <italic>control variable</italic>, and allowing (4) to be rewritten as,
<disp-formula id="E6"><label>(6)</label><mml:math id="M18"><mml:mrow><mml:munder><mml:munder><mml:mrow><mml:mo stretchy="false">[</mml:mo><mml:mo>&#x02212;</mml:mo><mml:mi>M</mml:mi><mml:mo stretchy="false">(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo stretchy="false">)</mml:mo><mml:mtext>&#x000A0;&#x000A0;&#x000A0;&#x000A0;</mml:mtext><mml:msup><mml:mi>S</mml:mi><mml:mi>&#x022A4;</mml:mi></mml:msup><mml:mtext>&#x000A0;&#x000A0;&#x000A0;&#x000A0;</mml:mtext><mml:msup><mml:mrow></mml:mrow><mml:mi>e</mml:mi></mml:msup><mml:mtext>&#x000A0;&#x000A0;&#x000A0;</mml:mtext><mml:msup><mml:mi mathvariant="bold-italic">J</mml:mi><mml:mi>&#x022A4;</mml:mi></mml:msup><mml:mo stretchy="false">(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo stretchy="false">)</mml:mo><mml:mo stretchy="false">]</mml:mo></mml:mrow><mml:mo stretchy="true">&#x0FE38;</mml:mo></mml:munder><mml:mi>A</mml:mi></mml:munder><mml:mi mathvariant="bold-italic">x</mml:mi><mml:mo>=</mml:mo><mml:munder><mml:munder><mml:mrow><mml:mi mathvariant="bold-italic">n</mml:mi><mml:mo stretchy="false">(</mml:mo><mml:mi mathvariant="bold-italic">q</mml:mi><mml:mo>,</mml:mo><mml:mi mathvariant="bold-italic">&#x003BD;</mml:mi><mml:mo stretchy="false">)</mml:mo></mml:mrow><mml:mo stretchy="true">&#x0FE38;</mml:mo></mml:munder><mml:mi>b</mml:mi></mml:munder><mml:mo>.</mml:mo></mml:mrow></mml:math>
</disp-formula></p>
<p>Equation <xref ref-type="disp-formula" rid="E6">6</xref> provides an affine equality constraint, <italic>A</italic><bold><italic>x</italic></bold>&#x02009;&#x0003D;&#x02009;<bold><italic>b</italic></bold>, which can be used to ensure that the minimization of the control objectives respects the system dynamics.</p>
</sec>
<sec id="S3-4">
<label>3.4</label> <title>Quadratic Programming Based Control</title>
<p>Given the control objectives defined by the task errors from Section <xref ref-type="sec" rid="S3-1">3.1</xref>, the control constraints from Section <xref ref-type="sec" rid="S3-2">3.2</xref>, and the optimization variable defined by (5), we can now form a generic, single task, optimization-based whole-body control problem as,
<disp-formula id="E7"><label>(7)</label><mml:math id="M19"><mml:mtable columnalign="left" class="align"><mml:mtr><mml:mtd columnalign="left" class="align-odd"><mml:munder accentunder="true"><mml:mrow><mml:mtext>min</mml:mtext></mml:mrow><mml:mrow><mml:mtext mathvariant="bold-italic">x</mml:mtext></mml:mrow></mml:munder></mml:mtd><mml:mtd class="align-even"><mml:msub><mml:mrow><mml:mi>T</mml:mi></mml:mrow><mml:mrow><mml:mi>i</mml:mi></mml:mrow></mml:msub><mml:mrow><mml:mo class="MathClass-open">(</mml:mo><mml:mrow><mml:mtext mathvariant="bold-italic">x</mml:mtext></mml:mrow><mml:mo class="MathClass-close">)</mml:mo></mml:mrow></mml:mtd></mml:mtr><mml:mtr><mml:mtd columnalign="left" class="align-odd"><mml:mtext>s.t.</mml:mtext></mml:mtd><mml:mtd class="align-even"><mml:mi>G</mml:mi><mml:mtext mathvariant="bold-italic">x</mml:mtext><mml:mo class="MathClass-rel">&#x02264;</mml:mo><mml:mtext mathvariant="bold-italic">h</mml:mtext></mml:mtd></mml:mtr><mml:mtr><mml:mtd class="align-even"></mml:mtd><mml:mtd class="align-even"><mml:mi>A</mml:mi><mml:mtext mathvariant="bold-italic">x</mml:mtext><mml:mo class="MathClass-rel">&#x0003D;</mml:mo><mml:mtext mathvariant="bold-italic">b</mml:mtext><mml:mo class="MathClass-punc">,</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math>
</disp-formula> where the objective function, <italic>T<sub>i</sub></italic>(<bold><italic>x</italic></bold>), is the task error, representing for example, the squared error between a desired acceleration or wrench and the system&#x02019;s (see Section <xref ref-type="sec" rid="S3-1">3.1</xref>). The inequality constraints, generically represented by, <italic>G</italic><bold><italic>x</italic></bold>&#x02009;&#x02264;&#x02009;<bold><italic>h</italic></bold>, contain the concatenation of all of the affine inequalities defined in Table <xref ref-type="table" rid="T3">3</xref>, while the affine equality constraints, shown by <italic>A</italic><bold><italic>x</italic></bold>&#x02009;&#x0003D;&#x02009;<bold><italic>b</italic></bold>, obligatorily contain the equation of motion constraints from (6), and possibly the coupled &#x0201C;no motion&#x0201D; constraints of any contacts which might be active.</p>
<p>The form of this problem will be referred to throughout this work as the <italic>full problem</italic>, which is also the default formulation used in OCRA. The user can choose to work with the <italic>reduced problem</italic>, in which the dynamics are not explicit in the constraints, but projected onto the different control objectives, and with the optimization variable, <bold><italic>x</italic></bold>, in this case, consisting of the control inputs, <bold><italic>&#x003C4;</italic></bold>, and external wrenches <italic><sup>e</sup></italic><bold><italic>&#x003C9;</italic></bold>, i.e., <inline-formula><mml:math id="M20"><mml:mtext mathvariant="bold-italic">x</mml:mtext><mml:mo class="MathClass-rel">&#x0003D;</mml:mo><mml:msup><mml:mrow><mml:mrow><mml:mo class="MathClass-open">[</mml:mo><mml:mrow><mml:msup><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003C4;</mml:mn></mml:mstyle></mml:mrow><mml:mrow><mml:mo class="MathClass-rel">&#x022A4;</mml:mo></mml:mrow></mml:msup><mml:msup><mml:mrow><mml:mspace width="1em" class="quad"/></mml:mrow><mml:mrow><mml:mi>e</mml:mi></mml:mrow></mml:msup><mml:msup><mml:mrow><mml:mstyle mathvariant="bold-italic"><mml:mn>&#x003C9;</mml:mn></mml:mstyle></mml:mrow><mml:mrow><mml:mo class="MathClass-rel">&#x022A4;</mml:mo></mml:mrow></mml:msup></mml:mrow><mml:mo class="MathClass-close">]</mml:mo></mml:mrow></mml:mrow><mml:mrow><mml:mo class="MathClass-rel">&#x022A4;</mml:mo></mml:mrow></mml:msup></mml:math></inline-formula>. The reduced problem has the advantage of having less optimization variables, which can improve the solution time as shown in Section <xref ref-type="sec" rid="S3-5">3.5</xref> of Salini (<xref ref-type="bibr" rid="B16">2012</xref>), at the expense of complicating the writing of the tasks and constraints in terms of the optimization variable. The inclusion of the generalized joint accelerations, <inline-formula><mml:math id="M26"><mml:mover accent="true"><mml:mi mathvariant="bold-italic">&#x003BD;</mml:mi><mml:mo>&#x002D9;</mml:mo></mml:mover></mml:math></inline-formula>, in the full problem, yields clarity and simplicity when writing the cost functions and the constraints on the joint velocities, acceleration and joint limits.</p>
</sec>
<sec id="S3-5">
<label>3.5</label> <title>Prioritization Strategies</title>
<p>Up to this point, only one task objective function is considered in the whole-body controller in Section <xref ref-type="sec" rid="S3-4">3.4</xref>. If multiple task objective functions are combined (using operations that preserve convexity) in the resolution of the control problem, then they can be performed simultaneously. In these cases, it is important to select a strategy for the resolution of the optimization problem. The strategy will in turn, determine how tasks interact/interfere with one another. The two prevailing methods for dealing with multiple tasks are hierarchical (Saab et al., <xref ref-type="bibr" rid="B15">2013</xref>; Escande et al., <xref ref-type="bibr" rid="B2">2014</xref>) implemented as WOCRA and weighted prioritization (Bouyarmane and Kheddar, <xref ref-type="bibr" rid="B1">2011</xref>; Salini et al., <xref ref-type="bibr" rid="B18">2011</xref>) implemented as HOCRA. A hybrid scheme can also be used providing the best of the former two methods (Liu et al., <xref ref-type="bibr" rid="B6">2016</xref>).</p>
</sec>
</sec>
<sec id="S4">
<label>4</label> <title>Software</title>
<sec id="S4-6">
<label>4.1</label> <title>Structure</title>
<sec id="S4-6-1">
<label>4.1.1</label> <title>OCRA Libraries</title>
<p>The main concepts introduced in previous sections are materialized in the different interfaces, abstract, and concrete classes OCRA is composed of. These are encapsulated in four essential components or libraries. These are: <monospace>ocra-optim</monospace>, <monospace>ocra-control</monospace>, <monospace>ocra-coms</monospace>, and <monospace>ocra-utils</monospace>.</p>
<p>The first of these libraries, <monospace>ocra-optim</monospace>, defines the lowest-level data structures required to build an optimization problem such as variables, functions, and constraints, as well as the basic concept of a solver and prioritization strategies. Table <xref ref-type="table" rid="T4">4</xref> shows the main classes in this library, their type, and a brief description.</p>
<table-wrap position="float" id="T4">
<label>Table 4</label>
<caption><p>Main classes composing the <monospace>ocra-optim</monospace> library.</p></caption>
<table frame="hsides" rules="groups">
<thead>
<tr>
<th align="left" valign="top"/>
<th align="left" valign="top">ocra-optim</th>
</tr>
<tr>
<th align="left" valign="top" colspan="2"><hr/></th>
</tr>
<tr>
<th align="left" valign="top">Main classes</th>
<th align="left" valign="top">Features</th>
</tr>
</thead>
<tbody>
<tr>
<td valign="top" align="left"><monospace>Variable</monospace> <graphic xlink:href="frobt-05-00024-i001.tif"/></td>
<td valign="top" align="left">Represents the mathematical concept of variable</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>Function</monospace> <graphic xlink:href="frobt-05-00024-i002.tif"/></td>
<td valign="top" align="left">Base for any type of function</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>Constraint</monospace> <graphic xlink:href="frobt-05-00024-i002.tif"/></td>
<td valign="top" align="left">Templated base class to build equality/inequalities constraints</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>LinearizedCoulombFunction</monospace> <graphic xlink:href="frobt-05-00024-i002.tif"/></td>
<td valign="top" align="left">Builds a discretized cone representing a Coulomb Friction cone</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>Solver</monospace> <graphic xlink:href="frobt-05-00024-i001.tif"/></td>
<td valign="top" align="left">Base class for optimization solvers</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>CascadeQPSolver</monospace> <graphic xlink:href="frobt-05-00024-i003.tif"/></td>
<td valign="top" align="left">Implements a hierarchical solver</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>OneLevelSolver</monospace> <graphic xlink:href="frobt-05-00024-i001.tif"/></td>
<td valign="top" align="left">Used for building solvers with one level of importannce to all tasks. It also contains specific implementations with <monospace>QuadProg</monospace>&#x0002B;&#x0002B; and <monospace>QPOases</monospace>. This is the solver used in <monospace>wocra</monospace></td>
</tr>
</tbody>
</table>
<table-wrap-foot>
<p><italic>Blue labels indicate abstract classes that can be later implemented. Orange labels are assigned instead to concrete classes without particular inheritances, while green labels stand for implemented classes</italic>.</p>
</table-wrap-foot>
</table-wrap>
<p>The <monospace>ocra-control</monospace> library goes up one level of abstraction, containing all the classes necessary to build the model of a robot, implement a control law, account for the floating-base dynamics and build the different types of tasks, constraints and trajectories. The two main prioritization techniques described in Section <xref ref-type="sec" rid="S3-5">3.5</xref> are, respectively, implemented through <monospace>HOCRA</monospace> and <monospace>WOCRA</monospace>. Again, the main classes in this library along with their brief description are collected in Table <xref ref-type="table" rid="T5">5</xref>.</p>
<table-wrap position="float" id="T5">
<label>Table 5</label>
<caption><p>Main classes composing the <monospace>ocra-control</monospace> library.</p></caption>
<table frame="hsides" rules="groups">
<thead>
<tr>
<th valign="top" align="center" colspan="2">ocra-control<hr/></th>
</tr>
<tr>
<th valign="top" align="left">Main classes</th>
<th valign="top" align="left">Features</th>
</tr>
</thead>
<tbody>
<tr>
<td valign="top" align="left"><monospace>Controller</monospace> <graphic xlink:href="frobt-05-00024-i001.tif"/></td>
<td valign="top" align="left">Used to implement control laws</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>Model</monospace> <graphic xlink:href="frobt-05-00024-i001.tif"/></td>
<td valign="top" align="left">Provides dynamic and static terms from the equations of motion</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>FullDynamicEquationFunction</monospace> <graphic xlink:href="frobt-05-00024-i001.tif"/></td>
<td valign="top" align="left">Creates the dynamics equation as a linear function of the optimization variable</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>ModelContacts</monospace> <graphic xlink:href="frobt-05-00024-i002.tif"/></td>
<td valign="top" align="left">Concatenates the contact variables and Jacobians for a model</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>ControlFrame</monospace> <graphic xlink:href="frobt-05-00024-i004.tif"/></td>
<td valign="top" align="left">Generic representation of a frame</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>Feature</monospace> <graphic xlink:href="frobt-05-00024-i004.tif"/></td>
<td valign="top" align="left">Used by tasks to compute errors and Jacobians</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>Task</monospace> <graphic xlink:href="frobt-05-00024-i002.tif"/></td>
<td valign="top" align="left">&#x02013;</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>TaskBuilder</monospace> <graphic xlink:href="frobt-05-00024-i001.tif"/></td>
<td valign="top" align="left">Builds task-specific features</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>&#x0002A;TaskBuilder</monospace> <graphic xlink:href="frobt-05-00024-i003.tif"/></td>
<td valign="top" align="left">Task-specific implementations of <monospace>TaskBuilder</monospace>. &#x0201C;&#x0002A;&#x0201D; is replaced by Com, FullPosture, Orientation, etc.</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>TaskConstructionManager</monospace> <graphic xlink:href="frobt-05-00024-i001.tif"/></td>
<td valign="top" align="left">&#x02013;</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>&#x0002A;LimitConstraint</monospace> <graphic xlink:href="frobt-05-00024-i003.tif"/></td>
<td valign="top" align="left">(torque and joint limits)</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>Trajectory</monospace> <graphic xlink:href="frobt-05-00024-i002.tif"/></td>
<td valign="top" align="left">Helper class to build trajectories. These can be minimum jerk, linearly interpolated, gaussian processes or time-optimal</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>WocraController</monospace> <graphic xlink:href="frobt-05-00024-i003.tif"/></td>
<td valign="top" align="left">QP-based controller using a weighted prioritization strategy</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>HocraController</monospace> <graphic xlink:href="frobt-05-00024-i003.tif"/></td>
<td valign="top" align="left">QP-based controller using a hierarchical prioritization strategy</td>
</tr>
</tbody>
</table>
<table-wrap-foot>
<p><italic>Blue labels indicate abstract classes that can be later implemented. Orange labels are assigned instead to concrete classes without particular inheritances. Red labels to interfaces and green labels to implementations</italic>.</p>
</table-wrap-foot>
</table-wrap>
<p>The last two libraries are agnostic to the paradigm suggested by OCRA. That is, a client&#x02013;server model. In order to implement it, the <monospace>ocra-coms</monospace> library is provided and comes with the generic classes to create a server and a client and to manage the communication between them. Table <xref ref-type="table" rid="T6">6</xref> lists the main classes in this library along with their description.</p>
<table-wrap position="float" id="T6">
<label>Table 6</label>
<caption><p>Main classes composing the <monospace>ocra-coms</monospace> library.</p></caption>
<table frame="hsides" rules="groups">
<thead>
<tr>
<th align="center" valign="top" colspan="2">ocra-coms<hr/></th>
</tr>
<tr>
<th valign="top" align="left">Main classes</th>
<th valign="top" align="left">Features</th>
</tr>
</thead>
<tbody>
<tr>
<td valign="top" align="left"><monospace>ControllerServer</monospace> <graphic xlink:href="frobt-05-00024-i001.tif"/></td>
<td valign="top" align="left">Must be inherited to implement the server side</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>ServerCommunications</monospace> <graphic xlink:href="frobt-05-00024-i002.tif"/></td>
<td valign="top" align="left">Helps the server establish YARP-based communication with the client</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>ClientCommunications</monospace> <graphic xlink:href="frobt-05-00024-i002.tif"/></td>
<td valign="top" align="left">Helps the client establish YARP-based communication with the server</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>ClientManager</monospace> <graphic xlink:href="frobt-05-00024-i002.tif"/></td>
<td valign="top" align="left">Implements the functionalities of <monospace>YARP RFModule</monospace> on the client side. Holds the main client thread</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>ControllerClient</monospace> <graphic xlink:href="frobt-05-00024-i001.tif"/></td>
<td valign="top" align="left">Implements the functionalities of <monospace>YARP RateThread</monospace> on the client side. Main thread hosted by <monospace>ClientManager</monospace></td>
</tr>
<tr>
<td valign="top" align="left"><monospace>TaskConnection</monospace> <graphic xlink:href="frobt-05-00024-i002.tif"/></td>
<td valign="top" align="left">Used on the client side to connect and communicate with the tasks started by the server</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>TrajectoryThread</monospace> <graphic xlink:href="frobt-05-00024-i002.tif"/></td>
<td valign="top" align="left">Used to create trajectories on the client side</td>
</tr>
</tbody>
</table>
<table-wrap-foot>
<p><italic>Blue labels indicate abstract classes that can be later implemented. Orange labels are assigned instead to concrete classes without particular inheritances</italic>.</p>
</table-wrap-foot>
</table-wrap>
<p>Finally, the <monospace>ocra-utils</monospace> library as its name states, is a set of utilities to aid the other libraries: helpers to perform file operations, xml parsing, data structure conversions, errors descriptors, among others.</p>
</sec>
<sec id="S4-6-2">
<label>4.1.2</label> <title>OCRA for iCub</title>
<p>The classes needed to <italic>implement</italic> a server for the iCub robot and a generic client are present in the <monospace>ocra-icub</monospace> library. As can be seen from the green implementation labels in Table <xref ref-type="table" rid="T7">7</xref>, most of the main classes are implementations of base classes from <monospace>ocra-control</monospace> and <monospace>ocra-coms</monospace>. In the following section, two main detailed explanations are provided: how to use these classes to obtain a client&#x02013;server architecture for iCub, and how objects of the different classes interact.</p>
<table-wrap position="float" id="T7">
<label>Table 7</label>
<caption><p>Main classes composing the <monospace>ocra-icub</monospace> library.</p></caption>
<table frame="hsides" rules="groups">
<thead>
<tr>
<th valign="top" align="center" colspan="2">ocra-icub<hr/></th>
</tr>
<tr>
<th valign="top" align="left">Main classes</th>
<th valign="top" align="left">Features</th>
</tr>
</thead>
<tbody>
<tr>
<td valign="top" align="left"><monospace>ModelInitializer</monospace> <graphic xlink:href="frobt-05-00024-i005.tif"/></td>
<td valign="top" align="left">Retrieves model configuration information from the server to create a local copy of the robot model</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>OcraWbiModel</monospace> <graphic xlink:href="frobt-05-00024-i006.tif"/></td>
<td valign="top" align="left">Implements the abstract Model class from <monospace>ocra-control</monospace> for the iCub robot</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>IcubControllerServer</monospace> <graphic xlink:href="frobt-05-00024-i007.tif"/></td>
<td valign="top" align="left">Implements <monospace>ControllerServer</monospace> for the iCub robot</td>
</tr>
<tr>
<td valign="top" align="left"><monospace>Module</monospace> <graphic xlink:href="frobt-05-00024-i007.tif"/></td>
<td valign="top" align="left">Module that launches the controller thread, parses controller options and the tasks set XML. Basically a <monospace>yarp:os:RFModule</monospace></td>
</tr>
<tr>
<td valign="top" align="left"><monospace>Thread</monospace> <graphic xlink:href="frobt-05-00024-i007.tif"/></td>
<td valign="top" align="left">Main controller thread started. Created by <monospace>Module</monospace>, contains the controller, tasks manager, and solves the whole-body control problem</td>
</tr>
</tbody>
</table>
<table-wrap-foot>
<p><italic>Orange labels mean concrete class without any particular inheritance. Green labels are for classes that implement some base class from the main OCRA libraries. Yellow labels stand indicate classes that are used to build a client, while gray labels are for those used to build a server</italic>.</p>
</table-wrap-foot>
</table-wrap>
<p>Given the classes involved in the construction of this task-oriented, client-server paradigm for whole-body control, as well as the particular implementations for iCub, we present for the sake of clarity in Figure <xref ref-type="fig" rid="F1">1</xref> an illustration of a typical server&#x02013;client architecture with the underlying OCRA libraries used to build each component. This section proceeds with a time-based illustration of the interaction logic between the different objects of our system in the form of <italic>sequence diagrams</italic> (IEEE, <xref ref-type="bibr" rid="B3">2009</xref>) as shown in Figures <xref ref-type="fig" rid="F2">2</xref> and <xref ref-type="fig" rid="F3">3</xref>. Given the amount of classes in the package, it might be difficult to see the global interaction among them along with the intended architecture. The next two sections attempt to clear this out by showing the inner interactions of both client and server, independently and between them.</p>
<fig id="F1" position="float">
<label>Figure 1</label>
<caption><p>A server (ocra-icub-server) and a client (icub-client) are here represented in dark green as YARP modules. In light green, we see the underlying OCRA libraries associated to their construction, as well as for the communication between them and the parsing of the tasks set.</p></caption>
<graphic xlink:href="frobt-05-00024-g001.tif"/>
</fig>
<fig id="F2" position="float">
<label>Figure 2</label>
<caption><p>UML sequence diagram displaying the typical interactions within the ocra-icub-server. The time evolution of interactions is followed from top to bottom, while messages passed among objects are found in the horizontal dimension. The light yellow background of some lifelines indicates that these are threads.</p></caption>
<graphic xlink:href="frobt-05-00024-g002.tif"/>
</fig>
<fig id="F3" position="float">
<label>Figure 3</label>
<caption><p>UML sequence diagram displaying the typical interactions within a generic client. The time evolution of interactions is followed from top to bottom, while messages passed among objects are found in the horizontal dimension. The light yellow background of some lifelines indicate that these are threads.</p></caption>
<graphic xlink:href="frobt-05-00024-g003.tif"/>
</fig>
</sec>
<sec id="S4-6-3">
<label>4.1.3</label> <title>iCub Server</title>
<p>Figure <xref ref-type="fig" rid="F2">2</xref> depicts the sequence diagram for the <monospace>ocra</monospace>-<monospace>icub</monospace>-<monospace>server</monospace>. The user starts by executing the server from terminal issuing the command <monospace>ocra-icub-server [options]</monospace> (1).</p>
<p>The default options are specified in its initialization file <monospace>ocra-icub-server.ini</monospace> or hardcoded in the source code. After the execution of the server, an object of type <monospace>ResourceFinder</monospace> is created, which is responsible for the parsing of the former <italic>options</italic>. Right after, a yarp <monospace>RFModule</monospace> is created (3) and started (4), whose first task will be to configure the server (6), ask the <monospace>ResourceFinder</monospace> to find the desired type of controller (7), i.e., WOCRA or HOCRA, the solver to be used, i.e., QUADPROG or QPOASES, the XML file with the description of the tasks that the client will manipulate, etc. At this point, a <monospace>yarpWholeBodyInterface</monospace> object is created (8) and initialized. This class serves as an interface to the robot, and as such will allow us to set the control references obtained, as well as to obtain the state of the robot. Now the module is ready to create (12) and start (13) the main thread of the client.</p>
<p>Before entering the main loop of the thread, however, a couple of objects of interest are created. First, an object of type <monospace>IcubControllerServer</monospace> (14), which during initialization (16) will create the desired controller with its internal solver. At this phase, also communication ports are opened with standardized names that will be used by the cient for future connections. <monospace>IcubControllerServer</monospace> is then asked by the thread to update its internal model of the robot (17) and add the tasks specified by the user via XML (18). This process involves the creation (19) of an object of type <monospace>TaskConstructionManager</monospace> which will create one or multiple instances (20) of <monospace>TaskBuilder</monospace>, one per type of task found in the XML. These task objects will then get added to <monospace>iCubControllerServer</monospace> (21). Notice how the tasks are <italic>living in the server</italic>. The server will then ask the <monospace>yarpWholeBodyInterface</monospace> object to set the torque control mode on the robot (22) for it to accept torque references. The latter are computed every cycle of the <monospace>Thread</monospace> (24&#x02013;27) by <monospace>iCubControllerServer</monospace>.</p>
<p>The server will be constantly controlling the robot to achieve default initial states of the specified tasks. As an example, if one task is of COM type, it controls the robot to keep it at its initial position, until a client connects to the server and tells it to do otherwise. Finally, if the user decides to stop the server (28), the sequence of object &#x0201C;destructions&#x0201D; is illustrated from (29) to (37).</p>
</sec>
<sec id="S4-6-4">
<label>4.1.4</label> <title>Generic Client</title>
<p>A client&#x02019;s main goal is to connect to the server to provide reference trajectories to the tasks it hosts. Let us show through Figure <xref ref-type="fig" rid="F3">3</xref> the main interactions within a client and the type of communication it establishes with the server.</p>
<p>As done previously on the server side, we are going to follow the sequence diagram in an orderly fashion. First, notice how before the user can start a client, they need to start the server. This is evident by the sequence number (2) next to <monospace>example-client</monospace>. Thus, having a server properly started, the client is launched and the first thing it does is to get model information of the robot through the class <monospace>ModelInitializer</monospace>. This is the first interaction between the client and the server (4-5), after which a local model of the robot is built (6). Once the client has access to the robot model, the main client thread is created (7). This is of type <monospace>ControllerClient</monospace> which is a Yarp <monospace>RateThread</monospace>. The creation of the thread is followed by a <monospace>ClientCommunications</monospace> object (8), which creates and connects local ports to the server for inter-process communications. Its role will become clearer later on. The client thread is passed to a <monospace>ClientManager</monospace> object (10) which will handle the life-cycle of the thread and its configuration (11&#x02013;12). The module subsequently starts (18) the client thread, which afters initialization will spawn a couple of objects of interest.</p>
<p>Given the tasks contained in the XML file (taskSet) and fed to the server, the client will create one or more <monospace>TaskConnection</monospace> objects (18) for each of those tasks that are to be manipulated. Although not depicted in the diagram, for the sake of clarity, these objects will open control ports that are then connected to their corresponding tasks on the server side (19). It is through these objects that the client will be able to send task-specific messages to get or set their state.</p>
<p>As it is often the case, the user might want to create reference trajectories (of even different types) for all or some of the tasks. To this end one or more objects of type <monospace>TrajectoryThread</monospace> are created (20). These, at the same time, will internally create <monospace>TaskConnection</monospace> objects again to set the references to the tasks on the server (21). The client thread can then start the trajectory threads (23) and run in the background until it receives new references (25&#x02013;29).</p>
<p>Now that the client has created task connections and trajectory threads, the client logic starts in the main thread (30&#x02013;40). In this main loop, the client can:
<list list-type="bullet">
<list-item><p>Get or set task-specific states through the <monospace>TaskConnection</monospace> objects (31&#x02013;34).</p></list-item>
<list-item><p>Add, remove or get tasks through the <monospace>ClientCommunications</monospace> object (35&#x02013;38).</p></list-item>
<list-item><p>Set references to tasks trajectories through the <monospace>TrajectoryThread</monospace> objects (39&#x02013;40).</p></list-item>
</list></p>
<p>In order to stop the client, the user can send a <monospace>SIGINT</monospace> signal (<monospace>ctrl</monospace>&#x02009;&#x0002B;<monospace>&#x02009;c</monospace>) to kill the process and the sequence of &#x0201C;destructions&#x0201D; will be as in (43&#x02013;53).</p>
<p>In Section 5.2, a link to a short tutorial can be found where it is explained how to launch a server and client.</p>
</sec>
<sec id="S4-6-5">
<label>4.1.5</label> <title>Client Generator</title>
<p>Because each new iCub controller client requires the same basic setup, a helper tool has been developed to automatically scaffold out the minimum required code for a new client. Invoking <monospace>icub</monospace>-<monospace>client</monospace>-<monospace>generator</monospace> <monospace>[name-of-client]</monospace> from the command line will produce a directory called <monospace>name</monospace>-<monospace>of</monospace>-<monospace>client/</monospace>, with all of the minimum client requirements and a complete <monospace>CMake</monospace> build. One then needs only to edit the <monospace>name-of-client.cpp</monospace> file and add control logic. Therefore, anyone can write an iCub client in just a few minutes.</p>
</sec>
</sec>
</sec>
<sec id="S5">
<label>5</label> <title>Conclusion</title>
<p>The development of intelligent and autonomous robots entails many challenges, one of which is robust and flexible controllers. The overall goal of any control software should be to abstract the control of redundant robots, such as the iCub, to higher and higher levels of logic in order to facilitate the generation of complex overall behaviors&#x02014;behaviors, which should ultimately render the robot useful. Whole-body control was born from these requirements and lays forth the design criteria for OCRA presented in Section <xref ref-type="sec" rid="S1">1</xref>. Through its various abstract and concrete classes, and server&#x02013;client structure, OCRA attempts to provide a solution which meets these needs but also balances ease of use with flexibility. The design of OCRA allows users to interact with and customize the control problem at virtually any level from the real-time computation of joint torques to high-level controller clients. This wide array of usability means that OCRA is suitable for any user from control experts to control novices. We believe that this is an important step toward improving the usability of such software because the learning curve should be simple for those who only want a functioning controller, but the software should also be flexible enough to allow users to experiments with fundamental concepts.</p>
<p>At the low-level, this is accomplished by abstracting the various aspects of the control problem and providing concrete implementations for the most commonly reused concepts. Users interested in low-level control concepts can, therefore, experiment with customizing the abstract interface classes to their own needs, or simply construct novel controllers using the concrete class implementations. Higher-level usage on the other hand, is easy to get started with, thanks to the server&#x02013;client architecture. If the robot has been properly interfaced with the OCRA controller server, then clients can be developed with little effort and most of all, no deep understanding of the internals of the server side. Various examples of the different manners in which one can interact with OCRA are presented in the Supplemental Data Section and validate the variety of ways OCRA can be used to study and develop autonomy.</p>
<p>Ultimately, OCRA should serve as the basis for increasingly complex logic, by robustly resolving progressively more complex layers of the control problem. The server&#x02013;client architecture is just the beginning of this process and should be built upon by even high-levels of problem reasoning, to create greater and greater levels of robot autonomy.</p>
</sec>
<sec id="S6">
<title>Author Contributions</title>
<p>GE, RL, and AH contributed to the development and integration of the proposed software framework. VP laid out the conceptual foundations of the main algorithms in this software. GE, RL, AH, and VP contributed to the writing of the associated paper, JE being the main contributor to the writing.</p>
</sec>
<sec id="S7">
<title>Conflict of Interest Statement</title>
<p>The authors declare that the research was conducted in the absence of any commercial or financial relationships that could be construed as a potential conflict of interest.</p>
</sec>
</body>
<back>
<ack>
<p>The authors wish to acknowledge the contribution of CEA-List for providing access to the ORC framework as well as to the engineers/researchers whose work has led to OCRA: Darwin Lau, Mingxin Liu, Joseph Salini, Hak Sovannara, and Silvio Traversaro.</p>
</ack>
<fn-group>
<fn fn-type="financial-disclosure">
<p><bold>Funding.</bold> The research leading to these results has received funding from the European Community&#x02019;s Seventh Framework Programme (FP7/2007-2013) under grant agreements No. 600716 (CoDyCo). This work has also been partially sponsored by the French government research program Investissements d&#x02019;Avenir through the Robotex Equipment of Excellence (ANR-10-EQPX-44).</p></fn>
</fn-group>
<sec id="S9">
<title>Online Material</title>
<p>Website: <uri xlink:href="https://ocra-recipes.github.io/web/">https://ocra-recipes.github.io/web/</uri>.</p>
<p>OCRA Documentation: <uri xlink:href="https://ocra-recipes.github.io/web/doxy-ocra-recipes/html/index.html">https://ocra-recipes.github.io/web/doxy-ocra-recipes/html/index.html</uri>.</p>
<p>OCRA iCub Documentation: <uri xlink:href="https://ocra-recipes.github.io/web/doxy-ocra-wbi-plugins/html/index.html">https://ocra-recipes.github.io/web/doxy-ocra-wbi-plugins/html/index.html</uri>.</p>
<p>OCRA Source Code: <uri xlink:href="https://github.com/ocra-recipes/ocra-recipes">https://github.com/ocra-recipes/ocra-recipes</uri>.</p>
<p>OCRA iCub Source Code: <uri xlink:href="https://github.com/ocra-recipes/ocra-wbi-plugins">https://github.com/ocra-recipes/ocra-wbi-plugins</uri>.</p>
<p>Related publications: <uri xlink:href="https://ocra-recipes.github.io/web/authors/">https://ocra-recipes.github.io/web/authors/</uri>.</p>
<p>Tutorials: <uri xlink:href="https://ocra-recipes.github.io/web/icub/2016/11/26/using-ocra-with-icub.html">https://ocra-recipes.github.io/web/icub/2016/11/26/using-ocra-with-icub.html</uri>.</p>
</sec>
<ref-list>
<title>References</title>
<ref id="B1"><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Bouyarmane</surname> <given-names>K.</given-names></name> <name><surname>Kheddar</surname> <given-names>A.</given-names></name></person-group> (<year>2011</year>). &#x0201C;<article-title>Using a multi-objective controller to synthesize simulated humanoid robot motion with changing contact configurations</article-title>,&#x0201D; in <conf-name>IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS), 2011</conf-name> (<conf-loc>San Francisco, CA</conf-loc>: <conf-sponsor>IEEE</conf-sponsor>), <fpage>4414</fpage>&#x02013;<lpage>4419</lpage>.<pub-id pub-id-type="doi">10.1109/IROS.2011.6094483</pub-id></citation></ref>
<ref id="B2"><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Escande</surname> <given-names>A.</given-names></name> <name><surname>Mansard</surname> <given-names>N.</given-names></name> <name><surname>Wieber</surname> <given-names>P.-B.</given-names></name></person-group> (<year>2014</year>). <article-title>Hierarchical quadratic programming: fast online humanoid-robot motion generation</article-title>. <source>Int. J. Rob. Res.</source> <volume>33</volume>, <fpage>1006</fpage>&#x02013;<lpage>1028</lpage>.<pub-id pub-id-type="doi">10.1177/0278364914521306</pub-id></citation></ref>
<ref id="B3"><citation citation-type="book"><collab>IEEE</collab>. (<year>2009</year>). <source>1016-2009 &#x02013; IEEE Standard for Information Technology&#x02013;Systems Design&#x02013;Software Design Descriptions</source> (<publisher-name>IEEE</publisher-name>).<pub-id pub-id-type="doi">10.1109/IEEESTD.2009.5167255</pub-id></citation></ref>
<ref id="B4"><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Khatib</surname> <given-names>O.</given-names></name></person-group> (<year>1986</year>). <article-title>Real-time obstacle avoidance for manipulators and mobile robots</article-title>. <source>Int. J. Rob. Res.</source> <volume>5</volume>, <fpage>90</fpage>&#x02013;<lpage>98</lpage>.<pub-id pub-id-type="doi">10.1177/027836498600500106</pub-id></citation></ref>
<ref id="B5"><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Khatib</surname> <given-names>O.</given-names></name></person-group> (<year>1987</year>). <article-title>A unified approach for motion and force control of robot manipulators: the operational space formulation</article-title>. <source>IEEE J. Rob. Autom.</source> <volume>3</volume>, <fpage>43</fpage>&#x02013;<lpage>53</lpage>.<pub-id pub-id-type="doi">10.1109/JRA.1987.1087068</pub-id></citation></ref>
<ref id="B6"><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Liu</surname> <given-names>M.</given-names></name> <name><surname>Tan</surname> <given-names>Y.</given-names></name> <name><surname>Padois</surname> <given-names>V.</given-names></name></person-group> (<year>2016</year>). <article-title>Generalized hierarchical control</article-title>. <source>Auton. Robots</source> <volume>40</volume>, <fpage>17</fpage>&#x02013;<lpage>31</lpage>.<pub-id pub-id-type="doi">10.1007/s10514-015-9436-1</pub-id></citation></ref>
<ref id="B7"><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Mansard</surname> <given-names>N.</given-names></name> <name><surname>Stasse</surname> <given-names>O.</given-names></name> <name><surname>Evrard</surname> <given-names>P.</given-names></name> <name><surname>Kheddar</surname> <given-names>A.</given-names></name></person-group> (<year>2009</year>). &#x0201C;<article-title>A versatile generalized inverted kinematics implementation for collaborative working humanoid robots: the stack of tasks</article-title>,&#x0201D; in <conf-name>International Conference on Advanced Robotics, 2009. ICAR 2009</conf-name> (<conf-loc>Munich</conf-loc>: <conf-sponsor>IEEE</conf-sponsor>), <fpage>1</fpage>&#x02013;<lpage>6</lpage>.</citation></ref>
<ref id="B8"><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Mistry</surname> <given-names>M.</given-names></name> <name><surname>Buchli</surname> <given-names>J.</given-names></name> <name><surname>Schaal</surname> <given-names>S.</given-names></name></person-group> (<year>2010</year>). &#x0201C;<article-title>Inverse dynamics control of floating base systems using orthogonal decomposition</article-title>,&#x0201D; in <conf-name>IEEE International Conference on Robotics and Automation</conf-name> (<conf-loc>Anchorage, AK</conf-loc>: <conf-sponsor>IEEE</conf-sponsor>), <fpage>3406</fpage>&#x02013;<lpage>3412</lpage>.<pub-id pub-id-type="doi">10.1109/ROBOT.2010.5509646</pub-id></citation></ref>
<ref id="B9"><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Nori</surname> <given-names>F.</given-names></name> <name><surname>Traversaro</surname> <given-names>S.</given-names></name> <name><surname>Eljaik</surname> <given-names>J.</given-names></name> <name><surname>Romano</surname> <given-names>F.</given-names></name> <name><surname>Del Prete</surname> <given-names>A.</given-names></name> <name><surname>Pucci</surname> <given-names>D.</given-names></name></person-group> (<year>2015</year>). <article-title>iCub whole-body control through force regulation on rigid non-coplanar contacts</article-title>. <source>Front. Rob. AI.</source> <volume>2</volume>:<fpage>6</fpage>.<pub-id pub-id-type="doi">10.3389/frobt.2015.00006</pub-id></citation></ref>
<ref id="B10"><citation citation-type="book"><person-group person-group-type="author"><name><surname>Padois</surname> <given-names>V.</given-names></name></person-group> (<year>2016</year>). <source>Control and Design of Robots With Tasks and Constraints in Mind</source>. <publisher-loc>Paris, France</publisher-loc>: <publisher-name>Hdr, Universit&#x000E9; Pierre et Marie Curie (Paris 6)</publisher-name>.</citation></ref>
<ref id="B11"><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Padois</surname> <given-names>V.</given-names></name> <name><surname>Fourquet</surname> <given-names>J.-Y.</given-names></name> <name><surname>Chiron</surname> <given-names>P.</given-names></name></person-group> (<year>2007</year>). <article-title>Kinematic and dynamic model-based control of wheeled mobile manipulators: a unified framework for reactive approaches</article-title>. <source>Robotica</source> <volume>25</volume>, <fpage>157</fpage>&#x02013;<lpage>173</lpage>.<pub-id pub-id-type="doi">10.1017/S0263574707003360</pub-id></citation></ref>
<ref id="B12"><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Peters</surname> <given-names>J.</given-names></name> <name><surname>Mistry</surname> <given-names>M.</given-names></name> <name><surname>Udwadia</surname> <given-names>F.</given-names></name> <name><surname>Nakanishi</surname> <given-names>J.</given-names></name> <name><surname>Schaal</surname> <given-names>S.</given-names></name></person-group> (<year>2008</year>). <article-title>A unifying framework for robot control with redundant dofs</article-title>. <source>Auton. Robots</source> <volume>24</volume>, <fpage>1</fpage>&#x02013;<lpage>12</lpage>.<pub-id pub-id-type="doi">10.1007/s10514-007-9051-x</pub-id></citation></ref>
<ref id="B13"><citation citation-type="web"><collab>Roboptim</collab>. (<year>2016</year>). <source>C&#x0002B;&#x0002B; Library for Numerical Optimization for Robotics</source>. Available at: <uri xlink:href="http://roboptim.net/">http://roboptim.net/</uri></citation></ref>
<ref id="B14"><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Rocchi</surname> <given-names>A.</given-names></name> <name><surname>Hoffman</surname> <given-names>E. M.</given-names></name> <name><surname>Caldwell</surname> <given-names>D. G.</given-names></name> <name><surname>Tsagarakis</surname> <given-names>N. G.</given-names></name></person-group> (<year>2015</year>). &#x0201C;<article-title>Opensot: a whole-body control library for the compliant humanoid robot coman</article-title>,&#x0201D; in <conf-name>IEEE International Conference on Robotics and Automation (ICRA), 2015</conf-name> (<conf-loc>Seattle, WA</conf-loc>: <conf-sponsor>IEEE</conf-sponsor>), <fpage>1093</fpage>&#x02013;<lpage>1099</lpage>.<pub-id pub-id-type="doi">10.1109/ICRA.2015.7140076</pub-id></citation></ref>
<ref id="B15"><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Saab</surname> <given-names>L.</given-names></name> <name><surname>Ramos</surname> <given-names>O. E.</given-names></name> <name><surname>Keith</surname> <given-names>F.</given-names></name> <name><surname>Mansard</surname> <given-names>N.</given-names></name> <name><surname>Soueres</surname> <given-names>P.</given-names></name> <name><surname>Fourquet</surname> <given-names>J.-Y.</given-names></name></person-group> (<year>2013</year>). <article-title>Dynamic whole-body motion generation under rigid contacts and other unilateral constraints</article-title>. <source>IEEE Trans. Robot.</source> <volume>29</volume>, <fpage>346</fpage>&#x02013;<lpage>362</lpage>.<pub-id pub-id-type="doi">10.1109/TRO.2012.2234351</pub-id></citation></ref>
<ref id="B16"><citation citation-type="book"><person-group person-group-type="author"><name><surname>Salini</surname> <given-names>J.</given-names></name></person-group> (<year>2012</year>). <source>Dynamic Control for the Task/Posture Coordination of Humanoids: Toward Synthesis of Complex Activities</source>. <publisher-loc>Theses, Paris</publisher-loc>: <publisher-name>Universit&#x000E9; Pierre et Marie Curie &#x02013; Paris VI</publisher-name>.</citation></ref>
<ref id="B17"><citation citation-type="web"><person-group person-group-type="author"><name><surname>Salini</surname> <given-names>J.</given-names></name> <name><surname>Ivaldi</surname> <given-names>S.</given-names></name> <name><surname>Hak</surname> <given-names>S.</given-names></name> <name><surname>Padois</surname> <given-names>V.</given-names></name></person-group> (<year>2013</year>). <source>ISIR Controller in the XDE Framework for the Control of Robots Based on LQP Solvers</source>. Available at: <uri xlink:href="http://chronos.isir.upmc.fr/salini/XDE-ISIRController/documentation/html/index.html">http://chronos.isir.upmc.fr/salini/XDE-ISIRController/documentation/html/index.html</uri></citation></ref>
<ref id="B18"><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Salini</surname> <given-names>J.</given-names></name> <name><surname>Padois</surname> <given-names>V.</given-names></name> <name><surname>Bidaud</surname> <given-names>P.</given-names></name></person-group> (<year>2011</year>). &#x0201C;<article-title>Synthesis of complex humanoid whole-body behavior: a focus on sequencing and tasks transitions</article-title>,&#x0201D; in <conf-name>IEEE International Conference on Robotics and Automation (ICRA), 2011</conf-name> (<conf-loc>Shanghai</conf-loc>: <conf-sponsor>IEEE</conf-sponsor>), <fpage>1283</fpage>&#x02013;<lpage>1290</lpage>.<pub-id pub-id-type="doi">10.1109/ICRA.2011.5980202</pub-id></citation></ref>
<ref id="B19"><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Sentis</surname> <given-names>L.</given-names></name> <name><surname>Khatib</surname> <given-names>O.</given-names></name></person-group> (<year>2005</year>). &#x0201C;<article-title>Control of free-floating humanoid robots through task prioritization</article-title>,&#x0201D; in <conf-name>Proceedings of the 2005 IEEE International Conference on Robotics and Automation, 2005. ICRA 2005</conf-name> (<conf-loc>Barcelona</conf-loc>: <conf-sponsor>IEEE</conf-sponsor>), <fpage>1718</fpage>&#x02013;<lpage>1723</lpage>.<pub-id pub-id-type="doi">10.1109/ROBOT.2005.1570361</pub-id></citation></ref>
<ref id="B20"><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Sentis</surname> <given-names>L.</given-names></name> <name><surname>Khatib</surname> <given-names>O.</given-names></name></person-group> (<year>2006</year>). &#x0201C;<article-title>A whole-body control framework for humanoids operating in human environments</article-title>,&#x0201D; in <conf-name>Proceedings 2006 IEEE International Conference on, Robotics and Automation, 2006. ICRA 2006</conf-name> (<conf-loc>Orlando, FL</conf-loc>: <conf-sponsor>IEEE</conf-sponsor>), <fpage>2641</fpage>&#x02013;<lpage>2648</lpage>.<pub-id pub-id-type="doi">10.1109/ROBOT.2006.1642100</pub-id></citation></ref>
</ref-list>
<fn-group>
<fn id="fn1"><p><sup>1</sup><uri xlink:href="http://www-list.cea.fr/en/">http://www-list.cea.fr/en/</uri>.</p></fn>
<fn id="fn2"><p><sup>2</sup>European Project Whole-body Compliant Dynamical Contacts in Cognitive Humanoids.</p></fn>
</fn-group>
</back>
</article>