-
Notifications
You must be signed in to change notification settings - Fork 19
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
a9f3e59
commit 90392e3
Showing
1 changed file
with
386 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,386 @@ | ||
<?xml version="1.0" encoding="utf-8" ?> | ||
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.2 20190208//EN" | ||
"JATS-publishing1.dtd"> | ||
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" dtd-version="1.2" article-type="other"> | ||
<front> | ||
<journal-meta> | ||
<journal-id></journal-id> | ||
<journal-title-group> | ||
<journal-title>Journal of Open Source Software</journal-title> | ||
<abbrev-journal-title>JOSS</abbrev-journal-title> | ||
</journal-title-group> | ||
<issn publication-format="electronic">2475-9066</issn> | ||
<publisher> | ||
<publisher-name>Open Journals</publisher-name> | ||
</publisher> | ||
</journal-meta> | ||
<article-meta> | ||
<article-id pub-id-type="publisher-id">3967</article-id> | ||
<article-id pub-id-type="doi">10.21105/joss.03967</article-id> | ||
<title-group> | ||
<article-title>TriP: A Python package for the kinematic modeling of | ||
serial-parallel hybrid robots</article-title> | ||
</title-group> | ||
<contrib-group> | ||
<contrib contrib-type="author"> | ||
<contrib-id contrib-id-type="orcid">0000-0002-7825-3476</contrib-id> | ||
<name> | ||
<surname>Baumgärtner</surname> | ||
<given-names>Jan</given-names> | ||
</name> | ||
<xref ref-type="aff" rid="aff-1"/> | ||
</contrib> | ||
<contrib contrib-type="author"> | ||
<name> | ||
<surname>Miller</surname> | ||
<given-names>Torben</given-names> | ||
</name> | ||
<xref ref-type="aff" rid="aff-2"/> | ||
</contrib> | ||
<aff id="aff-1"> | ||
<institution-wrap> | ||
<institution>Heidelberg University</institution> | ||
</institution-wrap> | ||
</aff> | ||
<aff id="aff-2"> | ||
<institution-wrap> | ||
<institution>Independent Researcher</institution> | ||
</institution-wrap> | ||
</aff> | ||
</contrib-group> | ||
<pub-date date-type="pub" publication-format="electronic" iso-8601-date="2021-10-28"> | ||
<day>28</day> | ||
<month>10</month> | ||
<year>2021</year> | ||
</pub-date> | ||
<volume>7</volume> | ||
<issue>71</issue> | ||
<fpage>3967</fpage> | ||
<permissions> | ||
<copyright-statement>Authors of papers retain copyright and release the | ||
work under a Creative Commons Attribution 4.0 International License (CC | ||
BY 4.0)</copyright-statement> | ||
<copyright-year>2022</copyright-year> | ||
<copyright-holder>The article authors</copyright-holder> | ||
<license license-type="open-access" xlink:href="https://creativecommons.org/licenses/by/4.0/"> | ||
<license-p>Authors of papers retain copyright and release the work under | ||
a Creative Commons Attribution 4.0 International License (CC BY | ||
4.0)</license-p> | ||
</license> | ||
</permissions> | ||
<kwd-group kwd-group-type="author"> | ||
<kwd>Python</kwd> | ||
<kwd>robotics</kwd> | ||
<kwd>inverse kinematics</kwd> | ||
<kwd>kinematics</kwd> | ||
<kwd>parallel manipulator</kwd> | ||
<kwd>serial manipulator</kwd> | ||
</kwd-group> | ||
</article-meta> | ||
</front> | ||
<body> | ||
<sec id="summary"> | ||
<title>Summary</title> | ||
<p>Robots can be classified according to their mechanical structure. | ||
Serial mechanisms like robotic arms are mechanisms where each moving | ||
part (called a link) is connected to only the one before and the one | ||
after it. They are often used when a large workspace is required, | ||
meaning the robot needs a long reach. In parallel mechanisms, the | ||
links of the robot form loops causing them to be structurally stronger | ||
and stiffer.</p> | ||
<p>If both a large workspace and structural strength are required, | ||
hybrids that contain both serial and parallel mechanisms are used. | ||
While hybrid mechanisms combine the mechanical advantages of both | ||
parallel and serial mechanisms, they also combine their modeling | ||
disadvantages:</p> | ||
<list list-type="bullet"> | ||
<list-item> | ||
<p>Finding an explicit solution for either forward or inverse | ||
kinematics is often impossible. Using numerical approaches instead | ||
leads to complicated constrained optimization problems for both | ||
forward and inverse kinematics.</p> | ||
</list-item> | ||
<list-item> | ||
<p>While serial mechanisms are very well supported by current | ||
robotic frameworks, parallel mechanisms and hybrid mechanisms | ||
especially are often not supported at all. A great overview of the | ||
supported robot types for different robotic frameworks was | ||
compiled by Kumar | ||
(<xref alt="2019" rid="ref-kumar" ref-type="bibr">2019</xref>).</p> | ||
</list-item> | ||
</list> | ||
<p>TriP is a python package designed to close this gap using a modular | ||
modeling framework akin to the one described by Kumar et al. | ||
(<xref alt="2020" rid="ref-survey" ref-type="bibr">2020</xref>). It | ||
allows the modeling of arbitrary hybrid mechanisms and is capable of | ||
calculating forward and inverse kinematics.</p> | ||
<p>The calculations are performed using a symbolic framework. This | ||
makes it easy for users to implement custom case-dependent | ||
mathematical solvers.</p> | ||
</sec> | ||
<sec id="statement-of-need"> | ||
<title>Statement of Need</title> | ||
<p>While a huge number of researchers, such as Pisla et al. | ||
(<xref alt="2013" rid="ref-PISLA" ref-type="bibr">2013</xref>), Kanaan | ||
et al. (<xref alt="2009" rid="ref-verne" ref-type="bibr">2009</xref>), | ||
and Zoss et al. | ||
(<xref alt="2006" rid="ref-berkley" ref-type="bibr">2006</xref>), use | ||
hybrid serial parallel systems, most modern kinematics frameworks | ||
still lack support for such systems. Examples include OpenRAVE | ||
(<xref alt="Diankov & Kuffner, 2008" rid="ref-openrave" ref-type="bibr">Diankov | ||
& Kuffner, 2008</xref>), used in the MoveIt! stack | ||
(<xref alt="Chitta et al., 2012" rid="ref-moveit" ref-type="bibr">Chitta | ||
et al., 2012</xref>), the MATLAB robotics toolbox | ||
(<xref alt="Corke, 2017" rid="ref-matlabrobot" ref-type="bibr">Corke, | ||
2017</xref>), Klampt | ||
(<xref alt="Hauser, 2021" rid="ref-Klampt" ref-type="bibr">Hauser, | ||
2021</xref>), and the inverse kinematics Python library | ||
(<xref alt="Manceron, 2021" rid="ref-ikpy" ref-type="bibr">Manceron, | ||
2021</xref>). While all these frameworks and libraries offer fast | ||
computation of forward and inverse kinematics, they only support | ||
branching serial mechanisms. This lack of support often leaves | ||
developers with essentially two choices:</p> | ||
<p>Either shoehorn their hybrid robots into a framework not designed | ||
to handle them or be left to implement their own kinematic | ||
solvers.</p> | ||
<p>TriP is a lightweight and easy-to-use package for directly modeling | ||
hybrid mechanisms and calculating their kinematics. Although TriP is | ||
fast for a Python package, it is not built for robust hard-real time | ||
control applications. Instead, it is aimed at researchers and | ||
engineers who quickly want to build kinematic models to test their | ||
mechanical designs. For this reason it also exposes a interface to the | ||
nonlinear optimization and algorithmic differentiation tool CasADi | ||
(<xref alt="Andersson et al., 2019" rid="ref-casadi" ref-type="bibr">Andersson | ||
et al., 2019</xref>). This allows researchers to investigate the | ||
kinematic properties of their robots, for example, by using CasADi to | ||
find singular configurations or to compute manipulability ellipsoides. | ||
Similar to MoveIt!, TriP also enables researchers to build their own | ||
inverse kinematic solvers.</p> | ||
</sec> | ||
<sec id="overview"> | ||
<title>Overview</title> | ||
<p>TriP models robots using its <italic>Robot</italic> class. A | ||
<italic>Robot</italic> object is made up of | ||
<italic>Transformation</italic> and <italic>KinematicGroup</italic> | ||
objects. The <italic>KinematicGroup</italic> objects are used to model | ||
parallel mechanisms while the <italic>Transformation</italic> objects | ||
model serial mechanisms. See Figure | ||
<xref alt="1" rid="hybrid_chain_taxonomy_groups">1</xref> for | ||
reference, where the links of each robot are colored according to the | ||
<italic>KinematicGroup</italic> or <italic>Transformation</italic> it | ||
belongs to, while joints are either light green or orange, depending | ||
on whether they are actuated or not.</p> | ||
<fig> | ||
<caption><p>Different Hybrid Robot types and their object structure | ||
<styled-content id="hybrid_chain_taxonomy_groups"></styled-content></p></caption> | ||
<graphic mimetype="image" mime-subtype="png" xlink:href="hybrid_chain_taxonomy_groups.png" xlink:title="" /> | ||
</fig> | ||
<p>Both <italic>KinematicGroups</italic> and | ||
<italic>Transformations</italic> can be connected to form branching | ||
mechanisms as indicated in Figure | ||
<xref alt="1" rid="hybrid_chain_taxonomy_groups">1</xref>.</p> | ||
<p><italic>Transformation</italic> objects implement homogeneous | ||
coordinate transformations between coordinate frames. These can be | ||
either dynamic or static with dynamic transformations implementing | ||
joints. A few example joints can be seen in Figure | ||
<xref alt="2" rid="sample_trafo">2</xref>.</p> | ||
<fig> | ||
<caption><p>Sample Joints using the Transformation class | ||
<styled-content id="sample_trafo"></styled-content></p></caption> | ||
<graphic mimetype="image" mime-subtype="png" xlink:href="sample_transformations.png" xlink:title="" /> | ||
</fig> | ||
<p>While all example joints use Euler angles in roll pitch yaw | ||
convention to describe rotation, quaternions are also supported.</p> | ||
<p><italic>KinematicGroups</italic> model parallel mechanisms using | ||
the abstraction approach described by Kumar et al. | ||
(<xref alt="2020" rid="ref-survey" ref-type="bibr">2020</xref>). This | ||
approach models a parallel manipulator as a virtual serial manipulator | ||
and a mapping that maps the virtual joint state to the true actuated | ||
joint state of the parallel manipulator.</p> | ||
<p>An illustrative example of this model is an excavator with two | ||
hydraulic cylinders. Each cylinder is part of a parallel mechanism | ||
resulting in two <italic>KinematicGroups</italic>. Both can be seen in | ||
Figure <xref alt="3" rid="group_structure">3</xref>, where one is | ||
green and the other one is blue.</p> | ||
<fig> | ||
<caption><p>Excavator Arm build from two Groups (green and blue) | ||
<styled-content id="group_structure"></styled-content></p></caption> | ||
<graphic mimetype="image" mime-subtype="png" xlink:href="group_structure.png" xlink:title="" /> | ||
</fig> | ||
<p>The abstraction approach models the excavator as a serial | ||
manipulator where the joints are directly actuated. Using two mappings | ||
to convert the state of the hydraulic cylinders to the state of the | ||
joints and vice versa, it is possible to calculate both forward and | ||
inverse kinematics. In this example, the mapping between cylinders and | ||
joints can be expressed using trigonometry. Since an explicit | ||
formulation of the mappings might not always be possible, TriP can | ||
also compute the mapping by solving the closure equation of the | ||
parallel manipulator.</p> | ||
<p>TriP can generate symbolic representations of robots using CasADi | ||
(<xref alt="Andersson et al., 2019" rid="ref-casadi" ref-type="bibr">Andersson | ||
et al., 2019</xref>). This symbolic representation can be used to set | ||
up a solver object that then solves the inverse kinematics. While the | ||
library already implements a simple inverse kinematics solver, the | ||
symbolic representation makes it easy to implement custom solvers.</p> | ||
<p>All features of TriP are thoroughly documented with tutorials and | ||
examples to help people get started.</p> | ||
</sec> | ||
</body> | ||
<back> | ||
<ref-list> | ||
<ref-list> | ||
<ref id="ref-Klampt"> | ||
<element-citation publication-type="webpage"> | ||
<person-group person-group-type="author"> | ||
<name><surname>Hauser</surname><given-names>Kris</given-names></name> | ||
</person-group> | ||
<article-title>Kris’ locomotion and manipulation planning toolbox - Klamp’t</article-title> | ||
<year iso-8601-date="2021">2021</year> | ||
<date-in-citation content-type="access-date"><year iso-8601-date="2021-03-31">2021</year><month>03</month><day>31</day></date-in-citation> | ||
<uri>https://github.com/krishauser/Klampt</uri> | ||
</element-citation> | ||
</ref> | ||
<ref id="ref-ikpy"> | ||
<element-citation publication-type="webpage"> | ||
<person-group person-group-type="author"> | ||
<name><surname>Manceron</surname><given-names>Pierre</given-names></name> | ||
</person-group> | ||
<article-title>IKPy - an inverse kinematics library aiming performance and modularity</article-title> | ||
<year iso-8601-date="2021">2021</year> | ||
<date-in-citation content-type="access-date"><year iso-8601-date="2021-07-10">2021</year><month>07</month><day>10</day></date-in-citation> | ||
<uri>https://github.com/Phylliade/ikpy</uri> | ||
</element-citation> | ||
</ref> | ||
<ref id="ref-survey"> | ||
<element-citation publication-type="article-journal"> | ||
<person-group person-group-type="author"> | ||
<name><surname>Kumar</surname><given-names>Shivesh</given-names></name> | ||
<name><surname>Woehrle</surname><given-names>Hendrik</given-names></name> | ||
<name><surname>Fernández</surname><given-names>José</given-names></name> | ||
<name><surname>Mueller</surname><given-names>Andreas</given-names></name> | ||
<name><surname>Kirchner</surname><given-names>Frank</given-names></name> | ||
</person-group> | ||
<article-title>A survey on modularity and distributivity in series-parallel hybrid robots</article-title> | ||
<source>Mechatronics</source> | ||
<year iso-8601-date="2020-04">2020</year><month>04</month> | ||
<volume>68</volume> | ||
<pub-id pub-id-type="doi">10.1016/j.mechatronics.2020.102367</pub-id> | ||
</element-citation> | ||
</ref> | ||
<ref id="ref-casadi"> | ||
<element-citation publication-type="article-journal"> | ||
<person-group person-group-type="author"> | ||
<name><surname>Andersson</surname><given-names>Joel A E</given-names></name> | ||
<name><surname>Gillis</surname><given-names>Joris</given-names></name> | ||
<name><surname>Horn</surname><given-names>Greg</given-names></name> | ||
<name><surname>Rawlings</surname><given-names>James B</given-names></name> | ||
<name><surname>Diehl</surname><given-names>Moritz</given-names></name> | ||
</person-group> | ||
<article-title>CasADi – A software framework for nonlinear optimization and optimal control</article-title> | ||
<source>Mathematical Programming Computation</source> | ||
<publisher-name>Springer</publisher-name> | ||
<year iso-8601-date="2019">2019</year> | ||
<volume>11</volume> | ||
<issue>1</issue> | ||
<pub-id pub-id-type="doi">10.1007/s12532-018-0139-4</pub-id> | ||
</element-citation> | ||
</ref> | ||
<ref id="ref-berkley"> | ||
<element-citation publication-type="article-journal"> | ||
<person-group person-group-type="author"> | ||
<name><surname>Zoss</surname><given-names>A. B.</given-names></name> | ||
<name><surname>Kazerooni</surname><given-names>H.</given-names></name> | ||
<name><surname>Chu</surname><given-names>A.</given-names></name> | ||
</person-group> | ||
<article-title>Biomechanical design of the Berkeley lower extremity exoskeleton (BLEEX)</article-title> | ||
<source>IEEE/ASME Transactions on Mechatronics</source> | ||
<year iso-8601-date="2006-05">2006</year><month>05</month> | ||
<volume>11</volume> | ||
<pub-id pub-id-type="doi">10.1109/TMECH.2006.871087</pub-id> | ||
</element-citation> | ||
</ref> | ||
<ref id="ref-verne"> | ||
<element-citation publication-type="article-journal"> | ||
<person-group person-group-type="author"> | ||
<name><surname>Kanaan</surname><given-names>Daniel</given-names></name> | ||
<name><surname>Wenger</surname><given-names>Philippe</given-names></name> | ||
<name><surname>Chablat</surname><given-names>Damien</given-names></name> | ||
</person-group> | ||
<article-title>Kinematic analysis of a serial–parallel machine tool: The VERNE machine</article-title> | ||
<source>Mechanism and Machine Theory</source> | ||
<year iso-8601-date="2009">2009</year> | ||
<volume>44</volume> | ||
<issue>2</issue> | ||
<issn>0094-114X</issn> | ||
<uri>https://www.sciencedirect.com/science/article/pii/S0094114X08000517</uri> | ||
<pub-id pub-id-type="doi">10.1016/j.mechmachtheory.2008.03.002</pub-id> | ||
</element-citation> | ||
</ref> | ||
<ref id="ref-PISLA"> | ||
<element-citation publication-type="article-journal"> | ||
<person-group person-group-type="author"> | ||
<name><surname>Pisla</surname><given-names>Doina</given-names></name> | ||
<name><surname>Szilaghyi</surname><given-names>Andras</given-names></name> | ||
<name><surname>Vaida</surname><given-names>Calin</given-names></name> | ||
<name><surname>Plitea</surname><given-names>Nicolae</given-names></name> | ||
</person-group> | ||
<article-title>Kinematics and workspace modeling of a new hybrid robot used in minimally invasive surgery</article-title> | ||
<source>Robotics and Computer-Integrated Manufacturing</source> | ||
<year iso-8601-date="2013">2013</year> | ||
<volume>29</volume> | ||
<issue>2</issue> | ||
<issn>0736-5845</issn> | ||
<uri>https://www.sciencedirect.com/science/article/pii/S0736584512001196</uri> | ||
<pub-id pub-id-type="doi">10.1016/j.rcim.2012.09.016</pub-id> | ||
</element-citation> | ||
</ref> | ||
<ref id="ref-openrave"> | ||
<element-citation publication-type="paper-conference"> | ||
<person-group person-group-type="author"> | ||
<name><surname>Diankov</surname><given-names>Rosen</given-names></name> | ||
<name><surname>Kuffner</surname><given-names>James J.</given-names></name> | ||
</person-group> | ||
<article-title>OpenRAVE: A planning architecture for autonomous robotics</article-title> | ||
<year iso-8601-date="2008">2008</year> | ||
</element-citation> | ||
</ref> | ||
<ref id="ref-matlabrobot"> | ||
<element-citation publication-type="book"> | ||
<person-group person-group-type="author"> | ||
<name><surname>Corke</surname><given-names>Peter I.</given-names></name> | ||
</person-group> | ||
<source>Robotics, vision & control: Fundamental algorithms in MATLAB</source> | ||
<publisher-name>Springer</publisher-name> | ||
<year iso-8601-date="2017">2017</year> | ||
</element-citation> | ||
</ref> | ||
<ref id="ref-kumar"> | ||
<element-citation publication-type="thesis"> | ||
<person-group person-group-type="author"> | ||
<name><surname>Kumar</surname><given-names>Shivesh</given-names></name> | ||
</person-group> | ||
<article-title>Modular and analytical methods for solving kinematics and dynamics of series-parallel hybrid robots</article-title> | ||
<publisher-name>Universität Bremen</publisher-name> | ||
<year iso-8601-date="2019">2019</year> | ||
</element-citation> | ||
</ref> | ||
<ref id="ref-moveit"> | ||
<element-citation publication-type="article-journal"> | ||
<person-group person-group-type="author"> | ||
<name><surname>Chitta</surname><given-names>Sachin</given-names></name> | ||
<name><surname>Sucan</surname><given-names>Ioan</given-names></name> | ||
<name><surname>Cousins</surname><given-names>Steve</given-names></name> | ||
</person-group> | ||
<article-title>Moveit! [ROS topics]</article-title> | ||
<source>IEEE Robotics & Automation Magazine</source> | ||
<publisher-name>IEEE</publisher-name> | ||
<year iso-8601-date="2012">2012</year> | ||
<volume>19</volume> | ||
<issue>1</issue> | ||
<pub-id pub-id-type="doi">10.1109/MRA.2011.2181749</pub-id> | ||
</element-citation> | ||
</ref> | ||
</ref-list> | ||
</ref-list> | ||
</back> | ||
</article> |